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.awt.event.KeyEvent;
009import java.util.Set;
010import java.util.concurrent.ConcurrentSkipListSet;
011
012import javax.swing.JButton;
013import javax.swing.JDialog;
014import javax.swing.JOptionPane;
015
016import org.apache.log4j.Logger;
017import org.openstreetmap.josm.actions.JosmAction;
018import org.openstreetmap.josm.gui.MainApplication;
019import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage;
020import org.openstreetmap.josm.plugins.streetside.StreetsideImage;
021import org.openstreetmap.josm.plugins.streetside.StreetsideLayer;
022import org.openstreetmap.josm.plugins.streetside.StreetsidePlugin;
023import org.openstreetmap.josm.plugins.streetside.gui.StreetsideExportDialog;
024import org.openstreetmap.josm.plugins.streetside.io.export.StreetsideExportManager;
025import org.openstreetmap.josm.tools.ImageProvider;
026import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
027import org.openstreetmap.josm.tools.Shortcut;
028
029/**
030 * Action that launches a StreetsideExportDialog and lets you export the images.
031 *
032 * @author nokutu
033 *
034 */
035public class StreetsideExportAction extends JosmAction {
036
037  private static final long serialVersionUID = 6131359489725632369L;
038
039  final static Logger logger = Logger.getLogger(StreetsideExportAction.class);
040
041  private StreetsideExportDialog dialog;
042
043  /**
044   * Main constructor.
045   */
046  public StreetsideExportAction() {
047    super(tr("Export Streetside images"), new ImageProvider(StreetsidePlugin.LOGO).setSize(ImageSizes.DEFAULT),
048        tr("Export Streetside images"), Shortcut.registerShortcut("Export Streetside",
049            tr("Export Streetside images"), KeyEvent.CHAR_UNDEFINED,
050            Shortcut.NONE), false, "streetsideExport", true);
051    setEnabled(false);
052  }
053
054  @Override
055  public void actionPerformed(ActionEvent ae) {
056    JOptionPane pane = new JOptionPane();
057
058    JButton ok = new JButton("Ok");
059    ok.addActionListener(e -> pane.setValue(JOptionPane.OK_OPTION));
060    JButton cancel = new JButton(tr("Cancel"));
061    cancel.addActionListener(e -> pane.setValue(JOptionPane.CANCEL_OPTION));
062
063    dialog = new StreetsideExportDialog(ok);
064    pane.setMessage(dialog);
065    pane.setOptions(new JButton[] {ok, cancel});
066
067    JDialog dlg = pane.createDialog(MainApplication.getMainFrame(), tr("Export Streetside images"));
068    dlg.setMinimumSize(new Dimension(400, 150));
069    dlg.setVisible(true);
070
071    // Checks if the inputs are correct and starts the export process.
072    if (pane.getValue() != null
073        && (int) pane.getValue() == JOptionPane.OK_OPTION
074        && dialog.chooser != null) {
075      if (dialog.group.isSelected(dialog.all.getModel())) {
076        export(StreetsideLayer.getInstance().getData().getImages());
077      } else if (dialog.group.isSelected(dialog.sequence.getModel())) {
078        Set<StreetsideAbstractImage> images = new ConcurrentSkipListSet<>();
079        for (StreetsideAbstractImage image : StreetsideLayer.getInstance().getData().getMultiSelectedImages()) {
080          if (image instanceof StreetsideImage) {
081            if (!images.contains(image)) {
082              images.addAll(image.getSequence().getImages());
083            }
084          } else {
085            images.add(image);
086          }
087        }
088        export(images);
089      } else if (dialog.group.isSelected(dialog.selected.getModel())) {
090        export(StreetsideLayer.getInstance().getData().getMultiSelectedImages());
091      }
092    }
093    dlg.dispose();
094  }
095
096  /**
097   * Exports the given images from the database.
098   *
099   * @param images
100   *          The set of images to be exported.
101   */
102  public void export(Set<StreetsideAbstractImage> images) {
103    MainApplication.worker.execute(new StreetsideExportManager(images,
104        dialog.chooser.getSelectedFile().toString()));
105  }
106
107  @Override
108  protected boolean listenToSelectionChange() {
109    return false;
110  }
111
112  /**
113   * Enabled when streetside layer is in layer list
114   */
115  @Override
116  protected void updateEnabledState() {
117    super.updateEnabledState();
118    setEnabled(StreetsideLayer.hasInstance());
119  }
120}