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

Last change on this file since 4191 was 4191, checked in by stoecker, 13 years ago

remove old debug stuff

  • Property svn:eol-style set to native
File size: 7.0 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 addChangeset(Changeset changeset) {
65 if (shownChangesets.add(changeset)) {
66 setChangesets(shownChangesets);
67 updateModel();
68 }
69 }
70
71 protected void removeChangeset(Changeset changeset) {
72 if (shownChangesets.remove(changeset)) {
73 setChangesets(shownChangesets);
74 updateModel();
75 }
76 }
77
78 protected void setChangesets(Collection<Changeset> changesets) {
79 shownChangesets.clear();
80 if (changesets != null) {
81 shownChangesets.addAll(changesets);
82 }
83 updateModel();
84 }
85
86 private void updateModel() {
87 Set<Changeset> sel = getSelectedChangesets();
88 data.clear();
89 data.addAll(shownChangesets);
90 ChangesetCache cache = ChangesetCache.getInstance();
91 for (Changeset cs: data) {
92 if (cache.contains(cs) && cache.get(cs.getId()) != cs) {
93 cs.mergeFrom(cache.get(cs.getId()));
94 }
95 }
96 sort();
97 fireIntervalAdded(this, 0, getSize());
98 setSelectedChangesets(sel);
99 }
100
101 public void initFromChangesetIds(Collection<Integer> ids) {
102 if (ids == null || ids.isEmpty()) {
103 setChangesets(null);
104 return;
105 }
106 Set<Changeset> changesets = new HashSet<Changeset>(ids.size());
107 for (int id: ids) {
108 if (id <= 0) {
109 continue;
110 }
111 changesets.add(new Changeset(id));
112 }
113 setChangesets(changesets);
114 }
115
116 public void initFromPrimitives(Collection<? extends OsmPrimitive> primitives) {
117 if (primitives == null) {
118 setChangesets(null);
119 return;
120 }
121 Set<Changeset> changesets = new HashSet<Changeset>();
122 for (OsmPrimitive p: primitives) {
123 if (p.getChangesetId() <= 0) {
124 continue;
125 }
126 changesets.add(new Changeset(p.getChangesetId()));
127 }
128 setChangesets(changesets);
129 }
130
131 public void initFromDataSet(DataSet ds) {
132 if (ds == null) {
133 setChangesets(null);
134 return;
135 }
136 Set<Changeset> changesets = new HashSet<Changeset>();
137 for (OsmPrimitive p: ds.allPrimitives()) {
138 if (p.getChangesetId() <=0 ) {
139 continue;
140 }
141 changesets.add(new Changeset(p.getChangesetId()));
142 }
143 setChangesets(changesets);
144 }
145
146 @Override
147 public Object getElementAt(int idx) {
148 return data.get(idx);
149 }
150
151 @Override
152 public int getSize() {
153 return data.size();
154 }
155
156 protected void sort() {
157 Collections.sort(
158 data,
159 new Comparator<Changeset>() {
160 public int compare(Changeset cs1, Changeset cs2) {
161 if (cs1.getId() > cs2.getId()) return -1;
162 if (cs1.getId() == cs2.getId()) return 0;
163 return 1;
164 }
165 }
166 );
167 }
168
169 /**
170 * Replies true if there is at least one selected open changeset
171 *
172 * @return true if there is at least one selected open changeset
173 */
174 public boolean hasSelectedOpenChangesets() {
175 return !getSelectedOpenChangesets().isEmpty();
176 }
177
178 /**
179 * Replies the selected open changesets
180 *
181 * @return the selected open changesets
182 */
183 public List<Changeset> getSelectedOpenChangesets() {
184 List<Changeset> ret = new ArrayList<Changeset>();
185 for (int i=0; i< getSize(); i++) {
186 if (selectionModel.isSelectedIndex(i)) {
187 Changeset cs = data.get(i);
188 if (cs.isOpen()) {
189 ret.add(cs);
190 }
191 }
192 }
193 return ret;
194 }
195
196 /* ---------------------------------------------------------------------------- */
197 /* Interface ChangesetCacheListener */
198 /* ---------------------------------------------------------------------------- */
199 public void changesetCacheUpdated(ChangesetCacheEvent event) {
200 Set<Changeset> sel = getSelectedChangesets();
201 for(Changeset cs: event.getAddedChangesets()) {
202 int idx = data.indexOf(cs);
203 if (idx >= 0 && data.get(idx) != cs) {
204 data.get(idx).mergeFrom(cs);
205 }
206 }
207 for(Changeset cs: event.getUpdatedChangesets()) {
208 int idx = data.indexOf(cs);
209 if (idx >= 0 && data.get(idx) != cs) {
210 data.get(idx).mergeFrom(cs);
211 }
212 }
213 for(Changeset cs: event.getRemovedChangesets()) {
214 int idx = data.indexOf(cs);
215 if (idx >= 0) {
216 // replace with an incomplete changeset
217 data.set(idx, new Changeset(cs.getId()));
218 }
219 }
220 fireContentsChanged(this, 0, getSize());
221 setSelectedChangesets(sel);
222 }
223}
Note: See TracBrowser for help on using the repository browser.