/*
* $Id$
*
* 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.build.module.map;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import VASSAL.build.AbstractBuildable;
import VASSAL.build.Buildable;
import VASSAL.build.module.Map;
import VASSAL.counters.Deck;
import VASSAL.counters.EventFilter;
import VASSAL.counters.GamePiece;
import VASSAL.counters.PieceFinder;
import VASSAL.counters.Properties;
/**
* Centers the map when user right-clicks on an empty hex
*/
public class MapCenterer extends AbstractBuildable implements MouseListener {
private Map map;
private PieceFinder finder;
public void addTo(Buildable b) {
finder = createPieceFinder();
map = (Map) b;
map.addLocalMouseListener(this);
}
/**
* When the user right-clicks on the Map, the view will center on the location
* of the click unless this {@link PieceFinder} locates a piece there.
* @return
*/
protected PieceFinder createPieceFinder() {
return new PieceFinder.PieceInStack() {
public Object visitDeck(Deck d) {
Point pos = d.getPosition();
Point p = new Point(pt.x - pos.x, pt.y - pos.y);
return d.getShape().contains(p) ? d : null;
}
};
}
public String[] getAttributeNames() {
return new String[0];
}
public String getAttributeValueString(String attName) {
return null;
}
public void setAttribute(String attName, Object value) {
}
public void mouseReleased(MouseEvent e) {
if (e.isMetaDown()) {
GamePiece found = map.findPiece(e.getPoint(), finder);
if (found != null) {
EventFilter filter = (EventFilter) found.getProperty(Properties.SELECT_EVENT_FILTER);
if (filter != null
&& filter.rejectEvent(e)) {
found = null;
}
}
if (found == null) {
Map.View m = (Map.View) e.getSource();
m.getMap().centerAt(e.getPoint());
}
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
}