Ticket #13815: 13815.patch
| File 13815.patch, 11.3 KB (added by , 9 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
88 88 private int currentPhoto = -1; 89 89 90 90 boolean useThumbs; 91 boolean useExternalViewer; 91 92 private final ExecutorService thumbsLoaderExecutor = 92 93 Executors.newSingleThreadExecutor(Utils.newThreadFactory("thumbnail-loader-%d", Thread.MIN_PRIORITY)); 93 94 private ThumbsLoader thumbsloader; … … 327 328 entries.add(SeparatorLayerAction.INSTANCE); 328 329 entries.add(new CorrelateGpxWithImages(this)); 329 330 entries.add(new ShowThumbnailAction(this)); 331 entries.add(new UseExternalViewerAction(this)); 332 entries.add(new SetExternalViewerAction(this)); 330 333 if (!menuAdditions.isEmpty()) { 331 334 entries.add(SeparatorLayerAction.INSTANCE); 332 335 entries.addAll(menuAdditions); … … 725 728 } 726 729 } 727 730 731 public void openCurrentPhotoInExternalViewer() { 732 if (data != null && !data.isEmpty() && currentPhoto >= 0 && currentPhoto < data.size()) { 733 String externalViewerPath = Main.pref.get("external.viewer.path", ""); 734 if (externalViewerPath != "") { 735 String imagePath = data.get(currentPhoto).getFile().toString(); 736 try { 737 if (Main.isPlatformOsx()) { 738 String[] command = {"open", "-a", externalViewerPath, imagePath}; 739 Runtime.getRuntime().exec(command); 740 } else { 741 String[] command = {externalViewerPath, imagePath}; 742 Runtime.getRuntime().exec(command); 743 } 744 } catch (IOException ex) { 745 System.err.println("IOException: "+ex.getMessage()); 746 } 747 } 748 } 749 } 750 728 751 /** 729 752 * Removes a photo from the list of images by index. 730 753 * @param idx Image index … … 870 893 currentPhoto = i; 871 894 ImageViewerDialog.showImage(GeoImageLayer.this, e); 872 895 Main.map.repaint(); 896 if (useExternalViewer) { 897 openCurrentPhotoInExternalViewer(); 898 } 873 899 break; 874 900 } 875 901 } … … 995 1021 @Override 996 1022 public void jumpToNextMarker() { 997 1023 showNextPhoto(); 1024 if (useExternalViewer) { 1025 openCurrentPhotoInExternalViewer(); 1026 } 998 1027 } 999 1028 1000 1029 @Override 1001 1030 public void jumpToPreviousMarker() { 1002 1031 showPreviousPhoto(); 1032 if (useExternalViewer) { 1033 openCurrentPhotoInExternalViewer(); 1034 } 1003 1035 } 1004 1036 1005 1037 /** … … 1025 1057 stopLoadThumbs(); 1026 1058 } 1027 1059 } 1060 1061 /** 1062 * Returns the current external viewer status. 1063 * {@code true}: external viewer is used, {@code false}: external viewer is not used. 1064 * @return Current external viewer status 1065 * @since 1066 */ 1067 public boolean isUseExternalViewer() { 1068 return useExternalViewer; 1069 } 1070 1071 /** 1072 * Enables or disables the use of an external viewer. 1073 * @param useExternalViewer New external viewer status 1074 * @since 1075 */ 1076 public void setUseExternalViewer(boolean useExternalViewer) { 1077 this.useExternalViewer = useExternalViewer; 1078 } 1028 1079 } -
src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
47 47 private static final String COMMAND_FIRST = "first"; 48 48 private static final String COMMAND_LAST = "last"; 49 49 private static final String COMMAND_COPY_PATH = "copypath"; 50 private static final String COMMAND_OPEN_EXTERNAL = "openexternal"; 50 51 51 52 private final ImageDisplay imgDisplay = new ImageDisplay(); 52 53 private boolean centerView; … … 162 163 ImageProvider.get("dialogs", "zoom-best-fit"), tr("Zoom best fit and 1:1"))); 163 164 btnZoomBestFit.setPreferredSize(buttonDim); 164 165 166 JButton btnOpenExternal = new JButton(new ImageAction(COMMAND_OPEN_EXTERNAL, 167 ImageProvider.get("open"), tr("Open in external viewer"))); 168 btnOpenExternal.setPreferredSize(buttonDim); 169 165 170 btnCollapse = new JButton(new ImageAction(COMMAND_COLLAPSE, 166 171 ImageProvider.get("dialogs", "collapse"), tr("Move dialog to the side pane"))); 167 172 btnCollapse.setPreferredSize(new Dimension(20, 20)); … … 178 183 buttons.add(btnDeleteFromDisk); 179 184 buttons.add(Box.createRigidArea(new Dimension(7, 0))); 180 185 buttons.add(btnCopyPath); 186 buttons.add(btnOpenExternal); 181 187 182 188 JPanel bottomPane = new JPanel(new GridBagLayout()); 183 189 GridBagConstraints gc = new GridBagConstraints(); … … 248 254 if (currentLayer != null) { 249 255 currentLayer.copyCurrentPhotoPath(); 250 256 } 257 } else if (COMMAND_OPEN_EXTERNAL.equals(action)) { 258 if (currentLayer != null) { 259 currentLayer.openCurrentPhotoInExternalViewer(); 260 } 251 261 } else if (COMMAND_COLLAPSE.equals(action)) { 252 262 collapseButtonClicked = true; 253 263 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. 2 package org.openstreetmap.josm.gui.layer.geoimage; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import java.awt.Component; 7 import java.awt.event.ActionEvent; 8 import java.io.File; 9 import java.util.List; 10 11 import javax.swing.AbstractAction; 12 import javax.swing.JMenuItem; 13 import javax.swing.JFileChooser; 14 15 import org.openstreetmap.josm.Main; 16 import org.openstreetmap.josm.gui.layer.Layer; 17 import org.openstreetmap.josm.gui.layer.Layer.LayerAction; 18 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser; 19 import org.openstreetmap.josm.gui.widgets.FileChooserManager; 20 import org.openstreetmap.josm.tools.ImageProvider; 21 22 /** 23 * Choose the app to be used as the external image viewer. 24 * @since 25 */ 26 public 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")) { 48 AbstractFileChooser fc = new FileChooserManager(true, "external.viewer.lastdirectory", ""). 49 createFileChooser(false, "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, "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. 2 package org.openstreetmap.josm.gui.layer.geoimage; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import java.awt.Component; 7 import java.awt.event.ActionEvent; 8 import java.util.List; 9 10 import javax.swing.AbstractAction; 11 import javax.swing.JCheckBoxMenuItem; 12 13 import org.openstreetmap.josm.Main; 14 import org.openstreetmap.josm.gui.layer.Layer; 15 import org.openstreetmap.josm.gui.layer.Layer.LayerAction; 16 import org.openstreetmap.josm.tools.ImageProvider; 17 18 /** 19 * Toggle the the use of an external image viewer on and off. 20 * @since 21 */ 22 public 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 }
