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

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

see #11390 - use functional comparators

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