001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.io;
003    
004    import java.util.ArrayList;
005    import java.util.List;
006    
007    import javax.swing.DefaultComboBoxModel;
008    
009    import org.openstreetmap.josm.data.osm.Changeset;
010    import org.openstreetmap.josm.data.osm.ChangesetCache;
011    import org.openstreetmap.josm.data.osm.ChangesetCacheEvent;
012    import org.openstreetmap.josm.data.osm.ChangesetCacheListener;
013    
014    /**
015     * A combobox model for the list of open changesets. The model is populated with the list
016     * of open changesets kept in the {@link ChangesetCache}.
017     *
018     */
019    public class OpenChangesetComboBoxModel extends DefaultComboBoxModel implements ChangesetCacheListener {
020        private List<Changeset> changesets;
021        private Changeset selectedChangeset = null;
022    
023        protected Changeset getChangesetById(long id) {
024            for (Changeset cs : changesets) {
025                if (cs.getId() == id) return cs;
026            }
027            return null;
028        }
029    
030        public OpenChangesetComboBoxModel() {
031            this.changesets = new ArrayList<Changeset>();
032        }
033    
034        /**
035         * Refreshes the content of the combobox model with the current list of open
036         * changesets from the {@link ChangesetCache}.
037         */
038        public void refresh() {
039            changesets.clear();
040            changesets.addAll(ChangesetCache.getInstance().getOpenChangesets());
041            fireContentsChanged(this, 0, getSize());
042            int idx = changesets.indexOf(selectedChangeset);
043            if (idx < 0) {
044                selectFirstChangeset();
045            } else {
046                setSelectedItem(changesets.get(idx));
047            }
048        }
049    
050        /**
051         * Selects the first changeset in the current list of open changesets
052         */
053        public void selectFirstChangeset() {
054            if (changesets == null || changesets.isEmpty()) {
055                setSelectedItem(null);
056            } else {
057                setSelectedItem(changesets.get(0));
058            }
059        }
060    
061        /* ------------------------------------------------------------------------------------ */
062        /* ChangesetCacheListener                                                               */
063        /* ------------------------------------------------------------------------------------ */
064        public void changesetCacheUpdated(ChangesetCacheEvent event) {
065            refresh();
066        }
067    
068        /* ------------------------------------------------------------------------------------ */
069        /* ComboBoxModel                                                                        */
070        /* ------------------------------------------------------------------------------------ */
071        @Override
072        public Object getElementAt(int index) {
073            return changesets.get(index);
074        }
075    
076        @Override
077        public int getIndexOf(Object anObject) {
078            return changesets.indexOf(anObject);
079        }
080    
081        @Override
082        public int getSize() {
083            return changesets.size();
084        }
085    
086        @Override
087        public Object getSelectedItem() {
088            return selectedChangeset;
089        }
090    
091        @Override
092        public void setSelectedItem(Object anObject) {
093            if (anObject == null) {
094                this.selectedChangeset = null;
095                super.setSelectedItem(null);
096                return;
097            }
098            if (! (anObject instanceof Changeset)) return;
099            Changeset cs = (Changeset)anObject;
100            if (cs.getId() == 0 || ! cs.isOpen()) return;
101            Changeset candidate = getChangesetById(cs.getId());
102            if (candidate == null) return;
103            this.selectedChangeset = candidate;
104            super.setSelectedItem(selectedChangeset);
105        }
106    }