blob: 7167fb557afb8a51983e86c875e17687a20be511 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 KPIT Technologies.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Jan Mauersberger- initial API and implementation
* Sascha Baumgart- initial API and implementation
*******************************************************************************/
package org.eclipse.opencert.userguidance.labelparser;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.opencert.userguidance.labelparser.tokens.HighlightItem;
import org.eclipse.opencert.userguidance.labelparser.tokens.HighlightItem.ItemHeaderType;
import org.eclipse.opencert.userguidance.labelparser.tokens.TextToken;
import org.eclipse.opencert.userguidance.labelparser.tokens.Token;
public abstract class Highlighter {
private final static Color idColor = new Color(null, 185, 50, 96);
private final static Color pathColor = new Color(null, 87, 173, 143);
private final static Color uriColor = new Color(null, 70, 70, 250);
private final static Color varColor = new Color(null, 130, 110, 30);
private final static Color vocColor = new Color(null, 100, 100, 100);
private final String inputText;
private final Font normalFont;
private final Font boldFont;
private String outputText;
private List<StyleRange> styles;
private List<Token> tokens;
public Highlighter(String input, Font normalFont, Font boldFont) {
this.inputText = input;
this.normalFont = normalFont;
this.boldFont = boldFont;
}
public void calculateHighlighting() {
tokens = LabelParserUtil.parse(inputText);
styles = new ArrayList<StyleRange>(tokens.size());
StringBuilder outputTextBuilder = new StringBuilder();
// Indicates how much shorter the printed string is in comparison with
// the parsed string
int truncationOffset = 0;
if (tokens != null) {
for (Token token : tokens) {
if (token instanceof HighlightItem) {
HighlightItem item = (HighlightItem) token;
// Token representation
String tokenRepresentation = getRepresentation(item);
outputTextBuilder.append(tokenRepresentation);
// Style
StyleRange styleRange = new StyleRange();
styleRange.start = item.getStartIndex() - truncationOffset;
styleRange.length = tokenRepresentation.length();
styleRange.foreground = getHighlightColor(item
.getHeaderType());
styleRange.font = getHighlightFont(item.getHeaderType());
styleRange.underline = isUnderlined(item.getHeaderType());
styles.add(styleRange);
truncationOffset += item.getRawString().length()
- tokenRepresentation.length();
} else if (token instanceof TextToken) {
TextToken textToken = (TextToken) token;
String tokenRepresentation = textToken.getRepresentation();
outputTextBuilder.append(tokenRepresentation);
// Style
// StyleRange styleRange = new StyleRange();
// styleRange.start = textToken.getStartIndex()
// - truncationOffset;
// styleRange.length = tokenRepresentation.length();
// styleRange.font = normalFont;
// styles.add(styleRange);
}
}
}
outputText = outputTextBuilder.toString();
}
public String getOutputText() {
return outputText;
}
public List<StyleRange> getStyles() {
return styles;
}
public StyleRange[] getStylesArray() {
StyleRange[] stylesArray = styles
.toArray(new StyleRange[styles.size()]);
return stylesArray;
}
public List<Token> getTokens() {
return tokens;
}
protected Color getHighlightColor(ItemHeaderType type) {
Color result = null;
switch (type) {
case id:
result = idColor;
break;
case path:
result = pathColor;
break;
case uri:
result = uriColor;
break;
case var:
result = varColor;
break;
case voc:
result = vocColor;
break;
default:
result = ColorConstants.black;
}
return result;
}
protected Font getHighlightFont(ItemHeaderType type) {
Font result = null;
switch (type) {
case id:
result = boldFont;
break;
case path:
result = boldFont;
break;
case uri:
result = boldFont;
break;
case var:
result = boldFont;
break;
case voc:
result = boldFont;
break;
default:
result = normalFont;
}
return result;
}
protected boolean isUnderlined(ItemHeaderType type) {
boolean result;
switch (type) {
case id:
result = false;
break;
case path:
result = true;
break;
case uri:
result = true;
break;
case var:
result = false;
break;
case voc:
result = false;
break;
default:
result = false;
}
return result;
}
protected abstract String getRepresentation(HighlightItem item);
}