    001// License: GPL. For details, see LICENSE file.
    002package org.openstreetmap.josm.plugins.streetside.mode;
    003
    004import static org.openstreetmap.josm.tools.I18n.tr;
    005
    006import java.awt.Color;
    007import java.awt.Cursor;
    008import java.awt.Graphics2D;
    009import java.awt.Point;
    010import java.awt.event.MouseEvent;
    011import java.util.Arrays;
    012
    013import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
    014import org.openstreetmap.josm.plugins.streetside.StreetsideImportedImage;
    015import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
    016import org.openstreetmap.josm.plugins.streetside.history.StreetsideRecord;
    017
    018import org.openstreetmap.josm.data.Bounds;
    019import org.openstreetmap.josm.gui.MainApplication;
    020import org.openstreetmap.josm.gui.MapView;
    021import org.openstreetmap.josm.plugins.streetside.history.commands.CommandJoin;
    022import org.openstreetmap.josm.plugins.streetside.history.commands.CommandUnjoin;
    023
    024/**
    025 * In this mode the user can join pictures to make sequences or unjoin them.
    026 *
    027 * @author nokutu
    028 *
    029 */
    030public class JoinMode extends AbstractMode {
    031
    032  private StreetsideImportedImage lastClick;
    033  private MouseEvent lastPos;
    034
    035  /**
    036   * Main constructor.
    037   */
    038  public JoinMode() {
    039    this.cursor = Cursor.CROSSHAIR_CURSOR;
    040  }
    041
    042  @Override
    043  public void mousePressed(MouseEvent e) {
    044    final StreetsideAbstractImage highlighted = StreetsideLayer.getInstance().getData().getHighlightedImage();
    045    if (highlighted == null) {
    046      return;
    047    }
    048    if (this.lastClick == null && highlighted instanceof StreetsideImportedImage) {
    049      this.lastClick = (StreetsideImportedImage) highlighted;
    050    } else if (this.lastClick != null
    051        && highlighted instanceof StreetsideImportedImage) {
    052      if (
    053        (
    054          (highlighted.previous() == null && this.lastClick.next() == null) ||
    055          (highlighted.next() == null && this.lastClick.previous() == null)
    056        )
    057        && highlighted.getSequence() != this.lastClick.getSequence()
    058      ) {
    059        StreetsideRecord.getInstance().addCommand(new CommandJoin(this.lastClick, highlighted));
    060      } else if (this.lastClick.next() == highlighted || this.lastClick.previous() == highlighted) {
    061        StreetsideRecord.getInstance().addCommand(
    062          new CommandUnjoin(Arrays.asList(this.lastClick, highlighted))
    063        );
    064      }
    065      this.lastClick = null;
    066    }
    067    StreetsideLayer.invalidateInstance();
    068  }
    069
    070  @Override
    071  public void mouseMoved(MouseEvent e) {
    072    this.lastPos = e;
    073    if (!(MainApplication.getLayerManager().getActiveLayer() instanceof StreetsideLayer))
    074      return;
    075    StreetsideAbstractImage closestTemp = getClosest(e.getPoint());
    076    StreetsideLayer.getInstance().getData().setHighlightedImage(closestTemp);
    077    StreetsideLayer.invalidateInstance();
    078  }
    079
    080  @Override
    081  public void paint(Graphics2D g, MapView mv, Bounds box) {
    082    if (this.lastClick != null) {
    083      g.setColor(Color.WHITE);
    084      Point p0 = mv.getPoint(this.lastClick.getMovingLatLon());
    085      Point p1 = this.lastPos.getPoint();
    086      g.drawLine(p0.x, p0.y, p1.x, p1.y);
    087    }
    088  }
    089
    090  @Override
    091  public String toString() {
    092    return tr("Join mode");
    093  }
    094}