lib/clevic/swing/action.rb in clevic-0.13.0.b9 vs lib/clevic/swing/action.rb in clevic-0.13.0.b10

- old
+ new

@@ -4,36 +4,36 @@ class Action include Gather property :shortcut, :method, :handler, :tool_tip, :visible property :name, :text, :checkable, :enabled - + # Needed to enable / disable accelerators on the fly. def enabled=( bool ) # test for @menu_item instead of the method to # work around Swing Stupidity. See comments in menu_item. menu_item.enabled = bool unless @menu_item.nil? @enabled = bool end - + def initialize( parent, options = {}, &block ) @parent = parent @enabled = true - + # work around the Swing Stupidity detailed in enabled= gather( options, &block ) end attr_reader :parent, :menu_item - + def plain_text text.gsub( /&/, '' ) end - + def object_name name.to_s end - + # find the java.awt.event.KeyEvent::VK constant # for the letter after the &. Then set it on the item's # mnemonic. Because JMenuItem.setMnemonic won't take a nil def mnemonic if @mnemonic.nil? @@ -45,79 +45,79 @@ false end end @mnemonic end - + def menu_item if @menu_item.nil? @menu_item = if checkable javax.swing.JCheckBoxMenuItem.new else javax.swing.JMenuItem.new end - + # Menu item always enabled, until later. # Otherwise it prevents the assignment # of an accelerator key. So we have to # work around yet another Swing stupidity. menu_item.enabled = true - + menu_item.text = plain_text menu_item.mnemonic = mnemonic if mnemonic menu_item.accelerator = parse_shortcut( shortcut ) unless shortcut.nil? menu_item.tool_tip_text = tool_tip menu_item.add_action_listener do |event| handler.call( event ) end - + # Put this at the end so it doesn't interfere with the # keystroke assignment Swing Stupidity. menu_item.enabled = enabled end @menu_item end - + # parse a Qt-style Ctrl+D shortcut specification # and return a javax.swing.KeyStroke def parse_shortcut( sequence ) # munge keystroke to something getKeyStroke recognises # file:///usr/share/doc/java-sdk-docs-1.6.0.10/html/api/javax/swing/KeyStroke.html#getKeyStroke%28java.lang.String%29 # Yes, the space MUST be last in the charset, otherwise Ctrl-" fails modifiers = sequence.split( /[-+ ]/ ) last = modifiers.pop - + modifier_mask = modifiers.inject(0) do |mask,value| mask | if value =~ /ctrl/i java.awt.Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() else eval( "java.awt.event.InputEvent::#{value.upcase}_DOWN_MASK" ) end end - + keystroke = if last.length == 1 case last # these two seem to break the KeyStroke parsing algorithm when "'" javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_QUOTE, modifier_mask ) - + when '"' javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_QUOTE, modifier_mask | java.awt.event.InputEvent::SHIFT_DOWN_MASK ) - + # the conversion in else doesn't work for these when '[' javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_OPEN_BRACKET, modifier_mask ) - + when ']' javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_CLOSE_BRACKET, modifier_mask ) - + when ';' javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_SEMICOLON, modifier_mask ) - + else keystring = javax.swing.KeyStroke.getKeyStroke( java.lang.Character.new( last.to_char ), modifier_mask ).toString # have to do this conversion for Mac OS X javax.swing.KeyStroke.getKeyStroke( keystring.gsub( /typed/, 'pressed' ) ) end @@ -135,14 +135,14 @@ # dummy class for creating a menu separator class Separator < Action def initialize super(nil) end - + def shortcut nil end - + def menu_item end end end