source: josm/trunk/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java@ 19050

Last change on this file since 19050 was 19050, checked in by taylor.smock, 6 weeks ago

Revert most var changes from r19048, fix most new compile warnings and checkstyle issues

Also, document why various ErrorProne checks were originally disabled and fix
generic SonarLint issues.

  • Property svn:eol-style set to native
File size: 6.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.io;
3
4import java.beans.PropertyChangeListener;
5import java.beans.PropertyChangeSupport;
6import java.io.File;
7import java.util.ArrayList;
8import java.util.Collections;
9import java.util.Comparator;
10import java.util.List;
11import java.util.stream.Collectors;
12
13import javax.swing.table.DefaultTableModel;
14
15import org.openstreetmap.josm.gui.layer.AbstractModifiableLayer;
16import org.openstreetmap.josm.gui.layer.OsmDataLayer;
17
18/**
19 * Table model for the {@link SaveLayersTable} in the {@link SaveLayersDialog}.
20 */
21public class SaveLayersModel extends DefaultTableModel {
22 public static final String MODE_PROP = SaveLayerInfo.class.getName() + ".mode";
23
24 /**
25 * The status of the editor
26 */
27 public enum Mode {
28 EDITING_DATA,
29 UPLOADING_AND_SAVING
30 }
31
32 private transient List<SaveLayerInfo> layerInfo;
33 private Mode mode;
34 private final PropertyChangeSupport support;
35
36 // keep in sync with how the columns are ordered in SaveLayersTableColumnModel#build
37 private static final int columnFilename = 0;
38 private static final int columnActions = 2;
39
40 /**
41 * Constructs a new {@code SaveLayersModel}.
42 */
43 public SaveLayersModel() {
44 mode = Mode.EDITING_DATA;
45 support = new PropertyChangeSupport(this);
46 }
47
48 public void addPropertyChangeListener(PropertyChangeListener l) {
49 support.addPropertyChangeListener(l);
50 }
51
52 public void removePropertyChangeListener(PropertyChangeListener l) {
53 support.removePropertyChangeListener(l);
54 }
55
56 protected void fireModeChanged(Mode oldValue, Mode newValue) {
57 support.firePropertyChange(MODE_PROP, oldValue, newValue);
58 }
59
60 public void setMode(Mode newValue) {
61 Mode oldValue = this.mode;
62 this.mode = newValue;
63 fireModeChanged(oldValue, newValue);
64 }
65
66 public Mode getMode() {
67 return mode;
68 }
69
70 /**
71 * Populates the model with given modifiable layers.
72 * @param layers The layers to use to populate this model
73 * @since 7358
74 */
75 public void populate(List<? extends AbstractModifiableLayer> layers) {
76 layerInfo = new ArrayList<>();
77 if (layers == null) return;
78 for (AbstractModifiableLayer layer: layers) {
79 layerInfo.add(new SaveLayerInfo(layer));
80 }
81 layerInfo.sort(Comparator.naturalOrder());
82 fireTableDataChanged();
83 }
84
85 @Override
86 public int getRowCount() {
87 if (layerInfo == null) return 0;
88 return layerInfo.size();
89 }
90
91 @Override
92 public Object getValueAt(int row, int column) {
93 if (layerInfo == null) return null;
94 return layerInfo.get(row);
95 }
96
97 @Override
98 public boolean isCellEditable(int row, int column) {
99 return column == columnFilename || column == columnActions;
100 }
101
102 @Override
103 public void setValueAt(Object value, int row, int column) {
104 final SaveLayerInfo info = this.layerInfo.get(row);
105 switch (column) {
106 case columnFilename:
107 info.setFile((File) value);
108 if (info.isSavable()) {
109 info.setDoSaveToFile(true);
110 }
111 break;
112 case columnActions:
113 boolean[] values = (boolean[]) value;
114 info.setDoUploadToServer(values[0]);
115 info.setDoSaveToFile(values[1]);
116 break;
117 default: // Do nothing
118 }
119 fireTableDataChanged();
120 }
121
122 public List<SaveLayerInfo> getSafeLayerInfo() {
123 return this.layerInfo;
124 }
125
126 public List<SaveLayerInfo> getLayersWithoutFilesAndSaveRequest() {
127 if (layerInfo == null) {
128 return Collections.emptyList();
129 }
130 return layerInfo.stream().filter(info -> info.isDoSaveToFile() && info.getFile() == null).collect(Collectors.toList());
131 }
132
133 public List<SaveLayerInfo> getLayersWithIllegalFilesAndSaveRequest() {
134 if (layerInfo == null) {
135 return Collections.emptyList();
136 }
137 return layerInfo.stream()
138 .filter(info -> info.isDoSaveToFile() && info.getFile() != null && info.getFile().exists() && !info.getFile().canWrite())
139 .collect(Collectors.toList());
140 }
141
142 public List<SaveLayerInfo> getLayersWithConflictsAndUploadRequest() {
143 List<SaveLayerInfo> ret = new ArrayList<>();
144 if (layerInfo != null) {
145 for (SaveLayerInfo info: layerInfo) {
146 AbstractModifiableLayer l = info.getLayer();
147 if (info.isDoUploadToServer() && l instanceof OsmDataLayer && !((OsmDataLayer) l).getConflicts().isEmpty()) {
148 ret.add(info);
149 }
150 }
151 }
152 return ret;
153 }
154
155 public List<SaveLayerInfo> getLayersToUpload() {
156 if (layerInfo == null) {
157 return Collections.emptyList();
158 }
159 return layerInfo.stream().filter(SaveLayerInfo::isDoUploadToServer).collect(Collectors.toList());
160 }
161
162 public List<SaveLayerInfo> getLayersToSave() {
163 if (layerInfo == null) {
164 return Collections.emptyList();
165 }
166 return layerInfo.stream().filter(SaveLayerInfo::isDoSaveToFile).collect(Collectors.toList());
167 }
168
169 public void setUploadState(AbstractModifiableLayer layer, UploadOrSaveState state) {
170 SaveLayerInfo info = getSaveLayerInfo(layer);
171 if (info != null) {
172 info.setUploadState(state);
173 }
174 fireTableDataChanged();
175 }
176
177 public void setSaveState(AbstractModifiableLayer layer, UploadOrSaveState state) {
178 SaveLayerInfo info = getSaveLayerInfo(layer);
179 if (info != null) {
180 info.setSaveState(state);
181 }
182 fireTableDataChanged();
183 }
184
185 public SaveLayerInfo getSaveLayerInfo(AbstractModifiableLayer layer) {
186 return this.layerInfo.stream()
187 .filter(info -> info.getLayer() == layer)
188 .findFirst().orElse(null);
189 }
190
191 public void resetSaveAndUploadState() {
192 for (SaveLayerInfo info: layerInfo) {
193 info.setSaveState(null);
194 info.setUploadState(null);
195 }
196 }
197
198 public boolean hasUnsavedData() {
199 for (SaveLayerInfo info: layerInfo) {
200 if (info.isDoUploadToServer() && UploadOrSaveState.OK != info.getUploadState())
201 return true;
202 if (info.isDoSaveToFile() && UploadOrSaveState.OK != info.getSaveState())
203 return true;
204 }
205 return false;
206 }
207
208 public int getNumCancel() {
209 return (int) layerInfo.stream()
210 .filter(info -> UploadOrSaveState.CANCELED == info.getSaveState() || UploadOrSaveState.CANCELED == info.getUploadState())
211 .count();
212 }
213
214 public int getNumFailed() {
215 return (int) layerInfo.stream()
216 .filter(info -> UploadOrSaveState.FAILED == info.getSaveState() || UploadOrSaveState.FAILED == info.getUploadState())
217 .count();
218 }
219}
Note: See TracBrowser for help on using the repository browser.