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