glimmer-dsl-swt 0.1.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.
- checksums.yaml +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +47 -0
- data/RUBY_VERSION +1 -0
- data/VERSION +1 -0
- data/bin/girb +10 -0
- data/bin/girb_runner.rb +13 -0
- data/bin/glimmer +5 -0
- data/icons/scaffold_app.icns +0 -0
- data/lib/ext/glimmer.rb +13 -0
- data/lib/ext/glimmer/config.rb +18 -0
- data/lib/glimmer-dsl-swt.rb +12 -0
- data/lib/glimmer/data_binding/list_selection_binding.rb +52 -0
- data/lib/glimmer/data_binding/model_binding.rb +248 -0
- data/lib/glimmer/data_binding/observable.rb +21 -0
- data/lib/glimmer/data_binding/observable_array.rb +107 -0
- data/lib/glimmer/data_binding/observable_model.rb +108 -0
- data/lib/glimmer/data_binding/observable_widget.rb +17 -0
- data/lib/glimmer/data_binding/observer.rb +124 -0
- data/lib/glimmer/data_binding/shine.rb +23 -0
- data/lib/glimmer/data_binding/table_items_binding.rb +56 -0
- data/lib/glimmer/data_binding/tree_items_binding.rb +71 -0
- data/lib/glimmer/data_binding/widget_binding.rb +33 -0
- data/lib/glimmer/dsl/swt/async_exec_expression.rb +14 -0
- data/lib/glimmer/dsl/swt/bind_expression.rb +37 -0
- data/lib/glimmer/dsl/swt/color_expression.rb +19 -0
- data/lib/glimmer/dsl/swt/column_properties_expression.rb +24 -0
- data/lib/glimmer/dsl/swt/combo_selection_data_binding_expression.rb +42 -0
- data/lib/glimmer/dsl/swt/custom_widget_expression.rb +39 -0
- data/lib/glimmer/dsl/swt/data_binding_expression.rb +34 -0
- data/lib/glimmer/dsl/swt/dialog_expression.rb +26 -0
- data/lib/glimmer/dsl/swt/display_expression.rb +19 -0
- data/lib/glimmer/dsl/swt/dsl.rb +34 -0
- data/lib/glimmer/dsl/swt/exec_expression.rb +28 -0
- data/lib/glimmer/dsl/swt/layout_data_expression.rb +25 -0
- data/lib/glimmer/dsl/swt/layout_expression.rb +27 -0
- data/lib/glimmer/dsl/swt/list_selection_data_binding_expression.rb +44 -0
- data/lib/glimmer/dsl/swt/menu_bar_expression.rb +33 -0
- data/lib/glimmer/dsl/swt/menu_expression.rb +32 -0
- data/lib/glimmer/dsl/swt/message_box_expression.rb +29 -0
- data/lib/glimmer/dsl/swt/observe_expression.rb +32 -0
- data/lib/glimmer/dsl/swt/property_expression.rb +22 -0
- data/lib/glimmer/dsl/swt/rgb_expression.rb +12 -0
- data/lib/glimmer/dsl/swt/rgba_expression.rb +12 -0
- data/lib/glimmer/dsl/swt/shell_expression.rb +25 -0
- data/lib/glimmer/dsl/swt/swt_expression.rb +25 -0
- data/lib/glimmer/dsl/swt/sync_exec_expression.rb +15 -0
- data/lib/glimmer/dsl/swt/tab_item_expression.rb +33 -0
- data/lib/glimmer/dsl/swt/table_items_data_binding_expression.rb +31 -0
- data/lib/glimmer/dsl/swt/tree_items_data_binding_expression.rb +31 -0
- data/lib/glimmer/dsl/swt/tree_properties_expression.rb +26 -0
- data/lib/glimmer/dsl/swt/widget_expression.rb +35 -0
- data/lib/glimmer/dsl/swt/widget_listener_expression.rb +32 -0
- data/lib/glimmer/launcher.rb +196 -0
- data/lib/glimmer/package.rb +57 -0
- data/lib/glimmer/rake_task.rb +62 -0
- data/lib/glimmer/scaffold.rb +582 -0
- data/lib/glimmer/swt/color_proxy.rb +53 -0
- data/lib/glimmer/swt/display_proxy.rb +88 -0
- data/lib/glimmer/swt/font_proxy.rb +72 -0
- data/lib/glimmer/swt/layout_data_proxy.rb +84 -0
- data/lib/glimmer/swt/layout_proxy.rb +82 -0
- data/lib/glimmer/swt/menu_proxy.rb +101 -0
- data/lib/glimmer/swt/message_box_proxy.rb +48 -0
- data/lib/glimmer/swt/packages.rb +13 -0
- data/lib/glimmer/swt/shell_proxy.rb +152 -0
- data/lib/glimmer/swt/swt_proxy.rb +106 -0
- data/lib/glimmer/swt/tab_item_proxy.rb +65 -0
- data/lib/glimmer/swt/table_proxy.rb +150 -0
- data/lib/glimmer/swt/tree_proxy.rb +120 -0
- data/lib/glimmer/swt/widget_listener_proxy.rb +34 -0
- data/lib/glimmer/swt/widget_proxy.rb +489 -0
- data/lib/glimmer/ui/custom_shell.rb +45 -0
- data/lib/glimmer/ui/custom_widget.rb +244 -0
- data/lib/glimmer/util/proc_tracker.rb +16 -0
- data/vendor/swt/linux/swt.jar +0 -0
- data/vendor/swt/mac/swt.jar +0 -0
- data/vendor/swt/windows/swt.jar +0 -0
- metadata +307 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'glimmer/data_binding/observable_array'
|
2
|
+
require 'glimmer/data_binding/observable_model'
|
3
|
+
require 'glimmer/data_binding/observable'
|
4
|
+
require 'glimmer/data_binding/observer'
|
5
|
+
require 'glimmer/swt/swt_proxy'
|
6
|
+
|
7
|
+
module Glimmer
|
8
|
+
module DataBinding
|
9
|
+
class TreeItemsBinding
|
10
|
+
include DataBinding::Observable
|
11
|
+
include DataBinding::Observer
|
12
|
+
|
13
|
+
include_package 'org.eclipse.swt'
|
14
|
+
include_package 'org.eclipse.swt.widgets'
|
15
|
+
|
16
|
+
def initialize(parent, model_binding, tree_properties)
|
17
|
+
@tree = parent
|
18
|
+
@model_binding = model_binding
|
19
|
+
@tree_properties = [tree_properties].flatten.first.to_h
|
20
|
+
if @tree.respond_to?(:tree_properties=)
|
21
|
+
@tree.tree_properties = @tree_properties
|
22
|
+
else # assume custom widget
|
23
|
+
@tree.body_root.tree_properties = @tree_properties
|
24
|
+
end
|
25
|
+
call
|
26
|
+
model = model_binding.base_model
|
27
|
+
observe(model, model_binding.property_name_expression)
|
28
|
+
@tree.on_widget_disposed do |dispose_event|
|
29
|
+
unregister_all_observables
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(new_value=nil)
|
34
|
+
@model_tree_root_node = @model_binding.evaluate_property
|
35
|
+
populate_tree(@model_tree_root_node, @tree, @tree_properties)
|
36
|
+
end
|
37
|
+
|
38
|
+
def populate_tree(model_tree_root_node, parent, tree_properties)
|
39
|
+
# TODO make it change things by delta instead of removing all
|
40
|
+
selected_tree_item_model = parent.swt_widget.getSelection.map(&:getData).first
|
41
|
+
old_tree_items = parent.all_tree_items
|
42
|
+
old_tree_item_expansion_by_data = old_tree_items.reduce({}) {|hash, ti| hash.merge(ti.getData => ti.getExpanded)}
|
43
|
+
old_tree_items.each do |tree_item|
|
44
|
+
tree_item.getData('observer_registrations').each do |key, observer_registration|
|
45
|
+
observer_registration.unregister
|
46
|
+
end
|
47
|
+
end
|
48
|
+
parent.swt_widget.removeAll
|
49
|
+
populate_tree_node(model_tree_root_node, parent.swt_widget, tree_properties)
|
50
|
+
parent.all_tree_items.each { |ti| ti.setExpanded(!!old_tree_item_expansion_by_data[ti.getData]) }
|
51
|
+
tree_item_to_select = parent.depth_first_search {|ti| ti.getData == selected_tree_item_model}
|
52
|
+
parent.swt_widget.setSelection(tree_item_to_select)
|
53
|
+
end
|
54
|
+
|
55
|
+
def populate_tree_node(model_tree_node, parent, tree_properties)
|
56
|
+
return if model_tree_node.nil?
|
57
|
+
# TODO anticipate default tree properties if none were passed (like literal values text and children)
|
58
|
+
tree_item = TreeItem.new(parent, SWT::SWTProxy[:none])
|
59
|
+
observer_registrations = @tree_properties.reduce({}) do |hash, key_value_pair|
|
60
|
+
hash.merge(key_value_pair.first => observe(model_tree_node, key_value_pair.last))
|
61
|
+
end
|
62
|
+
tree_item.setData('observer_registrations', observer_registrations)
|
63
|
+
tree_item.setData(model_tree_node)
|
64
|
+
tree_item.setText((model_tree_node && model_tree_node.send(tree_properties[:text])).to_s)
|
65
|
+
[model_tree_node && model_tree_node.send(tree_properties[:children])].flatten.to_a.compact.each do |child|
|
66
|
+
populate_tree_node(child, tree_item, tree_properties)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'glimmer'
|
2
|
+
require_relative 'observable'
|
3
|
+
require_relative 'observer'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DataBinding
|
7
|
+
class WidgetBinding
|
8
|
+
include Glimmer
|
9
|
+
include Observable
|
10
|
+
include Observer
|
11
|
+
|
12
|
+
attr_reader :widget, :property
|
13
|
+
def initialize(model, property, translator = nil)
|
14
|
+
@widget = model
|
15
|
+
@property = property
|
16
|
+
@translator = translator || proc {|value| value}
|
17
|
+
|
18
|
+
if @widget.respond_to?(:dispose)
|
19
|
+
@widget.on_widget_disposed do |dispose_event|
|
20
|
+
unregister_all_observables
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
def call(value)
|
25
|
+
converted_value = translated_value = @translator.call(value)
|
26
|
+
@widget.set_attribute(@property, converted_value) unless evaluate_property == converted_value
|
27
|
+
end
|
28
|
+
def evaluate_property
|
29
|
+
@widget.get_attribute(@property)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/swt/exec_expression'
|
3
|
+
|
4
|
+
module Glimmer
|
5
|
+
module DSL
|
6
|
+
module SWT
|
7
|
+
# Asynchronously executes code block against the SWT Event Loop
|
8
|
+
# to manipulate SWT UI objects on the UI thread safely
|
9
|
+
class AsyncExecExpression < StaticExpression
|
10
|
+
include ExecExpression
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/data_binding/model_binding'
|
3
|
+
|
4
|
+
module Glimmer
|
5
|
+
module DSL
|
6
|
+
module SWT
|
7
|
+
# Responsible for setting up the return value of the bind keyword (command symbol)
|
8
|
+
# as a ModelBinding. It is then used by another command handler like
|
9
|
+
# DataBindingCommandHandler for text and selection properties on Text and Spinner
|
10
|
+
# or TableItemsDataBindingCommandHandler for items in a Table
|
11
|
+
class BindExpression < StaticExpression
|
12
|
+
def can_interpret?(parent, keyword, *args, &block)
|
13
|
+
(
|
14
|
+
keyword == 'bind' and
|
15
|
+
(
|
16
|
+
(
|
17
|
+
(args.size == 2) and
|
18
|
+
textual?(args[1])
|
19
|
+
) ||
|
20
|
+
(
|
21
|
+
(args.size == 3) and
|
22
|
+
textual?(args[1]) and
|
23
|
+
(args[2].is_a?(Hash))
|
24
|
+
)
|
25
|
+
)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def interpret(parent, keyword, *args, &block)
|
30
|
+
binding_options = args[2] || {}
|
31
|
+
binding_options[:on_read] = binding_options.delete(:on_read) || binding_options.delete('on_read') || block
|
32
|
+
DataBinding::ModelBinding.new(args[0], args[1].to_s, binding_options)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/top_level_expression'
|
3
|
+
require 'glimmer/swt/color_proxy'
|
4
|
+
require 'glimmer/swt/display_proxy'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module SWT
|
9
|
+
class ColorExpression < StaticExpression
|
10
|
+
include TopLevelExpression
|
11
|
+
include_package 'org.eclipse.swt.widgets'
|
12
|
+
|
13
|
+
def interpret(parent, keyword, *args, &block)
|
14
|
+
Glimmer::SWT::ColorProxy.new(*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
|
3
|
+
module Glimmer
|
4
|
+
module DSL
|
5
|
+
module SWT
|
6
|
+
# Responsible for providing a readable keyword (command symbol) to capture
|
7
|
+
# and return column properties for use in TreeItemsDataBindingCommandHandler
|
8
|
+
class ColumnPropertiesExpression < StaticExpression
|
9
|
+
include_package 'org.eclipse.swt.widgets'
|
10
|
+
|
11
|
+
def can_interpret?(parent, keyword, *args, &block)
|
12
|
+
keyword == 'column_properties' and
|
13
|
+
block.nil? and
|
14
|
+
parent.respond_to?(:swt_widget) and
|
15
|
+
parent.swt_widget.is_a?(Table)
|
16
|
+
end
|
17
|
+
|
18
|
+
def interpret(parent, keyword, *args, &block)
|
19
|
+
args
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'glimmer/dsl/expression'
|
2
|
+
require 'glimmer/data_binding/model_binding'
|
3
|
+
require 'glimmer/data_binding/widget_binding'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module SWT
|
8
|
+
class ComboSelectionDataBindingExpression < Expression
|
9
|
+
include_package 'org.eclipse.swt.widgets'
|
10
|
+
|
11
|
+
def can_interpret?(parent, keyword, *args, &block)
|
12
|
+
keyword == 'selection' and
|
13
|
+
block.nil? and
|
14
|
+
parent.respond_to?(:swt_widget) and
|
15
|
+
parent.swt_widget.is_a?(Combo) and
|
16
|
+
args.size == 1 and
|
17
|
+
args[0].is_a?(DataBinding::ModelBinding) and
|
18
|
+
args[0].evaluate_options_property.is_a?(Array)
|
19
|
+
end
|
20
|
+
|
21
|
+
def interpret(parent, keyword, *args, &block)
|
22
|
+
model_binding = args[0]
|
23
|
+
|
24
|
+
#TODO make this options observer dependent and all similar observers in widget specific data binding handlers
|
25
|
+
# TODO consider delegating some of this work
|
26
|
+
widget_binding = DataBinding::WidgetBinding.new(parent, 'items')
|
27
|
+
widget_binding.call(model_binding.evaluate_options_property)
|
28
|
+
model = model_binding.base_model
|
29
|
+
widget_binding.observe(model, model_binding.options_property_name)
|
30
|
+
|
31
|
+
widget_binding = DataBinding::WidgetBinding.new(parent, 'text')
|
32
|
+
widget_binding.call(model_binding.evaluate_property)
|
33
|
+
widget_binding.observe(model, model_binding.property_name_expression)
|
34
|
+
|
35
|
+
parent.on_widget_selected do
|
36
|
+
model_binding.call(widget_binding.evaluate_property)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'glimmer'
|
2
|
+
require 'glimmer/dsl/expression'
|
3
|
+
require 'glimmer/dsl/parent_expression'
|
4
|
+
require 'glimmer/dsl/top_level_expression'
|
5
|
+
require 'glimmer/ui/custom_widget'
|
6
|
+
require 'glimmer/ui/custom_shell'
|
7
|
+
|
8
|
+
module Glimmer
|
9
|
+
module DSL
|
10
|
+
module SWT
|
11
|
+
class CustomWidgetExpression < Expression
|
12
|
+
# TODO Make custom widgets automatically generate static expressions
|
13
|
+
include ParentExpression
|
14
|
+
include TopLevelExpression
|
15
|
+
|
16
|
+
def can_interpret?(parent, keyword, *args, &block)
|
17
|
+
custom_widget_class = UI::CustomWidget.for(keyword)
|
18
|
+
custom_widget_class and
|
19
|
+
(parent.respond_to?(:swt_widget) or
|
20
|
+
custom_widget_class.ancestors.include?(UI::CustomShell))
|
21
|
+
end
|
22
|
+
|
23
|
+
def interpret(parent, keyword, *args, &block)
|
24
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
25
|
+
UI::CustomWidget.for(keyword).new(parent, *args, options, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_content(parent, &block)
|
29
|
+
# TODO consider avoiding source_location
|
30
|
+
if block.source_location == parent.content&.__getobj__.source_location
|
31
|
+
parent.content.call(parent) unless parent.content.called?
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'glimmer/dsl/expression'
|
2
|
+
require 'glimmer/data_binding/model_binding'
|
3
|
+
require 'glimmer/data_binding/widget_binding'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module SWT
|
8
|
+
# Responsible for wiring two-way data-binding for text and selection properties
|
9
|
+
# on Text, Button, and Spinner widgets.
|
10
|
+
# Does so by using the output of the bind(model, property) command in the form
|
11
|
+
# of a ModelBinding, which is then connected to an anonymous widget observer
|
12
|
+
# (aka widget_data_binder as per widget_data_binders array)
|
13
|
+
#
|
14
|
+
# Depends on BindCommandHandler
|
15
|
+
class DataBindingExpression < Expression
|
16
|
+
def can_interpret?(parent, keyword, *args, &block)
|
17
|
+
args.size == 1 and
|
18
|
+
args[0].is_a?(DataBinding::ModelBinding)
|
19
|
+
end
|
20
|
+
|
21
|
+
def interpret(parent, keyword, *args, &block)
|
22
|
+
model_binding = args[0]
|
23
|
+
widget_binding_parameters = [parent, keyword]
|
24
|
+
widget_binding = DataBinding::WidgetBinding.new(*widget_binding_parameters)
|
25
|
+
widget_binding.call(model_binding.evaluate_property)
|
26
|
+
#TODO make this options observer dependent and all similar observers in widget specific data binding handlers
|
27
|
+
widget_binding.observe(model_binding)
|
28
|
+
# TODO simplify this logic and put it where it belongs
|
29
|
+
parent.add_observer(model_binding, keyword) if parent.respond_to?(:add_observer, [model_binding, keyword])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/dsl/top_level_expression'
|
4
|
+
require 'glimmer/swt/shell_proxy'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module SWT
|
9
|
+
class DialogExpression < StaticExpression
|
10
|
+
include TopLevelExpression
|
11
|
+
include ParentExpression
|
12
|
+
|
13
|
+
def can_interpret?(parent, keyword, *args, &block)
|
14
|
+
keyword == 'dialog' and
|
15
|
+
(parent.nil? or parent.is_a?(Glimmer::SWT::ShellProxy))
|
16
|
+
end
|
17
|
+
|
18
|
+
def interpret(parent, keyword, *args, &block)
|
19
|
+
args = [parent] + args unless parent.nil?
|
20
|
+
args += [:dialog_trim, :application_modal]
|
21
|
+
Glimmer::SWT::ShellProxy.send(:new, *args)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/dsl/top_level_expression'
|
4
|
+
require 'glimmer/swt/display_proxy'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module SWT
|
9
|
+
class DisplayExpression < StaticExpression
|
10
|
+
include TopLevelExpression
|
11
|
+
include ParentExpression
|
12
|
+
|
13
|
+
def interpret(parent, keyword, *args, &block)
|
14
|
+
Glimmer::SWT::DisplayProxy.instance(*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'glimmer/launcher'
|
2
|
+
require Glimmer::Launcher.swt_jar_file
|
3
|
+
require 'glimmer/dsl/engine'
|
4
|
+
Dir[File.expand_path('../*_expression.rb', __FILE__)].each {|f| require f}
|
5
|
+
|
6
|
+
# Glimmer DSL expression configuration module
|
7
|
+
#
|
8
|
+
# When DSL engine interprets an expression, it attempts to handle
|
9
|
+
# with expressions listed here in the order specified.
|
10
|
+
|
11
|
+
# Every expression has a corresponding Expression subclass
|
12
|
+
# in glimmer/dsl
|
13
|
+
|
14
|
+
module Glimmer
|
15
|
+
module DSL
|
16
|
+
module SWT
|
17
|
+
Engine.add_dynamic_expressions(
|
18
|
+
SWT,
|
19
|
+
%w[
|
20
|
+
layout
|
21
|
+
widget_listener
|
22
|
+
combo_selection_data_binding
|
23
|
+
list_selection_data_binding
|
24
|
+
tree_items_data_binding
|
25
|
+
table_items_data_binding
|
26
|
+
data_binding
|
27
|
+
property
|
28
|
+
widget
|
29
|
+
custom_widget
|
30
|
+
]
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'glimmer/dsl/top_level_expression'
|
2
|
+
require 'glimmer/swt/display_proxy'
|
3
|
+
|
4
|
+
module Glimmer
|
5
|
+
module DSL
|
6
|
+
module SWT
|
7
|
+
# Mixin for common code in async_exec and sync_exec expressions
|
8
|
+
# Uses name in subclass to auto-derive exec_operation
|
9
|
+
module ExecExpression
|
10
|
+
include TopLevelExpression
|
11
|
+
|
12
|
+
def exec_operation
|
13
|
+
@exec_operation ||= self.class.name.split(/::/).last.sub(/Expression$/, '').underscore
|
14
|
+
end
|
15
|
+
|
16
|
+
def can_interpret?(parent, keyword, *args, &block)
|
17
|
+
keyword == exec_operation and
|
18
|
+
block_given? and
|
19
|
+
args.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
def interpret(parent, keyword, *args, &block)
|
23
|
+
Glimmer::SWT::DisplayProxy.instance.send(exec_operation, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'glimmer'
|
2
|
+
require 'glimmer/dsl/static_expression'
|
3
|
+
require 'glimmer/dsl/parent_expression'
|
4
|
+
require 'glimmer/swt/layout_data_proxy'
|
5
|
+
|
6
|
+
# TODO consider turning static keywords like layout_data into methods
|
7
|
+
|
8
|
+
module Glimmer
|
9
|
+
module DSL
|
10
|
+
module SWT
|
11
|
+
class LayoutDataExpression < StaticExpression
|
12
|
+
include ParentExpression
|
13
|
+
|
14
|
+
def can_interpret?(parent, keyword, *args, &block)
|
15
|
+
keyword == 'layout_data' and
|
16
|
+
parent.respond_to?(:swt_widget)
|
17
|
+
end
|
18
|
+
|
19
|
+
def interpret(parent, keyword, *args, &block)
|
20
|
+
Glimmer::SWT::LayoutDataProxy.new(parent, args)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|