package com.revolsys.swing.table.predicate; import java.awt.Color; import java.awt.Component; import java.util.function.BiFunction; import javax.swing.BorderFactory; import javax.swing.border.Border; import org.jdesktop.swingx.decorator.BorderHighlighter; import org.jdesktop.swingx.decorator.ColorHighlighter; import org.jdesktop.swingx.decorator.ComponentAdapter; import org.jdesktop.swingx.decorator.HighlightPredicate; import org.jdesktop.swingx.decorator.Highlighter; import com.revolsys.logging.Logs; import com.revolsys.swing.table.highlighter.OutsideBorderHighlighter; public class FunctionHighlighter implements HighlightPredicate { public static Highlighter border(final BiFunction<Component, ComponentAdapter, Boolean> function, final Border border) { final HighlightPredicate predicate = new FunctionHighlighter(function); return new BorderHighlighter(predicate, border); } public static Highlighter border(final BiFunction<Component, ComponentAdapter, Boolean> function, final Color color) { return border(function, color, 1); } public static Highlighter border(final BiFunction<Component, ComponentAdapter, Boolean> function, final Color color, final int thickness) { final Border border = BorderFactory.createLineBorder(color, thickness); return border(function, border); } public static Highlighter color(final BiFunction<Component, ComponentAdapter, Boolean> function, final Color cellBackground, final Color cellForeground, final Color selectedBackground, final Color selectedForeground) { final HighlightPredicate predicate = new FunctionHighlighter(function); return new ColorHighlighter(predicate, cellBackground, cellForeground, selectedBackground, selectedForeground); } public static Highlighter outsideBorder( final BiFunction<Component, ComponentAdapter, Boolean> function, final Color color, final int thickness) { final HighlightPredicate predicate = new FunctionHighlighter(function); return new OutsideBorderHighlighter(predicate, color, thickness, true, false); } private final BiFunction<Component, ComponentAdapter, Boolean> function; public FunctionHighlighter(final BiFunction<Component, ComponentAdapter, Boolean> function) { this.function = function; } @Override public boolean isHighlighted(final Component renderer, final ComponentAdapter adapter) { try { return this.function.apply(renderer, adapter); } catch (final Throwable e) { Logs.debug(this, "Error in highlighter", e); return false; } } }