// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.dialogs.changeset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.swing.DefaultListSelectionModel;
import javax.swing.table.AbstractTableModel;
import org.openstreetmap.josm.data.osm.ChangesetDataSet;
import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetDataSetEntry;
import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetModificationType;
import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
/**
* This is the table model for the content of a changeset.
*
*/
public class ChangesetContentTableModel extends AbstractTableModel {
private final ArrayList<ChangesetContentEntry> data = new ArrayList<ChangesetContentEntry>();
private DefaultListSelectionModel selectionModel;
public ChangesetContentTableModel(DefaultListSelectionModel selectionModel) {
this.selectionModel = selectionModel;
}
/**
* Replies true if there is at least one selected primitive in the table model
*
* @return true if there is at least one selected primitive in the table model
*/
public boolean hasSelectedPrimitives() {
return selectionModel.getMinSelectionIndex() >= 0;
}
public void setSelectedByIdx(int row) {
selectionModel.setSelectionInterval(row, row);
}
/**
* Replies the selection model
* @return the selection model
*/
public DefaultListSelectionModel getSelectionModel() {
return selectionModel;
}
public Set<HistoryOsmPrimitive> getSelectedPrimitives() {
Set<HistoryOsmPrimitive> ret = new HashSet<HistoryOsmPrimitive>();
for (int i=0;i < data.size();i++) {
if (selectionModel.isSelectedIndex(i)) {
ret.add(data.get(i).getPrimitive());
}
}
return ret;
}
/**
* Populates the model with the content of a model. If ds is null, the
* table is cleared.
*
* @param ds the changeset content.
*/
public void populate(ChangesetDataSet ds) {
this.data.clear();
if (ds == null) {
fireTableDataChanged();
return;
}
for (Iterator<ChangesetDataSetEntry> it = ds.iterator(); it.hasNext();) {
data.add(new ChangesetContentEntry(it.next()));
}
sort();
fireTableDataChanged();
}
protected void sort() {
Collections.sort(
data,
new Comparator<ChangesetDataSetEntry>() {
public int compare(ChangesetDataSetEntry c1, ChangesetDataSetEntry c2) {
if (c1.getModificationType().equals(c2.getModificationType())) {
long id1 = c1.getPrimitive().getId();
long id2 = c2.getPrimitive().getId();
if (id1 == id2)
return 0;
else if (id1 < id2)
return -1;
return 1;
}
switch(c1.getModificationType()) {
case CREATED: return -1;
case UPDATED:
switch(c2.getModificationType()) {
case CREATED: return 1;
default: return -1;
}
case DELETED:
return 1;
}
// should not happen
return 0;
}
}
);
}
/* -------------------------------------------------------------- */
/* interface TableModel */
/* -------------------------------------------------------------- */
public int getColumnCount() {
return 3;
}
public int getRowCount() {
return data.size();
}
public Object getValueAt(int row, int col) {
switch(col) {
case 0: return data.get(row).getModificationType();
default: return data.get(row).getPrimitive();
}
}
/**
* The type used internally to keep information about {@see HistoryOsmPrimitive}
* with their {@see ChangesetModificationType}.
*
*/
static private class ChangesetContentEntry implements ChangesetDataSetEntry{
private final ChangesetModificationType modificationType;
private final HistoryOsmPrimitive primitive;
public ChangesetContentEntry(ChangesetModificationType modificationType, HistoryOsmPrimitive primitive) {
this.modificationType = modificationType;
this.primitive = primitive;
}
public ChangesetContentEntry(ChangesetDataSetEntry entry) {
this(entry.getModificationType(), entry.getPrimitive());
}
public ChangesetModificationType getModificationType() {
return modificationType;
}
public HistoryOsmPrimitive getPrimitive() {
return primitive;
}
}
}