001 // License: GPL. See LICENSE file for details.
002 package org.openstreetmap.josm.actions.mapmode;
003
004 import java.awt.Cursor;
005 import java.awt.event.ActionEvent;
006 import java.awt.event.InputEvent;
007 import java.awt.event.MouseEvent;
008 import java.awt.event.MouseListener;
009 import java.awt.event.MouseMotionListener;
010
011 import org.openstreetmap.josm.Main;
012 import org.openstreetmap.josm.actions.JosmAction;
013 import org.openstreetmap.josm.gui.MapFrame;
014 import org.openstreetmap.josm.gui.layer.Layer;
015 import org.openstreetmap.josm.tools.ImageProvider;
016 import org.openstreetmap.josm.tools.Shortcut;
017
018 /**
019 * A class implementing MapMode is able to be selected as an mode for map editing.
020 * As example scrolling the map is a MapMode, connecting Nodes to new Ways
021 * is another.
022 *
023 * MapModes should register/deregister all necessary listeners on the map's view
024 * control.
025 */
026 abstract public class MapMode extends JosmAction implements MouseListener, MouseMotionListener {
027 protected final Cursor cursor;
028 protected boolean ctrl;
029 protected boolean alt;
030 protected boolean shift;
031
032 /**
033 * Constructor for mapmodes without an menu
034 */
035 public MapMode(String name, String iconName, String tooltip, Shortcut shortcut, MapFrame mapFrame, Cursor cursor) {
036 super(name, "mapmode/"+iconName, tooltip, shortcut, false);
037 this.cursor = cursor;
038 putValue("active", false);
039 }
040
041 /**
042 * Constructor for mapmodes with an menu (no shortcut will be registered)
043 */
044 public MapMode(String name, String iconName, String tooltip, MapFrame mapFrame, Cursor cursor) {
045 putValue(NAME, name);
046 putValue(SMALL_ICON, ImageProvider.get("mapmode", iconName));
047 putValue(SHORT_DESCRIPTION, tooltip);
048 this.cursor = cursor;
049 }
050
051 public void enterMode() {
052 putValue("active", true);
053 Main.map.mapView.setNewCursor(cursor, this);
054 updateStatusLine();
055 }
056 public void exitMode() {
057 putValue("active", false);
058 Main.map.mapView.resetCursor(this);
059 }
060
061 protected void updateStatusLine() {
062 Main.map.statusLine.setHelpText(getModeHelpText());
063 Main.map.statusLine.repaint();
064 }
065
066 public String getModeHelpText() {
067 return "";
068 }
069 /**
070 * Call selectMapMode(this) on the parent mapFrame.
071 */
072 public void actionPerformed(ActionEvent e) {
073 if (Main.isDisplayingMapView()) {
074 Main.map.selectMapMode(this);
075 }
076 }
077
078 // By default, all tools will work with all layers. Can be overwritten to require
079 // a special type of layer
080 public boolean layerIsSupported(Layer l) {
081 return true;
082 }
083
084 protected void updateKeyModifiers(InputEvent e) {
085 updateKeyModifiers(e.getModifiers());
086 }
087
088 protected void updateKeyModifiers(MouseEvent e) {
089 updateKeyModifiers(e.getModifiers());
090 }
091
092 protected void updateKeyModifiers(int modifiers) {
093 ctrl = (modifiers & ActionEvent.CTRL_MASK) != 0;
094 alt = (modifiers & (ActionEvent.ALT_MASK|InputEvent.ALT_GRAPH_MASK)) != 0;
095 shift = (modifiers & ActionEvent.SHIFT_MASK) != 0;
096 }
097
098 public void mouseReleased(MouseEvent e) {}
099 public void mouseExited(MouseEvent e) {}
100 public void mousePressed(MouseEvent e) {}
101 public void mouseClicked(MouseEvent e) {}
102 public void mouseEntered(MouseEvent e) {}
103 public void mouseMoved(MouseEvent e) {}
104 public void mouseDragged(MouseEvent e) {}
105 }