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 }