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

Last change on this file since 3206 was 3206, checked in by jttt, 14 years ago

Remove obsoleted methods from Dataset, replace some calls of getNodes()/getWays()/getRelations() with allPrimitives()

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