001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import java.util.ArrayList;
005import java.util.List;
006
007import javax.swing.DefaultComboBoxModel;
008
009import org.openstreetmap.josm.data.osm.Changeset;
010import org.openstreetmap.josm.data.osm.ChangesetCache;
011import org.openstreetmap.josm.data.osm.ChangesetCacheEvent;
012import 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 */
019public 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    @Override
065    public void changesetCacheUpdated(ChangesetCacheEvent event) {
066        refresh();
067    }
068
069    /* ------------------------------------------------------------------------------------ */
070    /* ComboBoxModel                                                                        */
071    /* ------------------------------------------------------------------------------------ */
072    @Override
073    public Object getElementAt(int index) {
074        return changesets.get(index);
075    }
076
077    @Override
078    public int getIndexOf(Object anObject) {
079        return changesets.indexOf(anObject);
080    }
081
082    @Override
083    public int getSize() {
084        return changesets.size();
085    }
086
087    @Override
088    public Object getSelectedItem() {
089        return selectedChangeset;
090    }
091
092    @Override
093    public void setSelectedItem(Object anObject) {
094        if (anObject == null) {
095            this.selectedChangeset = null;
096            super.setSelectedItem(null);
097            return;
098        }
099        if (! (anObject instanceof Changeset)) return;
100        Changeset cs = (Changeset)anObject;
101        if (cs.getId() == 0 || ! cs.isOpen()) return;
102        Changeset candidate = getChangesetById(cs.getId());
103        if (candidate == null) return;
104        this.selectedChangeset = candidate;
105        super.setSelectedItem(selectedChangeset);
106    }
107}