use of org.omegat.core.matching.DiffDriver.TextRun in project omegat by omegat-org.
the class MatchesTextArea method setActiveMatch.
/**
* Sets the index of an active match. It basically highlights the fuzzy
* match string selected. (numbers start from 0)
*/
@Override
public void setActiveMatch(int activeMatch) {
UIThreadsUtil.mustBeSwingThread();
if (activeMatch < 0 || activeMatch >= matches.size() || this.activeMatch == activeMatch) {
return;
}
this.activeMatch = activeMatch;
StyledDocument doc = (StyledDocument) getDocument();
doc.setCharacterAttributes(0, doc.getLength(), ATTRIBUTES_EMPTY, true);
int start = delimiters.get(activeMatch);
int end = delimiters.get(activeMatch + 1);
NearString match = matches.get(activeMatch);
// List tokens = match.str.getSrcTokenList();
ITokenizer tokenizer = Core.getProject().getSourceTokenizer();
if (tokenizer == null) {
return;
}
// Apply sourceText styling
if (sourcePos.get(activeMatch) != -1) {
Token[] tokens = tokenizer.tokenizeVerbatim(match.source);
// fix for bug 1586397
byte[] attributes = match.attr;
for (int i = 0; i < tokens.length; i++) {
Token token = tokens[i];
int tokstart = start + sourcePos.get(activeMatch) + token.getOffset();
int toklength = token.getLength();
if ((attributes[i] & StringData.UNIQ) != 0) {
doc.setCharacterAttributes(tokstart, toklength, ATTRIBUTES_CHANGED, false);
} else if ((attributes[i] & StringData.PAIR) != 0) {
doc.setCharacterAttributes(tokstart, toklength, ATTRIBUTES_UNCHANGED, false);
}
}
}
// Iterate through (up to) 5 fuzzy matches
for (int i = 0; i < diffInfos.size(); i++) {
Map<Integer, List<TextRun>> diffInfo = diffInfos.get(i);
// Iterate through each diff variant (${diff}, ${diffReversed}, ...)
for (Entry<Integer, List<TextRun>> e : diffInfo.entrySet()) {
int diffPos = e.getKey();
if (diffPos != -1) {
// Iterate through each style chunk (added or deleted)
for (TextRun r : e.getValue()) {
int tokstart = delimiters.get(i) + diffPos + r.start;
switch(r.type) {
case DELETE:
doc.setCharacterAttributes(tokstart, r.length, i == activeMatch ? ATTRIBUTES_DELETED_ACTIVE : ATTRIBUTES_DELETED_INACTIVE, false);
break;
case INSERT:
doc.setCharacterAttributes(tokstart, r.length, i == activeMatch ? ATTRIBUTES_INSERTED_ACTIVE : ATTRIBUTES_INSERTED_INACTIVE, false);
break;
case NOCHANGE:
}
}
}
}
}
doc.setCharacterAttributes(start, end - start, ATTRIBUTES_SELECTED, false);
// two newlines
setCaretPosition(end - 2);
final int fstart = start;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setCaretPosition(fstart);
}
});
}
Aggregations