Ticket #13815: 13815_v2.patch

File 13815_v2.patch, 11.3 KB (added by Adrian, 9 years ago)
  • src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java

     
    8888    private int currentPhoto = -1;
    8989
    9090    boolean useThumbs;
     91    boolean useExternalViewer;
    9192    private final ExecutorService thumbsLoaderExecutor =
    9293            Executors.newSingleThreadExecutor(Utils.newThreadFactory("thumbnail-loader-%d", Thread.MIN_PRIORITY));
    9394    private ThumbsLoader thumbsloader;
     
    324325        entries.add(SeparatorLayerAction.INSTANCE);
    325326        entries.add(new CorrelateGpxWithImages(this));
    326327        entries.add(new ShowThumbnailAction(this));
     328        entries.add(new UseExternalViewerAction(this));
     329        entries.add(new SetExternalViewerAction(this));
    327330        if (!menuAdditions.isEmpty()) {
    328331            entries.add(SeparatorLayerAction.INSTANCE);
    329332            entries.addAll(menuAdditions);
     
    731734        }
    732735    }
    733736
     737    public void openCurrentPhotoInExternalViewer() {
     738        if (data != null && !data.isEmpty() && currentPhoto >= 0 && currentPhoto < data.size()) {
     739            String externalViewerPath = Main.pref.get("external.viewer.path", "");
     740            if (externalViewerPath != "") {
     741                String imagePath = data.get(currentPhoto).getFile().toString();
     742                try {
     743                    if (Main.isPlatformOsx()) {
     744                        String[] command = {"open", "-a", externalViewerPath, imagePath};
     745                        Runtime.getRuntime().exec(command);
     746                    } else {
     747                        String[] command = {externalViewerPath, imagePath};
     748                        Runtime.getRuntime().exec(command);
     749                    }
     750                } catch (IOException ex) {
     751                    System.err.println(tr("IOException: ")+ex.getMessage());
     752                }
     753            }
     754        }
     755    }
     756
    734757    /**
    735758     * Removes a photo from the list of images by index.
    736759     * @param idx Image index
     
    882905                        currentPhoto = i;
    883906                        ImageViewerDialog.showImage(GeoImageLayer.this, e);
    884907                        Main.map.repaint();
     908                        if (useExternalViewer) {
     909                            openCurrentPhotoInExternalViewer();
     910                        }
    885911                        break;
    886912                    }
    887913                }
     
    10071033    @Override
    10081034    public void jumpToNextMarker() {
    10091035        showNextPhoto();
     1036        if (useExternalViewer) {
     1037            openCurrentPhotoInExternalViewer();
     1038        }
    10101039    }
    10111040
    10121041    @Override
    10131042    public void jumpToPreviousMarker() {
    10141043        showPreviousPhoto();
     1044        if (useExternalViewer) {
     1045            openCurrentPhotoInExternalViewer();
     1046        }
    10151047    }
    10161048
    10171049    /**
     
    10371069            stopLoadThumbs();
    10381070        }
    10391071    }
     1072
     1073    /**
     1074     * Returns the current external viewer status.
     1075     * {@code true}: external viewer is used, {@code false}: external viewer is not used.
     1076     * @return Current external viewer status
     1077     * @since
     1078     */
     1079    public boolean isUseExternalViewer() {
     1080        return useExternalViewer;
     1081    }
     1082
     1083    /**
     1084     * Enables or disables the use of an external viewer.
     1085     * @param useExternalViewer New external viewer status
     1086     * @since
     1087     */
     1088    public void setUseExternalViewer(boolean useExternalViewer) {
     1089        this.useExternalViewer = useExternalViewer;
     1090    }
    10401091}
  • src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java

     
    4747    private static final String COMMAND_FIRST = "first";
    4848    private static final String COMMAND_LAST = "last";
    4949    private static final String COMMAND_COPY_PATH = "copypath";
     50    private static final String COMMAND_OPEN_EXTERNAL = "openexternal";
    5051
    5152    private final ImageDisplay imgDisplay = new ImageDisplay();
    5253    private boolean centerView;
     
    162163                ImageProvider.get("dialogs", "zoom-best-fit"), tr("Zoom best fit and 1:1")));
    163164        btnZoomBestFit.setPreferredSize(buttonDim);
    164165
     166        JButton btnOpenExternal = new JButton(new ImageAction(COMMAND_OPEN_EXTERNAL,
     167                ImageProvider.get("open"), tr("Open in external viewer")));
     168        btnOpenExternal.setPreferredSize(buttonDim);
     169
    165170        btnCollapse = new JButton(new ImageAction(COMMAND_COLLAPSE,
    166171                ImageProvider.get("dialogs", "collapse"), tr("Move dialog to the side pane")));
    167172        btnCollapse.setPreferredSize(new Dimension(20, 20));
     
    178183        buttons.add(btnDeleteFromDisk);
    179184        buttons.add(Box.createRigidArea(new Dimension(7, 0)));
    180185        buttons.add(btnCopyPath);
     186        buttons.add(btnOpenExternal);
    181187
    182188        JPanel bottomPane = new JPanel(new GridBagLayout());
    183189        GridBagConstraints gc = new GridBagConstraints();
     
    248254                if (currentLayer != null) {
    249255                    currentLayer.copyCurrentPhotoPath();
    250256                }
     257            } else if (COMMAND_OPEN_EXTERNAL.equals(action)) {
     258                if (currentLayer != null) {
     259                    currentLayer.openCurrentPhotoInExternalViewer();
     260                }
    251261            } else if (COMMAND_COLLAPSE.equals(action)) {
    252262                collapseButtonClicked = true;
    253263                detachedDialog.getToolkit().getSystemEventQueue().postEvent(new WindowEvent(detachedDialog, WindowEvent.WINDOW_CLOSING));
  • src/org/openstreetmap/josm/gui/layer/geoimage/SetExternalViewerAction.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.layer.geoimage;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.Component;
     7import java.awt.event.ActionEvent;
     8import java.io.File;
     9import java.util.List;
     10
     11import javax.swing.AbstractAction;
     12import javax.swing.JMenuItem;
     13import javax.swing.JFileChooser;
     14
     15import org.openstreetmap.josm.Main;
     16import org.openstreetmap.josm.gui.layer.Layer;
     17import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
     18import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
     19import org.openstreetmap.josm.gui.widgets.FileChooserManager;
     20import org.openstreetmap.josm.tools.ImageProvider;
     21
     22/**
     23 * Choose the app to be used as the external image viewer.
     24 * @since
     25 */
     26public class SetExternalViewerAction extends AbstractAction implements LayerAction {
     27
     28    private final transient GeoImageLayer layer;
     29
     30    /**
     31     * Constructs a new {@code SetExternalViewerAction} action.
     32     * @param layer image layer
     33     */
     34    public SetExternalViewerAction(GeoImageLayer layer) {
     35        super(tr("Set external viewer"), ImageProvider.get("dialogs/next"));
     36        putValue(SHORT_DESCRIPTION, tr("Choose the application to be used as the external image viewer."));
     37        this.layer = layer;
     38    }
     39
     40    /**
     41     * This is called after the menu entry was selected.
     42     * @param arg0 action event
     43     */
     44    @Override
     45    public void actionPerformed(ActionEvent arg0) {
     46        /** Work around a difference in behaviour between the native and non-native file choosers in OS X. */
     47        if (Main.isPlatformOsx() && Main.pref.getBoolean("use.native.file.dialog", Main.isPlatformOsx())) {
     48            AbstractFileChooser fc = new FileChooserManager(true, "external.viewer.lastdirectory", "").
     49                    createFileChooser(false, tr("Choose the external image viewer"), null, JFileChooser.DIRECTORIES_ONLY).openFileChooser();
     50            if (fc != null) {
     51                File sel = fc.getSelectedFile();
     52                if (sel != null) {
     53                    Main.pref.put("external.viewer.path", sel.toString());
     54                }
     55            }
     56        } else {
     57            AbstractFileChooser fc = new FileChooserManager(true, "external.viewer.lastdirectory", "").
     58                   createFileChooser(false, tr("Choose the external image viewer"), null, JFileChooser.FILES_ONLY).openFileChooser();
     59            if (fc != null) {
     60                File sel = fc.getSelectedFile();
     61                if (sel != null) {
     62                    Main.pref.put("external.viewer.path", sel.toString());
     63                }
     64            }
     65        }
     66    }
     67
     68    /** Create actual menu entry. */
     69    @Override
     70    public Component createMenuComponent() {
     71        JMenuItem item = new JMenuItem(this);
     72        return item;
     73    }
     74
     75    /** Check if the current layer is supported. */
     76    @Override
     77    public boolean supportLayers(List<Layer> layers) {
     78        return layers.size() == 1 && layers.get(0) instanceof GeoImageLayer;
     79    }
     80}
  • src/org/openstreetmap/josm/gui/layer/geoimage/UseExternalViewerAction.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.layer.geoimage;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.Component;
     7import java.awt.event.ActionEvent;
     8import java.util.List;
     9
     10import javax.swing.AbstractAction;
     11import javax.swing.JCheckBoxMenuItem;
     12
     13import org.openstreetmap.josm.Main;
     14import org.openstreetmap.josm.gui.layer.Layer;
     15import org.openstreetmap.josm.gui.layer.Layer.LayerAction;
     16import org.openstreetmap.josm.tools.ImageProvider;
     17
     18/**
     19 * Toggle the the use of an external image viewer on and off.
     20 * @since
     21 */
     22public class UseExternalViewerAction extends AbstractAction implements LayerAction {
     23
     24    private final transient GeoImageLayer layer;
     25
     26    /**
     27     * Constructs a new {@code ToggleUseExtImageViewerAction} action.
     28     * @param layer image layer
     29     */
     30    public UseExternalViewerAction(GeoImageLayer layer) {
     31        super(tr("(Toggle) Use external viewer"), ImageProvider.get("dialogs/refresh"));
     32        putValue(SHORT_DESCRIPTION, tr("Use external image viewer (as well as internal viewer)."));
     33        this.layer = layer;
     34    }
     35
     36    /**
     37     * This is called after the menu entry was selected.
     38     * @param arg0 action event
     39     */
     40    @Override
     41    public void actionPerformed(ActionEvent arg0) {
     42        layer.setUseExternalViewer(!layer.isUseExternalViewer());
     43    }
     44
     45    /** Create actual menu entry and define if it is enabled or not. */
     46    @Override
     47    public Component createMenuComponent() {
     48        JCheckBoxMenuItem toggleItem = new JCheckBoxMenuItem(this);
     49        toggleItem.setEnabled(true);
     50        toggleItem.setState(layer.isUseExternalViewer());
     51        return toggleItem;
     52    }
     53
     54    /** Check if the current layer is supported. */
     55    @Override
     56    public boolean supportLayers(List<Layer> layers) {
     57        return layers.size() == 1 && layers.get(0) instanceof GeoImageLayer;
     58    }
     59}