/*
 * $Id: KeyStrokeListener.java 3907 2008-07-28 15:08:04Z uckelman $
 *
 * Copyright (c) 2000-2003 by Rodney Kinney
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License (LGPL) as published by the Free Software Foundation.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, copies are available
 * at http://www.opensource.org.
 */
package VASSAL.tools;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.KeyStroke;

/**
 * Utility class for associating an Action with a keystroke from multiple
 * different component sources
 *
 * @see VASSAL.build.GameModule#addKeyStrokeListener
 * @see VASSAL.build.GameModule#addKeyStrokeSource
 */
public class KeyStrokeListener {
  private ActionListener l;
  private KeyStroke key;
  private List<KeyStrokeSource> sources = new ArrayList<KeyStrokeSource>();

  public KeyStrokeListener(ActionListener l, KeyStroke key) {
    this.l = l;
    setKeyStroke(key);
  }

  public KeyStrokeListener(ActionListener l) {
    this(l, null);
  }

  public void setKeyStroke(KeyStroke newKey) {
    if (newKey != null && newKey.getKeyCode() == 0) {
      newKey = null;
    }
    if (key != null) {
      for (KeyStrokeSource s : sources) {
        s.getComponent().unregisterKeyboardAction(key);
      }
    }
    key = newKey;
    for (KeyStrokeSource s : sources) {
      addKeyStrokeSource(s);
    }
  }

  public KeyStroke getKeyStroke() {
    return key;
  }
  
  public void keyPressed(KeyStroke stroke) {
    if (stroke != null && stroke.equals(key)) {
      l.actionPerformed(new ActionEvent(this,0,"Direct Invocation"));
    }
  }

  public void addKeyStrokeSource(KeyStrokeSource src) {
    if (!sources.contains(src)) {
      sources.add(src);
    }
    if (key != null) {
      src.getComponent().registerKeyboardAction(l, key, src.getMode());
    }
  }
}
