80 lines
2.2 KiB
Java
80 lines
2.2 KiB
Java
|
|
package net.filebot.ui.sfv;
|
|
|
|
|
|
import java.awt.Component;
|
|
import java.util.EnumSet;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
import javax.swing.JTable;
|
|
import javax.swing.table.DefaultTableCellRenderer;
|
|
|
|
import net.filebot.ui.sfv.ChecksumRow.State;
|
|
|
|
|
|
/**
|
|
* DefaultTableCellRenderer with highlighting of text patterns.
|
|
*/
|
|
class HighlightPatternCellRenderer extends DefaultTableCellRenderer {
|
|
|
|
private final Pattern pattern;
|
|
|
|
|
|
public HighlightPatternCellRenderer(Pattern pattern) {
|
|
this.pattern = pattern;
|
|
}
|
|
|
|
|
|
@Override
|
|
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
|
super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
|
|
|
|
// check for error or warning
|
|
boolean isError = (EnumSet.of(State.ERROR, State.WARNING).contains(table.getValueAt(row, 0)));
|
|
|
|
// highlight patterns by using a smaller font-size and changing the font-color to a dark green
|
|
// do not change the font-color if cell is selected, because that would look ugly (imagine green text on blue background ...)
|
|
Matcher matcher = pattern.matcher(value.toString());
|
|
|
|
// use no-break, because we really don't want line-wrapping in our table cells
|
|
StringBuffer htmlText = new StringBuffer("<html><nobr>");
|
|
|
|
while (matcher.find()) {
|
|
matcher.appendReplacement(htmlText, createReplacement(isSelected ? null : (isError ? "red" : "#009900"), "smaller", isError ? "bold" : null));
|
|
}
|
|
|
|
matcher.appendTail(htmlText);
|
|
|
|
htmlText.append("</nobr></html>");
|
|
|
|
setText(htmlText.toString());
|
|
|
|
return this;
|
|
}
|
|
|
|
|
|
protected String createReplacement(String cssColor, String cssFontSize, String cssFontWeight) {
|
|
// build replacement string like
|
|
// e.g. <span style='font-size: smaller; color: #009900;'>$0</span>
|
|
StringBuilder replacement = new StringBuilder(60);
|
|
|
|
replacement.append("<span style='");
|
|
|
|
if (cssColor != null) {
|
|
replacement.append("color:").append(cssColor).append(';');
|
|
}
|
|
|
|
if (cssFontSize != null) {
|
|
replacement.append("font-size:").append(cssFontSize).append(';');
|
|
}
|
|
|
|
if (cssFontWeight != null) {
|
|
replacement.append("font-weight:").append(cssFontWeight).append(';');
|
|
}
|
|
|
|
return replacement.append("'>$0</span>").toString();
|
|
}
|
|
|
|
}
|