mental / minicomic

A tool for assembling web and print comics.

minicomic / lib / minicomic / ui / menubar.rb
100644 71 lines (61 sloc) 1.898 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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