// License: GPL. See LICENSE file for details.
package org.openstreetmap.josm.actions.mapmode;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.gui.MapFrame;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.tools.ImageProvider;
import org.openstreetmap.josm.tools.Shortcut;
/**
* A class implementing MapMode is able to be selected as an mode for map editing.
* As example scrolling the map is a MapMode, connecting Nodes to new Ways
* is another.
*
* MapModes should register/deregister all necessary listeners on the map's view
* control.
*/
abstract public class MapMode extends JosmAction implements MouseListener, MouseMotionListener {
private final Cursor cursor;
private Cursor oldCursor;
/**
* Constructor for mapmodes without an menu
*/
public MapMode(String name, String iconName, String tooltip, Shortcut shortcut, MapFrame mapFrame, Cursor cursor) {
super(name, "mapmode/"+iconName, tooltip, shortcut, false);
this.cursor = cursor;
putValue("active", false);
}
/**
* Constructor for mapmodes with an menu (no shortcut will be registered)
*/
public MapMode(String name, String iconName, String tooltip, MapFrame mapFrame, Cursor cursor) {
putValue(NAME, name);
putValue(SMALL_ICON, ImageProvider.get("mapmode", iconName));
putValue(SHORT_DESCRIPTION, tooltip);
this.cursor = cursor;
}
public void enterMode() {
putValue("active", true);
oldCursor = Main.map.mapView.getCursor();
Main.map.mapView.setCursor(cursor);
updateStatusLine();
}
public void exitMode() {
putValue("active", false);
Main.map.mapView.setCursor(oldCursor);
}
protected void updateStatusLine() {
Main.map.statusLine.setHelpText(getModeHelpText());
Main.map.statusLine.repaint();
}
public String getModeHelpText() {
return "";
}
/**
* Call selectMapMode(this) on the parent mapFrame.
*/
public void actionPerformed(ActionEvent e) {
if (Main.map != null)
Main.map.selectMapMode(this);
}
// By default, all tools will work with all layers. Can be overwritten to require
// a special type of layer
public boolean layerIsSupported(Layer l) {
return true;
}
public void mouseReleased(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {}
}