001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.plugins.streetside.actions;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Dimension;
007import java.awt.event.ActionEvent;
008import java.util.ArrayList;
009import java.util.List;
010
011import javax.swing.JDialog;
012import javax.swing.JOptionPane;
013
014import org.openstreetmap.josm.Main;
015import org.openstreetmap.josm.actions.JosmAction;
016import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
017import org.openstreetmap.josm.plugins.streetside.StreetsideDataListener;
018import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
019import org.openstreetmap.josm.plugins.streetside.StreetsidePlugin;
020import org.openstreetmap.josm.plugins.streetside.gui.StreetsideMainDialog;
021import org.openstreetmap.josm.plugins.streetside.gui.StreetsideWalkDialog;
022import org.openstreetmap.josm.tools.ImageProvider;
023import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
024
025/**
026 * Walks forward at a given interval.
027 *
028 * @author nokutu
029 *
030 */
031public class StreetsideWalkAction extends JosmAction implements StreetsideDataListener {
032
033  private static final long serialVersionUID = 3454223919402245818L;
034
035  private WalkThread thread;
036  private final List<WalkListener> listeners = new ArrayList<>();
037
038  /**
039   *
040   */
041  public StreetsideWalkAction() {
042    super(tr("Walk mode"), new ImageProvider(StreetsidePlugin.LOGO).setSize(ImageSizes.DEFAULT),
043        tr("Walk mode"), null,
044        false, "streetsideWalk", true);
045  }
046
047  @Override
048  public void actionPerformed(ActionEvent arg0) {
049    StreetsideWalkDialog dialog = new StreetsideWalkDialog();
050    JOptionPane pane = new JOptionPane(dialog, JOptionPane.PLAIN_MESSAGE,
051        JOptionPane.OK_CANCEL_OPTION);
052    JDialog dlg = pane.createDialog(Main.parent, tr("Walk mode"));
053    dlg.setMinimumSize(new Dimension(400, 150));
054    dlg.setVisible(true);
055    if (pane.getValue() != null
056        && (int) pane.getValue() == JOptionPane.OK_OPTION) {
057      thread = new WalkThread((int) dialog.spin.getValue(),
058          dialog.waitForPicture.isSelected(),
059          dialog.followSelection.isSelected(), dialog.goForward.isSelected());
060      fireWalkStarted();
061      thread.start();
062      StreetsideMainDialog.getInstance().setMode(StreetsideMainDialog.MODE.WALK);
063    }
064  }
065
066  @Override
067  public void imagesAdded() {
068    // Nothing
069  }
070
071  /**
072   * Adds a listener.
073   *
074   * @param lis
075   *          The listener to be added.
076   */
077  public void addListener(WalkListener lis) {
078    listeners.add(lis);
079  }
080
081  /**
082   * Removes a listener.
083   *
084   * @param lis
085   *          The listener to be added.
086   */
087  public void removeListener(WalkListener lis) {
088    listeners.remove(lis);
089  }
090
091  private void fireWalkStarted() {
092    if (listeners.isEmpty()) {
093      return;
094    }
095    for (WalkListener lis : listeners) {
096      lis.walkStarted(thread);
097    }
098  }
099
100  @Override
101  protected boolean listenToSelectionChange() {
102    return false;
103  }
104
105  @Override
106  public void selectedImageChanged(StreetsideAbstractImage oldImage, StreetsideAbstractImage newImage) {
107    if (oldImage == null && newImage != null) {
108      setEnabled(true);
109    } else if (oldImage != null && newImage == null) {
110      setEnabled(false);
111    }
112  }
113
114  /**
115   * Enabled when a mapillary image is selected.
116   */
117  @Override
118  protected void updateEnabledState() {
119    super.updateEnabledState();
120    setEnabled(StreetsideLayer.hasInstance() && StreetsideLayer.getInstance().getData().getSelectedImage() != null);
121  }
122
123}