require 'java'
require 'rexml/document'
require 'rexml/xpath'
require 'minicomic/xml/namespaces'
module Minicomic
module UI
class MenuBar
def initialize(menubar)
@menubar = menubar
end
def load_form(doc)
root = REXML::XPath.first(doc, '/ui:menubar', XML::DEFAULT_NS_MAPPINGS)
REXML::XPath.each(root, './xforms:group', XML::DEFAULT_NS_MAPPINGS) do |child|
label = REXML::XPath.first(child, './xforms:label', XML::DEFAULT_NS_MAPPINGS)
label_text = label ? label.text : nil
submenu = javax.swing.JMenu.new(label_text)
@menubar.add submenu
build_submenu(submenu, child)
end
@menubar.revalidate
end
def build_submenu(menu, element)
finished_compact = false
REXML::XPath.each(element, './xforms:group|./xforms:trigger', XML::DEFAULT_NS_MAPPINGS) do |child|
menu.add_separator if finished_compact
finished_compact = false
label = REXML::XPath.first(child, './xforms:label', XML::DEFAULT_NS_MAPPINGS)
label_text = label ? label.text : nil
case child.local_name
when 'group'
case child.attribute('appearance').value
when 'minimal'
build_submenu(menu, child)
when 'compact'
build_submenu(menu, child)
finished_compact = true
else
submenu = javax.swing.JMenu.new(label_text)
menu.add submenu
build_submenu(submenu, child)
end
when 'trigger'
item = javax.swing.JMenuItem.new(label_text)
menu.add item
verb = child.attribute('verb', XML::MINICOMIC_UI_NS)
item.add_action_listener verb_invoke_action(verb) if verb
end
end
end
private :build_submenu
def verb_invoke_action(verb)
Proc.new { invoke_verb verb }
end
private :verb_invoke_action
def invoke_verb(verb)
puts "Verb #{verb} invoked"
end
private :invoke_verb
end
end
end