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