Hallo.
Ich möchte gerne in SWT eine für die SQL-Syntax StyledText Komponente Entwerfen.
Also die Begriffe wie "SELECT", "AS", "FROM" usw. Sollen Dunkel Lila und die Kommentare mit
"/*" und "*/" sollen Dunkel Grün angezeigt werden.
Ich habe folgendes dazu im Internet gefunden:
http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Demonstratesmultilinecomments.htm
Ich habe das etwas anders umgesetzt aber mit dem selben Prinzip:
Leider kann die StyledText Komponente nur einen LineStyleListener haben und nicht mehrere.
Somit weiß ich z.b. nicht wie ich die kommentare von den anderen Trennen soll.
Ebenso ist es sehr unschön, dass diese Lösung es nicht trennt ob es wirklich das Keyword ist, welches farblich hinterlegt werden soll.
Also damit meine ich, dass wenn ich "SELECT column1 AS IchBinColumn1 FROM Table1" schreibe oder ob ich nur das Wort "das" schreibe, würde er mir das Wort "das" mit dem "as" auch farblich markieren, obwohl es ja nicht wirklich das ist, was er machen soll.
Ebenso finde ich, ist diese Lösung eher unperformant oder?
Wie dem auch sei. Ich suche jedenfalls einen einfach zu realisierenden und korrekt ausführenden Algorythmus.
Kann mir dabei jemand helfen?
Ich möchte gerne in SWT eine für die SQL-Syntax StyledText Komponente Entwerfen.
Also die Begriffe wie "SELECT", "AS", "FROM" usw. Sollen Dunkel Lila und die Kommentare mit
"/*" und "*/" sollen Dunkel Grün angezeigt werden.
Ich habe folgendes dazu im Internet gefunden:
http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Demonstratesmultilinecomments.htm
Ich habe das etwas anders umgesetzt aber mit dem selben Prinzip:
Java:
// Hier die Implementierung in der oberklasse, dieser Kommentar steht nicht im Quellcode
// sondern wurde nur für dieses Forum gemacht
private static final String[] KEYWORDS_START = {
"/*", "SELECT", "FROM", "UPDATE", "DROP", "DELETE", "INSERT", "INTO", "VALUES", "AS", "CREATE", "ALTER", "AND", "OR",
"FROM", "WHERE", "IN", "[", "]", "{", "}", "(", ")" ,"|", "&", "LIKE", "ORDER", "BY", "DISTINCT", "UNION", "TABLE",
"NOT", "NULL", "AUTO_INCREMENT", ";", "BETWEEN", "LEFT", "RIGHT", "INNER", "OUTER", "FULL", "JOIN", "PRIMARY KEY"
};
private static final String[] KEYWORDS_END = {
"*/", "SELECT", "FROM", "UPDATE", "DROP", "DELETE", "INSERT", "INTO", "VALUES", "AS", "CREATE", "ALTER", "AND", "OR",
"FROM", "WHERE", "IN", "[", "]", "{", "}", "(", ")" ,"|", "&", "LIKE", "ORDER", "BY", "DISTINCT", "UNION", "TABLE",
"NOT", "NULL", "AUTO_INCREMENT", ";", "BETWEEN", "LEFT", "RIGHT", "INNER", "OUTER", "FULL", "JOIN", "PRIMARY KEY"
};
class StyleListener implements LineStyleListener {
private final String[] KEY_START;
private final String[] KEY_END;
private Color COMMENT_COLOR = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN);
private final List<int[]> commentOffsets;
public StyleListener(String[] start, String[] end) {
this.KEY_START = start;
this.KEY_END = end;
commentOffsets = new ArrayList<int[]>();
}
public void refreshMultilineComments(String text) {
commentOffsets.clear();
for (int index = 0; index < KEY_START.length; index++) {
for (int pos = text.indexOf(KEY_START[index]); pos > -1; pos = text.indexOf(KEY_START[index], pos)) {
int[] offsets = new int[2];
offsets[0] = pos;
pos = text.indexOf(KEY_END[index], pos);
offsets[1] = pos == -1 ? text.length() - 1 : pos + KEY_END[index].length() - 1;
pos = offsets[1];
commentOffsets.add(offsets);
}
}
}
@Override
public void lineGetStyle(LineStyleEvent event) {
List<StyleRange> styles = new ArrayList<StyleRange>();
int length = event.lineText.length();
for (int i = 0, n = commentOffsets.size(); i < n; i++) {
int[] offsets = (int[]) commentOffsets.get(i);
if (offsets[0] > event.lineOffset + length) break;
if (offsets[0] <= event.lineOffset + length && offsets[1] >= event.lineOffset) {
int start = Math.max(offsets[0], event.lineOffset);
int len = Math.min(offsets[1], event.lineOffset + length) - start + 1;
styles.add(new StyleRange(start, len, COMMENT_COLOR, null, SWT.BOLD | SWT.ITALIC));
}
}
event.styles = (StyleRange[]) styles.toArray(new StyleRange[0]);
}
}
Leider kann die StyledText Komponente nur einen LineStyleListener haben und nicht mehrere.
Somit weiß ich z.b. nicht wie ich die kommentare von den anderen Trennen soll.
Ebenso ist es sehr unschön, dass diese Lösung es nicht trennt ob es wirklich das Keyword ist, welches farblich hinterlegt werden soll.
Also damit meine ich, dass wenn ich "SELECT column1 AS IchBinColumn1 FROM Table1" schreibe oder ob ich nur das Wort "das" schreibe, würde er mir das Wort "das" mit dem "as" auch farblich markieren, obwohl es ja nicht wirklich das ist, was er machen soll.
Ebenso finde ich, ist diese Lösung eher unperformant oder?
Wie dem auch sei. Ich suche jedenfalls einen einfach zu realisierenden und korrekt ausführenden Algorythmus.
Kann mir dabei jemand helfen?