Class: Glimmer::SWT::DisplayProxy
- Inherits:
-
Object
- Object
- Glimmer::SWT::DisplayProxy
- Includes:
- Custom::Drawable
- Defined in:
- lib/glimmer/swt/display_proxy.rb
Overview
Proxy for org.eclipse.swt.widgets.Display
Maintains a singleton instance since SWT only supports a single active display at a time.
Supports SWT Display’s very useful asyncExec and syncExec methods to support proper multi-threaded manipulation of SWT UI objects
Invoking ‘#swt_display` returns the SWT Display object wrapped by this proxy
Follows the Proxy Design Pattern
Defined Under Namespace
Classes: FilterListener
Constant Summary collapse
- OBSERVED_MENU_ITEMS =
['about', 'preferences']
Instance Attribute Summary collapse
-
#swt_display ⇒ Object
readonly
SWT Display object wrapped.
Class Method Summary collapse
-
.instance(*args) ⇒ Object
Returns singleton instance.
Instance Method Summary collapse
- #add_swt_event_filter(swt_constant, &block) ⇒ Object
- #async_exec(&block) ⇒ Object
- #can_handle_observation_request?(observation_request) ⇒ Boolean
- #content(&block) ⇒ Object
- #handle_observation_request(observation_request, &block) ⇒ Object
-
#initialize(*args) ⇒ DisplayProxy
constructor
A new instance of DisplayProxy.
- #method_missing(method, *args, &block) ⇒ Object
- #respond_to?(method, *args, &block) ⇒ Boolean
- #sync_exec(&block) ⇒ Object
- #timer_exec(&block) ⇒ Object
Methods included from Custom::Drawable
#clear_shapes, #resetup_shape_paint_listeners, #shapes
Constructor Details
#initialize(*args) ⇒ DisplayProxy
Returns a new instance of DisplayProxy.
70 71 72 73 74 |
# File 'lib/glimmer/swt/display_proxy.rb', line 70 def initialize(*args) Display.app_name ||= 'Glimmer' @swt_display = Display.new(*args) @swt_display.set_data('proxy', self) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
92 93 94 95 96 97 98 99 100 101 |
# File 'lib/glimmer/swt/display_proxy.rb', line 92 def method_missing(method, *args, &block) if can_handle_observation_request?(method) handle_observation_request(method, &block) else swt_display.send(method, *args, &block) end rescue => e Glimmer::Config.logger.debug {"Neither DisplayProxy nor #{swt_display.class.name} can handle the method ##{method}"} super end |
Instance Attribute Details
#swt_display ⇒ Object (readonly)
SWT Display object wrapped
68 69 70 |
# File 'lib/glimmer/swt/display_proxy.rb', line 68 def swt_display @swt_display end |
Class Method Details
.instance(*args) ⇒ Object
Returns singleton instance
59 60 61 62 63 64 |
# File 'lib/glimmer/swt/display_proxy.rb', line 59 def instance(*args) if @instance.nil? || @instance.swt_display.nil? || @instance.swt_display.isDisposed @instance = new(*args) end @instance end |
Instance Method Details
#add_swt_event_filter(swt_constant, &block) ⇒ Object
139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/glimmer/swt/display_proxy.rb', line 139 def add_swt_event_filter(swt_constant, &block) event_type = SWTProxy[swt_constant] @swt_display.addFilter(event_type, FilterListener.new(&block)) #WidgetListenerProxy.new(@swt_display.getListeners(event_type).last) WidgetListenerProxy.new( swt_display: @swt_display, event_type: event_type, filter: true, swt_listener: block, widget_add_listener_method: 'addFilter', swt_listener_class: FilterListener, swt_listener_method: 'handleEvent' ) end |
#async_exec(&block) ⇒ Object
80 81 82 |
# File 'lib/glimmer/swt/display_proxy.rb', line 80 def async_exec(&block) @swt_display.async_exec(&block) end |
#can_handle_observation_request?(observation_request) ⇒ Boolean
109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/glimmer/swt/display_proxy.rb', line 109 def can_handle_observation_request?(observation_request) observation_request = observation_request.to_s if observation_request.start_with?('on_swt_') constant_name = observation_request.sub(/^on_swt_/, '') SWTProxy.has_constant?(constant_name) elsif observation_request.start_with?('on_') event_name = observation_request.sub(/^on_/, '') OBSERVED_MENU_ITEMS.include?(event_name) else false end end |
#content(&block) ⇒ Object
76 77 78 |
# File 'lib/glimmer/swt/display_proxy.rb', line 76 def content(&block) Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::SWT::DisplayExpression.new, &block) end |
#handle_observation_request(observation_request, &block) ⇒ Object
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/glimmer/swt/display_proxy.rb', line 122 def handle_observation_request(observation_request, &block) observation_request = observation_request.to_s if observation_request.start_with?('on_swt_') constant_name = observation_request.sub(/^on_swt_/, '') add_swt_event_filter(constant_name, &block) elsif observation_request.start_with?('on_') event_name = observation_request.sub(/^on_/, '') if OBSERVED_MENU_ITEMS.include?(event_name) if OS.mac? = swt_display.getSystemMenu = .getItems.find {|| .getID == SWTProxy["ID_#{event_name.upcase}"]} .addListener(SWTProxy[:Selection], &block) end end end end |
#respond_to?(method, *args, &block) ⇒ Boolean
103 104 105 106 107 |
# File 'lib/glimmer/swt/display_proxy.rb', line 103 def respond_to?(method, *args, &block) super || can_handle_observation_request?(method) || swt_display.respond_to?(method, *args, &block) end |
#sync_exec(&block) ⇒ Object
84 85 86 |
# File 'lib/glimmer/swt/display_proxy.rb', line 84 def sync_exec(&block) @swt_display.sync_exec(&block) end |
#timer_exec(&block) ⇒ Object
88 89 90 |
# File 'lib/glimmer/swt/display_proxy.rb', line 88 def timer_exec(&block) @swt_display.timer_exec(&block) end |