package edu.stanford.nlp.trees.tregex.gui;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.event.MouseEvent;
import javax.swing.JTextField;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import javax.swing.text.Highlighter.Highlight;
public class HighlightUtils {
//Non-instantiable
private HighlightUtils() { }
/**
* Highlight the given label from the first mouse event to the second
* Returns true if the highlight was successful, false otherwise.
*/
public static boolean addHighlight(JTextField label, MouseEvent mouseEvent1, MouseEvent mouseEvent2) {
FontMetrics fm = label.getFontMetrics(label.getFont());
int firstXpos = mouseEvent1.getX();
int lastXpos = mouseEvent2.getX();
int firstOffset = getCharOffset(fm, label.getText(), firstXpos);
int lastOffset = getCharOffset(fm, label.getText(), lastXpos);
if(lastOffset != firstOffset) {
if(firstOffset > lastOffset) {
int tmp = firstOffset;
firstOffset = lastOffset;
lastOffset = tmp;
}
try {
label.getHighlighter().removeAllHighlights();
label.getHighlighter().addHighlight(firstOffset, lastOffset, new DefaultHighlighter.DefaultHighlightPainter(Color.yellow));
return true;
} catch (BadLocationException e1) {
return false;
}
} else
return false;
}
/**
* Returns true if the given mouse event occurred within a highlight h on label.
*/
public static boolean isInHighlight(MouseEvent e, JTextField label, Highlighter h) {
Highlight[] hls = h.getHighlights();
if(hls == null || hls.length == 0)
return false;
Highlight hl = hls[0];
FontMetrics fm = label.getFontMetrics(label.getFont());
int offset = getCharOffset(fm, label.getText(), e.getX());
return hl.getStartOffset() <= offset && offset < hl.getEndOffset();
}
private static int getCharOffset(FontMetrics fm, String characters, int xPos) {
StringBuilder s = new StringBuilder();
char[] sArray = characters.toCharArray();
int i;
for(i = 0; i < characters.length() && fm.stringWidth(s.toString()) < xPos; i++) {
s.append(sArray[i]);
}
return i;
}
}