// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.io; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.swing.table.DefaultTableModel; import org.openstreetmap.josm.gui.layer.OsmDataLayer; public class SaveLayersModel extends DefaultTableModel { static final public String MODE_PROP = SaveLayerInfo.class.getName() + ".mode"; public enum Mode { EDITING_DATA, UPLOADING_AND_SAVING } private List<SaveLayerInfo> layerInfo; private Mode mode; private PropertyChangeSupport support; public SaveLayersModel() { mode = Mode.EDITING_DATA; support = new PropertyChangeSupport(this); } public void addPropertyChangeListener(PropertyChangeListener l) { support.addPropertyChangeListener(l); } public void removePropertyChangeListener(PropertyChangeListener l) { support.removePropertyChangeListener(l); } protected void fireModeChanged(Mode oldValue, Mode newValue) { support.firePropertyChange(MODE_PROP, oldValue, newValue); } public void setMode(Mode newValue) { Mode oldValue = this.mode; this.mode = newValue; fireModeChanged(oldValue, newValue); } public Mode getMode() { return mode; } public void populate(List<OsmDataLayer> layers) { layerInfo = new ArrayList<SaveLayerInfo>(); if (layers == null) return; for (OsmDataLayer layer: layers) { layerInfo.add(new SaveLayerInfo(layer)); } Collections.sort( layerInfo, new Comparator<SaveLayerInfo>() { public int compare(SaveLayerInfo o1, SaveLayerInfo o2) { return o1.compareTo(o2); } } ); fireTableDataChanged(); } @Override public int getRowCount() { if (layerInfo == null) return 0; return layerInfo.size(); } @Override public Object getValueAt(int row, int column) { if (layerInfo == null) return null; return layerInfo.get(row); } @Override public boolean isCellEditable(int row, int column) { return column == 3 || column == 4 || column == 5; } @Override public void setValueAt(Object value, int row, int column) { switch(column) { case 3 /* file name */: this.layerInfo.get(row).setFile((File)value); this.layerInfo.get(row).setDoSaveToFile(true); break; case 4 /* upload */: this.layerInfo.get(row).setDoUploadToServer((Boolean)value);break; case 5 /* save */: this.layerInfo.get(row).setDoSaveToFile((Boolean)value);break; } fireTableDataChanged(); } public List<SaveLayerInfo> getSafeLayerInfo() { return this.layerInfo; } public List<SaveLayerInfo> getLayersWithoutFilesAndSaveRequest() { List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>(); for (SaveLayerInfo info: layerInfo) { if (info.isDoSaveToFile() && info.getFile() == null) { ret.add(info); } } return ret; } public List<SaveLayerInfo> getLayersWithIllegalFilesAndSaveRequest() { List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>(); for (SaveLayerInfo info: layerInfo) { if (info.isDoSaveToFile() && info.getFile() != null && ! info.getFile().canWrite()) { ret.add(info); } } return ret; } public List<SaveLayerInfo> getLayersWithConflictsAndUploadRequest() { List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>(); for (SaveLayerInfo info: layerInfo) { if (info.isDoUploadToServer() && !info.getLayer().getConflicts().isEmpty()) { ret.add(info); } } return ret; } public List<SaveLayerInfo> getLayersToUpload() { List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>(); for (SaveLayerInfo info: layerInfo) { if (info.isDoUploadToServer()) { ret.add(info); } } return ret; } public List<SaveLayerInfo> getLayersToSave() { List<SaveLayerInfo> ret =new ArrayList<SaveLayerInfo>(); for (SaveLayerInfo info: layerInfo) { if (info.isDoSaveToFile()) { ret.add(info); } } return ret; } public void setUploadState(OsmDataLayer layer, UploadOrSaveState state) { SaveLayerInfo info = getSaveLayerInfo(layer); if (info != null) { info.setUploadState(state); } fireTableDataChanged(); } public void setSaveState(OsmDataLayer layer, UploadOrSaveState state) { SaveLayerInfo info = getSaveLayerInfo(layer); if (info != null) { info.setSaveState(state); } fireTableDataChanged(); } public SaveLayerInfo getSaveLayerInfo(OsmDataLayer layer) { for (SaveLayerInfo info: this.layerInfo) { if (info.getLayer() == layer) return info; } return null; } public void resetSaveAndUploadState() { for (SaveLayerInfo info: layerInfo) { info.setSaveState(null); info.setUploadState(null); } } public boolean hasUnsavedData() { for (SaveLayerInfo info: layerInfo) { if (info.isDoUploadToServer() && ! UploadOrSaveState.OK.equals(info.getUploadState())) return true; if (info.isDoSaveToFile() && ! UploadOrSaveState.OK.equals(info.getSaveState())) return true; } return false; } public int getNumCancel() { int ret = 0; for (SaveLayerInfo info: layerInfo) { if (UploadOrSaveState.CANCELLED.equals(info.getSaveState()) || UploadOrSaveState.CANCELLED.equals(info.getUploadState())) { ret++; } } return ret; } public int getNumFailed() { int ret = 0; for (SaveLayerInfo info: layerInfo) { if (UploadOrSaveState.FAILED.equals(info.getSaveState()) || UploadOrSaveState.FAILED.equals(info.getUploadState())) { ret++; } } return ret; } }