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
OBSERVED_MENU_ITEMS =
['about', 'preferences']

Constants inherited from WidgetProxy

WidgetProxy::DEFAULT_INITIALIZERS, WidgetProxy::DEFAULT_STYLES

Instance Attribute Summary collapse

Attributes inherited from WidgetProxy

#swt_widget

Instance Method Summary collapse

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

#method_missing

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
    @swt_widget = swt_widget
  else
    if args.first.is_a?(ShellProxy)
      args[0] = args[0].swt_widget
    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
        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_beforeObject (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

Returns:

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

#centerObject

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

#closeObject



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?
        system_menu = DisplayProxy.instance.swt_display.getSystemMenu
        menu_item = system_menu.getItems.find {|menu_item| menu_item.getID == SWTProxy["ID_#{event_name.upcase}"]}
        menu_item.addListener(SWTProxy[:Selection], &block)
      end
    else
      super
    end
  end
end

#hideObject



83
84
85
# File 'lib/glimmer/swt/shell_proxy.rb', line 83

def hide
  @swt_widget.setVisible(false)
end

#openObject 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

#packObject



100
101
102
# File 'lib/glimmer/swt/shell_proxy.rb', line 100

def pack
  @swt_widget.pack
end

#pack_same_sizeObject



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



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

Returns:

  • (Boolean)


91
92
93
# File 'lib/glimmer/swt/shell_proxy.rb', line 91

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