Class: Glimmer::SWT::DisplayProxy

Inherits:
Object
  • Object
show all
Includes:
Custom::Drawable
Defined in:
lib/glimmer/swt/display_proxy.rb

Overview

Proxy for org.eclipse.swt.widgets.Display

Maintains a singleton instance since SWT only supports a single active display at a time.

Supports SWT Display’s very useful asyncExec and syncExec methods to support proper multi-threaded manipulation of SWT UI objects

Invoking ‘#swt_display` returns the SWT Display object wrapped by this proxy

Follows the Proxy Design Pattern

Defined Under Namespace

Classes: FilterListener

Constant Summary collapse

OBSERVED_MENU_ITEMS =
['about', 'preferences']

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Custom::Drawable

#clear_shapes, #resetup_shape_paint_listeners, #shapes

Constructor Details

#initialize(*args) ⇒ DisplayProxy

Returns a new instance of DisplayProxy.



70
71
72
73
74
# File 'lib/glimmer/swt/display_proxy.rb', line 70

def initialize(*args)
  Display.app_name ||= 'Glimmer'
  @swt_display = Display.new(*args)
  @swt_display.set_data('proxy', self)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



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

def method_missing(method, *args, &block)
  if can_handle_observation_request?(method)
    handle_observation_request(method, &block)
  else
    swt_display.send(method, *args, &block)
  end
rescue => e
  Glimmer::Config.logger.debug {"Neither DisplayProxy nor #{swt_display.class.name} can handle the method ##{method}"}
  super
end

Instance Attribute Details

#swt_displayObject (readonly)

SWT Display object wrapped



68
69
70
# File 'lib/glimmer/swt/display_proxy.rb', line 68

def swt_display
  @swt_display
end

Class Method Details

.instance(*args) ⇒ Object

Returns singleton instance



59
60
61
62
63
64
# File 'lib/glimmer/swt/display_proxy.rb', line 59

def instance(*args)
  if @instance.nil? || @instance.swt_display.nil? || @instance.swt_display.isDisposed
    @instance = new(*args)
  end
  @instance
end

Instance Method Details

#add_swt_event_filter(swt_constant, &block) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/glimmer/swt/display_proxy.rb', line 139

def add_swt_event_filter(swt_constant, &block)
  event_type = SWTProxy[swt_constant]
  @swt_display.addFilter(event_type, FilterListener.new(&block))
  #WidgetListenerProxy.new(@swt_display.getListeners(event_type).last)
  WidgetListenerProxy.new(
    swt_display: @swt_display,
    event_type: event_type,
    filter: true,
    swt_listener: block,
    widget_add_listener_method: 'addFilter',
    swt_listener_class:  FilterListener,
    swt_listener_method: 'handleEvent'
  )
end

#async_exec(&block) ⇒ Object



80
81
82
# File 'lib/glimmer/swt/display_proxy.rb', line 80

def async_exec(&block)
  @swt_display.async_exec(&block)
end

#can_handle_observation_request?(observation_request) ⇒ Boolean

Returns:

  • (Boolean)


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

def can_handle_observation_request?(observation_request)
  observation_request = observation_request.to_s
  if observation_request.start_with?('on_swt_')
    constant_name = observation_request.sub(/^on_swt_/, '')
    SWTProxy.has_constant?(constant_name)
  elsif observation_request.start_with?('on_')
    event_name = observation_request.sub(/^on_/, '')
    OBSERVED_MENU_ITEMS.include?(event_name)
  else
    false
  end
end

#content(&block) ⇒ Object



76
77
78
# File 'lib/glimmer/swt/display_proxy.rb', line 76

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

#handle_observation_request(observation_request, &block) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/glimmer/swt/display_proxy.rb', line 122

def handle_observation_request(observation_request, &block)
  observation_request = observation_request.to_s
  if observation_request.start_with?('on_swt_')
    constant_name = observation_request.sub(/^on_swt_/, '')
    add_swt_event_filter(constant_name, &block)
  elsif observation_request.start_with?('on_')
    event_name = observation_request.sub(/^on_/, '')
    if OBSERVED_MENU_ITEMS.include?(event_name)
      if OS.mac?
        system_menu = 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
    end
  end
end

#respond_to?(method, *args, &block) ⇒ Boolean

Returns:

  • (Boolean)


103
104
105
106
107
# File 'lib/glimmer/swt/display_proxy.rb', line 103

def respond_to?(method, *args, &block)
  super ||
    can_handle_observation_request?(method) ||
    swt_display.respond_to?(method, *args, &block)
end

#sync_exec(&block) ⇒ Object



84
85
86
# File 'lib/glimmer/swt/display_proxy.rb', line 84

def sync_exec(&block)
  @swt_display.sync_exec(&block)
end

#timer_exec(&block) ⇒ Object



88
89
90
# File 'lib/glimmer/swt/display_proxy.rb', line 88

def timer_exec(&block)
  @swt_display.timer_exec(&block)
end