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 }