package com.revolsys.swing.map.layer.record.table.predicate;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JComponent;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import com.revolsys.awt.WebColors;
import com.revolsys.datatype.DataTypes;
import com.revolsys.identifier.Identifier;
import com.revolsys.record.Record;
import com.revolsys.record.code.CodeTable;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.swing.map.layer.record.AbstractRecordLayer;
import com.revolsys.swing.map.layer.record.LayerRecord;
import com.revolsys.swing.table.highlighter.ColorHighlighter;
import com.revolsys.swing.table.record.RecordRowTable;
import com.revolsys.swing.table.record.model.RecordRowTableModel;
public class ModifiedFieldPredicate implements HighlightPredicate {
public static void add(final RecordRowTable table) {
final RecordRowTableModel model = table.getModel();
final ModifiedFieldPredicate predicate = new ModifiedFieldPredicate(model);
final Color lime50 = WebColors.newAlpha(WebColors.Lime, 127);
table.addHighlighter(
new ColorHighlighter(new AndHighlightPredicate(predicate, HighlightPredicate.EVEN), lime50,
WebColors.Black, lime50, WebColors.Black));
table.addHighlighter(
new ColorHighlighter(new AndHighlightPredicate(predicate, HighlightPredicate.ODD),
WebColors.Lime, WebColors.Black, WebColors.Lime, WebColors.Black));
}
private final RecordRowTableModel model;
public ModifiedFieldPredicate(final RecordRowTableModel model) {
this.model = model;
}
@Override
public boolean isHighlighted(final Component renderer, final ComponentAdapter adapter) {
String toolTip = null;
boolean highlighted = false;
try {
final int rowIndex = adapter.convertRowIndexToModel(adapter.row);
final Record record = this.model.getRecord(rowIndex);
if (record instanceof LayerRecord) {
final LayerRecord layerRecord = (LayerRecord)record;
final AbstractRecordLayer layer = layerRecord.getLayer();
if (layer.isDeleted(layerRecord)) {
highlighted = false;
} else {
final int columnIndex = adapter.convertColumnIndexToModel(adapter.column);
final String fieldName = this.model.getColumnFieldName(columnIndex);
highlighted = layerRecord.isModified(fieldName);
if (highlighted) {
final RecordDefinition recordDefinition = layerRecord.getRecordDefinition();
final Object originalValue = layerRecord.getOriginalValue(fieldName);
final CodeTable codeTable = recordDefinition.getCodeTableByFieldName(fieldName);
String text;
if (originalValue == null) {
text = "-";
} else if (codeTable == null) {
text = DataTypes.toString(originalValue);
} else {
text = codeTable.getValue(Identifier.newIdentifier(originalValue));
if (text == null) {
text = "-";
}
}
toolTip = text;
}
if (columnIndex < this.model.getColumnFieldsOffset()) {
highlighted = false;
}
}
}
} catch (final IndexOutOfBoundsException e) {
highlighted = false;
}
final JComponent component = (JComponent)renderer;
if (toolTip != null && toolTip.length() > 100) {
toolTip = toolTip.substring(0, 100) + "...";
}
component.setToolTipText(toolTip);
return highlighted;
}
}