source: josm/trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java@ 9078

Last change on this file since 9078 was 9078, checked in by Don-vip, 8 years ago

sonar - Immutable Field

  • Property svn:eol-style set to native
File size: 7.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io.session;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.CardLayout;
7import java.awt.Font;
8import java.awt.GridBagLayout;
9import java.awt.Insets;
10import java.awt.event.ActionEvent;
11import java.awt.event.ActionListener;
12import java.awt.event.ItemEvent;
13import java.awt.event.ItemListener;
14import java.io.File;
15import java.io.IOException;
16import java.io.OutputStream;
17import java.io.OutputStreamWriter;
18import java.io.PrintWriter;
19import java.io.Writer;
20import java.net.MalformedURLException;
21import java.net.URI;
22import java.net.URL;
23import java.nio.charset.StandardCharsets;
24import java.util.Collection;
25import java.util.Collections;
26
27import javax.swing.AbstractAction;
28import javax.swing.ButtonGroup;
29import javax.swing.JButton;
30import javax.swing.JCheckBox;
31import javax.swing.JLabel;
32import javax.swing.JPanel;
33import javax.swing.JRadioButton;
34import javax.swing.SwingConstants;
35
36import org.openstreetmap.josm.actions.SaveAction;
37import org.openstreetmap.josm.gui.layer.Layer;
38import org.openstreetmap.josm.gui.layer.OsmDataLayer;
39import org.openstreetmap.josm.gui.util.GuiHelper;
40import org.openstreetmap.josm.gui.widgets.JosmTextField;
41import org.openstreetmap.josm.io.OsmWriter;
42import org.openstreetmap.josm.io.OsmWriterFactory;
43import org.openstreetmap.josm.io.session.SessionWriter.ExportSupport;
44import org.openstreetmap.josm.tools.GBC;
45import org.openstreetmap.josm.tools.ImageProvider;
46import org.w3c.dom.Element;
47
48public class OsmDataSessionExporter implements SessionLayerExporter {
49
50 private final OsmDataLayer layer;
51 private JRadioButton link, include;
52 private JCheckBox export;
53
54 public OsmDataSessionExporter(OsmDataLayer layer) {
55 this.layer = layer;
56 }
57
58 @Override
59 public Collection<Layer> getDependencies() {
60 return Collections.emptySet();
61 }
62
63 private class LayerSaveAction extends AbstractAction {
64 LayerSaveAction() {
65 putValue(SMALL_ICON, new ImageProvider("save").setWidth(16).get());
66 putValue(SHORT_DESCRIPTION, layer.requiresSaveToFile() ?
67 tr("Layer contains unsaved data - save to file.") :
68 tr("Layer does not contain unsaved data."));
69 updateEnabledState();
70 }
71
72 @Override
73 public void actionPerformed(ActionEvent e) {
74 SaveAction.getInstance().doSave(layer);
75 updateEnabledState();
76 }
77
78 public final void updateEnabledState() {
79 setEnabled(layer.requiresSaveToFile());
80 }
81 }
82
83 @Override
84 public JPanel getExportPanel() {
85 final JPanel p = new JPanel(new GridBagLayout());
86 JPanel topRow = new JPanel(new GridBagLayout());
87 export = new JCheckBox();
88 export.setSelected(true);
89 final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT);
90 lbl.setToolTipText(layer.getToolTipText());
91 lbl.setLabelFor(export);
92 JLabel lblData = new JLabel(tr("Data:"));
93 /* I18n: Refer to a OSM data file in session file */ link = new JRadioButton(tr("local file"));
94 link.putClientProperty("actionname", "link");
95 link.setToolTipText(tr("Link to a OSM data file on your local disk."));
96 /* I18n: Include OSM data in session file */ include = new JRadioButton(tr("include"));
97 include.setToolTipText(tr("Include OSM data in the .joz session file."));
98 include.putClientProperty("actionname", "include");
99 ButtonGroup group = new ButtonGroup();
100 group.add(link);
101 group.add(include);
102
103 JPanel cardLink = new JPanel(new GridBagLayout());
104 final File file = layer.getAssociatedFile();
105 final LayerSaveAction saveAction = new LayerSaveAction();
106 final JButton save = new JButton(saveAction);
107 if (file != null) {
108 JosmTextField tf = new JosmTextField();
109 tf.setText(file.getPath());
110 tf.setEditable(false);
111 cardLink.add(tf, GBC.std());
112 save.setMargin(new Insets(0, 0, 0, 0));
113 cardLink.add(save, GBC.eol().insets(2, 0, 0, 0));
114 } else {
115 cardLink.add(new JLabel(tr("No file association")), GBC.eol());
116 }
117
118 JPanel cardInclude = new JPanel(new GridBagLayout());
119 JLabel lblIncl = new JLabel(tr("OSM data will be included in the session file."));
120 lblIncl.setFont(lblIncl.getFont().deriveFont(Font.PLAIN));
121 cardInclude.add(lblIncl, GBC.eol().fill(GBC.HORIZONTAL));
122
123 final CardLayout cl = new CardLayout();
124 final JPanel cards = new JPanel(cl);
125 cards.add(cardLink, "link");
126 cards.add(cardInclude, "include");
127
128 if (file != null) {
129 link.setSelected(true);
130 } else {
131 link.setEnabled(false);
132 link.setToolTipText(tr("No file association"));
133 include.setSelected(true);
134 cl.show(cards, "include");
135 }
136
137 link.addActionListener(new ActionListener() {
138 @Override
139 public void actionPerformed(ActionEvent e) {
140 cl.show(cards, "link");
141 }
142 });
143 include.addActionListener(new ActionListener() {
144 @Override
145 public void actionPerformed(ActionEvent e) {
146 cl.show(cards, "include");
147 }
148 });
149
150 topRow.add(export, GBC.std());
151 topRow.add(lbl, GBC.std());
152 topRow.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
153 p.add(topRow, GBC.eol().fill(GBC.HORIZONTAL));
154 p.add(lblData, GBC.std().insets(10, 0, 0, 0));
155 p.add(link, GBC.std());
156 p.add(include, GBC.eol());
157 p.add(cards, GBC.eol().insets(15, 0, 3, 3));
158
159 export.addItemListener(new ItemListener() {
160 @Override
161 public void itemStateChanged(ItemEvent e) {
162 if (e.getStateChange() == ItemEvent.DESELECTED) {
163 GuiHelper.setEnabledRec(p, false);
164 export.setEnabled(true);
165 } else {
166 GuiHelper.setEnabledRec(p, true);
167 save.setEnabled(saveAction.isEnabled());
168 link.setEnabled(file != null);
169 }
170 }
171 });
172 return p;
173 }
174
175 @Override
176 public boolean shallExport() {
177 return export.isSelected();
178 }
179
180 @Override
181 public boolean requiresZip() {
182 return include.isSelected();
183 }
184
185 @Override
186 public Element export(ExportSupport support) throws IOException {
187 Element layerEl = support.createElement("layer");
188 layerEl.setAttribute("type", "osm-data");
189 layerEl.setAttribute("version", "0.1");
190
191 Element file = support.createElement("file");
192 layerEl.appendChild(file);
193
194 if (requiresZip()) {
195 String zipPath = "layers/" + String.format("%02d", support.getLayerIndex()) + "/data.osm";
196 file.appendChild(support.createTextNode(zipPath));
197 addDataFile(support.getOutputStreamZip(zipPath));
198 } else {
199 URI uri = layer.getAssociatedFile().toURI();
200 URL url = null;
201 try {
202 url = uri.toURL();
203 } catch (MalformedURLException e) {
204 throw new IOException(e);
205 }
206 file.appendChild(support.createTextNode(url.toString()));
207 }
208 return layerEl;
209 }
210
211 protected void addDataFile(OutputStream out) {
212 Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
213 OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, layer.data.getVersion());
214 layer.data.getReadLock().lock();
215 try {
216 w.writeLayer(layer);
217 w.flush();
218 } finally {
219 layer.data.getReadLock().unlock();
220 }
221 }
222}
Note: See TracBrowser for help on using the repository browser.