package com.revolsys.swing.map.layer.record.table.predicate; import java.awt.Color; import java.awt.Component; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import org.jdesktop.swingx.decorator.ColorHighlighter; import org.jdesktop.swingx.decorator.ComponentAdapter; import org.jdesktop.swingx.decorator.HighlightPredicate; import com.revolsys.awt.WebColors; import com.revolsys.datatype.DataType; import com.revolsys.identifier.SingleIdentifier; import com.revolsys.swing.map.form.LayerRecordForm; import com.revolsys.swing.map.layer.record.table.model.LayerRecordTableModel; import com.revolsys.swing.table.BaseJTable; import com.revolsys.util.Property; public class FormAllFieldsModifiedPredicate implements HighlightPredicate { public static void add(final LayerRecordForm form, final BaseJTable table) { final LayerRecordTableModel model = table.getTableModel(); final FormAllFieldsModifiedPredicate predicate = new FormAllFieldsModifiedPredicate(form, model); table.addHighlighter( new ColorHighlighter(new AndHighlightPredicate(predicate, HighlightPredicate.EVEN), WebColors.newAlpha(WebColors.YellowGreen, 127), WebColors.Black, WebColors.LimeGreen, Color.WHITE)); table.addHighlighter( new ColorHighlighter(new AndHighlightPredicate(predicate, HighlightPredicate.ODD), WebColors.YellowGreen, WebColors.Black, WebColors.Green, Color.WHITE)); } private final Reference<LayerRecordForm> form; private final LayerRecordTableModel model; public FormAllFieldsModifiedPredicate(final LayerRecordForm form, final LayerRecordTableModel model) { this.form = new WeakReference<>(form); this.model = model; } @Override public boolean isHighlighted(final Component renderer, final ComponentAdapter adapter) { try { final int rowIndex = adapter.convertRowIndexToModel(adapter.row); final String fieldName = this.model.getColumnFieldName(rowIndex); if (fieldName != null) { final LayerRecordForm form = this.form.get(); if (form.isFieldValid(fieldName)) { if (form.hasOriginalValue(fieldName)) { Object fieldValue = form.getFieldValue(fieldName); if (fieldValue instanceof SingleIdentifier) { final SingleIdentifier singleIdentifier = (SingleIdentifier)fieldValue; fieldValue = singleIdentifier.getValue(0); } final Object originalValue = form.getOriginalValue(fieldName); boolean equal = DataType.equal(originalValue, fieldValue); if (!equal) { if (originalValue == null) { if (fieldValue instanceof String) { final String string = (String)fieldValue; if (!Property.hasValue(string)) { equal = true; } } } } return !equal; } } } } catch (final IndexOutOfBoundsException e) { } return false; } }