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.



55
56
57
58
# File 'lib/glimmer/swt/display_proxy.rb', line 55

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



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

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



53
54
55
# File 'lib/glimmer/swt/display_proxy.rb', line 53

def swt_display
  @swt_display
end

Class Method Details

.instance(*args) ⇒ Object

Returns singleton instance



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

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



111
112
113
114
115
# File 'lib/glimmer/swt/display_proxy.rb', line 111

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)


81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/glimmer/swt/display_proxy.rb', line 81

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



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

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

#handle_observation_request(observation_request, &block) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/glimmer/swt/display_proxy.rb', line 94

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


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

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