/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.client.gui;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.freecolandroid.repackaged.java.awt.event.ActionEvent;
import org.freecolandroid.repackaged.java.awt.event.ActionListener;
import org.freecolandroid.repackaged.java.awt.event.MouseEvent;
import org.freecolandroid.repackaged.java.awt.event.MouseListener;
import org.freecolandroid.repackaged.javax.swing.Timer;
import net.sf.freecol.FreeCol;
import net.sf.freecol.client.FreeColClient;
import net.sf.freecol.client.control.InGameController;
import net.sf.freecol.common.model.PathNode;
import net.sf.freecol.common.model.Tile;
import net.sf.freecol.common.model.Unit;
import net.sf.freecol.common.model.Unit.UnitState;
/**
* Listens to mouse buttons being pressed at the level of the Canvas.
*/
public final class CanvasMouseListener implements ActionListener, MouseListener {
private static final Logger logger = Logger.getLogger(CanvasMouseListener.class.getName());
private final Canvas canvas;
private final MapViewer mapViewer;
private final int doubleClickDelay = 200; // Milliseconds
private Timer doubleClickTimer;
private int centerX, centerY;
private FreeColClient freeColClient;
/**
* The constructor to use.
*
* @param canvas The component this object gets created for.
* @param mapViewer The GUI that holds information such as screen resolution.
*/
public CanvasMouseListener(FreeColClient freeColClient, Canvas canvas, MapViewer mapViewer) {
this.freeColClient = freeColClient;
this.canvas = canvas;
this.mapViewer = mapViewer;
doubleClickTimer = new Timer(doubleClickDelay,this, freeColClient);
}
/**
* Invoked when a mouse button was clicked.
*
* @param e The MouseEvent that holds all the information.
*/
public void mouseClicked(MouseEvent e) {
try {
if (e.getClickCount() > 1) {
Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY());
if (FreeCol.isInDebugMode()) {
if (tile.getSettlement() != null) {
canvas.debugForeignColony(tile.getSettlement());
}
} else {
canvas.showColonyPanel(tile);
}
} else {
canvas.requestFocus();
}
} catch (Exception ex) {
logger.log(Level.WARNING, "Error in mouseClicked!", ex);
}
}
/**
* Invoked when the mouse enters the component.
*
* @param e The MouseEvent that holds all the information.
*/
public void mouseEntered(MouseEvent e) {
// Ignore for now.
}
/**
* Invoked when the mouse exits the component.
*
* @param e The MouseEvent that holds all the information.
*/
public void mouseExited(MouseEvent e) {
// Ignore for now.
}
/**
* Invoked when a mouse button was pressed.
*
* @param e The MouseEvent that holds all the information.
*/
public void mousePressed(MouseEvent e) {
if (!e.getComponent().isEnabled()) {
return;
}
try {
if (e.getButton() == MouseEvent.BUTTON3 || e.isPopupTrigger()) {
// Cancel goto if one is active
if (mapViewer.isGotoStarted()) {
mapViewer.stopGoto();
}
canvas.showTilePopup(mapViewer.convertToMapTile(e.getX(), e.getY()), e.getX(), e.getY());
} else if (e.getButton() == MouseEvent.BUTTON2) {
Tile tile = mapViewer.convertToMapTile(e.getX(), e.getY());
if (tile != null) {
Unit unit = mapViewer.getActiveUnit();
if (unit != null && unit.getTile() != tile) {
PathNode dragPath = unit.findPath(tile);
mapViewer.startGoto();
mapViewer.setGotoPath(dragPath);
}
}
} else if (e.getButton() == MouseEvent.BUTTON1) {
if (mapViewer.isGotoStarted()) {
PathNode path = mapViewer.getGotoPath();
if (path != null) {
mapViewer.stopGoto();
// Move the unit:
Unit unit = mapViewer.getActiveUnit();
freeColClient.getInGameController()
.setDestination(unit, path.getLastNode().getTile());
if (freeColClient.currentPlayerIsMyPlayer()) {
freeColClient.getInGameController()
.moveToDestination(unit);
}
}
} else if (doubleClickTimer.isRunning()) {
doubleClickTimer.stop();
} else {
centerX = e.getX();
centerY = e.getY();
doubleClickTimer.start();
}
canvas.requestFocus();
}
} catch (Exception ex) {
logger.log(Level.WARNING, "Error in mousePressed!", ex);
}
}
/**
* Invoked when a mouse button was released.
*
* @param e The MouseEvent that holds all the information.
*/
public void mouseReleased(MouseEvent e) {
try {
if (mapViewer.getGotoPath() != null) {
// A mouse drag has ended (see CanvasMouseMotionListener).
PathNode temp = mapViewer.getGotoPath();
mapViewer.stopGoto();
// Move the unit:
Unit unit = mapViewer.getActiveUnit();
InGameController ctlr = freeColClient
.getInGameController();
ctlr.setDestination(unit, temp.getLastNode().getTile());
if (freeColClient.currentPlayerIsMyPlayer()) {
ctlr.moveToDestination(unit);
boolean canStayActive = unit.getState() == UnitState.ACTIVE
&& unit.getDestination() == null
&& unit.getMovesLeft() > 0;
if(canStayActive){
return;
}
ctlr.nextActiveUnit();
}
} else if (mapViewer.isGotoStarted()) {
mapViewer.stopGoto();
}
} catch (Exception ex) {
logger.log(Level.WARNING, "Error in mouseReleased!", ex);
}
}
public void actionPerformed(ActionEvent timerEvent){
doubleClickTimer.stop();
mapViewer.setSelectedTile(mapViewer.convertToMapTile(centerX, centerY), true);
}
}