glimmer 0.1.8.470 → 0.1.9.470

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33d1e6ed089bc7dd67eee706f264787cda60ebe2fc1c3fdf1697c277ff5adad4
4
- data.tar.gz: 7c7b23d0827e273289502df018308c7ab383c6e7299e75c6da89a9034113af53
3
+ metadata.gz: 0067b97cd354df28d0f9c07542c18c86fbd0862d2d14791c49488a1bd999715d
4
+ data.tar.gz: 6f6107572403c58148bbb9e5eb6613c5252c264373bbc3c8bd2bae2305fd9e76
5
5
  SHA512:
6
- metadata.gz: 917f8181c1085e246bca952bd4861974081a95486b415e7e6f6c1dcc465776b79ae02ad18b1071f40823c74fdc721186ae5d008a4e1cadd4da2a0da6db40136f
7
- data.tar.gz: 2011b3eedcb1018624bdb872aef40f5900ba2892e680e5ec23cffd495fea4574fd34a66e9720263a343f4ae30e56a91adba5a87529fe9bcf50408cd0e2548c4d
6
+ metadata.gz: 9162f6be53c6cf3a5641e137ad112f2711a9d332fc8e3cfda52579fe0286505103b93d4f4f16952358ead6ffc1915cf90b93b38af548d88b38ccb828666dcac1
7
+ data.tar.gz: fa1841ff34f94cef66485767670a564d21c50d93f9c3a99a39653914385205bcbe1abca03b351697e776e9222ae3fe5741aefcf98d9214a4c7d8bb6416237e1e
data/Gemfile CHANGED
@@ -4,12 +4,12 @@ gem 'facets', '3.1.0'
4
4
  gem 'os', '1.0.0'
5
5
 
6
6
  group :development do
7
- gem "rspec", "~> 3.5.0"
8
7
  gem "rspec-mocks", "~> 3.5.0"
8
+ gem "rspec", "~> 3.5.0"
9
9
  gem "rdoc", "~> 2.3.0"
10
10
  gem "bundler", "~> 1.0"
11
11
  gem "jeweler", "~> 2.3.0"
12
12
  gem "coveralls", "= 0.8.5", require: false
13
13
  gem "simplecov", "~> 0.10.0", require: nil
14
- gem "puts_debuggerer", "0.6.1"
14
+ gem "puts_debuggerer", "~> 0.7.1"
15
15
  end
@@ -26,7 +26,7 @@ Please follow these instructions to make the `glimmer` command available on your
26
26
 
27
27
  Add the following to `Gemfile`:
28
28
  ```
29
- gem 'glimmer', '~> 0.1.8.470'
29
+ gem 'glimmer', '~> 0.1.9.470'
30
30
  ```
31
31
 
32
32
  And, then run:
@@ -38,7 +38,7 @@ bundle install
38
38
 
39
39
  Run this command to get directly:
40
40
  ```
41
- gem install glimmer -v 0.1.8.470
41
+ gem install glimmer -v 0.1.9.470
42
42
  ```
43
43
 
44
44
  ## Usage
data/TODO.md CHANGED
@@ -2,5 +2,11 @@
2
2
 
3
3
  Here is a list of tasks to do (please delete once done):
4
4
 
5
- * Support Tree databinding
5
+ * Support Tree databinding (bidirectional)
6
+ * Figure out what is missing from table databinding (bidirectional?)
6
7
  * Explore rewriting shine with Ruby 2 support
8
+ * Add a startup progress dialog (consider Glimmer branding)
9
+ * Externalize constants to make easily configurable
10
+ * Extract ListenerParent into its own file from WidgetListenerCommandHandler
11
+ * Nested databinding support
12
+ * Enhance XML DSL support (special characters, CDATA, escaped characters (#, {, }, .))
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.8.470
1
+ 0.1.9.470
data/bin/girb CHANGED
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- system "irb -r #{File.expand_path(File.join(__FILE__, '..', 'girb_runner.rb'))}"
2
+ require 'os'
3
+ require_relative '../lib/glimmer_application'
4
+ additional_options = OS.mac? ? "-J-XstartOnFirstThread" : ""
5
+ system "ruby #{additional_options} -J-classpath \"#{GlimmerApplication::SWT_JAR_FILE}\" -S irb -r #{File.expand_path(File.join(__FILE__, '..', 'girb_runner.rb'))}"
@@ -1,5 +1 @@
1
- require_relative '../lib/glimmer_application'
2
- include Java
3
- $CLASSPATH << GlimmerApplication::SWT_JAR_FILE
4
1
  require_relative '../lib/glimmer'
5
- include Glimmer
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: glimmer 0.1.8.470 ruby lib
5
+ # stub: glimmer 0.1.9.470 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "glimmer".freeze
9
- s.version = "0.1.8.470"
9
+ s.version = "0.1.9.470"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["AndyMaleh".freeze]
14
- s.date = "2017-07-23"
14
+ s.date = "2017-07-26"
15
15
  s.description = "JRuby DSL that enables easy and efficient authoring of user-interfaces using the robust platform-independent Eclipse SWT library".freeze
16
16
  s.email = "andy.am@gmail.com".freeze
17
17
  s.executables = ["glimmer".freeze, "girb".freeze]
@@ -39,6 +39,7 @@ Gem::Specification.new do |s|
39
39
  "lib/command_handler_chain_factory.rb",
40
40
  "lib/command_handler_chain_link.rb",
41
41
  "lib/command_handlers.rb",
42
+ "lib/command_handlers/RELEASE.md",
42
43
  "lib/command_handlers/bind_command_handler.rb",
43
44
  "lib/command_handlers/combo_selection_data_binding_command_handler.rb",
44
45
  "lib/command_handlers/data_binding_command_handler.rb",
@@ -54,11 +55,14 @@ Gem::Specification.new do |s|
54
55
  "lib/command_handlers/models/r_widget_listener.rb",
55
56
  "lib/command_handlers/models/r_widget_packages.rb",
56
57
  "lib/command_handlers/models/table_items_updater.rb",
58
+ "lib/command_handlers/models/tree_items_updater.rb",
57
59
  "lib/command_handlers/models/widget_observer.rb",
58
60
  "lib/command_handlers/shell_command_handler.rb",
59
61
  "lib/command_handlers/tab_item_command_handler.rb",
60
62
  "lib/command_handlers/table_column_properties_data_binding_command_handler.rb",
61
63
  "lib/command_handlers/table_items_data_binding_command_handler.rb",
64
+ "lib/command_handlers/tree_items_data_binding_command_handler.rb",
65
+ "lib/command_handlers/tree_properties_data_binding_command_handler.rb",
62
66
  "lib/command_handlers/widget_command_handler.rb",
63
67
  "lib/command_handlers/widget_listener_command_handler.rb",
64
68
  "lib/command_handlers/widget_method_command_handler.rb",
@@ -101,6 +105,7 @@ Gem::Specification.new do |s|
101
105
  "spec/lib/glimmer__shine_data_binding__spec.rb",
102
106
  "spec/lib/glimmer__tab_item__spec.rb",
103
107
  "spec/lib/glimmer__table_data_binding__spec.rb",
108
+ "spec/lib/glimmer__tree_data_binding__spec.rb",
104
109
  "spec/lib/glimmer_spec.rb",
105
110
  "spec/lib/xml/glimmer_xml_spec.rb",
106
111
  "spec/samples/contactmanager/contact_manager_presenter_spec.rb",
@@ -118,37 +123,37 @@ Gem::Specification.new do |s|
118
123
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
119
124
  s.add_runtime_dependency(%q<facets>.freeze, ["= 3.1.0"])
120
125
  s.add_runtime_dependency(%q<os>.freeze, ["= 1.0.0"])
121
- s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
122
126
  s.add_development_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
127
+ s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
123
128
  s.add_development_dependency(%q<rdoc>.freeze, ["~> 2.3.0"])
124
129
  s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
125
130
  s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.3.0"])
126
131
  s.add_development_dependency(%q<coveralls>.freeze, ["= 0.8.5"])
127
132
  s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.10.0"])
128
- s.add_development_dependency(%q<puts_debuggerer>.freeze, ["= 0.6.1"])
133
+ s.add_development_dependency(%q<puts_debuggerer>.freeze, ["~> 0.7.1"])
129
134
  else
130
135
  s.add_dependency(%q<facets>.freeze, ["= 3.1.0"])
131
136
  s.add_dependency(%q<os>.freeze, ["= 1.0.0"])
132
- s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
133
137
  s.add_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
138
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
134
139
  s.add_dependency(%q<rdoc>.freeze, ["~> 2.3.0"])
135
140
  s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
136
141
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.0"])
137
142
  s.add_dependency(%q<coveralls>.freeze, ["= 0.8.5"])
138
143
  s.add_dependency(%q<simplecov>.freeze, ["~> 0.10.0"])
139
- s.add_dependency(%q<puts_debuggerer>.freeze, ["= 0.6.1"])
144
+ s.add_dependency(%q<puts_debuggerer>.freeze, ["~> 0.7.1"])
140
145
  end
141
146
  else
142
147
  s.add_dependency(%q<facets>.freeze, ["= 3.1.0"])
143
148
  s.add_dependency(%q<os>.freeze, ["= 1.0.0"])
144
- s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
145
149
  s.add_dependency(%q<rspec-mocks>.freeze, ["~> 3.5.0"])
150
+ s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
146
151
  s.add_dependency(%q<rdoc>.freeze, ["~> 2.3.0"])
147
152
  s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
148
153
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.3.0"])
149
154
  s.add_dependency(%q<coveralls>.freeze, ["= 0.8.5"])
150
155
  s.add_dependency(%q<simplecov>.freeze, ["~> 0.10.0"])
151
- s.add_dependency(%q<puts_debuggerer>.freeze, ["= 0.6.1"])
156
+ s.add_dependency(%q<puts_debuggerer>.freeze, ["~> 0.7.1"])
152
157
  end
153
158
  end
154
159
 
@@ -5,6 +5,8 @@ require File.dirname(__FILE__) + "/command_handlers/bind_command_handler"
5
5
  require File.dirname(__FILE__) + "/command_handlers/tab_item_command_handler"
6
6
  require File.dirname(__FILE__) + "/command_handlers/combo_selection_data_binding_command_handler"
7
7
  require File.dirname(__FILE__) + "/command_handlers/list_selection_data_binding_command_handler"
8
+ require File.dirname(__FILE__) + "/command_handlers/tree_items_data_binding_command_handler"
9
+ require File.dirname(__FILE__) + "/command_handlers/tree_properties_data_binding_command_handler"
8
10
  require File.dirname(__FILE__) + "/command_handlers/table_items_data_binding_command_handler"
9
11
  require File.dirname(__FILE__) + "/command_handlers/table_column_properties_data_binding_command_handler"
10
12
  require File.dirname(__FILE__) + "/command_handlers/data_binding_command_handler"
@@ -19,6 +21,8 @@ CommandHandlerChainFactory.def_dsl(:swt,
19
21
  TabItemCommandHandler.new,
20
22
  ComboSelectionDataBindingCommandHandler.new,
21
23
  ListSelectionDataBindingCommandHandler.new,
24
+ TreeItemsDataBindingCommandHandler.new,
25
+ TreePropertiesDataBindingCommandHandler.new,
22
26
  TableItemsDataBindingCommandHandler.new,
23
27
  TableColumnPropertiesDataBindingCommandHandler.new,
24
28
  DataBindingCommandHandler.new,
@@ -0,0 +1,12 @@
1
+ # Release Notes
2
+
3
+ ** 0.1.9.470 **
4
+ - Support Tree data-binding (read-only from model to tree)
5
+
6
+ ** 0.1.8.470 **
7
+ - girb support
8
+
9
+ ** 0.1.5.470 **
10
+ - Glimmer now uses a Ruby Logger in debug mode to provide helpful debugging information
11
+ - Glimmer has a smart new Ruby shell script for executing applications
12
+ - Glimmer now downloads swt.jar automatically when missing (e.g. 1st run) on Mac, Windows, and Linux, and for x86 and x86-64 CPU architectures.
@@ -2,25 +2,40 @@ require File.dirname(__FILE__) + "/../command_handler"
2
2
  require File.dirname(__FILE__) + "/models/r_widget"
3
3
  require File.dirname(__FILE__) + "/models/model_observer"
4
4
 
5
+ # Responsible for setting up the return value of the bind keyword (command symbol)
6
+ # as a ModelObserver. It is then used by another command handler like
7
+ # DataBindingCommandHandler for text and selection properties on Text and Spinner
8
+ # or TableItemsDataBindingCommandHandler for items in a Table
5
9
  class BindCommandHandler
6
10
  include CommandHandler
7
-
11
+
8
12
  include_package 'org.eclipse.swt.widgets'
9
13
 
10
14
  def can_handle?(parent, command_symbol, *args, &block)
11
- parent.is_a?(RWidget) and
12
- command_symbol.to_s == "bind" and
13
- (((args.size == 2) and
14
- (args[1].is_a?(Symbol) or args[1].is_a?(String))) or
15
- ((args.size == 3) and
16
- (args[1].is_a?(Symbol) or args[1].is_a?(String)) and
17
- (args[2].is_a?(Symbol) or args[2].is_a?(String)))) and
18
- block == nil
15
+ (
16
+ parent.is_a?(RWidget) and
17
+ command_symbol.to_s == "bind" and
18
+ (
19
+ (
20
+ (args.size == 2) and
21
+ (
22
+ args[1].is_a?(Symbol) or
23
+ args[1].is_a?(String)
24
+ )
25
+ ) or
26
+ (
27
+ (args.size == 3) and
28
+ (args[1].is_a?(Symbol) or args[1].is_a?(String)) and
29
+ (args[2].is_a?(Symbol) or args[2].is_a?(String))
30
+ )
31
+ ) and
32
+ block == nil
33
+ )
19
34
  end
20
-
35
+
21
36
  def do_handle(parent, command_symbol, *args, &block)
22
37
  property_type = args[2] if (args.size == 3)
23
38
  ModelObserver.new(args[0], args[1].to_s, property_type)
24
39
  end
25
-
26
- end
40
+
41
+ end
@@ -4,12 +4,19 @@ require File.dirname(__FILE__) + "/models/observable_model"
4
4
  require File.dirname(__FILE__) + "/models/model_observer"
5
5
  require File.dirname(__FILE__) + "/models/widget_observer"
6
6
 
7
- class DataBindingCommandHandler
7
+ # Responsible for wiring two-way data-binding for text and selection properties
8
+ # on Text, Button, and Spinner widgets.
9
+ # Does so by using the output of the bind(model, property) command in the form
10
+ # of a ModelObserver, which is then connected to an anonymous widget observer
11
+ # (aka widget_data_binder as per widget_data_binders array)
12
+ #
13
+ # Depends on BindCommandHandler
14
+ class DataBindingCommandHandler
8
15
  extend Glimmer
9
16
  include CommandHandler
10
-
17
+
11
18
  include_package 'org.eclipse.swt.widgets'
12
-
19
+
13
20
  @@widget_data_binders = {
14
21
  Java::OrgEclipseSwtWidgets::Text => {
15
22
  :text => Proc.new do |rwidget, model_observer|
@@ -38,14 +45,14 @@ class DataBindingCommandHandler
38
45
  }
39
46
  end
40
47
  }
41
- }
42
-
48
+ }
49
+
43
50
  def can_handle?(parent, command_symbol, *args, &block)
44
- parent.is_a?(RWidget) and
51
+ (parent.is_a?(RWidget) and
45
52
  args.size == 1 and
46
- args[0].is_a?(ModelObserver)
53
+ args[0].is_a?(ModelObserver))
47
54
  end
48
-
55
+
49
56
  def do_handle(parent, command_symbol, *args, &block)
50
57
  model_observer = args[0]
51
58
  widget_observer = WidgetObserver.new(parent, command_symbol.to_s)
@@ -57,5 +64,5 @@ class DataBindingCommandHandler
57
64
  widget_data_binder = widget_data_binder_map[command_symbol.to_s.to_sym] if widget_data_binder_map
58
65
  widget_data_binder.call(parent, model_observer) if widget_data_binder
59
66
  end
60
-
67
+
61
68
  end
@@ -1,9 +1,10 @@
1
+ require 'set'
1
2
  module ObservableArray
2
-
3
+
3
4
  def add_observer(element_properties, observer)
4
5
  property_observer_list << observer
5
6
  each do |element|
6
- element_properties.each do |property|
7
+ [element_properties].flatten.each do |property|
7
8
  element.extend(ObservableModel) unless element.is_a?(ObservableModel)
8
9
  element.add_observer(property, observer)
9
10
  end
@@ -11,30 +12,30 @@ module ObservableArray
11
12
  end
12
13
 
13
14
  def property_observer_list
14
- @property_observer_list = [] unless @property_observer_list
15
+ @property_observer_list = Set.new unless @property_observer_list
15
16
  @property_observer_list
16
17
  end
17
-
18
+
18
19
  def notify_observers
19
20
  property_observer_list.each {|observer| observer.update}
20
21
  end
21
-
22
+
22
23
  def self.extend_object(array)
23
24
  array.instance_eval("alias original_add <<")
24
25
  array.instance_eval <<-end_eval, __FILE__, __LINE__
25
- def <<(value)
26
- self.original_add(value)
27
- notify_observers
26
+ def <<(value)
27
+ self.original_add(value)
28
+ notify_observers
28
29
  end
29
30
  end_eval
30
-
31
+
31
32
  notify_observers_on_invokation(array, "delete", 1)
32
33
  notify_observers_on_invokation(array, "delete_at", 1)
33
34
  notify_observers_on_invokation(array, "clear")
34
-
35
+
35
36
  super
36
37
  end
37
-
38
+
38
39
  def self.notify_observers_on_invokation(model, method, argument_count=0)
39
40
  model.instance_eval "alias original_#{method} #{method}\n"
40
41
  arguments = ""
@@ -44,8 +45,8 @@ module ObservableArray
44
45
  arguments = arguments[0..-2]
45
46
  model.instance_eval <<-end_eval, __FILE__, __LINE__
46
47
  def #{method}(#{arguments})
47
- self.original_#{method}(#{arguments})
48
- notify_observers
48
+ self.original_#{method}(#{arguments})
49
+ notify_observers
49
50
  end
50
51
  end_eval
51
52
  end
@@ -1,5 +1,6 @@
1
+ require 'set'
1
2
  module ObservableModel
2
-
3
+
3
4
  def add_observer(property_name, observer)
4
5
  property_observer_list(property_name) << observer
5
6
  end
@@ -8,16 +9,16 @@ module ObservableModel
8
9
  @property_observers = Hash.new unless @property_observers
9
10
  @property_observers
10
11
  end
11
-
12
+
12
13
  def property_observer_list(property_name)
13
- property_observer_hash[property_name.to_sym] = [] unless property_observer_hash[property_name.to_sym]
14
+ property_observer_hash[property_name.to_sym] = Set.new unless property_observer_hash[property_name.to_sym]
14
15
  property_observer_hash[property_name.to_sym]
15
16
  end
16
-
17
+
17
18
  def notify_observers(property_name)
18
19
  property_observer_list(property_name).each {|observer| observer.update(send(property_name))}
19
20
  end
20
-
21
+
21
22
  class Updater
22
23
  def initialize(property_name, observable_model)
23
24
  @property_name = property_name
@@ -27,33 +28,33 @@ module ObservableModel
27
28
  @observable_model.notify_observers(@property_name)
28
29
  end
29
30
  end
30
-
31
+
31
32
  def self.extend_object(model)
32
33
  super
33
34
  model.methods.each do |method|
34
35
  self.add_method_observers(model, method)
35
36
  end
36
37
  end
37
-
38
+
38
39
  def self.add_method_observers(model, method)
39
40
  setter_method_pattern = /^(\w+=)$/
40
41
  if (method.match(setter_method_pattern))
41
42
  getter_method = method[0, method.length - 1]
42
43
  getter_value = model.send(getter_method)
43
- if (getter_value.is_a?(Array) and
44
+ if (getter_value.is_a?(Array) and
44
45
  !getter_value.is_a?(ObservableArray))
45
46
  getter_value.extend(ObservableArray)
46
47
  getter_value.add_observer([], Updater.new(getter_method, model))
47
48
  end
48
49
  model.instance_eval "alias original_#{method} #{method}\n"
49
50
  model.instance_eval <<-end_eval, __FILE__, __LINE__
50
- def #{method}(value)
51
+ def #{method}(value)
51
52
  self.original_#{method}(value)
52
53
  notify_observers('#{getter_method}')
53
54
  if (value.is_a?(Array) and !value.is_a?(ObservableArray))
54
55
  value.extend(ObservableArray)
55
56
  value.add_observer([], ObservableModel::Updater.new('#{getter_method}', self))
56
- end
57
+ end
57
58
  end
58
59
  end_eval
59
60
  end
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + "/observable_array"
2
+ require File.dirname(__FILE__) + "/observable_model"
3
+
4
+ class TreeItemsUpdater
5
+ include_package 'org.eclipse.swt'
6
+ include_package 'org.eclipse.swt.widgets'
7
+
8
+ def initialize(parent, model_observer, tree_properties)
9
+ @tree = parent
10
+ @model_observer = model_observer
11
+ @tree_properties = [tree_properties].flatten.first.to_h
12
+ update(@model_observer.evaluate_property)
13
+ model = model_observer.model
14
+ model.extend(ObservableModel) unless model.is_a?(ObservableModel)
15
+ model.add_observer(model_observer.property_name, self)
16
+ end
17
+ def update(model_tree_root_node=nil)
18
+ if model_tree_root_node and model_tree_root_node.respond_to?(@tree_properties[:children])
19
+ model_tree_root_node.extend(ObservableModel) unless model_tree_root_node.is_a?(ObservableModel)
20
+ model_tree_root_node.add_observer(@tree_properties[:text], self)
21
+ model_tree_root_node.add_observer(@tree_properties[:children], self)
22
+ @model_tree_root_node = model_tree_root_node
23
+ end
24
+ populate_tree(@model_tree_root_node, @tree, @tree_properties)
25
+ end
26
+ def populate_tree(model_tree_root_node, parent, tree_properties)
27
+ parent.widget.removeAll
28
+ populate_tree_node(model_tree_root_node, parent.widget, tree_properties)
29
+ end
30
+ def populate_tree_node(model_tree_node, parent, tree_properties)
31
+ table_item = TreeItem.new(parent, SWT::NONE)
32
+ table_item.setText((model_tree_node && model_tree_node.send(tree_properties[:text])).to_s)
33
+ [model_tree_node && model_tree_node.send(tree_properties[:children])].flatten.to_a.compact.each do |child|
34
+ child.extend(ObservableModel) unless child.is_a?(ObservableModel)
35
+ child.add_observer(@tree_properties[:text], self)
36
+ populate_tree_node(child, table_item, tree_properties)
37
+ end
38
+ end
39
+
40
+ end
@@ -1,9 +1,11 @@
1
1
  require File.dirname(__FILE__) + "/../command_handler"
2
2
  require File.dirname(__FILE__) + "/models/r_widget"
3
3
 
4
+ # Responsible for providing a readable keyword (command symbol) to capture
5
+ # and return column properties for use in TreeItemsDataBindingCommandHandler
4
6
  class TableColumnPropertiesDataBindingCommandHandler
5
7
  include CommandHandler
6
-
8
+
7
9
  include_package 'org.eclipse.swt'
8
10
  include_package 'org.eclipse.swt.widgets'
9
11
 
@@ -13,9 +15,9 @@ class TableColumnPropertiesDataBindingCommandHandler
13
15
  command_symbol.to_s == "column_properties" and
14
16
  block == nil
15
17
  end
16
-
18
+
17
19
  def do_handle(parent, command_symbol, *args, &block)
18
20
  args
19
21
  end
20
-
21
- end
22
+
23
+ end
@@ -2,9 +2,10 @@ require File.dirname(__FILE__) + "/../command_handler"
2
2
  require File.dirname(__FILE__) + "/models/r_widget"
3
3
  require File.dirname(__FILE__) + "/models/table_items_updater"
4
4
 
5
+ #Depends on BindCommandHandler and TableColumnPropertiesDataBindingCommandHandler
5
6
  class TableItemsDataBindingCommandHandler
6
7
  include CommandHandler
7
-
8
+
8
9
  include_package 'org.eclipse.swt.widgets'
9
10
 
10
11
  def can_handle?(parent, command_symbol, *args, &block)
@@ -17,11 +18,11 @@ class TableItemsDataBindingCommandHandler
17
18
  args[1].is_a?(Array) and
18
19
  block == nil
19
20
  end
20
-
21
+
21
22
  def do_handle(parent, command_symbol, *args, &block)
22
23
  model_observer = args[0]
23
24
  column_properties = args[1]
24
25
  TableItemsUpdater.new(parent, model_observer, column_properties)
25
26
  end
26
27
 
27
- end
28
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+ require File.dirname(__FILE__) + "/models/tree_items_updater"
4
+
5
+ class TreeItemsDataBindingCommandHandler
6
+ include CommandHandler
7
+
8
+ include_package 'org.eclipse.swt.widgets'
9
+
10
+ def can_handle?(parent, command_symbol, *args, &block)
11
+ (parent.is_a?(RWidget)) and
12
+ (parent.widget.is_a?(Tree)) and
13
+ (command_symbol.to_s == "items") and
14
+ (args.size == 2) and
15
+ (args[0].is_a?(ModelObserver)) and
16
+ (!args[0].evaluate_property.is_a?(Array)) and
17
+ (args[1].is_a?(Array) && !args[1].empty? && args[1].first.is_a?(Hash)) and
18
+ (block == nil)
19
+ end
20
+
21
+ def do_handle(parent, command_symbol, *args, &block)
22
+ model_observer = args[0]
23
+ tree_properties = args[1]
24
+ TreeItemsUpdater.new(parent, model_observer, tree_properties)
25
+ end
26
+
27
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+
4
+ # Responsible for providing a readable keyword (command symbol) to capture
5
+ # and return tree properties for use in TreeItemsDataBindingCommandHandler
6
+ class TreePropertiesDataBindingCommandHandler
7
+ include CommandHandler
8
+
9
+ include_package 'org.eclipse.swt'
10
+ include_package 'org.eclipse.swt.widgets'
11
+
12
+ def can_handle?(parent, command_symbol, *args, &block)
13
+ parent.is_a?(RWidget) and
14
+ parent.widget.is_a?(Tree) and
15
+ command_symbol.to_s == "tree_properties" and
16
+ block == nil
17
+ end
18
+
19
+ def do_handle(parent, command_symbol, *args, &block)
20
+ args
21
+ end
22
+
23
+ end
@@ -4,81 +4,81 @@ require_relative "../lib/glimmer"
4
4
 
5
5
  #Presents login screen data
6
6
  class LoginPresenter
7
-
7
+
8
8
  attr_accessor :user_name
9
9
  attr_accessor :password
10
10
  attr_accessor :status
11
-
11
+
12
12
  def initialize
13
13
  @user_name = ""
14
14
  @password = ""
15
15
  @status = "Logged Out"
16
16
  end
17
-
17
+
18
18
  def status=(status)
19
19
  @status = status
20
-
21
- #TODO add feature to bind dependent properties to master property
22
- notify_observers("logged_in")
20
+
21
+ #TODO add feature to bind dependent properties to master property (2017-07-25 nested data binding)
22
+ notify_observers("logged_in")
23
23
  notify_observers("logged_out")
24
24
  end
25
-
25
+
26
26
  def logged_in
27
27
  self.status == "Logged In"
28
28
  end
29
-
29
+
30
30
  def logged_out
31
31
  !self.logged_in
32
32
  end
33
-
33
+
34
34
  def login
35
35
  self.status = "Logged In"
36
36
  end
37
-
37
+
38
38
  def logout
39
39
  self.user_name = ""
40
40
  self.password = ""
41
41
  self.status = "Logged Out"
42
42
  end
43
-
43
+
44
44
  end
45
45
 
46
46
  #Login screen
47
47
  class Login
48
48
  include_package 'org.eclipse.swt'
49
49
  include_package 'org.eclipse.swt.layout'
50
-
50
+
51
51
  include Glimmer
52
-
52
+
53
53
  def launch
54
54
  presenter = LoginPresenter.new
55
55
  @shell = shell {
56
56
  text "Login"
57
- composite {
57
+ composite {
58
58
  layout GridLayout.new(2, false) #two columns with differing widths
59
-
59
+
60
60
  label { text "Username:" } # goes in column 1
61
61
  text { # goes in column 2
62
- text bind(presenter, :user_name)
62
+ text bind(presenter, :user_name)
63
63
  enabled bind(presenter, :logged_out)
64
- }
65
-
66
- label { text "Password:" }
64
+ }
65
+
66
+ label { text "Password:" }
67
67
  text(:password, :border) {
68
- text bind(presenter, :password)
68
+ text bind(presenter, :password)
69
69
  enabled bind(presenter, :logged_out)
70
70
  }
71
-
72
- label { text "Status:" }
71
+
72
+ label { text "Status:" }
73
73
  label { text bind(presenter, :status) }
74
-
75
- button {
74
+
75
+ button {
76
76
  text "Login"
77
77
  enabled bind(presenter, :logged_out)
78
78
  on_widget_selected { presenter.login }
79
79
  }
80
-
81
- button {
80
+
81
+ button {
82
82
  text "Logout"
83
83
  enabled bind(presenter, :logged_in)
84
84
  on_widget_selected { presenter.logout }
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'spec_helper'
2
2
 
3
3
  describe "Glimmer Data Binding" do
4
4
  include Glimmer
@@ -0,0 +1,113 @@
1
+ require "spec_helper"
2
+
3
+ describe "Glimmer Tree Data Binding" do
4
+ include Glimmer
5
+
6
+ include_package 'org.eclipse.swt'
7
+ include_package 'org.eclipse.swt.widgets'
8
+ include_package 'org.eclipse.swt.layout'
9
+
10
+ before do
11
+ dsl :swt
12
+ end
13
+
14
+ after do
15
+ @target.display.dispose if @target && @target.display
16
+ end
17
+
18
+ class Person
19
+ attr_accessor :name, :age, :adult, :people
20
+ end
21
+
22
+ class Manager < Person
23
+ def initialize
24
+ @people = []
25
+ end
26
+
27
+ attr_accessor :people
28
+ end
29
+
30
+ class Company
31
+ def initialize
32
+ @owner = []
33
+ end
34
+
35
+ attr_accessor :owner
36
+ end
37
+
38
+ it "data binds text widget to a string property" do
39
+ person1 = Person.new
40
+ person1.name = "Bruce Ting"
41
+ person1.age = 45
42
+ person1.adult = true
43
+
44
+ person2 = Person.new
45
+ person2.name = "Julia Fang"
46
+ person2.age = 17
47
+ person2.adult = false
48
+
49
+ manager = Manager.new
50
+ manager.name = "Tim Harkins"
51
+ manager.age = 79
52
+ manager.adult = true
53
+ manager.people << person1
54
+ manager.people << person2
55
+
56
+ company = Company.new
57
+ company.owner = manager
58
+
59
+ @target = shell {
60
+ @tree = tree(:virtual, :border) {
61
+ items bind(company, :owner), tree_properties(children: :people, text: :name)
62
+ }
63
+ }
64
+
65
+ expect(@tree.widget.getItems.size).to eq(1)
66
+
67
+ rootNode = @tree.widget.getItems[0]
68
+ expect(rootNode.getText()).to eq("Tim Harkins")
69
+
70
+ expect(rootNode.getItems.size).to eq(2)
71
+ node1 = rootNode.getItems[0]
72
+ node2 = rootNode.getItems[1]
73
+ expect(node1.getText()).to eq("Bruce Ting")
74
+ expect(node2.getText()).to eq("Julia Fang")
75
+
76
+ manager.name = "Tim Lee Harkins"
77
+
78
+ rootNode = @tree.widget.getItems[0]
79
+ expect(rootNode.getText()).to eq("Tim Lee Harkins")
80
+
81
+ person1.name = "Bruce A. Ting"
82
+ node1 = @tree.widget.getItems.first.getItems.first
83
+ expect(node1.getText()).to eq("Bruce A. Ting")
84
+
85
+ person2.name = "Julia Katherine Fang"
86
+ node2 = @tree.widget.getItems.first.getItems.last
87
+ expect(node2.getText()).to eq("Julia Katherine Fang")
88
+
89
+ person3 = Person.new
90
+ person3.name = "Bob David Kennith"
91
+ person3.age = 37
92
+ person3.adult = true
93
+
94
+ manager.people << person3
95
+ manager.people = manager.people
96
+
97
+ rootNode = @tree.widget.getItems.first
98
+ expect(rootNode.getItems.size).to eq(3)
99
+ node3 = rootNode.getItems.last
100
+ expect(node3.getText()).to eq("Bob David Kennith")
101
+
102
+ manager.people.delete_at(0)
103
+
104
+ rootNode = @tree.widget.getItems.first
105
+ expect(rootNode.getItems.size).to eq(2)
106
+ node1 = rootNode.getItems.first
107
+ node2 = rootNode.getItems.last
108
+ expect(node1.getText()).to eq("Julia Katherine Fang")
109
+ expect(node2.getText()).to eq("Bob David Kennith")
110
+
111
+ end
112
+
113
+ end
@@ -13,6 +13,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
13
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'samples'))
14
14
  $LOAD_PATH.unshift(File.dirname(__FILE__))
15
15
  require 'glimmer'
16
+ require 'puts_debuggerer'
16
17
  # This file was generated by the `rspec --init` command. Conventionally, all
17
18
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
18
19
  # The generated `.rspec` file contains `--require spec_helper` which will cause
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.1.8.470
4
+ version: 0.1.9.470
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-23 00:00:00.000000000 Z
11
+ date: 2017-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -44,7 +44,7 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: 3.5.0
47
- name: rspec
47
+ name: rspec-mocks
48
48
  prerelease: false
49
49
  type: :development
50
50
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
60
  version: 3.5.0
61
- name: rspec-mocks
61
+ name: rspec
62
62
  prerelease: false
63
63
  type: :development
64
64
  version_requirements: !ruby/object:Gem::Requirement
@@ -139,17 +139,17 @@ dependencies:
139
139
  - !ruby/object:Gem::Dependency
140
140
  requirement: !ruby/object:Gem::Requirement
141
141
  requirements:
142
- - - '='
142
+ - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: 0.6.1
144
+ version: 0.7.1
145
145
  name: puts_debuggerer
146
146
  prerelease: false
147
147
  type: :development
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - '='
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 0.6.1
152
+ version: 0.7.1
153
153
  description: JRuby DSL that enables easy and efficient authoring of user-interfaces
154
154
  using the robust platform-independent Eclipse SWT library
155
155
  email: andy.am@gmail.com
@@ -180,6 +180,7 @@ files:
180
180
  - lib/command_handler_chain_factory.rb
181
181
  - lib/command_handler_chain_link.rb
182
182
  - lib/command_handlers.rb
183
+ - lib/command_handlers/RELEASE.md
183
184
  - lib/command_handlers/bind_command_handler.rb
184
185
  - lib/command_handlers/combo_selection_data_binding_command_handler.rb
185
186
  - lib/command_handlers/data_binding_command_handler.rb
@@ -195,11 +196,14 @@ files:
195
196
  - lib/command_handlers/models/r_widget_listener.rb
196
197
  - lib/command_handlers/models/r_widget_packages.rb
197
198
  - lib/command_handlers/models/table_items_updater.rb
199
+ - lib/command_handlers/models/tree_items_updater.rb
198
200
  - lib/command_handlers/models/widget_observer.rb
199
201
  - lib/command_handlers/shell_command_handler.rb
200
202
  - lib/command_handlers/tab_item_command_handler.rb
201
203
  - lib/command_handlers/table_column_properties_data_binding_command_handler.rb
202
204
  - lib/command_handlers/table_items_data_binding_command_handler.rb
205
+ - lib/command_handlers/tree_items_data_binding_command_handler.rb
206
+ - lib/command_handlers/tree_properties_data_binding_command_handler.rb
203
207
  - lib/command_handlers/widget_command_handler.rb
204
208
  - lib/command_handlers/widget_listener_command_handler.rb
205
209
  - lib/command_handlers/widget_method_command_handler.rb
@@ -242,6 +246,7 @@ files:
242
246
  - spec/lib/glimmer__shine_data_binding__spec.rb
243
247
  - spec/lib/glimmer__tab_item__spec.rb
244
248
  - spec/lib/glimmer__table_data_binding__spec.rb
249
+ - spec/lib/glimmer__tree_data_binding__spec.rb
245
250
  - spec/lib/glimmer_spec.rb
246
251
  - spec/lib/xml/glimmer_xml_spec.rb
247
252
  - spec/samples/contactmanager/contact_manager_presenter_spec.rb