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

Last change on this file since 12372 was 12372, checked in by michael2402, 7 years ago

See #14794: Document package gui.dialogs.changeset

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