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    }