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, #auto_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_style?, #height, #method_missing, #post_add_content, #post_initialize_child, #proxy_source_object, #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, #width, #x, #y

Methods included from Custom::Drawable

#add_shape, #clear_shapes, #deregister_shape_painting, #expanded_shapes, #image_buffered_shapes, #paint_pixel_by_pixel, #setup_shape_painting, #shape_at_location, #shapes, #swt_drawable

Methods included from ProxyProperties

#get_attribute, #has_attribute?, #has_attribute_getter?, #has_attribute_setter?, #method_missing, #proxy_source_object, #respond_to?, #set_attribute

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
90
91
92
93
# File 'lib/glimmer/swt/shell_proxy.rb', line 44

def initialize(*args, swt_widget: nil)
  auto_exec do
    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
        if @filled_screen.nil? && fill_screen # only the first time
          @swt_widget.set_size(@display.bounds.width, @display.bounds.height)
        end
        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
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



212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/glimmer/swt/shell_proxy.rb', line 212

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



96
97
98
99
100
101
102
103
104
105
# File 'lib/glimmer/swt/shell_proxy.rb', line 96

def center_within_display
  auto_exec do
    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
end

#closeObject

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



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

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

#content(&block) ⇒ Object



190
191
192
# File 'lib/glimmer/swt/shell_proxy.rb', line 190

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

#disposed?Boolean Also known as: disposed

Returns:

  • (Boolean)


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

def disposed?
  swt_widget.isDisposed
end

#hideObject

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



141
142
143
144
145
# File 'lib/glimmer/swt/shell_proxy.rb', line 141

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

#include_focus_control?Boolean

Returns:

  • (Boolean)


166
167
168
# File 'lib/glimmer/swt/shell_proxy.rb', line 166

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

#nested?Boolean Also known as: nested

Returns:

  • (Boolean)


128
129
130
131
132
# File 'lib/glimmer/swt/shell_proxy.rb', line 128

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

#openObject Also known as: show

Opens shell and starts SWT’s UI thread event loop



108
109
110
111
# File 'lib/glimmer/swt/shell_proxy.rb', line 108

def open
  open_only
  start_event_loop unless nested?
end

#open_onlyObject

Opens without starting the event loop.



115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/glimmer/swt/shell_proxy.rb', line 115

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

#pack_same_sizeObject



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/glimmer/swt/shell_proxy.rb', line 170

def pack_same_size
  auto_exec do
    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
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.



200
201
202
203
204
205
206
207
208
209
210
# File 'lib/glimmer/swt/shell_proxy.rb', line 200

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

#visible=(visibility) ⇒ Object

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



162
163
164
# File 'lib/glimmer/swt/shell_proxy.rb', line 162

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

#visible?Boolean Also known as: visible

Returns:

  • (Boolean)


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

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