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    }