source: josm/trunk/src/org/openstreetmap/josm/actions/SaveAction.java

Last change on this file was 18287, checked in by Don-vip, 3 years ago

fix #20913 - fix handling of GPX files in sessions (patch by Bjoeni)

  • revert r17659 (except for unit tests) - see #20233
    • don't save GPX track and marker colors in session file anymore, but in the GPX files as extensions (like before)
    • don't ask to save unmodified GPX file
    • don't override global color settings when individual track doesn't have a color
  • ask user to save changes to GPX file when any drawing settings or marker colors have changed (currently only happens for track colors)
  • save marker color values to session even when corresponding GPX layer has already been deleted
  • save alpha values for GPX marker colors
  • added explanation to the "overwrite GPX file" dialog
  • inform user if not all files referenced by the session file are saved yet
  • allow user to save all files that are not included in the *.jos/*.joz but are only referenced in the session file
  • display * next to GPX layers that need to be saved (move isDirty() logic from OsmDataLayer to AbstractModifiableLayer)
  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.GridBagLayout;
8import java.awt.event.KeyEvent;
9import java.beans.PropertyChangeListener;
10import java.io.File;
11
12import javax.swing.JCheckBox;
13import javax.swing.JLabel;
14import javax.swing.JPanel;
15import javax.swing.SwingConstants;
16
17import org.openstreetmap.josm.data.gpx.GpxConstants;
18import org.openstreetmap.josm.gui.ExtendedDialog;
19import org.openstreetmap.josm.gui.MainApplication;
20import org.openstreetmap.josm.gui.layer.AbstractModifiableLayer;
21import org.openstreetmap.josm.gui.layer.GpxLayer;
22import org.openstreetmap.josm.gui.layer.Layer;
23import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
24import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
25import org.openstreetmap.josm.gui.layer.SaveToFile;
26import org.openstreetmap.josm.gui.util.GuiHelper;
27import org.openstreetmap.josm.spi.preferences.Config;
28import org.openstreetmap.josm.tools.GBC;
29import org.openstreetmap.josm.tools.Shortcut;
30
31/**
32 * Export the data as an OSM xml file.
33 *
34 * @author imi
35 */
36public final class SaveAction extends SaveActionBase {
37 private static final SaveAction instance = new SaveAction();
38
39 private final PropertyChangeListener updateOnRequireSaveChange = evt -> {
40 if (AbstractModifiableLayer.REQUIRES_SAVE_TO_DISK_PROP.equals(evt.getPropertyName())) {
41 updateEnabledState();
42 }
43 };
44
45 /**
46 * Construct the action with "Save" as label.
47 */
48 private SaveAction() {
49 super(tr("Save"), "save", tr("Save the current data."),
50 Shortcut.registerShortcut("system:save", tr("File: {0}", tr("Save")), KeyEvent.VK_S, Shortcut.CTRL),
51 true);
52 setHelpId(ht("/Action/Save"));
53 }
54
55 /**
56 * Returns the unique instance.
57 * @return the unique instance
58 */
59 public static SaveAction getInstance() {
60 return instance;
61 }
62
63 @Override
64 protected LayerChangeAdapter buildLayerChangeAdapter() {
65 return new LayerChangeAdapter() {
66 @Override
67 public void layerAdded(LayerAddEvent e) {
68 Layer l = e.getAddedLayer();
69 if (l instanceof AbstractModifiableLayer) {
70 l.addPropertyChangeListener(updateOnRequireSaveChange);
71 }
72 super.layerAdded(e);
73 }
74
75 @Override
76 public void layerRemoving(LayerRemoveEvent e) {
77 Layer l = e.getRemovedLayer();
78 if (l instanceof AbstractModifiableLayer) {
79 l.removePropertyChangeListener(updateOnRequireSaveChange);
80 }
81 super.layerRemoving(e);
82 }
83 };
84 }
85
86 @Override
87 protected boolean listenToSelectionChange() {
88 return false;
89 }
90
91 @Override
92 protected void updateEnabledState() {
93 Layer activeLayer = getLayerManager().getActiveLayer();
94 boolean en = activeLayer != null
95 && activeLayer.isSavable() && !(activeLayer.getAssociatedFile() != null
96 && activeLayer instanceof SaveToFile && !((SaveToFile) activeLayer).requiresSaveToFile());
97 GuiHelper.runInEDT(() -> setEnabled(en));
98 }
99
100 @Override
101 public File getFile(Layer layer) {
102 File f = layer.getAssociatedFile();
103 if (f != null && !f.exists()) {
104 f = null;
105 }
106
107 // Ask for overwrite in case of GpxLayer
108 if (f != null
109 && layer instanceof GpxLayer
110 && (((GpxLayer) layer).data == null
111 || !GpxConstants.JOSM_CREATOR_NAME.equals(((GpxLayer) layer).data.creator))
112 && !Config.getPref().getBoolean("gpx.export.overwrite", false)) {
113
114 JPanel p = new JPanel(new GridBagLayout());
115 JLabel label = new JLabel("<html>"
116 + tr("The file \"{0}\" will be modified.<br>Would you like to overwrite the existing file?", f.getName())
117 + "</html>");
118 label.setHorizontalAlignment(SwingConstants.CENTER);
119 JCheckBox remember = new JCheckBox(tr("Always overwrite GPX files without asking"));
120 remember.setHorizontalAlignment(SwingConstants.CENTER);
121 p.add(label, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 5, 10));
122 p.add(remember, GBC.eop().fill(GBC.HORIZONTAL));
123 ExtendedDialog dialog = new ExtendedDialog(
124 MainApplication.getMainFrame(),
125 tr("Overwrite"),
126 tr("Overwrite"), tr("Save As..."), tr("Cancel"))
127 .setButtonIcons("save", "save_as", "cancel")
128 .setContent(p);
129 int val = dialog.showDialog().getValue();
130 if (val == 1) {
131 Config.getPref().putBoolean("gpx.export.overwrite", remember.isSelected());
132 } else if (val == 2) {
133 f = null;
134 } else {
135 return null;
136 }
137 }
138 return f == null ? layer.createAndOpenSaveFileChooser() : f;
139 }
140}
Note: See TracBrowser for help on using the repository browser.