代码高亮主要是实现了数字、以及注释关键字这三部分的高亮。
1.通过遍历每一行的每个字符,来识别字符是否为字母、数字或注释,对于字符是关键字、数字或注释进行不同的着色处理,以此来显示在UI框架中。
2.代码首先建立一个while循环,遍历每一行的每个字符。代码根据字符是否是字母,数字和注释,选择不同的处理方式:
如果是字母,使用Character.isLetter()方法判断字符是否是字母,是字母的话使用StringBuffer维护从该字符开始到一段连续字母字符串,并将关键字进行着色处理。
如果是数字,则使用Character.isDigit()方法来判断字符是否是数字,如果是则使用StringBuffer维护从该字符开始到一段连续数字字符串,并将数字内容进行着色处理。
如果是“-”字符,判断后面是否为注释“–”,使用StringBuffer维护从该字符开始到注释结尾的注释字符串,并将注释内容进行着色处理。
3.着色处理时,使用了一个StyleRange数组,记录了不同字符的位置和颜色信息,最终将其应用到UI框架上。
代码实现:
super(parent, SWT.NONE);
this.keywords = keywords;
//this.setLayout(new FillLayout());
// // 禁止回车键换行
// st.addVerifyKeyListener(new VerifyKeyListener(){
// public void verifyKey(VerifyEvent event) {
// if(event.keyCode == SWT.CR){
// event.doit = false;
// }
// }
// });
// Tab键失去焦点而不是插入制表符
st.addTraverseListener(new TraverseListener(){
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
e.doit = true;
}
}
});
st.addLineStyleListener(new SQLSegmentLineStyleListener());
}
private class SQLSegmentLineStyleListener implements LineStyleListener {
@Override
public void lineGetStyle(LineStyleEvent event) {
if(keywords == null || keywords.length == 0){
return;
}
List<StyleRange> styles = new ArrayList<StyleRange>();
int start = 0;
int length = event.lineText.length();
while (start < length) {
if (Character.isLetter(event.lineText.charAt(start))) {//确定字符是否字母
StringBuffer buf = new StringBuffer();
int i = start;
for (; i < length && Character.isLetter(event.lineText.charAt(i)); i++) {
buf.append(event.lineText.charAt(i));//将i索引上的字符添加到字符缓存里
}
//关键字上色
if(Arrays.asList(keywords).contains(buf.toString())) {
styles.add(new StyleRange(event.lineOffset + start, i - start, color, null, SWT.BOLD));
}
start = i;
}
else if (Character.isDigit(event.lineText.charAt(start))) {//确定字符是否为数字
StringBuffer buf = new StringBuffer();
int i = start;
String Digit="\\d";//正则数字表达式
Pattern pattern_Digit=Pattern.compile(Digit);
for (; i < length && Character.isDigit(event.lineText.charAt(i)); i++) {
buf.append(event.lineText.charAt(i));//将i索引上的字符添加到字符缓存里
}
Matcher matcher_Digit = pattern_Digit.matcher(buf);
//关键字上色
if(matcher_Digit.find()) {
styles.add(new StyleRange(event.lineOffset + start, i - start, Digitcolor, null, SWT.BOLD));
}
start = i;
}
else if (event.lineText.charAt(start) == '-') {//注释 着色
StringBuffer buf = new StringBuffer();
String Single="--[^\n]*";//单行匹配正则式
//String Multi="--\\[(=*)\\[(.|\\n)*?\\]\\1\\]";//多行注释
Pattern pattern_Single=Pattern.compile(Single);//单行注释匹配
//Pattern pattern_Multi=Pattern.compile(Multi,Pattern.DOTALL);
int i = start;
for (; i < length ; i++) {
buf.append(event.lineText.charAt(i));
}
//System.out.println(buf);
Matcher matcher_Single = pattern_Single.matcher(buf);
//Matcher matcher_Multi = pattern_Multi.matcher(buf);
//单行注释匹配 --xx
if(matcher_Single.find()) {
styles.add(new StyleRange(event.lineOffset + start, i - start, variableColor, null, SWT.NORMAL));
}
//多行注释注释匹配 --[[xx]]
// if(matcher_Multi.find()) {
// //Matcher matcher = pattern.matcher(buf);
// styles.add(new StyleRange(event.lineOffset + start, i - start, variableColor, null, SWT.NORMAL));
// }
start = i;
}
else{
start ++;
}
}
event.styles = (StyleRange[]) styles.toArray(new StyleRange[0]);
}
结果展示如图: