source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerModel.java@ 6316

Last change on this file since 6316 was 6316, checked in by Don-vip, 11 years ago

Sonar/FindBugs - Loose coupling

  • Property svn:eol-style set to native
File size: 6.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.changeset;
3
4import java.beans.PropertyChangeListener;
5import java.beans.PropertyChangeSupport;
6import java.util.ArrayList;
7import java.util.Collection;
8import java.util.Collections;
9import java.util.Comparator;
10import java.util.HashSet;
11import java.util.List;
12import java.util.Set;
13
14import javax.swing.DefaultListSelectionModel;
15import javax.swing.table.AbstractTableModel;
16
17import org.openstreetmap.josm.data.osm.Changeset;
18import org.openstreetmap.josm.data.osm.ChangesetCache;
19import org.openstreetmap.josm.data.osm.ChangesetCacheEvent;
20import org.openstreetmap.josm.data.osm.ChangesetCacheListener;
21import org.openstreetmap.josm.gui.util.GuiHelper;
22
23/**
24 * This is the model for the changeset cache manager dialog.
25 *
26 */
27public class ChangesetCacheManagerModel extends AbstractTableModel implements ChangesetCacheListener{
28
29 /** the name of the property for the currently selected changeset in the detail view */
30 public final static String CHANGESET_IN_DETAIL_VIEW_PROP = ChangesetCacheManagerModel.class.getName() + ".changesetInDetailView";
31
32 private final ArrayList<Changeset> data = new ArrayList<Changeset>();
33 private DefaultListSelectionModel selectionModel;
34 private Changeset changesetInDetailView;
35 private final PropertyChangeSupport support = new PropertyChangeSupport(this);
36
37 public ChangesetCacheManagerModel(DefaultListSelectionModel selectionModel) {
38 this.selectionModel = selectionModel;
39 }
40
41 public void addPropertyChangeListener(PropertyChangeListener listener) {
42 support.addPropertyChangeListener(listener);
43 }
44
45 public void removePropertyChangeListener(PropertyChangeListener listener) {
46 support.removePropertyChangeListener(listener);
47 }
48
49 /**
50 * Sets the changeset currently displayed in the detail view. Fires a property change event
51 * for the property {@link #CHANGESET_IN_DETAIL_VIEW_PROP} if necessary.
52 *
53 * @param cs the changeset currently displayed in the detail view.
54 */
55 public void setChangesetInDetailView(Changeset cs) {
56 Changeset oldValue = changesetInDetailView;
57 changesetInDetailView = cs;
58 if (oldValue != cs) {
59 support.firePropertyChange(CHANGESET_IN_DETAIL_VIEW_PROP, oldValue, changesetInDetailView);
60 }
61 }
62
63 /**
64 * Replies true if there is at least one selected changeset
65 *
66 * @return true if there is at least one selected changeset
67 */
68 public boolean hasSelectedChangesets() {
69 return selectionModel.getMinSelectionIndex() >= 0;
70 }
71
72 /**
73 * Replies the list of selected changesets
74 *
75 * @return the list of selected changesets
76 */
77 public List<Changeset> getSelectedChangesets() {
78 List<Changeset> ret = new ArrayList<Changeset>();
79 for (int i =0; i< data.size();i++) {
80 Changeset cs = data.get(i);
81 if (selectionModel.isSelectedIndex(i)) {
82 ret.add(cs);
83 }
84 }
85 return ret;
86 }
87
88 /**
89 * Replies a set of ids of the selected changesets
90 *
91 * @return a set of ids of the selected changesets
92 */
93 public Set<Integer> getSelectedChangesetIds() {
94 Set<Integer> ret = new HashSet<Integer>();
95 for (Changeset cs: getSelectedChangesets()) {
96 ret.add(cs.getId());
97 }
98 return ret;
99 }
100
101 /**
102 * Selects the changesets in <code>selected</code>.
103 *
104 * @param selected the collection of changesets to select. Ignored if empty.
105 */
106 public void setSelectedChangesets(Collection<Changeset> selected) {
107 GuiHelper.runInEDTAndWait(new Runnable() {
108 @Override public void run() {
109 selectionModel.clearSelection();
110 }
111 });
112 if (selected == null || selected.isEmpty())
113 return;
114 for (Changeset cs: selected) {
115 final int idx = data.indexOf(cs);
116 if (idx >= 0) {
117 GuiHelper.runInEDTAndWait(new Runnable() {
118 @Override public void run() {
119 selectionModel.addSelectionInterval(idx,idx);
120 }
121 });
122 }
123 }
124 }
125
126 @Override
127 public int getColumnCount() {
128 return 5;
129 }
130
131 @Override
132 public int getRowCount() {
133 return data.size();
134 }
135
136 @Override
137 public Object getValueAt(int row, int column) {
138 return data.get(row);
139 }
140
141 public void init() {
142 ChangesetCache cc = ChangesetCache.getInstance();
143 List<Changeset> selected = getSelectedChangesets();
144 data.clear();
145 data.addAll(cc.getChangesets());
146 sort();
147 fireTableDataChanged();
148 setSelectedChangesets(selected);
149
150 cc.addChangesetCacheListener(this);
151 }
152
153 public void tearDown() {
154 ChangesetCache.getInstance().removeChangesetCacheListener(this);
155 }
156
157 public DefaultListSelectionModel getSelectionModel() {
158 return selectionModel;
159 }
160
161 protected void sort() {
162 Collections.sort(
163 this.data,
164 new Comparator<Changeset>() {
165 @Override public int compare(Changeset o1, Changeset o2) {
166 if (o1.getId() < o2.getId()) return 1;
167 if (o1.getId() == o2.getId()) return 0;
168 return -1;
169 }
170 }
171 );
172 }
173
174 /* ------------------------------------------------------------------------------ */
175 /* interface ChangesetCacheListener */
176 /* ------------------------------------------------------------------------------ */
177 @Override
178 public void changesetCacheUpdated(ChangesetCacheEvent event) {
179 List<Changeset> selected = getSelectedChangesets();
180 for (Changeset cs: event.getAddedChangesets()) {
181 data.add(cs);
182 }
183 for (Changeset cs: event.getRemovedChangesets()) {
184 data.remove(cs);
185 }
186 for (Changeset cs: event.getUpdatedChangesets()) {
187 int idx = data.indexOf(cs);
188 if (idx >= 0) {
189 Changeset mine = data.get(idx);
190 if (mine != cs) {
191 mine.mergeFrom(cs);
192 }
193 }
194 }
195 sort();
196 fireTableDataChanged();
197 setSelectedChangesets(selected);
198 }
199}
Note: See TracBrowser for help on using the repository browser.