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 }