glimmer 0.1.0.0

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 (61) hide show
  1. data/COPYING.LGPL +504 -0
  2. data/README +27 -0
  3. data/samples/contactmanager/contact.rb +12 -0
  4. data/samples/contactmanager/contact_manager.rb +65 -0
  5. data/samples/contactmanager/contact_manager_presenter.rb +23 -0
  6. data/samples/contactmanager/contact_repository.rb +27 -0
  7. data/samples/hello_world.rb +26 -0
  8. data/samples/login.rb +97 -0
  9. data/samples/tictactoe/tic_tac_toe.rb +67 -0
  10. data/samples/tictactoe/tic_tac_toe_board.rb +149 -0
  11. data/src/command_handler.rb +11 -0
  12. data/src/command_handler_chain_factory.rb +23 -0
  13. data/src/command_handler_chain_link.rb +22 -0
  14. data/src/command_handlers.rb +26 -0
  15. data/src/command_handlers/bind_command_handler.rb +29 -0
  16. data/src/command_handlers/data_binding_command_handler.rb +64 -0
  17. data/src/command_handlers/models/model_observer.rb +25 -0
  18. data/src/command_handlers/models/observable_array.rb +46 -0
  19. data/src/command_handlers/models/observable_model.rb +35 -0
  20. data/src/command_handlers/models/r_runnable.rb +14 -0
  21. data/src/command_handlers/models/r_shell.rb +27 -0
  22. data/src/command_handlers/models/r_widget.rb +146 -0
  23. data/src/command_handlers/models/r_widget_listener.rb +12 -0
  24. data/src/command_handlers/models/r_widget_packages.rb +9 -0
  25. data/src/command_handlers/models/table_items_updater.rb +39 -0
  26. data/src/command_handlers/models/widget_observer.rb +23 -0
  27. data/src/command_handlers/shell_command_handler.rb +18 -0
  28. data/src/command_handlers/swt_constant_command_handler.rb +22 -0
  29. data/src/command_handlers/table_column_properties_data_binding_command_handler.rb +24 -0
  30. data/src/command_handlers/table_items_data_binding_command_handler.rb +30 -0
  31. data/src/command_handlers/widget_command_handler.rb +26 -0
  32. data/src/command_handlers/widget_listener_command_handler.rb +35 -0
  33. data/src/command_handlers/widget_method_command_handler.rb +22 -0
  34. data/src/glimmer.rb +45 -0
  35. data/src/parent.rb +8 -0
  36. data/src/shine.rb +24 -0
  37. data/src/swt.rb +10 -0
  38. data/src/xml.rb +10 -0
  39. data/src/xml_command_handlers.rb +18 -0
  40. data/src/xml_command_handlers/html_command_handler.rb +49 -0
  41. data/src/xml_command_handlers/models/depth_first_search_iterator.rb +20 -0
  42. data/src/xml_command_handlers/models/name_space_visitor.rb +21 -0
  43. data/src/xml_command_handlers/models/node.rb +83 -0
  44. data/src/xml_command_handlers/models/node_visitor.rb +12 -0
  45. data/src/xml_command_handlers/models/xml_visitor.rb +62 -0
  46. data/src/xml_command_handlers/xml_command_handler.rb +22 -0
  47. data/src/xml_command_handlers/xml_name_space_command_handler.rb +34 -0
  48. data/src/xml_command_handlers/xml_tag_command_handler.rb +26 -0
  49. data/src/xml_command_handlers/xml_text_command_handler.rb +22 -0
  50. data/test/glimmer_constant_test.rb +36 -0
  51. data/test/glimmer_data_binding_test.rb +236 -0
  52. data/test/glimmer_listeners_test.rb +61 -0
  53. data/test/glimmer_shine_data_binding_test.rb +88 -0
  54. data/test/glimmer_table_data_binding_test.rb +135 -0
  55. data/test/glimmer_test.rb +233 -0
  56. data/test/observable_model_test.rb +27 -0
  57. data/test/r_widget_test.rb +52 -0
  58. data/test/samples/contactmanager/contact_manager_presenter_test.rb +60 -0
  59. data/test/samples/tictactoe/tic_tac_toe_test.rb +265 -0
  60. data/test/xml/glimmer_xml_test.rb +163 -0
  61. metadata +126 -0
@@ -0,0 +1,12 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ class RWidgetListener
5
+
6
+ attr_reader :listener
7
+
8
+ def initialize(listener)
9
+ @listener = listener
10
+ end
11
+
12
+ end
@@ -0,0 +1,9 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ # edit to add more packages and support custom widgets
5
+ class RWidget
6
+ include_package 'org.eclipse.swt'
7
+ include_package 'org.eclipse.swt.layout'
8
+ include_package 'org.eclipse.swt.widgets'
9
+ end
@@ -0,0 +1,39 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/observable_array"
5
+ require File.dirname(__FILE__) + "/observable_model"
6
+
7
+ class TableItemsUpdater
8
+ include_package 'org.eclipse.swt'
9
+ include_package 'org.eclipse.swt.widgets'
10
+
11
+ def initialize(parent, model_observer, column_properties)
12
+ @table = parent
13
+ @model_observer = model_observer
14
+ @column_properties = column_properties
15
+ update(@model_observer.evaluate_property)
16
+ model = model_observer.model
17
+ model.extend(ObservableModel) unless model.is_a?(ObservableModel)
18
+ model.add_observer(model_observer.property_name, self)
19
+ end
20
+ def update(model_collection=nil)
21
+ if (model_collection and model_collection.is_a?(Array))
22
+ model_collection.extend(ObservableArray)
23
+ model_collection.add_observer(@column_properties, self)
24
+ @model_collection = model_collection
25
+ end
26
+ populate_table(@model_collection, @table, @column_properties)
27
+ end
28
+ def populate_table(model_collection, parent, column_properties)
29
+ parent.widget.removeAll
30
+ model_collection.each do |model|
31
+ table_item = TableItem.new(parent.widget, SWT::NONE)
32
+ for index in 0..(column_properties.size-1)
33
+ table_item.setText(index, model.send(column_properties[index]).to_s)
34
+ end
35
+ end
36
+ end
37
+
38
+ end
39
+
@@ -0,0 +1,23 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ class WidgetObserver
5
+ attr_reader :widget, :property
6
+ @@property_type_converters = {
7
+ :text => Proc.new { |value| value.to_s }
8
+ }
9
+ def initialize model, property
10
+ @widget = model
11
+ @property = property
12
+ end
13
+ def update(value)
14
+ converted_value = value
15
+ converter = @@property_type_converters[@property.to_sym]
16
+ converted_value = converter.call(value) if converter
17
+ @widget.widget.send "set" + @property.camelcase(true), converted_value unless evaluate_property == converted_value
18
+ end
19
+ def evaluate_property
20
+ @widget.widget.send("get" + @property.camelcase(true))
21
+ end
22
+ end
23
+
@@ -0,0 +1,18 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/../command_handler"
5
+ require File.dirname(__FILE__) + "/models/r_shell"
6
+
7
+ class ShellCommandHandler
8
+ include CommandHandler
9
+
10
+ def can_handle?(parent, command_symbol, *args, &block)
11
+ command_symbol.to_s == "shell"
12
+ end
13
+
14
+ def do_handle(parent, command_symbol, *args, &block)
15
+ RShell.send(:new, *args)
16
+ end
17
+
18
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/../command_handler"
5
+ require File.dirname(__FILE__) + "/models/r_widget"
6
+
7
+ class SwtConstantCommandHandler
8
+ include CommandHandler
9
+
10
+ include_package 'org.eclipse.swt'
11
+
12
+ def can_handle?(parent, command_symbol, *args, &block)
13
+ args.size == 0 and
14
+ block == nil
15
+ end
16
+
17
+ def do_handle(parent, command_symbol, *args, &block)
18
+ puts 'org.eclipse.swt.SWT::' + command_symbol.to_s.upcase
19
+ eval 'org.eclipse.swt.SWT::' + command_symbol.to_s.upcase
20
+ end
21
+
22
+ end
@@ -0,0 +1,24 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/../command_handler"
5
+ require File.dirname(__FILE__) + "/models/r_widget"
6
+
7
+ class TableColumnPropertiesDataBindingCommandHandler
8
+ include CommandHandler
9
+
10
+ include_package 'org.eclipse.swt'
11
+ include_package 'org.eclipse.swt.widgets'
12
+
13
+ def can_handle?(parent, command_symbol, *args, &block)
14
+ parent.is_a?(RWidget) and
15
+ parent.widget.is_a?(Table) and
16
+ command_symbol.to_s == "column_properties" and
17
+ block == nil
18
+ end
19
+
20
+ def do_handle(parent, command_symbol, *args, &block)
21
+ args
22
+ end
23
+
24
+ end
@@ -0,0 +1,30 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/../command_handler"
5
+ require File.dirname(__FILE__) + "/models/r_widget"
6
+ require File.dirname(__FILE__) + "/models/table_items_updater"
7
+
8
+ class TableItemsDataBindingCommandHandler
9
+ include CommandHandler
10
+
11
+ include_package 'org.eclipse.swt.widgets'
12
+
13
+ def can_handle?(parent, command_symbol, *args, &block)
14
+ parent.is_a?(RWidget) and
15
+ parent.widget.is_a?(Table) and
16
+ command_symbol.to_s == "items" and
17
+ args.size == 2 and
18
+ args[0].is_a?(ModelObserver) and
19
+ args[0].evaluate_property.is_a?(Array) and
20
+ args[1].is_a?(Array) and
21
+ block == nil
22
+ end
23
+
24
+ def do_handle(parent, command_symbol, *args, &block)
25
+ model_observer = args[0]
26
+ column_properties = args[1]
27
+ TableItemsUpdater.new(parent, model_observer, column_properties)
28
+ end
29
+
30
+ end
@@ -0,0 +1,26 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/../command_handler"
5
+ require File.dirname(__FILE__) + "/models/r_widget"
6
+
7
+ class WidgetCommandHandler
8
+ include CommandHandler
9
+
10
+ include_package 'org.eclipse.swt.widgets'
11
+
12
+ def can_handle?(parent, command_symbol, *args, &block)
13
+ parent.is_a?(RWidget) and
14
+ command_symbol.to_s != "shell" and
15
+ (args.size == 0 or
16
+ (args.size == 1 and args[0].is_a?(Fixnum))) and
17
+ RWidget.widget_exists?(command_symbol.to_s)
18
+ end
19
+
20
+ def do_handle(parent, command_symbol, *args, &block)
21
+ style = args[0] if args.size == 1
22
+ puts "style argument is: " + style.to_s
23
+ RWidget.new(command_symbol.to_s, parent.widget, style)
24
+ end
25
+
26
+ end
@@ -0,0 +1,35 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/../command_handler"
5
+ require File.dirname(__FILE__) + "/models/r_widget"
6
+
7
+ class WidgetListenerCommandHandler
8
+ include CommandHandler
9
+
10
+ include_package 'org.eclipse.swt.widgets'
11
+
12
+ def can_handle?(parent, command_symbol, *args, &block)
13
+ parent.is_a?(RWidget) and
14
+ command_symbol.to_s[0,3] == "on_" and
15
+ command_symbol.to_s.length > 3 and
16
+ args.size == 0 and
17
+ parent.can_add_listener?(command_symbol.to_s[3, command_symbol.to_s.length])
18
+ end
19
+
20
+ def do_handle(parent, command_symbol, *args, &block)
21
+ parent.add_listener(command_symbol.to_s[3, command_symbol.to_s.length], &block)
22
+ ListenerParent.new #TODO refactor and move to models
23
+ end
24
+
25
+ #TODO refactor and move to separate file
26
+ class ListenerParent
27
+ include Parent
28
+
29
+ def process_block(block)
30
+ #NOOP
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/../command_handler"
5
+ require File.dirname(__FILE__) + "/models/r_widget"
6
+
7
+ class WidgetMethodCommandHandler
8
+ include CommandHandler
9
+
10
+ def can_handle?(parent, command_symbol, *args, &block)
11
+ parent.is_a?(RWidget) and
12
+ args.size > 0 and
13
+ block == nil and
14
+ parent.respond_to?(command_symbol, *args)
15
+ end
16
+
17
+ def do_handle(parent, command_symbol, *args, &block)
18
+ parent.send(command_symbol, *args)
19
+ nil
20
+ end
21
+
22
+ end
data/src/glimmer.rb ADDED
@@ -0,0 +1,45 @@
1
+ # Glimmer - a JRuby DSL that enables easy and efficient authoring of user-interfaces
2
+ # using the robust platform-independent Eclipse SWT library. Glimmer comes with built-in
3
+ # data-binding support to greatly facilitate synchronizing UI with domain models.
4
+ #
5
+ # Copyright (C) 2007-2008 Annas Al Maleh
6
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
7
+
8
+ require "rubygems"
9
+ require "facets"
10
+ require "java"
11
+ require File.dirname(__FILE__) + "/parent"
12
+
13
+ module Glimmer
14
+
15
+ include_package 'org.eclipse.swt'
16
+
17
+ @@parent_stack = []
18
+
19
+ def self.method_missing(method_symbol, *args, &block)
20
+ puts "method: " + method_symbol.to_s + " and args: " + args.to_s
21
+ command_handler_chain = CommandHandlerChainFactory.chain
22
+ return_value = command_handler_chain.handle(@@parent_stack.last, method_symbol, *args, &block)
23
+ add_contents(return_value, &block)
24
+ return return_value
25
+ end
26
+
27
+ def self.add_contents(parent, &block)
28
+ @@parent_stack.push(parent) if parent.is_a?(Parent)
29
+ @@parent_stack.last.process_block(block) if block and @@parent_stack.last
30
+ @@parent_stack.pop if parent.is_a?(Parent)
31
+ end
32
+
33
+ #added for convenience
34
+
35
+ def method_missing(method_symbol, *args, &block)
36
+ Glimmer.method_missing(method_symbol, *args, &block)
37
+ end
38
+
39
+ def add_contents(parent, &block)
40
+ Glimmer.add_contents(parent, &block)
41
+ end
42
+ end
43
+
44
+ # Command handlers may rely on Glimmer, so this is put here to avoid an infinite loop.
45
+ #require File.dirname(__FILE__) + "/command_handlers"
data/src/parent.rb ADDED
@@ -0,0 +1,8 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ module Parent
5
+ def process_block(block)
6
+ raise "must be implemented by a class"
7
+ end
8
+ end
data/src/shine.rb ADDED
@@ -0,0 +1,24 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/glimmer"
5
+
6
+ class Array
7
+ include Glimmer
8
+
9
+ alias original_compare <=>
10
+
11
+ def <=>(other)
12
+ if (self[0].class.name == "RWidget")
13
+ add_contents(self[0]) {
14
+ if (other.size == 2)
15
+ eval("#{self[1]} bind (other[0], other[1])")
16
+ elsif (other.size == 3)
17
+ eval("#{self[1]} bind (other[0], other[1], other[2])")
18
+ end
19
+ }
20
+ else
21
+ original_compare(other)
22
+ end
23
+ end
24
+ end
data/src/swt.rb ADDED
@@ -0,0 +1,10 @@
1
+ # Glimmer - a JRuby DSL that enables easy and efficient authoring of user-interfaces
2
+ # using the robust platform-independent Eclipse SWT library. Glimmer comes with built-in
3
+ # data-binding support to greatly facilitate synchronizing UI with domain models.
4
+ #
5
+ # Copyright (C) 2007-2008 Annas Al Maleh
6
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
7
+
8
+ require File.dirname(__FILE__) + "/glimmer"
9
+ require File.dirname(__FILE__) + "/command_handlers"
10
+
data/src/xml.rb ADDED
@@ -0,0 +1,10 @@
1
+ # Glimmer - a JRuby DSL that enables easy and efficient authoring of user-interfaces
2
+ # using the robust platform-independent Eclipse SWT library. Glimmer comes with built-in
3
+ # data-binding support to greatly facilitate synchronizing UI with domain models.
4
+ #
5
+ # Copyright (C) 2007-2008 Annas Al Maleh
6
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
7
+
8
+ require File.dirname(__FILE__) + "/glimmer"
9
+ require File.dirname(__FILE__) + "/xml_command_handlers"
10
+
@@ -0,0 +1,18 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require File.dirname(__FILE__) + "/command_handler_chain_factory"
5
+ require File.dirname(__FILE__) + "/xml_command_handlers/xml_name_space_command_handler"
6
+ require File.dirname(__FILE__) + "/xml_command_handlers/xml_text_command_handler"
7
+ require File.dirname(__FILE__) + "/xml_command_handlers/xml_tag_command_handler"
8
+ require File.dirname(__FILE__) + "/xml_command_handlers/html_command_handler"
9
+ require File.dirname(__FILE__) + "/xml_command_handlers/xml_command_handler"
10
+
11
+ # edit to add more command handlers and extend Glimmer
12
+ CommandHandlerChainFactory.set_command_handlers(
13
+ XmlNameSpaceCommandHandler.new,
14
+ XmlTextCommandHandler.new,
15
+ XmlTagCommandHandler.new,
16
+ HtmlCommandHandler.new,
17
+ XmlCommandHandler.new
18
+ )
@@ -0,0 +1,49 @@
1
+ # Copyright (C) 2007-2008 Annas Al Maleh
2
+ # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
+
4
+ require "facets/dictionary"
5
+ require File.dirname(__FILE__) + "/../command_handler"
6
+ require File.dirname(__FILE__) + "/models/node"
7
+
8
+ class HtmlCommandHandler
9
+ include CommandHandler
10
+
11
+ def can_handle?(parent, command_symbol, *args, &block)
12
+ (parent == nil or parent.is_a?(Node)) and
13
+ (args.size == 0 or ((args.size == 1) and ((args[0].is_a?(Hash)) or (args[0].is_a?(Hash)))))
14
+ end
15
+
16
+ def do_handle(parent, command_symbol, *args, &block)
17
+ attributes = Dictionary.new
18
+ attributes = args[0] if (args.size == 1)
19
+ append_id_and_class_attributes(command_symbol.to_s, attributes)
20
+ tag_name = parse_tag_name(command_symbol.to_s)
21
+ Node.new(parent, tag_name, attributes, &block)
22
+ end
23
+
24
+ def parse_tag_name(command)
25
+ match_data = command.match("_")
26
+ if (match_data.to_a.size > 0)
27
+ command.match("_").pre_match
28
+ else
29
+ command
30
+ end
31
+ end
32
+
33
+ def append_id_and_class_attributes(command, attributes)
34
+ class_only_match = command.match("__.+").to_s
35
+ if class_only_match.length > 0
36
+ class_value = class_only_match[2, class_only_match.length]
37
+ else
38
+ match_data = command.match("_[^_]+")
39
+ return unless match_data
40
+ match = match_data.to_s
41
+ id_value = match[1, match.length] if match.length > 0
42
+ attributes[:id] = id_value if id_value
43
+ match2 = match_data.post_match.match("_[^_]+").to_s if match_data.post_match
44
+ class_value = match2[1, match2.length] if match2.length > 0
45
+ end
46
+ attributes[:class] = class_value if class_value
47
+ end
48
+
49
+ end