package com.revolsys.swing.map.layer.record.table.model; import java.util.Collection; import java.util.List; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.jdesktop.swingx.decorator.HighlightPredicate; import org.jdesktop.swingx.decorator.HighlightPredicate.AndHighlightPredicate; import com.revolsys.awt.WebColors; import com.revolsys.beans.ObjectPropertyException; 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.table.SortableTableModel; import com.revolsys.swing.table.TablePanel; import com.revolsys.swing.table.highlighter.ColorHighlighter; import com.revolsys.swing.table.record.RecordRowTable; import com.revolsys.swing.table.record.model.RecordListTableModel; public class RecordLayerErrorsTableModel extends RecordListTableModel implements SortableTableModel, ListSelectionListener { private static final long serialVersionUID = 1L; private final List<Throwable> exceptions; private final AbstractRecordLayer layer; private final List<String> messages; public RecordLayerErrorsTableModel(final AbstractRecordLayer layer, final List<Record> records, final List<String> messages, final List<Throwable> exceptions, final Collection<String> fieldNames) { super(layer.getRecordDefinition(), records, fieldNames, 1); this.layer = layer; this.messages = messages; this.exceptions = exceptions; setEditable(true); setReadOnlyFieldNames(layer.getUserReadOnlyFieldNames()); } public void addRecord(final LayerRecord record, final String errorMessage) { super.add(record); this.messages.add(errorMessage); this.exceptions.add(null); } public void addRecord(final LayerRecord record, final Throwable exception) { super.add(record); String message; if (exception instanceof ObjectPropertyException) { final ObjectPropertyException objectPropertyException = (ObjectPropertyException)exception; message = objectPropertyException.getPropertyName() + ": " + objectPropertyException.getMessage(); } else { message = exception.getMessage(); } this.messages.add(message); this.exceptions.add(exception); } @Override public Class<?> getColumnClass(final int columnIndex) { if (columnIndex == 0) { return String.class; } else { return super.getColumnClass(columnIndex); } } @Override public String getColumnName(final int columnIndex) { if (columnIndex == 0) { return "Error"; } else { return super.getColumnName(columnIndex); } } @Override public int getRowCount() { return super.getRowCount(); } @Override public Object getValueAt(final int rowIndex, final int columnIndex) { if (columnIndex == 0) { if (rowIndex < this.messages.size()) { return this.messages.get(rowIndex); } else { return "-"; } } else { return super.getValueAt(rowIndex, columnIndex); } } @Override public boolean isCellEditable(final int rowIndex, final int columnIndex) { return false; } public TablePanel newPanel() { final RecordRowTable table = new RecordRowTable(this); table.setVisibleRowCount(this.getRowCount() + 1); table.setSortable(true); table.getSelectionModel().addListSelectionListener(this); table.resizeColumnsToContent(); final HighlightPredicate predicate = (renderer, adapter) -> { final int columnIndex = adapter.convertColumnIndexToModel(adapter.column); return columnIndex == 0; }; table.addHighlighter( new ColorHighlighter(new AndHighlightPredicate(predicate, HighlightPredicate.EVEN), WebColors.newAlpha(WebColors.Pink, 127), WebColors.FireBrick, WebColors.LightCoral, WebColors.FireBrick)); table.addHighlighter( new ColorHighlighter(new AndHighlightPredicate(predicate, HighlightPredicate.ODD), WebColors.Pink, WebColors.FireBrick, WebColors.Crimson, WebColors.White)); return new TablePanel(table); } @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(); } }