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

Last change on this file since 2613 was 2613, checked in by Gubaer, 14 years ago

new: global in-memory cache for downloaded changesets
new: toggle dialog for changesets
new: downloading of changesets (currently without changeset content, will follow later)

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