source: josm/trunk/src/org/openstreetmap/josm/gui/io/OpenChangesetComboBoxModel.java@ 12806

Last change on this file since 12806 was 12767, checked in by Don-vip, 7 years ago

see #15229 - see #15182 - do not longer fire ChangesetCacheEvent in EDT - now up to listeners to run their code in it if required

  • Property svn:eol-style set to native
File size: 3.6 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.io;
3
4import java.util.ArrayList;
5import java.util.List;
6
7import javax.swing.DefaultComboBoxModel;
8
9import org.openstreetmap.josm.data.osm.Changeset;
10import org.openstreetmap.josm.data.osm.ChangesetCache;
11import org.openstreetmap.josm.data.osm.ChangesetCacheEvent;
12import org.openstreetmap.josm.data.osm.ChangesetCacheListener;
13import org.openstreetmap.josm.gui.util.GuiHelper;
14
15/**
16 * A combobox model for the list of open changesets. The model is populated with the list
17 * of open changesets kept in the {@link ChangesetCache}.
18 *
19 */
20public class OpenChangesetComboBoxModel extends DefaultComboBoxModel<Changeset> implements ChangesetCacheListener {
21 private final transient List<Changeset> changesets;
22 private transient Changeset selectedChangeset;
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
31 /**
32 * Constructs a new {@code OpenChangesetComboBoxModel}.
33 */
34 public OpenChangesetComboBoxModel() {
35 this.changesets = new ArrayList<>();
36 }
37
38 /**
39 * Refreshes the content of the combobox model with the current list of open
40 * changesets from the {@link ChangesetCache}.
41 */
42 public void refresh() {
43 changesets.clear();
44 changesets.addAll(ChangesetCache.getInstance().getOpenChangesetsForCurrentUser());
45 fireContentsChanged(this, 0, getSize());
46 int idx = changesets.indexOf(selectedChangeset);
47 if (idx < 0) {
48 selectFirstChangeset();
49 } else {
50 setSelectedItem(changesets.get(idx));
51 }
52 }
53
54 /**
55 * Selects the first changeset in the current list of open changesets
56 */
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 /* ------------------------------------------------------------------------------------ */
68 @Override
69 public void changesetCacheUpdated(ChangesetCacheEvent event) {
70 GuiHelper.runInEDT(this::refresh);
71 }
72
73 /* ------------------------------------------------------------------------------------ */
74 /* ComboBoxModel */
75 /* ------------------------------------------------------------------------------------ */
76 @Override
77 public Changeset getElementAt(int index) {
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 }
103 if (!(anObject instanceof Changeset)) return;
104 Changeset cs = (Changeset) anObject;
105 if (cs.getId() == 0 || !cs.isOpen()) return;
106 Changeset candidate = getChangesetById(cs.getId());
107 if (candidate == null) return;
108 this.selectedChangeset = candidate;
109 super.setSelectedItem(selectedChangeset);
110 }
111}
Note: See TracBrowser for help on using the repository browser.