Ticket #6323: create_new_mode_2_6323.patch

File create_new_mode_2_6323.patch, 7.5 KB (added by Hojoe, 11 years ago)

the creat_new mode without the 'add node' code

  • src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java

    ### Eclipse Workspace Patch 1.0
    #P JOSM
     
    44import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66
     7import java.awt.AWTEvent;
    78import java.awt.BasicStroke;
    89import java.awt.Color;
    910import java.awt.Cursor;
    1011import java.awt.Graphics2D;
    1112import java.awt.Point;
    1213import java.awt.Rectangle;
     14import java.awt.Toolkit;
     15import java.awt.event.AWTEventListener;
    1316import java.awt.event.ActionEvent;
     17import java.awt.event.InputEvent;
    1418import java.awt.event.KeyEvent;
    1519import java.awt.event.MouseEvent;
    1620import java.awt.geom.AffineTransform;
     
    5054 */
    5155public class ExtrudeAction extends MapMode implements MapViewPaintable {
    5256
    53     enum Mode { extrude, translate, select }
     57    enum Mode { extrude, translate, select, create_new }
    5458
    5559    private Mode mode = Mode.select;
    5660
     
    97101     */
    98102    private MoveCommand moveCommand;
    99103
     104    /** The cursor for the 'create_new' mode. */
     105    private final Cursor cursorCreateNew;
     106
    100107    /**
     108     * This listener is used to indicate the 'create_new' mode, if the Alt modifier is pressed.
     109     */
     110    private final AWTEventListener altKeyListener = new AWTEventListener() {
     111        @Override
     112        public void eventDispatched(AWTEvent e) {
     113            if(Main.map == null || Main.map.mapView == null || !Main.map.mapView.isActiveLayerDrawable())
     114                return;
     115            if(mode == Mode.select) {
     116                InputEvent ie = (InputEvent) e;
     117                boolean altDown = (ie.getModifiers() & ActionEvent.ALT_MASK) != 0;
     118                Main.map.mapView.setNewCursor(altDown ? cursorCreateNew : cursor, this);
     119            }
     120        }
     121    };
     122
     123    /**
    101124     * Create a new SelectAction
    102125     * @param mapFrame The MapFrame this action belongs to.
    103126     */
     
    109132        putValue("help", ht("/Action/Extrude"));
    110133        initialMoveDelay = Main.pref.getInteger("edit.initial-move-delay",200);
    111134        selectedColor = PaintColors.SELECTED.get();
     135        cursorCreateNew = ImageProvider.getCursor("normal", "rectangle_plus");
    112136    }
    113137
    114138    @Override public String getModeHelpText() {
     
    116140            return tr("Move a segment along its normal, then release the mouse button.");
    117141        else if (mode == Mode.extrude)
    118142            return tr("Draw a rectangle of the desired size, then release the mouse button.");
     143        else if (mode == Mode.create_new)
     144            return tr("Draw a rectangle of the desired size, then release the mouse button.");
    119145        else
    120             return tr("Drag a way segment to make a rectangle. Ctrl-drag to move a segment along its normal.");
     146            return tr("Drag a way segment to make a rectangle. Ctrl-drag to move a segment along its normal, Alt-drag to create a new rectangle.");
    121147    }
    122148
    123149    @Override public boolean layerIsSupported(Layer l) {
     
    128154        super.enterMode();
    129155        Main.map.mapView.addMouseListener(this);
    130156        Main.map.mapView.addMouseMotionListener(this);
     157        try {
     158            Toolkit.getDefaultToolkit().addAWTEventListener(altKeyListener, AWTEvent.KEY_EVENT_MASK);
     159        }
     160        catch (SecurityException ex) { /* ignore, don't indicate the create_new mode */ }
    131161    }
    132162
    133163    @Override public void exitMode() {
    134164        Main.map.mapView.removeMouseListener(this);
    135165        Main.map.mapView.removeMouseMotionListener(this);
    136166        Main.map.mapView.removeTemporaryLayer(this);
     167        try {
     168            Toolkit.getDefaultToolkit().removeAWTEventListener(altKeyListener);
     169        }
     170        catch (SecurityException ex) { /* ignore, don't indicate the create_new mode */ }
    137171        super.exitMode();
    138172    }
    139173
    140174    /**
    141175     * If the left mouse button is pressed over a segment, switch
    142      * to either extrude or translate mode depending on whether Ctrl is held.
     176     * to either extrude, translate or create_new mode depending on whether Ctrl or Alt is held.
    143177     */
    144178    @Override public void mousePressed(MouseEvent e) {
    145179        if(!Main.map.mapView.isActiveLayerVisible())
     
    158192
    159193            if ((e.getModifiers() & ActionEvent.CTRL_MASK) != 0) {
    160194                mode = Mode.translate;
     195            } else if ((e.getModifiers() & ActionEvent.ALT_MASK) != 0) {
     196                mode = Mode.create_new;
     197                // create a new segment and then select and extrude the new segment
     198                getCurrentDataSet().setSelected(selectedSegment.way);
     199                alwaysCreateNodes = true;
    161200            } else {
    162201                mode = Mode.extrude;
    163202                getCurrentDataSet().setSelected(selectedSegment.way);
     
    224263        if (mode == Mode.select) {
    225264            // Just sit tight and wait for mouse to be released.
    226265        } else {
    227             //move and extrude mode - move the selected segment
     266            //move, create new and extrude mode - move the selected segment
    228267
    229268            EastNorth initialMouseEn = Main.map.mapView.getEastNorth(initialMousePos.x, initialMousePos.y);
    230269            EastNorth mouseEn = Main.map.mapView.getEastNorth(e.getPoint().x, e.getPoint().y);
     
    260299
    261300            Main.map.mapView.setNewCursor(Cursor.MOVE_CURSOR, this);
    262301
    263             if (mode == Mode.extrude) {
     302            if (mode == Mode.extrude || mode == Mode.create_new) {
    264303                //nothing here
    265304            } else if (mode == Mode.translate) {
    266305                //move nodes to new position
     
    292331        if (mode == Mode.select) {
    293332            // Nothing to be done
    294333        } else {
    295             if (mode == Mode.extrude) {
     334            if (mode == Mode.create_new) {
    296335                if (e.getPoint().distance(initialMousePos) > 10 && newN1en != null) {
     336                    Collection<Command> cmds = new LinkedList<Command>();
     337                    Node third = new Node(newN2en);
     338                    Node fourth = new Node(newN1en);
     339                    Way wnew = new Way();
     340                    wnew.addNode(selectedSegment.getFirstNode());
     341                    wnew.addNode(selectedSegment.getSecondNode());
     342                    wnew.addNode(third);
     343                    wnew.addNode(fourth);
     344                    // ... and close the way
     345                    wnew.addNode(selectedSegment.getFirstNode());
     346                    // undo support
     347                    cmds.add(new AddCommand(third));
     348                    cmds.add(new AddCommand(fourth));
     349                    cmds.add(new AddCommand(wnew));
     350                    Command c = new SequenceCommand(tr("Extrude Way"), cmds);
     351                    Main.main.undoRedo.add(c);
     352                    getCurrentDataSet().setSelected(wnew);
     353                }
     354            } else if (mode == Mode.extrude) {
     355                if (e.getPoint().distance(initialMousePos) > 10 && newN1en != null) {
    297356                    // create extrusion
    298357
    299358                    Collection<Command> cmds = new LinkedList<Command>();
     
    438497                Point p3 = mv.getPoint(newN1en);
    439498                Point p4 = mv.getPoint(newN2en);
    440499
    441                 if (mode == Mode.extrude) {
     500                if (mode == Mode.extrude || mode == Mode.create_new) {
    442501                    // Draw rectangle around new area.
    443502                    GeneralPath b = new GeneralPath();
    444503                    b.moveTo(p1.x, p1.y); b.lineTo(p3.x, p3.y);