package com.revolsys.swing.map.layer.record.table.model;
import java.util.Collection;
import java.util.Map;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.revolsys.record.Record;
import com.revolsys.swing.map.layer.record.AbstractRecordLayer;
import com.revolsys.swing.map.layer.record.LayerRecord;
import com.revolsys.swing.map.layer.record.table.predicate.MergedNullValuePredicate;
import com.revolsys.swing.map.layer.record.table.predicate.MergedRecordPredicate;
import com.revolsys.swing.map.layer.record.table.predicate.MergedValuePredicate;
import com.revolsys.swing.table.SortableTableModel;
import com.revolsys.swing.table.TablePanel;
import com.revolsys.swing.table.record.RecordRowTable;
import com.revolsys.swing.table.record.model.RecordListTableModel;
public class MergedRecordsTableModel extends RecordListTableModel
implements SortableTableModel, ListSelectionListener {
private static final long serialVersionUID = 1L;
public static TablePanel newPanel(final AbstractRecordLayer layer, final Record mergedObject,
final Collection<LayerRecord> objects) {
final MergedRecordsTableModel model = new MergedRecordsTableModel(layer, mergedObject, objects);
final RecordRowTable table = new RecordRowTable(model);
table.setVisibleRowCount(objects.size() + 2);
MergedValuePredicate.add(table);
MergedRecordPredicate.add(table);
MergedNullValuePredicate.add(table);
table.setSortable(false);
table.getSelectionModel().addListSelectionListener(model);
return new TablePanel(table);
}
private final AbstractRecordLayer layer;
private final Record mergedRecord;
public MergedRecordsTableModel(final AbstractRecordLayer layer) {
this(layer, null, null);
}
public MergedRecordsTableModel(final AbstractRecordLayer layer, final Record mergedRecord,
final Collection<LayerRecord> records) {
super(layer.getRecordDefinition(), records, layer.getFieldNames(), 1);
this.layer = layer;
setFieldsOffset(1);
this.mergedRecord = mergedRecord;
setEditable(true);
setReadOnlyFieldNames(layer.getUserReadOnlyFieldNames());
}
@Override
public String getColumnName(final int columnIndex) {
if (columnIndex == 0) {
return "#";
} else {
return super.getColumnName(columnIndex);
}
}
public Record getMergedRecord() {
return this.mergedRecord;
}
@SuppressWarnings("unchecked")
@Override
public <V extends Record> V getRecord(final int index) {
if (index == super.getRowCount()) {
return (V)this.mergedRecord;
} else {
return (V)super.getRecord(index);
}
}
@Override
public int getRowCount() {
return super.getRowCount() + 1;
}
@Override
public Object getValueAt(final int rowIndex, final int columnIndex) {
if (columnIndex == 0) {
if (rowIndex == getRowCount() - 1) {
return "Merge";
} else {
return rowIndex + 1;
}
} else {
return super.getValueAt(rowIndex, columnIndex);
}
}
@Override
public boolean isCellEditable(final int rowIndex, final int columnIndex) {
if (columnIndex == 0) {
return false;
} else if (rowIndex == getRowCount() - 1) {
return super.isCellEditable(rowIndex, columnIndex);
} else {
return false;
}
}
@Override
public void setValueAt(final Object value, final int rowIndex, final int columnIndex) {
final Map<String, Object> record = getRecord(rowIndex);
if (record != null) {
final String name = getColumnFieldName(columnIndex);
record.put(name, value);
}
}
@Override
public void valueChanged(final ListSelectionEvent event) {
final RecordRowTable table = getTable();
final ListSelectionModel selectionModel = table.getSelectionModel();
final int rowCount = super.getRowCount();
final boolean mergedSelected = selectionModel.isSelectedIndex(rowCount);
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) {
final Record record = getRecord(rowIndex);
if (record != null) {
if (mergedSelected || selectionModel.isSelectedIndex(rowIndex)) {
this.layer.addHighlightedRecords((LayerRecord)record);
} else {
this.layer.unHighlightRecords((LayerRecord)record);
}
}
}
this.layer.zoomToHighlighted();
}
}