// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.fixAddresses.gui;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.util.Collections;
import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer;
import org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity;
import org.openstreetmap.josm.plugins.fixAddresses.OSMStreet;
@SuppressWarnings("serial")
public class StreetTableModel extends AddressEditTableModel {
private static final int NUMBER_OF_COLUMNS = 3;
private static final String[] COLUMN_NAMES = new String[]{tr("Type"), tr("Name"), tr("Addresses")};
private static final Class<?>[] COLUMN_CLASSES = new Class<?>[]{String.class, String.class, Integer.class};
public StreetTableModel(AddressEditContainer addressContainer) {
super(addressContainer);
}
@Override
public int getColumnCount() {
return NUMBER_OF_COLUMNS;
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return COLUMN_CLASSES[columnIndex];
}
@Override
public int getRowCount() {
if (addressContainer == null || addressContainer.getStreetList() == null) {
return 0;
}
return addressContainer.getNumberOfStreets();
}
@Override
public Object getValueAt(int row, int column) {
OSMStreet sNode = (OSMStreet) getEntityOfRow(row);
if (sNode == null) {
return null;
}
switch (column) {
case 0:
return sNode.getType();
case 1:
return sNode.getName();
case 2:
return sNode.getNumberOfSegments();
case 3:
return sNode.getNumberOfAddresses();
case 4:
return sNode.hasAssociatedStreetRelation();
default:
throw new RuntimeException("Invalid column index: " + column);
}
}
@Override
public boolean isCellEditable(int row, int column) {
// TODO Auto-generated method stub
return false;
}
@Override
public IOSMEntity getEntityOfRow(int row) {
if (addressContainer == null || addressContainer.getStreetList() == null) {
return null;
}
if (row < 0 || row >= addressContainer.getNumberOfStreets()) {
return null;
}
return addressContainer.getStreetList().get(row);
}
@Override
public int getRowOfEntity(IOSMEntity entity) {
if (addressContainer == null || addressContainer.getStreetList() == null) {
return -1;
}
return addressContainer.getStreetList().indexOf(entity);
}
@Override
protected void sortByColumn(int column, boolean ascending) {
Collections.sort(addressContainer.getStreetList(), new StreetModelSorter(column, ascending));
}
/**
* Internal class StreetModelSorter.
*/
static class StreetModelSorter extends ColumnSorter<OSMStreet> {
StreetModelSorter(int column, boolean asc) {
super(column, asc);
}
@Override
public int compare(OSMStreet arg0, OSMStreet arg1) {
if (arg0 == null || arg1 == null) return 0;
switch (getColumn()) {
case 0:
if (arg0.getType() != null) {
return arg0.getType().compareTo(arg1.getType());
} else {
return arg1.hasName() ? -1 : 0;
}
case 1:
if (arg0.hasName()) {
return arg0.getName().compareTo(arg1.getName());
} else {
return arg1.hasName() ? -1 : 0;
}
case 2:
return Integer.valueOf(arg0.getNumberOfAddresses()).
compareTo(Integer.valueOf(arg1.getNumberOfAddresses()));
default:
}
return 0;
}
}
}