Ticket #13815: 13815_v2.patch
| File 13815_v2.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; … … 324 325 entries.add(SeparatorLayerAction.INSTANCE); 325 326 entries.add(new CorrelateGpxWithImages(this)); 326 327 entries.add(new ShowThumbnailAction(this)); 328 entries.add(new UseExternalViewerAction(this)); 329 entries.add(new SetExternalViewerAction(this)); 327 330 if (!menuAdditions.isEmpty()) { 328 331 entries.add(SeparatorLayerAction.INSTANCE); 329 332 entries.addAll(menuAdditions); … … 731 734 } 732 735 } 733 736 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 734 757 /** 735 758 * Removes a photo from the list of images by index. 736 759 * @param idx Image index … … 882 905 currentPhoto = i; 883 906 ImageViewerDialog.showImage(GeoImageLayer.this, e); 884 907 Main.map.repaint(); 908 if (useExternalViewer) { 909 openCurrentPhotoInExternalViewer(); 910 } 885 911 break; 886 912 } 887 913 } … … 1007 1033 @Override 1008 1034 public void jumpToNextMarker() { 1009 1035 showNextPhoto(); 1036 if (useExternalViewer) { 1037 openCurrentPhotoInExternalViewer(); 1038 } 1010 1039 } 1011 1040 1012 1041 @Override 1013 1042 public void jumpToPreviousMarker() { 1014 1043 showPreviousPhoto(); 1044 if (useExternalViewer) { 1045 openCurrentPhotoInExternalViewer(); 1046 } 1015 1047 } 1016 1048 1017 1049 /** … … 1037 1069 stopLoadThumbs(); 1038 1070 } 1039 1071 } 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 } 1040 1091 } -
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", 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. 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 }
