Class: Glimmer::SWT::ShellProxy
- Inherits:
-
WidgetProxy
- Object
- WidgetProxy
- Glimmer::SWT::ShellProxy
- Defined in:
- lib/glimmer/swt/shell_proxy.rb
Overview
Proxy for org.eclipse.swt.widgets.Shell
Follows the Proxy Design Pattern
Constant Summary collapse
- WIDTH_MIN =
130
- HEIGHT_MIN =
0
- OBSERVED_MENU_ITEMS =
['about', 'preferences']
Constants inherited from WidgetProxy
WidgetProxy::DEFAULT_INITIALIZERS, WidgetProxy::DEFAULT_STYLES
Instance Attribute Summary collapse
-
#opened_before ⇒ Object
(also: #opened_before?)
readonly
Returns the value of attribute opened_before.
Attributes inherited from WidgetProxy
Instance Method Summary collapse
- #add_observer(observer, property_name) ⇒ Object
- #can_handle_observation_request?(observation_request) ⇒ Boolean
-
#center ⇒ Object
Centers shell within monitor it is in.
- #close ⇒ Object
- #content(&block) ⇒ Object
- #handle_observation_request(observation_request, &block) ⇒ Object
- #hide ⇒ Object
-
#initialize(*args, swt_widget: nil) ⇒ ShellProxy
constructor
Instantiates ShellProxy with same arguments expected by SWT Shell if swt_widget keyword arg was passed, then it is assumed the shell has already been instantiated and the proxy wraps it instead of creating a new one.
-
#open ⇒ Object
(also: #show)
Opens shell and starts SWT’s UI thread event loop.
- #pack ⇒ Object
- #pack_same_size ⇒ Object
-
#start_event_loop ⇒ Object
(happens as part of ‘#open`) Starts SWT Event Loop.
-
#visible=(visibility) ⇒ Object
Setting to true opens/shows shell.
- #visible? ⇒ Boolean
Methods inherited from WidgetProxy
#async_exec, #can_add_observer?, #dispose, #extract_args, #get_attribute, #has_attribute?, #has_style?, #remove_observer, #set_attribute, swt_widget_class_for, #sync_exec, widget_exists?, #widget_property_listener_installers
Methods included from DataBinding::ObservableWidget
Constructor Details
#initialize(*args, swt_widget: nil) ⇒ ShellProxy
Instantiates ShellProxy with same arguments expected by SWT Shell if swt_widget keyword arg was passed, then it is assumed the shell has already been instantiated and the proxy wraps it instead of creating a new one.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 25 def initialize(*args, swt_widget: nil) if @swt_widget = else if args.first.is_a?(ShellProxy) args[0] = args[0]. end style_args = args.select {|arg| arg.is_a?(Symbol) || arg.is_a?(String)} if style_args.any? style_arg_start_index = args.index(style_args.first) style_arg_last_index = args.index(style_args.last) args[style_arg_start_index..style_arg_last_index] = SWTProxy[style_args] end if args.first.nil? || (!args.first.is_a?(Display) && !args.first.is_a?(Shell)) @display = DisplayProxy.instance.swt_display args = [@display] + args end args = args.compact @swt_widget = Shell.new(*args) @swt_widget.setLayout(FillLayout.new) @swt_widget.setMinimumSize(WIDTH_MIN, HEIGHT_MIN) on_event_show do Thread.new do sleep(0.25) async_exec do @swt_widget.setActive unless @swt_widget.isDisposed end end end end @display ||= @swt_widget.getDisplay end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Glimmer::DataBinding::ObservableWidget
Instance Attribute Details
#opened_before ⇒ Object (readonly) Also known as: opened_before?
Returns the value of attribute opened_before.
19 20 21 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 19 def opened_before @opened_before end |
Instance Method Details
#add_observer(observer, property_name) ⇒ Object
155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 155 def add_observer(observer, property_name) case property_name.to_s when 'visible?' #TODO see if you must handle non-? version and/or move elsewhere visibility_notifier = proc do observer.call(visible?) end on_event_show(&visibility_notifier) on_event_hide(&visibility_notifier) on_event_close(&visibility_notifier) else super end end |
#can_handle_observation_request?(observation_request) ⇒ Boolean
131 132 133 134 135 136 137 138 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 131 def can_handle_observation_request?(observation_request) result = false if observation_request.start_with?('on_') event_name = observation_request.sub(/^on_/, '') result = OBSERVED_MENU_ITEMS.include?(event_name) end result || super end |
#center ⇒ Object
Centers shell within monitor it is in
59 60 61 62 63 64 65 66 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 59 def center primary_monitor = @display.getPrimaryMonitor() monitor_bounds = primary_monitor.getBounds() shell_bounds = @swt_widget.getBounds() location_x = monitor_bounds.x + (monitor_bounds.width - shell_bounds.width) / 2 location_y = monitor_bounds.y + (monitor_bounds.height - shell_bounds.height) / 2 @swt_widget.setLocation(location_x, location_y) end |
#close ⇒ Object
87 88 89 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 87 def close @swt_widget.close end |
#content(&block) ⇒ Object
115 116 117 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 115 def content(&block) Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::SWT::ShellExpression.new, &block) end |
#handle_observation_request(observation_request, &block) ⇒ Object
140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 140 def handle_observation_request(observation_request, &block) if observation_request.start_with?('on_') event_name = observation_request.sub(/^on_/, '') if OBSERVED_MENU_ITEMS.include?(event_name) if OS.mac? = DisplayProxy.instance.swt_display.getSystemMenu = .getItems.find {|| .getID == SWTProxy["ID_#{event_name.upcase}"]} .addListener(SWTProxy[:Selection], &block) end else super end end end |
#hide ⇒ Object
83 84 85 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 83 def hide @swt_widget.setVisible(false) end |
#open ⇒ Object Also known as: show
Opens shell and starts SWT’s UI thread event loop
69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 69 def open if @opened_before @swt_widget.setVisible(true) # notify_observers('visible') else @opened_before = true @swt_widget.pack center @swt_widget.open start_event_loop end end |
#pack ⇒ Object
100 101 102 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 100 def pack @swt_widget.pack end |
#pack_same_size ⇒ Object
104 105 106 107 108 109 110 111 112 113 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 104 def pack_same_size bounds = @swt_widget.getBounds width = @swt_widget.getBounds.width height = @swt_widget.getBounds.height x = @swt_widget.getBounds.x y = @swt_widget.getBounds.y @swt_widget.pack @swt_widget.setSize(width, height) @swt_widget.setLocation(x, y) end |
#start_event_loop ⇒ Object
(happens as part of ‘#open`) Starts SWT Event Loop.
You may learn more about the SWT Event Loop here: help.eclipse.org/2019-12/nftopic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html This method is not needed except in rare circumstances where there is a need to start the SWT Event Loop before opening the shell.
125 126 127 128 129 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 125 def start_event_loop until @swt_widget.isDisposed @display.sleep unless @display.readAndDispatch end end |
#visible=(visibility) ⇒ Object
Setting to true opens/shows shell. Setting to false hides the shell.
96 97 98 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 96 def visible=(visibility) visibility ? show : hide end |
#visible? ⇒ Boolean
91 92 93 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 91 def visible? @swt_widget.isDisposed ? false : @swt_widget.isVisible end |