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
Constants inherited from WidgetProxy
WidgetProxy::DEFAULT_INITIALIZERS, WidgetProxy::DEFAULT_STYLES, WidgetProxy::KEYWORD_ALIASES
Instance Attribute Summary collapse
-
#opened_before ⇒ Object
(also: #opened_before?)
readonly
Returns the value of attribute opened_before.
Attributes inherited from WidgetProxy
#drag_source_proxy, #drag_source_style, #drag_source_transfer, #drop_target_proxy, #drop_target_transfer, #parent_proxy, #swt_widget
Instance Method Summary collapse
- #add_observer(observer, property_name) ⇒ Object
-
#center ⇒ Object
Centers shell within monitor it is in.
- #content(&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?, #can_handle_drag_observation_request?, #can_handle_drop_observation_request?, #can_handle_observation_request?, create, #dispose, #ensure_drag_source_proxy, #ensure_drop_target_proxy, #extract_args, #get_attribute, #handle_observation_request, #has_attribute?, #has_style?, #method_missing, #post_add_content, #post_initialize_child, #remove_observer, #respond_to?, #set_attribute, swt_widget_class_for, #sync_exec, underscored_widget_name, widget_exists?, #widget_property_listener_installers, widget_proxy_class
Methods included from Packages
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.
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 44 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.set_data('proxy', self) @swt_widget.setLayout(FillLayout.new) @swt_widget.setMinimumSize(WIDTH_MIN, HEIGHT_MIN) # TODO make this an option not the default on_swt_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::SWT::WidgetProxy
Instance Attribute Details
#opened_before ⇒ Object (readonly) Also known as: opened_before?
Returns the value of attribute opened_before.
38 39 40 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 38 def opened_before @opened_before end |
Instance Method Details
#add_observer(observer, property_name) ⇒ Object
159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 159 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_swt_show(&visibility_notifier) on_swt_hide(&visibility_notifier) on_swt_close(&visibility_notifier) else super end end |
#center ⇒ Object
Centers shell within monitor it is in
80 81 82 83 84 85 86 87 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 80 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 |
#content(&block) ⇒ Object
139 140 141 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 139 def content(&block) Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::SWT::ShellExpression.new, &block) end |
#hide ⇒ Object
104 105 106 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 104 def hide @swt_widget.setVisible(false) end |
#open ⇒ Object Also known as: show
Opens shell and starts SWT’s UI thread event loop
90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 90 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
117 118 119 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 117 def pack @swt_widget.pack end |
#pack_same_size ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 121 def pack_same_size bounds = @swt_widget.getBounds if OS.mac? @swt_widget.pack @swt_widget.setBounds(bounds) elsif OS.windows? || OS::Underlying.windows? minimum_size = @swt_widget.getMinimumSize @swt_widget.setMinimumSize(bounds.width, bounds.height) listener = on_control_resized { @swt_widget.setBounds(bounds) } @swt_widget.pack @swt_widget.removeControlListener(listener.swt_listener) @swt_widget.setMinimumSize(minimum_size) elsif OS.linux? @swt_widget.layout(true, true) @swt_widget.setBounds(bounds) end 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.
149 150 151 152 153 154 155 156 157 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 149 def start_event_loop until @swt_widget.isDisposed begin @display.sleep unless @display.readAndDispatch rescue => e Glimmer::Config.logger.info {e.} end end end |
#visible=(visibility) ⇒ Object
Setting to true opens/shows shell. Setting to false hides the shell.
113 114 115 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 113 def visible=(visibility) visibility ? show : hide end |
#visible? ⇒ Boolean
108 109 110 |
# File 'lib/glimmer/swt/shell_proxy.rb', line 108 def visible? @swt_widget.isDisposed ? false : @swt_widget.isVisible end |