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:
-
SWT
:bar style is passed in: Menu Bar -
Parent is ShellProxy: Pop Up Menu (having style :pop_up)
-
Parent is another Menu: Drop Down Menu (having style :drop_down)
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
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
# File lib/glimmer/swt/menu_proxy.rb, line 143 def drop_down? args.include?(:drop_down) end
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
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
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