source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java@ 6340

Last change on this file since 6340 was 6084, checked in by bastiK, 11 years ago

see #8902 - add missing @Override annotations (patch by shinigami)

  • Property svn:eol-style set to native
File size: 6.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.changeset;
3
4import java.util.ArrayList;
5import java.util.Collection;
6import java.util.Collections;
7import java.util.Comparator;
8import java.util.HashSet;
9import java.util.List;
10import java.util.Set;
11
12import javax.swing.DefaultListModel;
13import javax.swing.DefaultListSelectionModel;
14
15import org.openstreetmap.josm.data.osm.Changeset;
16import org.openstreetmap.josm.data.osm.ChangesetCache;
17import org.openstreetmap.josm.data.osm.ChangesetCacheEvent;
18import org.openstreetmap.josm.data.osm.ChangesetCacheListener;
19import org.openstreetmap.josm.data.osm.DataSet;
20import org.openstreetmap.josm.data.osm.OsmPrimitive;
21import org.openstreetmap.josm.data.osm.Storage;
22
23public class ChangesetListModel extends DefaultListModel implements ChangesetCacheListener{
24 private final List<Changeset> data = new ArrayList<Changeset>();
25 private final Storage<Changeset> shownChangesets = new Storage<Changeset>(true);
26 private DefaultListSelectionModel selectionModel;
27
28 public ChangesetListModel(DefaultListSelectionModel selectionModel) {
29 this.selectionModel = selectionModel;
30 }
31
32 public Set<Changeset> getSelectedChangesets() {
33 Set<Changeset> ret = new HashSet<Changeset>();
34 for (int i=0; i < getSize(); i++) {
35 if (selectionModel.isSelectedIndex(i)) {
36 ret.add(data.get(i));
37 }
38 }
39 return ret;
40 }
41
42 public Set<Integer> getSelectedChangesetIds() {
43 Set<Integer> ret = new HashSet<Integer>();
44 for (int i=0; i < getSize(); i++) {
45 if (selectionModel.isSelectedIndex(i)) {
46 ret.add(data.get(i).getId());
47 }
48 }
49 return ret;
50 }
51
52 public void setSelectedChangesets(Collection<Changeset> changesets) {
53 selectionModel.clearSelection();
54 if (changesets == null) return;
55 for (Changeset cs: changesets) {
56 int idx = data.indexOf(cs);
57 if (idx < 0) {
58 continue;
59 }
60 selectionModel.addSelectionInterval(idx,idx);
61 }
62 }
63
64 protected void setChangesets(Collection<Changeset> changesets) {
65 shownChangesets.clear();
66 if (changesets != null) {
67 shownChangesets.addAll(changesets);
68 }
69 updateModel();
70 }
71
72 private void updateModel() {
73 Set<Changeset> sel = getSelectedChangesets();
74 data.clear();
75 data.addAll(shownChangesets);
76 ChangesetCache cache = ChangesetCache.getInstance();
77 for (Changeset cs: data) {
78 if (cache.contains(cs) && cache.get(cs.getId()) != cs) {
79 cs.mergeFrom(cache.get(cs.getId()));
80 }
81 }
82 sort();
83 fireIntervalAdded(this, 0, getSize());
84 setSelectedChangesets(sel);
85 }
86
87 public void initFromChangesetIds(Collection<Integer> ids) {
88 if (ids == null || ids.isEmpty()) {
89 setChangesets(null);
90 return;
91 }
92 Set<Changeset> changesets = new HashSet<Changeset>(ids.size());
93 for (int id: ids) {
94 if (id <= 0) {
95 continue;
96 }
97 changesets.add(new Changeset(id));
98 }
99 setChangesets(changesets);
100 }
101
102 public void initFromPrimitives(Collection<? extends OsmPrimitive> primitives) {
103 if (primitives == null) {
104 setChangesets(null);
105 return;
106 }
107 Set<Changeset> changesets = new HashSet<Changeset>();
108 for (OsmPrimitive p: primitives) {
109 if (p.getChangesetId() <= 0) {
110 continue;
111 }
112 changesets.add(new Changeset(p.getChangesetId()));
113 }
114 setChangesets(changesets);
115 }
116
117 public void initFromDataSet(DataSet ds) {
118 if (ds == null) {
119 setChangesets(null);
120 return;
121 }
122 Set<Changeset> changesets = new HashSet<Changeset>();
123 for (OsmPrimitive p: ds.allPrimitives()) {
124 if (p.getChangesetId() <=0 ) {
125 continue;
126 }
127 changesets.add(new Changeset(p.getChangesetId()));
128 }
129 setChangesets(changesets);
130 }
131
132 @Override
133 public Object getElementAt(int idx) {
134 return data.get(idx);
135 }
136
137 @Override
138 public int getSize() {
139 return data.size();
140 }
141
142 protected void sort() {
143 Collections.sort(
144 data,
145 new Comparator<Changeset>() {
146 @Override
147 public int compare(Changeset cs1, Changeset cs2) {
148 if (cs1.getId() > cs2.getId()) return -1;
149 if (cs1.getId() == cs2.getId()) return 0;
150 return 1;
151 }
152 }
153 );
154 }
155
156 /**
157 * Replies true if there is at least one selected open changeset
158 *
159 * @return true if there is at least one selected open changeset
160 */
161 public boolean hasSelectedOpenChangesets() {
162 return !getSelectedOpenChangesets().isEmpty();
163 }
164
165 /**
166 * Replies the selected open changesets
167 *
168 * @return the selected open changesets
169 */
170 public List<Changeset> getSelectedOpenChangesets() {
171 List<Changeset> ret = new ArrayList<Changeset>();
172 for (int i=0; i< getSize(); i++) {
173 if (selectionModel.isSelectedIndex(i)) {
174 Changeset cs = data.get(i);
175 if (cs.isOpen()) {
176 ret.add(cs);
177 }
178 }
179 }
180 return ret;
181 }
182
183 /* ---------------------------------------------------------------------------- */
184 /* Interface ChangesetCacheListener */
185 /* ---------------------------------------------------------------------------- */
186 @Override
187 public void changesetCacheUpdated(ChangesetCacheEvent event) {
188 Set<Changeset> sel = getSelectedChangesets();
189 for(Changeset cs: event.getAddedChangesets()) {
190 int idx = data.indexOf(cs);
191 if (idx >= 0 && data.get(idx) != cs) {
192 data.get(idx).mergeFrom(cs);
193 }
194 }
195 for(Changeset cs: event.getUpdatedChangesets()) {
196 int idx = data.indexOf(cs);
197 if (idx >= 0 && data.get(idx) != cs) {
198 data.get(idx).mergeFrom(cs);
199 }
200 }
201 for(Changeset cs: event.getRemovedChangesets()) {
202 int idx = data.indexOf(cs);
203 if (idx >= 0) {
204 // replace with an incomplete changeset
205 data.set(idx, new Changeset(cs.getId()));
206 }
207 }
208 fireContentsChanged(this, 0, getSize());
209 setSelectedChangesets(sel);
210 }
211}
Note: See TracBrowser for help on using the repository browser.