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

Last change on this file since 17379 was 16913, checked in by simon04, 4 years ago

fix #19698 - Refactoring: make private fields final

  • Property svn:eol-style set to native
File size: 5.0 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.GpxData.GpxDataChangeListener;
18import org.openstreetmap.josm.gui.ExtendedDialog;
19import org.openstreetmap.josm.gui.MainApplication;
20import org.openstreetmap.josm.gui.layer.GpxLayer;
21import org.openstreetmap.josm.gui.layer.Layer;
22import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
23import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
24import org.openstreetmap.josm.gui.layer.OsmDataLayer;
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 (OsmDataLayer.REQUIRES_SAVE_TO_DISK_PROP.equals(evt.getPropertyName())) {
41 updateEnabledState();
42 }
43 };
44
45 private final GpxDataChangeListener updateOnRequireSaveChangeGpx = evt -> updateEnabledState();
46
47 /**
48 * Construct the action with "Save" as label.
49 */
50 private SaveAction() {
51 super(tr("Save"), "save", tr("Save the current data."),
52 Shortcut.registerShortcut("system:save", tr("File: {0}", tr("Save")), KeyEvent.VK_S, Shortcut.CTRL),
53 true);
54 setHelpId(ht("/Action/Save"));
55 }
56
57 /**
58 * Returns the unique instance.
59 * @return the unique instance
60 */
61 public static SaveAction getInstance() {
62 return instance;
63 }
64
65 @Override
66 protected LayerChangeAdapter buildLayerChangeAdapter() {
67 return new LayerChangeAdapter() {
68 @Override
69 public void layerAdded(LayerAddEvent e) {
70 Layer l = e.getAddedLayer();
71 if (l instanceof OsmDataLayer) {
72 l.addPropertyChangeListener(updateOnRequireSaveChange);
73 }
74 if (l instanceof GpxLayer) {
75 ((GpxLayer) l).data.addWeakChangeListener(updateOnRequireSaveChangeGpx);
76 }
77 super.layerAdded(e);
78 }
79
80 @Override
81 public void layerRemoving(LayerRemoveEvent e) {
82 Layer l = e.getRemovedLayer();
83 if (l instanceof OsmDataLayer) {
84 l.removePropertyChangeListener(updateOnRequireSaveChange);
85 }
86 if (l instanceof GpxLayer) {
87 ((GpxLayer) l).data.removeChangeListener(updateOnRequireSaveChangeGpx);
88 }
89 super.layerRemoving(e);
90 }
91 };
92 }
93
94 @Override
95 protected boolean listenToSelectionChange() {
96 return false;
97 }
98
99 @Override
100 protected void updateEnabledState() {
101 Layer activeLayer = getLayerManager().getActiveLayer();
102 boolean en = activeLayer != null
103 && activeLayer.isSavable() && !(activeLayer.getAssociatedFile() != null
104 && activeLayer instanceof SaveToFile && !((SaveToFile) activeLayer).requiresSaveToFile());
105 GuiHelper.runInEDT(() -> setEnabled(en));
106 }
107
108 @Override
109 public File getFile(Layer layer) {
110 File f = layer.getAssociatedFile();
111 if (f != null && !f.exists()) {
112 f = null;
113 }
114
115 // Ask for overwrite in case of GpxLayer
116 if (f != null && layer instanceof GpxLayer && !Config.getPref().getBoolean("gpx.export.overwrite", false)) {
117 JPanel p = new JPanel(new GridBagLayout());
118 JLabel label = new JLabel(tr("File {0} exists. Overwrite?", f.getName()));
119 label.setHorizontalAlignment(SwingConstants.CENTER);
120 JCheckBox remember = new JCheckBox(tr("Remember choice"));
121 remember.setHorizontalAlignment(SwingConstants.CENTER);
122 p.add(label, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 5, 10));
123 p.add(remember, GBC.eop().fill(GBC.HORIZONTAL));
124 ExtendedDialog dialog = new ExtendedDialog(
125 MainApplication.getMainFrame(),
126 tr("Overwrite"),
127 tr("Overwrite"), tr("Cancel"))
128 .setButtonIcons("save_as", "cancel")
129 .setContent(p);
130 if (dialog.showDialog().getValue() != 1) {
131 f = null;
132 } else if (remember.isSelected()) {
133 Config.getPref().putBoolean("gpx.export.overwrite", true);
134 }
135 }
136 return f == null ? layer.createAndOpenSaveFileChooser() : f;
137 }
138}
Note: See TracBrowser for help on using the repository browser.