001: /*--
002: $Id: KeyStrokeConverter.java,v 1.1 2004/03/01 07:56:01 wolfpaulus Exp $
003:
004: Copyright (C) 2003-2007 Wolf Paulus.
005: All rights reserved.
006:
007: Redistribution and use in source and binary forms, with or without
008: modification, are permitted provided that the following conditions
009: are met:
010:
011: 1. Redistributions of source code must retain the above copyright
012: notice, this list of conditions, and the following disclaimer.
013:
014: 2. Redistributions in binary form must reproduce the above copyright
015: notice, this list of conditions, and the disclaimer that follows
016: these conditions in the documentation and/or other materials provided
017: with the distribution.
018:
019: 3. The end-user documentation included with the redistribution,
020: if any, must include the following acknowledgment:
021: "This product includes software developed by the
022: SWIXML Project (http://www.swixml.org/)."
023: Alternately, this acknowledgment may appear in the software itself,
024: if and wherever such third-party acknowledgments normally appear.
025:
026: 4. The name "Swixml" must not be used to endorse or promote products
027: derived from this software without prior written permission. For
028: written permission, please contact <info_AT_swixml_DOT_org>
029:
030: 5. Products derived from this software may not be called "Swixml",
031: nor may "Swixml" appear in their name, without prior written
032: permission from the Swixml Project Management.
033:
034: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
035: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
036: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
037: DISCLAIMED. IN NO EVENT SHALL THE SWIXML PROJECT OR ITS
038: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
039: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
040: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
041: USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
042: ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
043: OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
044: OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
045: SUCH DAMAGE.
046: ====================================================================
047:
048: This software consists of voluntary contributions made by many
049: individuals on behalf of the Swixml Project and was originally
050: created by Wolf Paulus <wolf_AT_swixml_DOT_org>. For more information
051: on the Swixml Project, please see <http://www.swixml.org/>.
052: */
053:
054: package org.swixml.converters;
055:
056: import org.jdom.Attribute;
057: import org.swixml.Converter;
058: import org.swixml.Localizer;
059: import org.swixml.Parser;
060:
061: import javax.swing.*;
062:
063: /**
064: * A Converter that turns a Strings in the form of a filename into an KeyStroke objects.
065: * <pre>
066: * Valild syntax includes:
067: * <ul>
068: * <li>accelerator="F7"
069: * <li>accelerator="control N"
070: * <li>accelerator="alt A"
071: * </ul>
072: * </pre>
073: * <hr>
074: * @author <a href="mailto:wolf@paulus.com">Wolf Paulus</a>
075: * @author <a href="mailto:Eric.LAFARGUE@cec.eu.int">Eric Lafargue</a>
076: * @version $Revision: 1.1 $
077: * @see javax.swing.KeyStroke#getKeyStroke(java.lang.String)
078: * @see org.swixml.ConverterLibrary
079: */
080: public class KeyStrokeConverter implements Converter {
081:
082: /** converter's return type */
083: public static final Class TEMPLATE = KeyStroke.class;
084:
085: /**
086: * Converts a String into an KeyStroke through a Resource lookup
087: * @param type <code>Class</code> not used
088: * @param attr <code>Attribute</code> attribute provides the value to be converted
089: * @param localizer <code>Localizer</code> allow the use of resource lookups
090: * @return <code>Object</code> - a <code>KeyStroke</code>
091: */
092: public Object convert(final Class type, final Attribute attr,
093: Localizer localizer) {
094: return KeyStrokeConverter.conv(type, attr, localizer);
095: }
096:
097: /**
098: * Converts a String into an KeyStroke.
099: *
100: * Parses a string and returns a <code>KeyStroke</code>.
101: * The string must have the following syntax:
102: * <pre>
103: * <modifiers>* (<typedID> | <pressedReleasedID>)
104: *
105: * modifiers := shift | control | ctrl | meta | alt | button1 | button2 | button3
106: * typedID := typed <typedKey>
107: * typedKey := string of length 1 giving Unicode character.
108: * pressedReleasedID := (pressed | released) key
109: * key := KeyEvent key code name, i.e. the name following "VK_".
110: * </pre>
111: * If typed, pressed or released is not specified, pressed is assumed. Here
112: * are some examples:
113: * <pre>
114: * "INSERT" => getKeyStroke(KeyEvent.VK_INSERT, 0);
115: * "control DELETE" => getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK);
116: * "alt shift X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK);
117: * "alt shift released X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, true);
118: * "typed a" => getKeyStroke('a');
119: * </pre>
120: *
121: * In order to maintain backward-compatibility, specifying a null String,
122: * or a String which is formatted incorrectly, returns null.
123: *
124: * @param type <code>Class</code> not used
125: * @param attr <code>Attribute</code> attribute provides the value to be converted
126: * @param localizer <code>Localizer</code> allow the use of resource lookups
127: * @return <code>Object</code> - a <code>KeyStroke</code> object for that String,
128: * or null if the specified String is null, or is formatted incorrectly
129: */
130: public static Object conv(final Class type, final Attribute attr,
131: Localizer localizer) {
132: KeyStroke keyStroke = null;
133: if (attr != null) {
134: if (Parser.LOCALIZED_ATTRIBUTES.contains(attr.getName()
135: .toLowerCase())) {
136: if (attr.getAttributeType() == Attribute.CDATA_TYPE) {
137: attr.setValue(localizer.getString(attr.getValue()));
138: }
139: }
140: keyStroke = KeyStroke.getKeyStroke(attr.getValue());
141: }
142: return keyStroke;
143: }
144:
145: /**
146: * A <code>Converters</code> conversTo method informs about the Class type the converter
147: * is returning when its <code>convert</code> method is called
148: * @return <code>Class</code> - the Class the converter is returning when its convert method is called
149: */
150: public Class convertsTo() {
151: return TEMPLATE;
152: }
153: }
|