lib/glimmer/swt/shell_proxy.rb in glimmer-0.5.7 vs lib/glimmer/swt/shell_proxy.rb in glimmer-0.5.8

- old
+ new

@@ -1,8 +1,9 @@ require 'glimmer/swt/swt_proxy' require 'glimmer/swt/widget_proxy' require 'glimmer/swt/display_proxy' +require 'glimmer/swt/swt_proxy' require 'glimmer/dsl/shell_expression' module Glimmer module SWT # Proxy for org.eclipse.swt.widgets.Shell @@ -12,24 +13,31 @@ include_package 'org.eclipse.swt.widgets' include_package 'org.eclipse.swt.layout' WIDTH_MIN = 130 HEIGHT_MIN = 0 + OBSERVED_MENU_ITEMS = ['about', 'preferences'] attr_reader :opened_before alias opened_before? opened_before # Instantiates ShellProxy with same arguments expected by SWT Shell 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 = SWTProxy.constantify_args(args).compact + 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 @@ -90,12 +98,34 @@ until @swt_widget.isDisposed @display.sleep unless @display.readAndDispatch end end + 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 + + 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) + 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) + else + super + end + end + end + def add_observer(observer, property_name) case property_name.to_s - when 'visible?' + 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)