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}