001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.io;
003
004 import java.beans.PropertyChangeListener;
005 import java.beans.PropertyChangeSupport;
006 import java.io.File;
007 import java.util.ArrayList;
008 import java.util.Collections;
009 import java.util.Comparator;
010 import java.util.List;
011
012 import javax.swing.table.DefaultTableModel;
013
014 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
015
016 public class SaveLayersModel extends DefaultTableModel {
017 static final public String MODE_PROP = SaveLayerInfo.class.getName() + ".mode";
018 public enum Mode {
019 EDITING_DATA,
020 UPLOADING_AND_SAVING
021 }
022
023 private List<SaveLayerInfo> layerInfo;
024 private Mode mode;
025 private PropertyChangeSupport support;
026
027 // keep in sync with how the columns are ordered in SaveLayersTableColumnModel#build
028 private static final int columnFilename = 0;
029 private static final int columnActions = 2;
030
031 public SaveLayersModel() {
032 mode = Mode.EDITING_DATA;
033 support = new PropertyChangeSupport(this);
034 }
035
036 public void addPropertyChangeListener(PropertyChangeListener l) {
037 support.addPropertyChangeListener(l);
038 }
039
040 public void removePropertyChangeListener(PropertyChangeListener l) {
041 support.removePropertyChangeListener(l);
042 }
043
044 protected void fireModeChanged(Mode oldValue, Mode newValue) {
045 support.firePropertyChange(MODE_PROP, oldValue, newValue);
046 }
047
048 public void setMode(Mode newValue) {
049 Mode oldValue = this.mode;
050 this.mode = newValue;
051 fireModeChanged(oldValue, newValue);
052 }
053
054 public Mode getMode() {
055 return mode;
056 }
057
058 public void populate(List<OsmDataLayer> layers) {
059 layerInfo = new ArrayList<SaveLayerInfo>();
060 if (layers == null) return;
061 for (OsmDataLayer layer: layers) {
062 layerInfo.add(new SaveLayerInfo(layer));
063 }
064 Collections.sort(
065 layerInfo,
066 new Comparator<SaveLayerInfo>() {
067 public int compare(SaveLayerInfo o1, SaveLayerInfo o2) {
068 return o1.compareTo(o2);
069 }
070 }
071 );
072 fireTableDataChanged();
073 }
074
075 @Override
076 public int getRowCount() {
077 if (layerInfo == null) return 0;
078 return layerInfo.size();
079 }
080
081 @Override
082 public Object getValueAt(int row, int column) {
083 if (layerInfo == null) return null;
084 return layerInfo.get(row);
085 }
086
087 @Override
088 public boolean isCellEditable(int row, int column) {
089 return column == columnFilename || column == columnActions;
090 }
091
092 @Override
093 public void setValueAt(Object value, int row, int column) {
094 switch(column) {
095 case columnFilename:
096 this.layerInfo.get(row).setFile((File)value);
097 this.layerInfo.get(row).setDoSaveToFile(true);
098 break;
099 case columnActions:
100 boolean[] values = (boolean[]) value;
101 this.layerInfo.get(row).setDoUploadToServer(values[0]);
102 this.layerInfo.get(row).setDoSaveToFile(values[1]);
103 break;
104 }
105 fireTableDataChanged();
106 }
107
108 public List<SaveLayerInfo> getSafeLayerInfo() {
109 return this.layerInfo;
110 }
111
112 public List<SaveLayerInfo> getLayersWithoutFilesAndSaveRequest() {
113 List<SaveLayerInfo> ret = new ArrayList<SaveLayerInfo>();
114 for (SaveLayerInfo info: layerInfo) {
115 if (info.isDoSaveToFile() && info.getFile() == null) {
116 ret.add(info);
117 }
118 }
119 return ret;
120 }
121
122 public List<SaveLayerInfo> getLayersWithIllegalFilesAndSaveRequest() {
123 List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>();
124 for (SaveLayerInfo info: layerInfo) {
125 if (info.isDoSaveToFile() && info.getFile() != null && info.getFile().exists() && !info.getFile().canWrite()) {
126 ret.add(info);
127 }
128 }
129 return ret;
130 }
131
132 public List<SaveLayerInfo> getLayersWithConflictsAndUploadRequest() {
133 List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>();
134 for (SaveLayerInfo info: layerInfo) {
135 if (info.isDoUploadToServer() && !info.getLayer().getConflicts().isEmpty()) {
136 ret.add(info);
137 }
138 }
139 return ret;
140 }
141
142 public List<SaveLayerInfo> getLayersToUpload() {
143 List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>();
144 for (SaveLayerInfo info: layerInfo) {
145 if (info.isDoUploadToServer()) {
146 ret.add(info);
147 }
148 }
149 return ret;
150 }
151
152 public List<SaveLayerInfo> getLayersToSave() {
153 List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>();
154 for (SaveLayerInfo info: layerInfo) {
155 if (info.isDoSaveToFile()) {
156 ret.add(info);
157 }
158 }
159 return ret;
160 }
161
162 public void setUploadState(OsmDataLayer layer, UploadOrSaveState state) {
163 SaveLayerInfo info = getSaveLayerInfo(layer);
164 if (info != null) {
165 info.setUploadState(state);
166 }
167 fireTableDataChanged();
168 }
169
170 public void setSaveState(OsmDataLayer layer, UploadOrSaveState state) {
171 SaveLayerInfo info = getSaveLayerInfo(layer);
172 if (info != null) {
173 info.setSaveState(state);
174 }
175 fireTableDataChanged();
176 }
177
178 public SaveLayerInfo getSaveLayerInfo(OsmDataLayer layer) {
179 for (SaveLayerInfo info: this.layerInfo) {
180 if (info.getLayer() == layer)
181 return info;
182 }
183 return null;
184 }
185
186 public void resetSaveAndUploadState() {
187 for (SaveLayerInfo info: layerInfo) {
188 info.setSaveState(null);
189 info.setUploadState(null);
190 }
191 }
192
193 public boolean hasUnsavedData() {
194 for (SaveLayerInfo info: layerInfo) {
195 if (info.isDoUploadToServer() && ! UploadOrSaveState.OK.equals(info.getUploadState()))
196 return true;
197 if (info.isDoSaveToFile() && ! UploadOrSaveState.OK.equals(info.getSaveState()))
198 return true;
199 }
200 return false;
201 }
202
203 public int getNumCancel() {
204 int ret = 0;
205 for (SaveLayerInfo info: layerInfo) {
206 if (UploadOrSaveState.CANCELED.equals(info.getSaveState())
207 || UploadOrSaveState.CANCELED.equals(info.getUploadState())) {
208 ret++;
209 }
210 }
211 return ret;
212 }
213
214 public int getNumFailed() {
215 int ret = 0;
216 for (SaveLayerInfo info: layerInfo) {
217 if (UploadOrSaveState.FAILED.equals(info.getSaveState())
218 || UploadOrSaveState.FAILED.equals(info.getUploadState())) {
219 ret++;
220 }
221 }
222 return ret;
223 }
224 }