[2711] | 1 | // License: GPL. For details, see LICENSE file.
|
---|
| 2 | package org.openstreetmap.josm.gui.io;
|
---|
| 3 |
|
---|
| 4 | import java.util.ArrayList;
|
---|
| 5 | import java.util.List;
|
---|
| 6 |
|
---|
| 7 | import javax.swing.DefaultComboBoxModel;
|
---|
| 8 |
|
---|
| 9 | import org.openstreetmap.josm.data.osm.Changeset;
|
---|
| 10 | import org.openstreetmap.josm.data.osm.ChangesetCache;
|
---|
| 11 | import org.openstreetmap.josm.data.osm.ChangesetCacheEvent;
|
---|
| 12 | import org.openstreetmap.josm.data.osm.ChangesetCacheListener;
|
---|
[12767] | 13 | import org.openstreetmap.josm.gui.util.GuiHelper;
|
---|
[2711] | 14 |
|
---|
| 15 | /**
|
---|
[2781] | 16 | * A combobox model for the list of open changesets. The model is populated with the list
|
---|
[5266] | 17 | * of open changesets kept in the {@link ChangesetCache}.
|
---|
[2801] | 18 | *
|
---|
[2711] | 19 | */
|
---|
[7017] | 20 | public class OpenChangesetComboBoxModel extends DefaultComboBoxModel<Changeset> implements ChangesetCacheListener {
|
---|
[9078] | 21 | private final transient List<Changeset> changesets;
|
---|
[8840] | 22 | private transient Changeset selectedChangeset;
|
---|
[2711] | 23 |
|
---|
| 24 | protected Changeset getChangesetById(long id) {
|
---|
| 25 | for (Changeset cs : changesets) {
|
---|
| 26 | if (cs.getId() == id) return cs;
|
---|
| 27 | }
|
---|
| 28 | return null;
|
---|
| 29 | }
|
---|
| 30 |
|
---|
[7017] | 31 | /**
|
---|
| 32 | * Constructs a new {@code OpenChangesetComboBoxModel}.
|
---|
| 33 | */
|
---|
[2711] | 34 | public OpenChangesetComboBoxModel() {
|
---|
[7005] | 35 | this.changesets = new ArrayList<>();
|
---|
[2711] | 36 | }
|
---|
| 37 |
|
---|
[2781] | 38 | /**
|
---|
| 39 | * Refreshes the content of the combobox model with the current list of open
|
---|
[5266] | 40 | * changesets from the {@link ChangesetCache}.
|
---|
[2781] | 41 | */
|
---|
[2711] | 42 | public void refresh() {
|
---|
| 43 | changesets.clear();
|
---|
[9519] | 44 | changesets.addAll(ChangesetCache.getInstance().getOpenChangesetsForCurrentUser());
|
---|
[2711] | 45 | fireContentsChanged(this, 0, getSize());
|
---|
| 46 | int idx = changesets.indexOf(selectedChangeset);
|
---|
| 47 | if (idx < 0) {
|
---|
[2781] | 48 | selectFirstChangeset();
|
---|
[2711] | 49 | } else {
|
---|
| 50 | setSelectedItem(changesets.get(idx));
|
---|
| 51 | }
|
---|
| 52 | }
|
---|
| 53 |
|
---|
[2781] | 54 | /**
|
---|
| 55 | * Selects the first changeset in the current list of open changesets
|
---|
| 56 | */
|
---|
[2711] | 57 | public void selectFirstChangeset() {
|
---|
| 58 | if (changesets == null || changesets.isEmpty()) {
|
---|
| 59 | setSelectedItem(null);
|
---|
| 60 | } else {
|
---|
| 61 | setSelectedItem(changesets.get(0));
|
---|
| 62 | }
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 | /* ------------------------------------------------------------------------------------ */
|
---|
| 66 | /* ChangesetCacheListener */
|
---|
| 67 | /* ------------------------------------------------------------------------------------ */
|
---|
[6084] | 68 | @Override
|
---|
[2711] | 69 | public void changesetCacheUpdated(ChangesetCacheEvent event) {
|
---|
[12767] | 70 | GuiHelper.runInEDT(this::refresh);
|
---|
[2711] | 71 | }
|
---|
| 72 |
|
---|
| 73 | /* ------------------------------------------------------------------------------------ */
|
---|
| 74 | /* ComboBoxModel */
|
---|
| 75 | /* ------------------------------------------------------------------------------------ */
|
---|
| 76 | @Override
|
---|
[7017] | 77 | public Changeset getElementAt(int index) {
|
---|
[2711] | 78 | return changesets.get(index);
|
---|
| 79 | }
|
---|
| 80 |
|
---|
| 81 | @Override
|
---|
| 82 | public int getIndexOf(Object anObject) {
|
---|
| 83 | return changesets.indexOf(anObject);
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | @Override
|
---|
| 87 | public int getSize() {
|
---|
| 88 | return changesets.size();
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | @Override
|
---|
| 92 | public Object getSelectedItem() {
|
---|
| 93 | return selectedChangeset;
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | @Override
|
---|
| 97 | public void setSelectedItem(Object anObject) {
|
---|
| 98 | if (anObject == null) {
|
---|
| 99 | this.selectedChangeset = null;
|
---|
| 100 | super.setSelectedItem(null);
|
---|
| 101 | return;
|
---|
| 102 | }
|
---|
[8444] | 103 | if (!(anObject instanceof Changeset)) return;
|
---|
[8510] | 104 | Changeset cs = (Changeset) anObject;
|
---|
[8444] | 105 | if (cs.getId() == 0 || !cs.isOpen()) return;
|
---|
[2711] | 106 | Changeset candidate = getChangesetById(cs.getId());
|
---|
| 107 | if (candidate == null) return;
|
---|
| 108 | this.selectedChangeset = candidate;
|
---|
| 109 | super.setSelectedItem(selectedChangeset);
|
---|
| 110 | }
|
---|
| 111 | }
|
---|