glimmer-dsl-swt 4.17.4.1 → 4.17.8.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 +4 -4
- data/CHANGELOG.md +41 -3
- data/README.md +267 -107
- data/VERSION +1 -1
- data/glimmer-dsl-swt.gemspec +24 -5
- data/lib/glimmer/data_binding/tree_items_binding.rb +20 -2
- data/lib/glimmer/dsl/swt/checkbox_group_selection_data_binding_expression.rb +61 -0
- data/lib/glimmer/dsl/swt/custom_widget_expression.rb +2 -0
- data/lib/glimmer/dsl/swt/dialog_expression.rb +1 -0
- data/lib/glimmer/dsl/swt/directory_dialog_expression.rb +48 -0
- data/lib/glimmer/dsl/swt/dsl.rb +2 -0
- data/lib/glimmer/dsl/swt/expand_item_expression.rb +60 -0
- data/lib/glimmer/dsl/swt/file_dialog_expression.rb +48 -0
- data/lib/glimmer/dsl/swt/radio_group_selection_data_binding_expression.rb +61 -0
- data/lib/glimmer/dsl/swt/shell_expression.rb +4 -4
- data/lib/glimmer/dsl/swt/widget_expression.rb +9 -8
- data/lib/glimmer/swt/custom/checkbox_group.rb +160 -0
- data/lib/glimmer/swt/custom/code_text.rb +25 -18
- data/lib/glimmer/swt/custom/radio_group.rb +155 -0
- data/lib/glimmer/swt/directory_dialog_proxy.rb +65 -0
- data/lib/glimmer/swt/expand_item_proxy.rb +97 -0
- data/lib/glimmer/swt/file_dialog_proxy.rb +66 -0
- data/lib/glimmer/swt/image_proxy.rb +5 -0
- data/lib/glimmer/swt/menu_proxy.rb +5 -5
- data/lib/glimmer/swt/sash_form_proxy.rb +1 -1
- data/lib/glimmer/swt/shell_proxy.rb +6 -6
- data/lib/glimmer/swt/styled_text_proxy.rb +43 -0
- data/lib/glimmer/swt/tab_item_proxy.rb +1 -1
- data/lib/glimmer/swt/widget_proxy.rb +86 -82
- data/lib/glimmer/ui/custom_shell.rb +4 -4
- data/lib/glimmer/ui/custom_widget.rb +3 -0
- data/samples/elaborate/meta_sample.rb +36 -31
- data/samples/hello/hello_checkbox.rb +85 -0
- data/samples/hello/hello_checkbox_group.rb +68 -0
- data/samples/hello/hello_combo.rb +12 -12
- data/samples/hello/hello_directory_dialog.rb +60 -0
- data/samples/hello/hello_expand_bar.rb +110 -0
- data/samples/hello/hello_file_dialog.rb +60 -0
- data/samples/hello/hello_list_multi_selection.rb +23 -23
- data/samples/hello/hello_list_single_selection.rb +18 -17
- data/samples/hello/hello_radio.rb +108 -0
- data/samples/hello/hello_radio_group.rb +84 -0
- data/samples/hello/hello_styled_text.rb +138 -0
- data/samples/hello/hello_world.rb +4 -4
- metadata +23 -4
@@ -0,0 +1,65 @@
|
|
1
|
+
# Copyright (c) 2007-2020 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/swt/swt_proxy'
|
23
|
+
require 'glimmer/swt/widget_proxy'
|
24
|
+
require 'glimmer/swt/display_proxy'
|
25
|
+
|
26
|
+
module Glimmer
|
27
|
+
module SWT
|
28
|
+
# Proxy for org.eclipse.swt.widgets.DirectoryDialog
|
29
|
+
#
|
30
|
+
# Automatically uses the current shell if one is open.
|
31
|
+
# Otherwise, it instantiates a new shell parent
|
32
|
+
#
|
33
|
+
# Optionally takes a shell as an argument
|
34
|
+
#
|
35
|
+
# Follows the Proxy Design Pattern
|
36
|
+
class DirectoryDialogProxy < WidgetProxy
|
37
|
+
# TODO write rspec tests
|
38
|
+
include_package 'org.eclipse.swt.widgets'
|
39
|
+
|
40
|
+
def initialize(*args, swt_widget: nil)
|
41
|
+
if swt_widget
|
42
|
+
@swt_widget = swt_widget
|
43
|
+
else
|
44
|
+
style_args = args.select {|arg| arg.is_a?(Symbol) || arg.is_a?(String)}
|
45
|
+
if style_args.any?
|
46
|
+
style_arg_start_index = args.index(style_args.first)
|
47
|
+
style_arg_last_index = args.index(style_args.last)
|
48
|
+
args[style_arg_start_index..style_arg_last_index] = SWTProxy[style_args]
|
49
|
+
end
|
50
|
+
if !args.first.is_a?(Shell)
|
51
|
+
current_shell = DisplayProxy.instance.swt_display.shells.first
|
52
|
+
args.unshift(current_shell.nil? ? ShellProxy.new : current_shell)
|
53
|
+
end
|
54
|
+
if args.first.is_a?(ShellProxy)
|
55
|
+
args[0] = args[0].swt_widget
|
56
|
+
end
|
57
|
+
parent = args[0]
|
58
|
+
@parent_proxy = parent.is_a?(Shell) ? ShellProxy.new(swt_widget: parent) : parent
|
59
|
+
@swt_widget = DirectoryDialog.new(*args)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# Copyright (c) 2007-2020 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/swt/widget_proxy'
|
23
|
+
require 'glimmer/swt/swt_proxy'
|
24
|
+
|
25
|
+
module Glimmer
|
26
|
+
module SWT
|
27
|
+
# Proxy for org.eclipse.swt.widgets.ExpandItem
|
28
|
+
#
|
29
|
+
# Functions differently from other widget proxies.
|
30
|
+
#
|
31
|
+
# Glimmer instantiates an SWT Composite alongside the SWT ExpandItem
|
32
|
+
# and returns it for `#swt_widget` to allow adding widgets into it.
|
33
|
+
#
|
34
|
+
# In order to get the SWT ExpandItem object, one must call `#swt_expand_item`.
|
35
|
+
#
|
36
|
+
# Behind the scenes, this creates a tab item widget proxy separately from a composite that
|
37
|
+
# is set as the control of the tab item and `#swt_widget`.
|
38
|
+
#
|
39
|
+
# In order to retrieve the tab item widget proxy, one must call `#widget_proxy`
|
40
|
+
#
|
41
|
+
# Follows the Proxy Design Pattern
|
42
|
+
class ExpandItemProxy < WidgetProxy
|
43
|
+
ATTRIBUTES = ['text', 'height', 'expanded']
|
44
|
+
|
45
|
+
include_package 'org.eclipse.swt.widgets'
|
46
|
+
|
47
|
+
attr_reader :widget_proxy, :swt_expand_item
|
48
|
+
|
49
|
+
def initialize(parent, style, &contents)
|
50
|
+
super("composite", parent, style, &contents)
|
51
|
+
layout = FillLayout.new(SWTProxy[:vertical])
|
52
|
+
layout.marginWidth = 0
|
53
|
+
layout.marginHeight = 0
|
54
|
+
layout.spacing = 0
|
55
|
+
swt_widget.layout = layout
|
56
|
+
@widget_proxy = SWT::WidgetProxy.new('expand_item', parent, style)
|
57
|
+
@swt_expand_item = @widget_proxy.swt_widget
|
58
|
+
@swt_expand_item.control = swt_widget
|
59
|
+
@swt_expand_item.expanded = true
|
60
|
+
end
|
61
|
+
|
62
|
+
def post_add_content
|
63
|
+
@swt_expand_item.setHeight(swt_widget.computeSize(SWTProxy[:default], SWTProxy[:default]).y) unless @swt_expand_item.getHeight > 0
|
64
|
+
end
|
65
|
+
|
66
|
+
def has_attribute?(attribute_name, *args)
|
67
|
+
if ATTRIBUTES.include?(attribute_name.to_s)
|
68
|
+
true
|
69
|
+
else
|
70
|
+
super(attribute_name, *args)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def set_attribute(attribute_name, *args)
|
75
|
+
if ATTRIBUTES.include?(attribute_name.to_s)
|
76
|
+
@widget_proxy.set_attribute(attribute_name, *args)
|
77
|
+
else
|
78
|
+
super(attribute_name, *args)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_attribute(attribute_name)
|
83
|
+
if ATTRIBUTES.include?(attribute_name.to_s)
|
84
|
+
@widget_proxy.get_attribute(attribute_name)
|
85
|
+
else
|
86
|
+
super(attribute_name)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def dispose
|
91
|
+
swt_expand_item.setControl(nil)
|
92
|
+
swt_widget.dispose
|
93
|
+
swt_expand_item.dispose
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Copyright (c) 2007-2020 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/swt/swt_proxy'
|
23
|
+
require 'glimmer/swt/widget_proxy'
|
24
|
+
require 'glimmer/swt/display_proxy'
|
25
|
+
|
26
|
+
module Glimmer
|
27
|
+
module SWT
|
28
|
+
# Proxy for org.eclipse.swt.widgets.FileDialog
|
29
|
+
#
|
30
|
+
# Automatically uses the current shell if one is open.
|
31
|
+
# Otherwise, it instantiates a new shell parent
|
32
|
+
#
|
33
|
+
# Optionally takes a shell as an argument
|
34
|
+
#
|
35
|
+
# Follows the Proxy Design Pattern
|
36
|
+
class FileDialogProxy < WidgetProxy
|
37
|
+
# TODO write rspec tests
|
38
|
+
# TODO consider refactoring and sharing code with DirectoryDialogProxy (and do the same with their expressions)
|
39
|
+
include_package 'org.eclipse.swt.widgets'
|
40
|
+
|
41
|
+
def initialize(*args, swt_widget: nil)
|
42
|
+
if swt_widget
|
43
|
+
@swt_widget = swt_widget
|
44
|
+
else
|
45
|
+
style_args = args.select {|arg| arg.is_a?(Symbol) || arg.is_a?(String)}
|
46
|
+
if style_args.any?
|
47
|
+
style_arg_start_index = args.index(style_args.first)
|
48
|
+
style_arg_last_index = args.index(style_args.last)
|
49
|
+
args[style_arg_start_index..style_arg_last_index] = SWTProxy[style_args]
|
50
|
+
end
|
51
|
+
if !args.first.is_a?(Shell)
|
52
|
+
current_shell = DisplayProxy.instance.swt_display.shells.first
|
53
|
+
args.unshift(current_shell.nil? ? ShellProxy.new : current_shell)
|
54
|
+
end
|
55
|
+
if args.first.is_a?(ShellProxy)
|
56
|
+
args[0] = args[0].swt_widget
|
57
|
+
end
|
58
|
+
parent = args[0]
|
59
|
+
@parent_proxy = parent.is_a?(Shell) ? ShellProxy.new(swt_widget: parent) : parent
|
60
|
+
@swt_widget = FileDialog.new(*args)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -58,6 +58,11 @@ module Glimmer
|
|
58
58
|
elsif @file_path
|
59
59
|
@image_data = ImageData.new(input_stream || @file_path)
|
60
60
|
@swt_image = Image.new(DisplayProxy.instance.swt_display, @image_data)
|
61
|
+
width = options[:width]
|
62
|
+
height = options[:height]
|
63
|
+
height = (@image_data.height.to_f / @image_data.width.to_f)*width.to_f if !width.nil? && height.nil?
|
64
|
+
width = (@image_data.width.to_f / @image_data.height.to_f)*height.to_f if !height.nil? && width.nil?
|
65
|
+
scale_to(width, height) unless width.nil? || height.nil?
|
61
66
|
else
|
62
67
|
@swt_image = Image.new(*@args)
|
63
68
|
@image_data = @swt_image.image_data
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2007-2020 Andy Maleh
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
5
5
|
# "Software"), to deal in the Software without restriction, including
|
@@ -7,10 +7,10 @@
|
|
7
7
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
8
|
# permit persons to whom the Software is furnished to do so, subject to
|
9
9
|
# the following conditions:
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# The above copyright notice and this permission notice shall be
|
12
12
|
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
15
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
16
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
@@ -116,7 +116,7 @@ module Glimmer
|
|
116
116
|
else
|
117
117
|
menu_item_proxy.handle_observation_request(observation_request, &block)
|
118
118
|
end
|
119
|
-
end
|
119
|
+
end
|
120
120
|
end
|
121
121
|
end
|
122
|
-
end
|
122
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2007-2020 Andy Maleh
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
5
5
|
# "Software"), to deal in the Software without restriction, including
|
@@ -7,10 +7,10 @@
|
|
7
7
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
8
|
# permit persons to whom the Software is furnished to do so, subject to
|
9
9
|
# the following conditions:
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# The above copyright notice and this permission notice shall be
|
12
12
|
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
15
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
16
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
@@ -65,7 +65,7 @@ module Glimmer
|
|
65
65
|
@swt_widget.setMinimumSize(WIDTH_MIN, HEIGHT_MIN)
|
66
66
|
# TODO make this an option not the default
|
67
67
|
on_swt_show do
|
68
|
-
Thread.new do
|
68
|
+
Thread.new do
|
69
69
|
sleep(0.25)
|
70
70
|
async_exec do
|
71
71
|
@swt_widget.setActive unless @swt_widget.isDisposed
|
@@ -130,7 +130,7 @@ module Glimmer
|
|
130
130
|
@swt_widget.pack
|
131
131
|
@swt_widget.removeControlListener(listener.swt_listener)
|
132
132
|
@swt_widget.setMinimumSize(minimum_size)
|
133
|
-
elsif OS.linux?
|
133
|
+
elsif OS.linux?
|
134
134
|
@swt_widget.layout(true, true)
|
135
135
|
@swt_widget.setBounds(bounds)
|
136
136
|
end
|
@@ -171,4 +171,4 @@ module Glimmer
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
end
|
174
|
-
end
|
174
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Copyright (c) 2007-2020 Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/swt/widget_proxy'
|
23
|
+
|
24
|
+
module Glimmer
|
25
|
+
module SWT
|
26
|
+
# Proxy for org.eclipse.swt.custom.StyledText
|
27
|
+
#
|
28
|
+
# Follows the Proxy Design Pattern
|
29
|
+
class StyledTextProxy < WidgetProxy
|
30
|
+
def set_attribute(attribute_name, *args)
|
31
|
+
if attribute_name.to_s == 'selection'
|
32
|
+
if args.first
|
33
|
+
async_exec { @swt_widget.setCaretOffset(args.first.x) }
|
34
|
+
async_exec { @swt_widget.setSelection(args.first) }
|
35
|
+
end
|
36
|
+
else
|
37
|
+
super(attribute_name, *args)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -47,7 +47,7 @@ module Glimmer
|
|
47
47
|
super("composite", parent, style, &contents)
|
48
48
|
@widget_proxy = SWT::WidgetProxy.new('tab_item', parent, style)
|
49
49
|
@swt_tab_item = @widget_proxy.swt_widget
|
50
|
-
@
|
50
|
+
@swt_tab_item.control = swt_widget
|
51
51
|
end
|
52
52
|
|
53
53
|
def has_attribute?(attribute_name, *args)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2007-2020 Andy Maleh
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
5
5
|
# "Software"), to deal in the Software without restriction, including
|
@@ -7,10 +7,10 @@
|
|
7
7
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
8
|
# permit persons to whom the Software is furnished to do so, subject to
|
9
9
|
# the following conditions:
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# The above copyright notice and this permission notice shall be
|
12
12
|
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
15
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
16
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
@@ -44,26 +44,29 @@ module Glimmer
|
|
44
44
|
include Packages
|
45
45
|
|
46
46
|
DEFAULT_STYLES = {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
47
|
+
'arrow' => [:arrow],
|
48
|
+
'button' => [:push],
|
49
|
+
'checkbox' => [:check],
|
50
|
+
'check' => [:check],
|
51
|
+
'drag_source' => [:drop_copy],
|
52
|
+
'drop_target' => [:drop_copy],
|
53
|
+
'expand_bar' => [:v_scroll],
|
54
|
+
'list' => [:border, :v_scroll],
|
55
|
+
'menu_item' => [:push],
|
56
|
+
'radio' => [:radio],
|
57
|
+
'scrolled_composite' => [:border, :h_scroll, :v_scroll],
|
58
|
+
'spinner' => [:border],
|
59
|
+
'styled_text' => [:border, :multi, :v_scroll, :h_scroll],
|
60
|
+
'table' => [:virtual, :border, :full_selection],
|
61
|
+
'text' => [:border],
|
62
|
+
'toggle' => [:toggle],
|
63
|
+
'tool_bar' => [:push],
|
64
|
+
'tool_item' => [:push],
|
65
|
+
'tree' => [:virtual, :border, :h_scroll, :v_scroll],
|
63
66
|
}
|
64
67
|
|
65
68
|
DEFAULT_INITIALIZERS = {
|
66
|
-
|
69
|
+
'composite' => lambda do |composite|
|
67
70
|
if composite.get_layout.nil?
|
68
71
|
layout = GridLayout.new
|
69
72
|
layout.marginWidth = 15
|
@@ -71,28 +74,28 @@ module Glimmer
|
|
71
74
|
composite.layout = layout
|
72
75
|
end
|
73
76
|
end,
|
74
|
-
|
77
|
+
'scrolled_composite' => lambda do |scrolled_composite|
|
75
78
|
scrolled_composite.expand_horizontal = true
|
76
79
|
scrolled_composite.expand_vertical = true
|
77
80
|
end,
|
78
|
-
|
81
|
+
'table' => lambda do |table|
|
79
82
|
table.setHeaderVisible(true)
|
80
83
|
table.setLinesVisible(true)
|
81
84
|
end,
|
82
|
-
|
85
|
+
'table_column' => lambda do |table_column|
|
83
86
|
table_column.setWidth(80)
|
84
87
|
end,
|
85
|
-
|
88
|
+
'group' => lambda do |group|
|
86
89
|
group.layout = GridLayout.new if group.get_layout.nil?
|
87
90
|
end,
|
88
91
|
}
|
89
92
|
|
90
93
|
KEYWORD_ALIASES = {
|
91
|
-
'
|
94
|
+
'arrow' => 'button',
|
92
95
|
'checkbox' => 'button',
|
93
96
|
'check' => 'button',
|
97
|
+
'radio' => 'button',
|
94
98
|
'toggle' => 'button',
|
95
|
-
'arrow' => 'button',
|
96
99
|
}
|
97
100
|
|
98
101
|
class << self
|
@@ -105,7 +108,7 @@ module Glimmer
|
|
105
108
|
if init_args.empty?
|
106
109
|
selected_widget_proxy_class.new(swt_widget: swt_widget)
|
107
110
|
else
|
108
|
-
selected_widget_proxy_class.new(*init_args)
|
111
|
+
selected_widget_proxy_class.new(*init_args)
|
109
112
|
end
|
110
113
|
end
|
111
114
|
|
@@ -116,11 +119,11 @@ module Glimmer
|
|
116
119
|
Glimmer::SWT.const_get(class_name)
|
117
120
|
rescue
|
118
121
|
Glimmer::SWT::WidgetProxy
|
119
|
-
end
|
122
|
+
end
|
120
123
|
end
|
121
124
|
|
122
125
|
def underscored_widget_name(swt_widget)
|
123
|
-
swt_widget.class.name.split(/::|\./).last.underscore
|
126
|
+
swt_widget.class.name.split(/::|\./).last.underscore
|
124
127
|
end
|
125
128
|
end
|
126
129
|
|
@@ -128,7 +131,7 @@ module Glimmer
|
|
128
131
|
|
129
132
|
# Initializes a new SWT Widget
|
130
133
|
#
|
131
|
-
# It is preferred to use `::create` method instead since it instantiates the
|
134
|
+
# It is preferred to use `::create` method instead since it instantiates the
|
132
135
|
# right subclass per widget keyword
|
133
136
|
#
|
134
137
|
# keyword, parent, swt_widget_args (including styles)
|
@@ -149,7 +152,7 @@ module Glimmer
|
|
149
152
|
@parent_proxy = parent.get_data('proxy') || parent_proxy_class.new(swt_widget: parent)
|
150
153
|
end
|
151
154
|
if @swt_widget&.get_data('proxy').nil?
|
152
|
-
@swt_widget.set_data('proxy', self)
|
155
|
+
@swt_widget.set_data('proxy', self)
|
153
156
|
DEFAULT_INITIALIZERS[underscored_widget_name]&.call(@swt_widget)
|
154
157
|
@parent_proxy.post_initialize_child(self)
|
155
158
|
end
|
@@ -216,7 +219,11 @@ module Glimmer
|
|
216
219
|
def get_attribute(attribute_name)
|
217
220
|
widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
|
218
221
|
if widget_custom_attribute
|
219
|
-
|
222
|
+
if widget_custom_attribute[:getter][:invoker]
|
223
|
+
widget_custom_attribute[:getter][:invoker].call(@swt_widget, [])
|
224
|
+
else
|
225
|
+
@swt_widget.send(widget_custom_attribute[:getter][:name])
|
226
|
+
end
|
220
227
|
else
|
221
228
|
@swt_widget.send(attribute_getter(attribute_name))
|
222
229
|
end
|
@@ -330,43 +337,33 @@ module Glimmer
|
|
330
337
|
}
|
331
338
|
end,
|
332
339
|
:caret_position => lambda do |observer|
|
333
|
-
on_swt_keydown { |event|
|
334
|
-
observer.call(@swt_widget.getCaretPosition)
|
335
|
-
}
|
336
340
|
on_swt_keyup { |event|
|
337
|
-
observer.call(@swt_widget.
|
341
|
+
observer.call(@swt_widget.getCaretOffset)
|
338
342
|
}
|
339
|
-
|
340
|
-
observer.call(@swt_widget.
|
343
|
+
on_swt_mouseup { |event|
|
344
|
+
observer.call(@swt_widget.getCaretOffset)
|
345
|
+
}
|
346
|
+
end,
|
347
|
+
:caret_offset => lambda do |observer|
|
348
|
+
on_swt_keyup { |event|
|
349
|
+
observer.call(@swt_widget.getCaretOffset)
|
341
350
|
}
|
342
351
|
on_swt_mouseup { |event|
|
343
|
-
observer.call(@swt_widget.
|
352
|
+
observer.call(@swt_widget.getCaretOffset)
|
344
353
|
}
|
345
354
|
end,
|
346
355
|
:selection => lambda do |observer|
|
347
|
-
on_swt_keydown { |event|
|
348
|
-
observer.call(@swt_widget.getSelection)
|
349
|
-
}
|
350
356
|
on_swt_keyup { |event|
|
351
|
-
observer.call(@swt_widget.getSelection)
|
352
|
-
}
|
353
|
-
on_swt_mousedown { |event|
|
354
|
-
observer.call(@swt_widget.getSelection)
|
357
|
+
observer.call(@swt_widget.getSelection) unless @swt_widget.getSelection.x == 0 && @swt_widget.getSelection.y == 0
|
355
358
|
}
|
356
359
|
on_swt_mouseup { |event|
|
357
|
-
observer.call(@swt_widget.getSelection)
|
360
|
+
observer.call(@swt_widget.getSelection) unless @swt_widget.getSelection.x == 0 && @swt_widget.getSelection.y == 0
|
358
361
|
}
|
359
362
|
end,
|
360
363
|
:selection_count => lambda do |observer|
|
361
|
-
on_swt_keydown { |event|
|
362
|
-
observer.call(@swt_widget.getSelectionCount)
|
363
|
-
}
|
364
364
|
on_swt_keyup { |event|
|
365
365
|
observer.call(@swt_widget.getSelectionCount)
|
366
366
|
}
|
367
|
-
on_swt_mousedown { |event|
|
368
|
-
observer.call(@swt_widget.getSelectionCount)
|
369
|
-
}
|
370
367
|
on_swt_mouseup { |event|
|
371
368
|
observer.call(@swt_widget.getSelectionCount)
|
372
369
|
}
|
@@ -379,7 +376,16 @@ module Glimmer
|
|
379
376
|
observer.call(@last_top_index)
|
380
377
|
end
|
381
378
|
}
|
382
|
-
end,
|
379
|
+
end,
|
380
|
+
:top_pixel => lambda do |observer|
|
381
|
+
@last_top_pixel = @swt_widget.getTopPixel
|
382
|
+
on_paint_control { |event|
|
383
|
+
if @swt_widget.getTopPixel != @last_top_pixel
|
384
|
+
@last_top_pixel = @swt_widget.getTopPixel
|
385
|
+
observer.call(@last_top_pixel)
|
386
|
+
end
|
387
|
+
}
|
388
|
+
end,
|
383
389
|
},
|
384
390
|
Java::OrgEclipseSwtWidgets::Button => {
|
385
391
|
:selection => lambda do |observer|
|
@@ -474,13 +480,13 @@ module Glimmer
|
|
474
480
|
proxy.set_attribute(:transfer, :text)
|
475
481
|
proxy.on_drag_enter { |event|
|
476
482
|
event.detail = DNDProxy[:drop_copy]
|
477
|
-
}
|
483
|
+
}
|
478
484
|
end
|
479
485
|
end
|
480
486
|
|
481
487
|
# TODO eliminate duplication in the following methods perhaps by relying on exceptions
|
482
488
|
|
483
|
-
def can_handle_observation_request?(observation_request)
|
489
|
+
def can_handle_observation_request?(observation_request)
|
484
490
|
observation_request = observation_request.to_s
|
485
491
|
if observation_request.start_with?('on_swt_')
|
486
492
|
constant_name = observation_request.sub(/^on_swt_/, '')
|
@@ -503,7 +509,7 @@ module Glimmer
|
|
503
509
|
end
|
504
510
|
rescue => e
|
505
511
|
Glimmer::Config.logger.debug {e.full_message}
|
506
|
-
false
|
512
|
+
false
|
507
513
|
end
|
508
514
|
|
509
515
|
def can_handle_drop_observation_request?(observation_request)
|
@@ -541,7 +547,7 @@ module Glimmer
|
|
541
547
|
end
|
542
548
|
|
543
549
|
def method_missing(method, *args, &block)
|
544
|
-
if can_handle_observation_request?(method)
|
550
|
+
if can_handle_observation_request?(method)
|
545
551
|
handle_observation_request(method, &block)
|
546
552
|
else
|
547
553
|
swt_widget.send(method, *args, &block)
|
@@ -553,7 +559,7 @@ module Glimmer
|
|
553
559
|
end
|
554
560
|
|
555
561
|
def respond_to?(method, *args, &block)
|
556
|
-
super ||
|
562
|
+
super ||
|
557
563
|
can_handle_observation_request?(method) ||
|
558
564
|
swt_widget.respond_to?(method, *args, &block)
|
559
565
|
end
|
@@ -561,7 +567,7 @@ module Glimmer
|
|
561
567
|
private
|
562
568
|
|
563
569
|
def style(underscored_widget_name, styles)
|
564
|
-
styles = [styles].flatten.compact
|
570
|
+
styles = [styles].flatten.compact
|
565
571
|
styles = default_style(underscored_widget_name) if styles.empty?
|
566
572
|
interpret_style(*styles)
|
567
573
|
end
|
@@ -597,9 +603,9 @@ module Glimmer
|
|
597
603
|
end
|
598
604
|
|
599
605
|
def add_listener(underscored_listener_name, &block)
|
600
|
-
widget_add_listener_method, listener_class, listener_method = self.class.find_listener(@swt_widget.getClass, underscored_listener_name)
|
606
|
+
widget_add_listener_method, listener_class, listener_method = self.class.find_listener(@swt_widget.getClass, underscored_listener_name)
|
601
607
|
widget_listener_proxy = nil
|
602
|
-
safe_block = lambda { |*args| block.call(*args) unless @swt_widget.isDisposed }
|
608
|
+
safe_block = lambda { |*args| block.call(*args) unless @swt_widget.isDisposed }
|
603
609
|
listener = listener_class.new(listener_method => safe_block)
|
604
610
|
@swt_widget.send(widget_add_listener_method, listener)
|
605
611
|
widget_listener_proxy = WidgetListenerProxy.new(swt_widget: @swt_widget, swt_listener: listener, widget_add_listener_method: widget_add_listener_method, swt_listener_class: listener_class, swt_listener_method: listener_method)
|
@@ -641,7 +647,7 @@ module Glimmer
|
|
641
647
|
listener_class.define_method('initialize') do |event_method_block_mapping|
|
642
648
|
@event_method_block_mapping = event_method_block_mapping
|
643
649
|
end
|
644
|
-
listener_type.getMethods.each do |event_method|
|
650
|
+
listener_type.getMethods.each do |event_method|
|
645
651
|
listener_class.define_method(event_method.getName) do |*args|
|
646
652
|
@event_method_block_mapping[event_method.getName]&.call(*args)
|
647
653
|
end
|
@@ -660,21 +666,21 @@ module Glimmer
|
|
660
666
|
end
|
661
667
|
|
662
668
|
def widget_custom_attribute_mapping
|
669
|
+
# TODO scope per widget class type just like other mappings
|
663
670
|
@swt_widget_custom_attribute_mapping ||= {
|
664
671
|
'focus' => {
|
665
672
|
getter: {name: 'isFocusControl'},
|
666
673
|
setter: {name: 'setFocus', invoker: lambda { |widget, args| @swt_widget.setFocus if args.first }},
|
667
674
|
},
|
668
675
|
'caret_position' => {
|
669
|
-
getter: {name: 'getCaretPosition'},
|
676
|
+
getter: {name: 'getCaretPosition', invoker: lambda { |widget, args| @swt_widget.respond_to?(:getCaretPosition) ? @swt_widget.getCaretPosition : @swt_widget.getCaretOffset}},
|
670
677
|
setter: {name: 'setSelection', invoker: lambda { |widget, args| @swt_widget.setSelection(args.first) if args.first }},
|
671
678
|
},
|
672
679
|
'selection_count' => {
|
673
680
|
getter: {name: 'getSelectionCount'},
|
674
|
-
setter: {name: 'setSelection', invoker: lambda { |widget, args|
|
675
|
-
|
676
|
-
caret_position
|
677
|
-
@swt_widget.setSelection(caret_position, caret_position + args.first) if args.first
|
681
|
+
setter: {name: 'setSelection', invoker: lambda { |widget, args|
|
682
|
+
caret_position = @swt_widget.respond_to?(:getCaretPosition) ? @swt_widget.getCaretPosition : @swt_widget.getCaretOffset
|
683
|
+
@swt_widget.setSelection(caret_position, caret_position + args.first) if args.first
|
678
684
|
}},
|
679
685
|
},
|
680
686
|
}
|
@@ -713,11 +719,9 @@ module Glimmer
|
|
713
719
|
end
|
714
720
|
|
715
721
|
def apply_property_type_converters(attribute_name, args)
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
args[0] = converter.call(value) if converter
|
720
|
-
end
|
722
|
+
value = args
|
723
|
+
converter = property_type_converters[attribute_name.to_sym]
|
724
|
+
args[0..-1] = [converter.call(*value)] if converter
|
721
725
|
if args.count == 1 && args.first.is_a?(ColorProxy)
|
722
726
|
g_color = args.first
|
723
727
|
args[0] = g_color.swt_color
|
@@ -738,8 +742,8 @@ module Glimmer
|
|
738
742
|
SWTProxy[*value]
|
739
743
|
},
|
740
744
|
:background => color_converter,
|
741
|
-
:background_image => lambda do
|
742
|
-
image_proxy = ImageProxy.create(value)
|
745
|
+
:background_image => lambda do |*value|
|
746
|
+
image_proxy = ImageProxy.create(*value)
|
743
747
|
|
744
748
|
if image_proxy&.file_path&.end_with?('.gif')
|
745
749
|
image = image_proxy.swt_image
|
@@ -769,13 +773,13 @@ module Glimmer
|
|
769
773
|
sleep(delayTime)
|
770
774
|
end
|
771
775
|
};
|
772
|
-
image_proxy = nil
|
776
|
+
image_proxy = nil
|
773
777
|
else
|
774
778
|
on_swt_Resize do |resize_event|
|
775
779
|
image_proxy.scale_to(@swt_widget.getSize.x, @swt_widget.getSize.y)
|
776
|
-
@swt_widget.setBackgroundImage(image_proxy.swt_image)
|
777
|
-
end
|
778
|
-
end
|
780
|
+
@swt_widget.setBackgroundImage(image_proxy.swt_image)
|
781
|
+
end
|
782
|
+
end
|
779
783
|
|
780
784
|
image_proxy&.swt_image
|
781
785
|
end,
|
@@ -797,8 +801,8 @@ module Glimmer
|
|
797
801
|
value
|
798
802
|
end
|
799
803
|
end,
|
800
|
-
:image => lambda do
|
801
|
-
ImageProxy.create(value).swt_image
|
804
|
+
:image => lambda do |*value|
|
805
|
+
ImageProxy.create(*value).swt_image
|
802
806
|
end,
|
803
807
|
:images => lambda do |array|
|
804
808
|
array.to_a.map do |value|
|
@@ -837,4 +841,4 @@ module Glimmer
|
|
837
841
|
end
|
838
842
|
end
|
839
843
|
end
|
840
|
-
end
|
844
|
+
end
|