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) ⇒ ShellProxy

Instantiates ShellProxy with same arguments expected by SWT Shell



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/glimmer/swt/shell_proxy.rb', line 23

def initialize(*args)
  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)
  @display ||= @swt_widget.getDisplay
  @swt_widget.setLayout(FillLayout.new)
  @swt_widget.setMinimumSize(WIDTH_MIN, HEIGHT_MIN)
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



143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/glimmer/swt/shell_proxy.rb', line 143

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)


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

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



45
46
47
48
49
50
51
52
# File 'lib/glimmer/swt/shell_proxy.rb', line 45

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



73
74
75
# File 'lib/glimmer/swt/shell_proxy.rb', line 73

def close
  @swt_widget.close
end

#content(&block) ⇒ Object



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

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

#handle_observation_request(observation_request, &block) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/glimmer/swt/shell_proxy.rb', line 128

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



69
70
71
# File 'lib/glimmer/swt/shell_proxy.rb', line 69

def hide
  @swt_widget.setVisible(false)
end

#openObject Also known as: show

Opens shell and starts SWT’s UI thread event loop



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/glimmer/swt/shell_proxy.rb', line 55

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



86
87
88
# File 'lib/glimmer/swt/shell_proxy.rb', line 86

def pack
  @swt_widget.pack
end

#pack_same_sizeObject



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

def pack_same_size
  minimum_size = @swt_widget.getMinimumSize
  bounds = @swt_widget.getBounds
  @swt_widget.setMinimumSize(bounds.width, bounds.height)
  listener = on_control_resized {
    @swt_widget.setSize(bounds.width, bounds.height)
    @swt_widget.setLocation(bounds.x, bounds.y)
  }
  @swt_widget.pack
  @swt_widget.removeControlListener(listener.swt_listener)
  @swt_widget.setMinimumSize(minimum_size)
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.



113
114
115
116
117
# File 'lib/glimmer/swt/shell_proxy.rb', line 113

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.



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

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

#visible?Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/glimmer/swt/shell_proxy.rb', line 77

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