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}