Class: Glimmer::SWT::ShellProxy

Inherits:
WidgetProxy show all
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

Attributes inherited from WidgetProxy

#drag_source_proxy, #drag_source_style, #drag_source_transfer, #drop_target_proxy, #drop_target_transfer, #finished_add_content, #parent_proxy, #swt_widget

Attributes included from Custom::Drawable

#image_double_buffered, #requires_shape_disposal

Instance Method Summary collapse

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, #finish_add_content!, flyweight_swt_widget_classes, #get_attribute, #handle_observation_request, #has_attribute?, #has_attribute_getter?, #has_attribute_setter?, #has_style?, #method_missing, #post_add_content, #post_initialize_child, #remove_observer, #respond_to?, #set_attribute, swt_widget_class_for, swt_widget_class_manual_entries, #sync_exec, #timer_exec, underscored_widget_name, widget_exists?, #widget_property_listener_installers, widget_proxy_class

Methods included from Custom::Drawable

#add_shape, #clear_shapes, #deregister_shape_painting, #image_buffered_shapes, #setup_shape_painting, #shapes

Methods included from Properties

attribute_getter, #attribute_getter, attribute_setter, #attribute_setter, normalized_attribute, #normalized_attribute, ruby_attribute_getter, #ruby_attribute_setter, ruby_attribute_setter

Methods included from Packages

included

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
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/glimmer/swt/shell_proxy.rb', line 44

def initialize(*args, swt_widget: nil)
  if swt_widget
    @swt_widget = swt_widget
  else
    if args.first.respond_to?(:swt_widget) && args.first.swt_widget.is_a?(Shell)
      @parent_proxy = args[0]
      args[0] = args[0].swt_widget
    end
    style_args = args.select {|arg| arg.is_a?(Symbol) || arg.is_a?(String)}.map(&:to_sym)
    fill_screen = nil
    if style_args.include?(:fill_screen)
      args.delete(:fill_screen)
      style_args.delete(:fill_screen)
      fill_screen = true
    end
    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
    shell_swt_display = Glimmer::SWT::DisplayProxy.instance.swt_display
    on_swt_show do
      @swt_widget.set_size(@display.bounds.width, @display.bounds.height) if fill_screen
      Thread.new do
        sleep(0.25)
        shell_swt_display.async_exec do
          @swt_widget.setActive unless @swt_widget.isDisposed
        end
      end
    end
  end
  on_widget_disposed {
    clear_shapes
  }
  @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_beforeObject (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



196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/glimmer/swt/shell_proxy.rb', line 196

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_within_displayObject

Centers shell within monitor it is in



92
93
94
95
96
97
98
99
# File 'lib/glimmer/swt/shell_proxy.rb', line 92

def center_within_display
  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

#closeObject

Closes shell. Automatically checks if widget is disposed to avoid crashing.



136
137
138
# File 'lib/glimmer/swt/shell_proxy.rb', line 136

def close
  @swt_widget.close unless @swt_widget.isDisposed
end

#content(&block) ⇒ Object



176
177
178
# File 'lib/glimmer/swt/shell_proxy.rb', line 176

def content(&block)
  Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::SWT::ShellExpression.new, &block)
end

#disposed?Boolean Also known as: disposed

Returns:

  • (Boolean)


125
126
127
# File 'lib/glimmer/swt/shell_proxy.rb', line 125

def disposed?
  swt_widget.isDisposed
end

#hideObject

Hides shell. Automatically checks if widget is disposed to avoid crashing.



131
132
133
# File 'lib/glimmer/swt/shell_proxy.rb', line 131

def hide
  @swt_widget.setVisible(false) unless @swt_widget.isDisposed
end

#include_focus_control?Boolean

Returns:

  • (Boolean)


150
151
152
# File 'lib/glimmer/swt/shell_proxy.rb', line 150

def include_focus_control?
  DisplayProxy.instance.focus_control&.shell == swt_widget
end

#nested?Boolean Also known as: nested

Returns:

  • (Boolean)


120
121
122
# File 'lib/glimmer/swt/shell_proxy.rb', line 120

def nested?
  !swt_widget&.parent.nil?
end

#openObject Also known as: show

Opens shell and starts SWT’s UI thread event loop



102
103
104
105
# File 'lib/glimmer/swt/shell_proxy.rb', line 102

def open
  open_only
  start_event_loop unless nested?
end

#open_onlyObject

Opens without starting the event loop.



109
110
111
112
113
114
115
116
117
118
# File 'lib/glimmer/swt/shell_proxy.rb', line 109

def open_only
  if @opened_before
    @swt_widget.setVisible(true)
  else
    @opened_before = true
    @swt_widget.pack
    center_within_display
    @swt_widget.open
  end
end

#packObject



154
155
156
# File 'lib/glimmer/swt/shell_proxy.rb', line 154

def pack
  @swt_widget.pack
end

#pack_same_sizeObject



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/glimmer/swt/shell_proxy.rb', line 158

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.layout(true, true)
    @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_loopObject

(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.



186
187
188
189
190
191
192
193
194
# File 'lib/glimmer/swt/shell_proxy.rb', line 186

def start_event_loop
  until @swt_widget.isDisposed
    begin
      @display.sleep unless @display.readAndDispatch
    rescue => e
      Glimmer::Config.logger.info {e.full_message}
    end
  end
end

#visible=(visibility) ⇒ Object

Setting to true opens/shows shell. Setting to false hides the shell.



146
147
148
# File 'lib/glimmer/swt/shell_proxy.rb', line 146

def visible=(visibility)
  visibility ? show : hide
end

#visible?Boolean Also known as: visible

Returns:

  • (Boolean)


140
141
142
# File 'lib/glimmer/swt/shell_proxy.rb', line 140

def visible?
  @swt_widget.isDisposed ? false : @swt_widget.isVisible
end