Class: Glimmer::SWT::DisplayProxy

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

Constant Summary collapse

OBSERVED_MENU_ITEMS =
['about', 'preferences']

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ DisplayProxy

Returns a new instance of DisplayProxy.



34
35
36
37
# File 'lib/glimmer/swt/display_proxy.rb', line 34

def initialize(*args)
  @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



39
40
41
42
43
44
# File 'lib/glimmer/swt/display_proxy.rb', line 39

def method_missing(method, *args, &block)
  swt_display.send(method, *args, &block)
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



32
33
34
# File 'lib/glimmer/swt/display_proxy.rb', line 32

def swt_display
  @swt_display
end

Class Method Details

.instance(*args) ⇒ Object

Returns singleton instance



23
24
25
26
27
28
# File 'lib/glimmer/swt/display_proxy.rb', line 23

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

Instance Method Details

#add_swt_event_listener(swt_constant, &block) ⇒ Object



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

def add_swt_event_listener(swt_constant, &block)
  event_type = SWTProxy[swt_constant]
  @swt_display.addFilter(event_type, &block)
  #WidgetListenerProxy.new(@swt_display.getListeners(event_type).last)
end

#can_handle_observation_request?(observation_request) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/glimmer/swt/display_proxy.rb', line 50

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

#handle_observation_request(observation_request, &block) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/glimmer/swt/display_proxy.rb', line 63

def handle_observation_request(observation_request, &block)
  if observation_request.start_with?('on_swt_')
    constant_name = observation_request.sub(/^on_swt_/, '')
    add_swt_event_listener(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)


46
47
48
# File 'lib/glimmer/swt/display_proxy.rb', line 46

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