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 }