/**********************************************************************
 * Copyright (C) 2003 swixml.org. <http://www.swixml.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions, and the disclaimer that follows
 *    these conditions in the documentation and/or other materials
 *    provided with the distribution.
 *
 * 3. The name "Swixml" must not be used to endorse or promote products
 *    derived from this software without prior written permission.  For
 *    written permission, please contact Wolf Paulus <wolf@paulus.com>
 *
 * 4. Products derived from this software may not be called "Swixml", nor
 *    may "Swixml" appear in their name, without prior written permission
 *    from the Swixml Project Management.
 *
 * In addition, we request (but do not require) that you include in the
 * end-user documentation provided with the redistribution and/or in the
 * software itself an acknowledgement equivalent to the following:
 *     "This product includes software developed by the
 *      Swixml Project (http://www.swixml.org/)."
 * Alternatively, the acknowledgment may be graphical using the logos
 * available at http://www.swixml.org/
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE SWIX AUTHORS OR THE PROJECT
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * ====================================================================
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Swixml Project and was originally
 * created by Wolf Paulus <wolf@paulus.com>. For more information on the
 * Swixml Project, please see <http://www.swixml.org/>.
 */

package org.swixml.converters;

import org.jdom.Attribute;
import org.swixml.Converter;
import org.swixml.Localizer;
import org.swixml.Parser;

import javax.swing.*;

/**
 * A Converter that turns a Strings in the form of a filename into an KeyStroke objects.

 * @author <a href="mailto:wolf@paulus.com">Wolf Paulus</a>
 * @version $Revision: 1.0 $
 * @see java.awt.Dimension
 * @see org.swixml.ConverterLibrary
 */
public class KeyStrokeConverter implements Converter {

  /** converter's return type */
  public static final Class TEMPLATE = KeyStroke.class;

  /**
   * Converts a String into an KeyStroke through a Resource lookup
   * @param type <code>Class</code> not used
   * @param attr <code>Attribute</code> attribute provides the value to be converted
   * @param localizer <code>Localizer</code> allow the use of resource lookups
   * @return <code>Object</code> - an <code>KeyStroke</code>
   */
  public Object convert( final Class type, final Attribute attr, Localizer localizer ) {
    return KeyStrokeConverter.conv( type, attr, localizer );
  }

  /**
   * Converts a String into an ImageIcon through a Resource lookup
   * @param type <code>Class</code> not used
   * @param attr <code>Attribute</code> attribute provides the value to be converted
   * @param localizer <code>Localizer</code> allow the use of resource lookups
   * @return <code>Object</code> - an <code>KeyStroke</code>
   */
  public static Object conv( final Class type, final Attribute attr, Localizer localizer ) {
    KeyStroke keyStroke = null;
    if (attr != null) {
      if (Parser.LOCALIZED_ATTRIBUTES.contains( attr.getName().toLowerCase() )) {
        if (attr.getAttributeType() == Attribute.CDATA_ATTRIBUTE) {
          attr.setValue( localizer.getString( attr.getValue() ) );
        }
      }
      try {
        keyStroke = KeyStroke.getKeyStroke( attr.getValue() );
      } catch (Exception e) {
        // intentionally empty
      }
    }
    return keyStroke;
  }

  /**
   * A <code>Converters</code> conversTo method informs about the Class type the converter
   * is returning when its <code>convert</code> method is called
   * @return <code>Class</code> - the Class the converter is returning when its convert method is called
   */
  public Class convertsTo() {
    return TEMPLATE;
  }
}
