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

Last change on this file was 18208, checked in by Don-vip, 3 years ago

global use of Utils.isEmpty/isBlank

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