Class: Glimmer::SWT::WidgetProxy
Overview
Proxy for SWT Widget objects
Sets default SWT styles to widgets upon inititalizing as per DEFAULT_STYLES
Also, auto-initializes widgets as per initializer blocks in DEFAULT_INITIALIZERS (e.g. setting Composite default layout)
Follows the Proxy Design Pattern
Constant Summary
collapse
- DEFAULT_STYLES =
{
"text" => [:border],
"table" => [:border],
"spinner" => [:border],
"list" => [:border, :v_scroll],
"button" => [:push],
"menu_item" => [:push],
}
- DEFAULT_INITIALIZERS =
{
"composite" => proc do |composite|
composite.setLayout(GridLayout.new)
end,
"table" => proc do |table|
table.(true)
table.setLinesVisible(true)
end,
"table_column" => proc do |table_column|
table_column.setWidth(80)
end,
"group" => proc do |group|
group.setLayout(GridLayout.new)
end,
}
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#method_missing
Constructor Details
#initialize(underscored_widget_name, parent, args) ⇒ WidgetProxy
Initializes a new SWT Widget
Styles is a comma separate list of symbols representing SWT styles in lower case
54
55
56
57
58
59
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 54
def initialize(underscored_widget_name, parent, args)
styles, = (underscored_widget_name, args)
swt_widget_class = self.class.swt_widget_class_for(underscored_widget_name)
@swt_widget = swt_widget_class.new(parent.swt_widget, style(underscored_widget_name, styles), *)
DEFAULT_INITIALIZERS[underscored_widget_name]&.call(@swt_widget)
end
|
Instance Attribute Details
Returns the value of attribute swt_widget.
49
50
51
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 49
def swt_widget
@swt_widget
end
|
Class Method Details
This supports widgets in and out of basic SWT
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 146
def self.swt_widget_class_for(underscored_widget_name)
swt_widget_name = underscored_widget_name.camelcase(:upper)
swt_widget_class = eval(swt_widget_name)
unless swt_widget_class.ancestors.include?(org.eclipse.swt.widgets.Widget)
Glimmer.logger&.debug("Class #{swt_widget_class} matching #{underscored_widget_name} is not a subclass of org.eclipse.swt.widgets.Widget")
return nil
end
swt_widget_class
rescue NameError => e
Glimmer.logger&.debug e.message
nil
rescue => e
Glimmer.logger&.debug e.message
nil
end
|
141
142
143
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 141
def self.widget_exists?(underscored_widget_name)
!!swt_widget_class_for(underscored_widget_name)
end
|
Instance Method Details
#add_observer(observer, property_name) ⇒ Object
Used for data-binding only. Consider renaming or improving to avoid the confusion it causes
187
188
189
190
191
192
193
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 187
def add_observer(observer, property_name)
property_listener_installers = @swt_widget.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact
widget_listener_installers = property_listener_installers.map{|installer| installer[property_name.to_s.to_sym]}.compact if !property_listener_installers.empty?
widget_listener_installers.each do |widget_listener_installer|
widget_listener_installer.call(observer)
end
end
|
#async_exec(&block) ⇒ Object
164
165
166
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 164
def async_exec(&block)
DisplayProxy.instance.async_exec(&block)
end
|
#can_add_observer?(property_name) ⇒ Boolean
TODO Consider renaming these methods as they are mainly used for data-binding
182
183
184
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 182
def can_add_observer?(property_name)
@swt_widget.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact.map(&:keys).flatten.map(&:to_s).include?(property_name.to_s)
end
|
#can_handle_observation_request?(observation_request) ⇒ Boolean
TODO eliminate duplication in the following methods perhaps by relying on exceptions
201
202
203
204
205
206
207
208
209
210
211
212
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 201
def can_handle_observation_request?(observation_request)
observation_request = observation_request.to_s
if observation_request.start_with?('on_event_')
constant_name = observation_request.sub(/^on_event_/, '')
SWTProxy.has_constant?(constant_name)
elsif observation_request.start_with?('on_')
event = observation_request.sub(/^on_/, '')
can_add_listener?(event)
else
false
end
end
|
#content(&block) ⇒ Object
#dispose ⇒ Object
176
177
178
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 176
def dispose
@swt_widget.dispose
end
|
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 61
def (underscored_widget_name, args)
@arg_extractor_mapping ||= {
'menu_item' => lambda do |args|
index = args.delete(args.last) if args.last.is_a?(Numeric)
= [index].compact
styles = args
[styles, ]
end,
}
if @arg_extractor_mapping[underscored_widget_name]
@arg_extractor_mapping[underscored_widget_name].call(args)
else
[args, []]
end
end
|
#get_attribute(attribute_name) ⇒ Object
96
97
98
99
100
101
102
103
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 96
def get_attribute(attribute_name)
widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
if widget_custom_attribute
@swt_widget.send(widget_custom_attribute[:getter][:name])
else
@swt_widget.send(attribute_getter(attribute_name))
end
end
|
#handle_observation_request(observation_request, &block) ⇒ Object
214
215
216
217
218
219
220
221
222
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 214
def handle_observation_request(observation_request, &block)
if observation_request.start_with?('on_event_')
constant_name = observation_request.sub(/^on_event_/, '')
add_swt_event_listener(constant_name, &block)
elsif observation_request.start_with?('on_')
event = observation_request.sub(/^on_/, '')
add_listener(event, &block)
end
end
|
#has_attribute?(attribute_name, *args) ⇒ Boolean
77
78
79
80
81
82
83
84
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 77
def has_attribute?(attribute_name, *args)
widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
if widget_custom_attribute
@swt_widget.respond_to?(widget_custom_attribute[:setter][:name])
else
@swt_widget.respond_to?(attribute_setter(attribute_name), args)
end
end
|
#has_style?(style) ⇒ Boolean
172
173
174
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 172
def has_style?(style)
(@swt_widget.style & SWTProxy[style]) == SWTProxy[style]
end
|
#remove_observer(observer, property_name) ⇒ Object
195
196
197
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 195
def remove_observer(observer, property_name)
end
|
#set_attribute(attribute_name, *args) ⇒ Object
86
87
88
89
90
91
92
93
94
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 86
def set_attribute(attribute_name, *args)
widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
if widget_custom_attribute
widget_custom_attribute[:setter][:invoker].call(@swt_widget, args)
else
apply_property_type_converters(attribute_name, args)
@swt_widget.send(attribute_setter(attribute_name), *args) unless @swt_widget.send(attribute_getter(attribute_name)) == args.first
end
end
|
#sync_exec(&block) ⇒ Object
168
169
170
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 168
def sync_exec(&block)
DisplayProxy.instance.sync_exec(&block)
end
|
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
# File 'lib/glimmer/swt/widget_proxy.rb', line 105
def widget_property_listener_installers
@swt_widget_property_listener_installers ||= {
Java::OrgEclipseSwtWidgets::Control => {
:focus => proc do |observer|
on_focus_gained { |focus_event|
observer.call(true)
}
on_focus_lost { |focus_event|
observer.call(false)
}
end,
},
Java::OrgEclipseSwtWidgets::Text => {
:text => proc do |observer|
on_modify_text { |modify_event|
observer.call(@swt_widget.getText)
}
end,
},
Java::OrgEclipseSwtWidgets::Button => {
:selection => proc do |observer|
on_widget_selected { |selection_event|
observer.call(@swt_widget.getSelection)
}
end
},
Java::OrgEclipseSwtWidgets::Spinner => {
:selection => proc do |observer|
on_widget_selected { |selection_event|
observer.call(@swt_widget.getSelection)
}
end
}
}
end
|