class Glimmer::SWT::MenuProxy

Proxy for org.eclipse.swt.widgets.Menu

Functions differently from other widget proxies.

Glimmer automatically detects if this is a drop down menu or pop up menu from its parent if no SWT style is passed in.

There are 3 possibilities:

In order to get the SWT Menu object, one must call `#swt_widget`.

In the case of a Drop Down menu, this automatically creates an SWT MenuItem object with style :cascade

In order to retrieve the menu item widget proxy, one must call `#menu_item_proxy`

Follows the Proxy Design Pattern

Constants

STYLE

Attributes

menu_item_proxy[R]
menu_parent[R]

Public Class Methods

new(parent, args) click to toggle source
Calls superclass method
# File lib/glimmer/swt/menu_proxy.rb, line 101
      def initialize(parent, args)
        # TODO refactor/simplify code below
        @children = []
        index = args.delete(args.last) if args.last.is_a?(Numeric)
        args = args.map {|arg| arg.is_a?(String) ? arg.to_sym : arg}
        if parent.is_a?(ShellProxy)
          args = args.unshift(:bar)
        elsif parent.is_a?(MenuProxy)
          args = args.unshift(:drop_down)
        else
          args = args.unshift(:pop_up)
        end
        if parent.is_a?(MenuProxy)
          @menu_item_proxy = SWT::WidgetProxy.for('menu_item', parent, [:cascade] + [index].compact)
          super(@menu_item_proxy, args)
          @menu_item_proxy.menu = self
        elsif parent.is_a?(ShellProxy)
          super(parent, args)
        else # widget pop up
          super(parent, args)
        end

        if bar?
          # Assumes a parent shell
          parent.menu_bar = self
        elsif pop_up?
          parent.menu = self
        end
        # TODO IMPLEMENT PROPERLY
#         on_focus_lost {
#           dispose
#         }
      end

Public Instance Methods

bar?() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 135
def bar?
  args.include?(:bar)
end
can_handle_observation_request?(observation_request, super_only: false) click to toggle source
Calls superclass method
# File lib/glimmer/swt/menu_proxy.rb, line 169
def can_handle_observation_request?(observation_request, super_only: false)
  super_result = super(observation_request)
  if observation_request.start_with?('on_') && !super_result && !super_only
    return menu_item_proxy.can_handle_observation_request?(observation_request)
  else
    super_result
  end
end
close() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 251
def close
  dom_element.remove
  Element['body'].off('click', &@close_event_handler)
  @visible = false
end
dom() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 275
def dom
  css_class = name
  css_class += ' menu-bar' if bar?
  css_class += ' menu-drop-down' if drop_down?
  css_class += ' menu-pop-up' if pop_up?
  @dom ||= html {
    ul(id: id, class: css_class) {
    }
  }.to_s
end
drop_down?() click to toggle source
element() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 271
def element
  'ul'
end
enabled() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 155
def enabled
  if drop_down?
    menu_item_proxy.enabled
  else
    true
  end
end
enabled=(value) click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 163
def enabled=(value)
  if drop_down?
    menu_item_proxy.enabled = value
  end
end
handle_observation_request(observation_request, block) click to toggle source
Calls superclass method
# File lib/glimmer/swt/menu_proxy.rb, line 178
def handle_observation_request(observation_request, block)
  if can_handle_observation_request?(observation_request, super_only: true)
    super
  else
    menu_item_proxy.handle_observation_request(observation_request, block)
  end
end
parent_menu() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 267
def parent_menu
  parent.parent unless root_menu?
end
pop_up?() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 139
def pop_up?
  args.include?(:pop_up)
end
post_add_content() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 196
def post_add_content
  if bar?
    # delay this till all children rendered (perhaps post_add_content block)
    parent_dom_element.css('position', 'relative')
    parent_dom_element.css('margin-top', '30px')
    parent_dom_element.css('height', '114%')
    redraw
    `$(#{path}).menu({
      position: { my: "top", at: "bottom" },
      icons: { submenu: "ui-icon-blank" }
    });`
    the_element = dom_element
    the_element.on('mouseover') { |event|
      if event.page_x.between?(the_element.offset.left, the_element.offset.left + the_element.width) and
         event.page_y.between?(the_element.offset.top, the_element.offset.top + the_element.height)
        `$(#{path}).menu('option', 'position', { my: 'left top', at: 'left bottom' })`
      end
    }
    the_element.on('menublur') {
      `$(#{path}).menu('option', 'position', { my: 'left top', at: 'right top' })`
    }
    minimum_width = children.to_a.map(&:dom_element).map(&:width).reduce(:+)
    the_element.css('min-width', minimum_width)
  end
end
post_initialize_child(child) click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 186
def post_initialize_child(child)
  if child && !@children.include?(child)
    if child.is_a?(MenuItemProxy)
      @children << child
    else
      @children << child.menu_item_proxy
    end
  end
end
render(custom_parent_dom_element: nil, brand_new: false) click to toggle source
Calls superclass method
# File lib/glimmer/swt/menu_proxy.rb, line 236
def render(custom_parent_dom_element: nil, brand_new: false)
  # TODO attach to top nav bar if parent is shell
  # TODO attach listener to parent to display on right click
  if parent.is_a?(MenuProxy) || parent.is_a?(MenuItemProxy) || parent.menu_requested? || parent.is_a?(ShellProxy)
    super(custom_parent_dom_element: custom_parent_dom_element, brand_new: brand_new)
    if root_menu? && !bar?
      `$(#{path}).menu();`
      @close_event_handler = lambda do |event|
        close if event.target != parent.dom_element && event.target.parents('.ui-menu').empty?
      end
      Element['body'].on('click', &@close_event_handler)
    end
  end
end
root_menu() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 261
def root_menu
  the_menu = self
  the_menu = the_menu.parent_menu until the_menu.root_menu?
  the_menu
end
root_menu?() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 257
def root_menu?
  !parent.is_a?(MenuProxy) && !parent.is_a?(MenuItemProxy)
end
text() click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 147
def text
  @menu_item_proxy&.text
end
text=(text_value) click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 151
def text=(text_value)
  @menu_item_proxy&.text = text_value
end
visible=(value) click to toggle source
# File lib/glimmer/swt/menu_proxy.rb, line 222
def visible=(value)
  @visible = value
  if @visible
    parent.menu_requested = true
    render
    dom_element.css('position', 'absolute')
    dom_element.css('left', parent.menu_x - parent.dom_element.offset.left)
    dom_element.css('top', parent.menu_y - parent.dom_element.offset.top)
    parent.menu_requested = false
  else
    close
  end
end