/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package scouter.client.util;
import java.util.ArrayList;
import java.util.LinkedList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.LineStyleEvent;
import org.eclipse.swt.custom.LineStyleListener;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
public class CustomLineStyleListener implements LineStyleListener{
String searchString;
boolean isConfig;
Display display;
ArrayList<ColoringWord> keywordArray;
boolean keywordBold;
boolean searchBold;
Color highlightingColor;
public CustomLineStyleListener(boolean isConfig, ArrayList<ColoringWord> keywordArray, boolean keywordBold) {
super();
this.isConfig = isConfig;
this.keywordArray = keywordArray;
this.keywordBold = keywordBold;
}
public CustomLineStyleListener(Display display, boolean isConfig, ArrayList<ColoringWord> keywordArray, boolean keywordBold) {
super();
this.display = display;
this.isConfig = isConfig;
this.keywordArray = keywordArray;
this.keywordBold = keywordBold;
}
public CustomLineStyleListener(boolean isConfig, ArrayList<ColoringWord> keywordMap, boolean keywordBold, boolean searchBold, int searchedTextColor) {
super();
this.isConfig = isConfig;
this.keywordArray = keywordMap;
this.keywordBold = keywordBold;
this.searchBold = searchBold;
highlightingColor = Display.getCurrent().getSystemColor(searchedTextColor);
}
public void setKeywordArray(ArrayList<ColoringWord> keywordArray) {
this.keywordArray = keywordArray;
}
public void setSearchString(String searchString){
this.searchString = searchString;
}
public void lineGetStyle(LineStyleEvent event) {
if(keywordArray == null)
return;
String line = event.lineText;
LinkedList<StyleRange> list = new LinkedList<StyleRange>();
for(int inx = 0 ; inx < keywordArray.size() ; inx++){
ColoringWord word = keywordArray.get(inx);
int cursor = -1;
while ((cursor = line.toLowerCase().indexOf(word.getWord().toLowerCase(), cursor + 1)) >= 0) {
list.add(getDefaultHighlightStyle(event.lineOffset + cursor, word.getWord().length(), Display.getCurrent().getSystemColor(word.getColor()), word.isBold()));
}
}
if(!isConfig){
if (searchString != null && searchString.length() > 0) {
int cursor = -1;
while ((cursor = line.toLowerCase().indexOf(searchString.toLowerCase(), cursor + 1)) >= 0) {
list.add(getHighlightStyle(event.lineOffset + cursor, searchString.length(), highlightingColor));
}
}
}
if(isConfig){
if(line.startsWith("#")){
list.add(getDefaultHighlightStyle(event.lineOffset, line.length(), Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN), false));
}
}
if(line.startsWith("<?")){
list.add(getDefaultHighlightStyle(event.lineOffset, line.length(), Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED), false));
}
event.styles = (StyleRange[]) list.toArray(new StyleRange[list.size()]);
}
private StyleRange getHighlightStyle(int startOffset, int length, Color color) {
StyleRange styleRange = new StyleRange();
styleRange.start = startOffset;
styleRange.length = length;
styleRange.background = color;
if(searchBold)
styleRange.fontStyle = SWT.BOLD;
return styleRange;
}
private StyleRange getDefaultHighlightStyle(int startOffset, int length, Color color, boolean isBold) {
StyleRange styleRange = new StyleRange();
styleRange.start = startOffset;
styleRange.length = length;
styleRange.foreground = color;
if(keywordBold || isBold)
styleRange.fontStyle = SWT.BOLD;
return styleRange;
}
}