📄 riestextpane.java
字号:
}
catch (BadLocationException ble) {
/* Hinweisfenster ausgeben
*/
JOptionPane jop = new JOptionPane();
jop.showConfirmDialog
(this,
"Fehler beim Anzeigen des Ries-Quellcodes!",
"Fehler",
JOptionPane.DEFAULT_OPTION,
JOptionPane.ERROR_MESSAGE);
}
}
/* Diese Methode bewirkt eine erneute, formatierte Anzeige des Dokuments.
* @param scanner Scanner mit den Tokens f黵 das Highlighting
* @param errors Fehlervektor mit den Exceptions f黵 das Highlighting
*/
public void refresh(Scanner scanner, Vector errors) {
/* Da Tabs den Zeilenfluss st鰎en (siehe Konstruktor) werden diese
* durch Leerzeichen ersetzt.
* text : unformatierter Text des Dokuments mit Tabs
* caretPosition : Position des Carets vor dem Methodenaufruf
*/
int caretPosition = this.getCaretPosition();
String text = this.getText();
int positionTab; // Position des ersten Tabs
while ((positionTab=text.indexOf("\t")) != -1) { // falls Tab
text = text.substring(0, positionTab) // nimm alles vor Tab
+ " " // statt Tab nimm vier Leerzeichen
+ text.substring(positionTab+1); // nimm alles ab Tab
}
/* Umwandeln aller CarriageReturns mit folgenden NewLines nach
* NewLines, da ansonsten das Highlighting die falschen Stellen unter
* Windows hervorhebt. (CRNL -> NL)
* Dies hat nicht mit dem Quellfile sondern mit der Methode
* .getDocument des TextPanes zu tun.
* Danke an Sun f黵 die fehlende Systemunabh鋘gigkeit (Marketinggag)
* des JTextPanes bzw. Document.
*/
int positionCRNL; // Position des CRNL
while ((positionCRNL=text.indexOf("\r\n")) != -1) { // falls CRNL
text = text.substring(0, positionCRNL) // nimm alles vor CRNL
+ text.substring(positionCRNL+1); // nimm alles ab NL
}
this.clear(); // l鰏chen des bisherigen Texts
this.append(text); // ersetze bisheriges Document durch tabfreies
/* doc : abgeholtes Dokument
* text : unformatierter Text des Dokuments ohne Tabs
* token : aktuell zu bearbeitendes Token
* absolutePosition : die absoulte Position zur relativen Position 0
* = Anfang von text
* tokenAnfang : relative Position des Anfangs des Token in text
* tokenEnde : relative Position des Endes des Token in text
* errorTokens : Vektor mit allen Tokens aufgetretener Fehler
* hasErrors : gibt an, ob schon Fehler gefunden wurden
*/
DefaultStyledDocument doc = (DefaultStyledDocument)this.getDocument();
text = this.getText();
Token token;
int absoluteTextPosition = 0;
int tokenAnfang;
int tokenEnde;
Vector errorTokens = new Vector();
boolean hasErrors = false;
/* Umwandeln aller CarriageReturns mit folgenden NewLines nach
* NewLines, da ansonsten das Highlighting die falschen Stellen unter
* Windows hervorhebt. (CRNL -> NL)
* Dies hat nicht mit dem Quellfile sondern mit der Methode
* .getDocument des TextPanes zu tun.
* Danke an Sun f黵 die fehlende Systemunabh鋘gigkeit (Marketinggag)
* des JTextPanes bzw. Document.
*/
while ((positionCRNL=text.indexOf("\r\n")) != -1) { // falls CRNL
text = text.substring(0, positionCRNL) // nimm alles vor CRNL
+ text.substring(positionCRNL+1); // nimm alles ab NL
}
/* L鰏chen bereits gesetzter Formatierungen, genauer R點ksetzen in
* die Formatierung der restlichen Tokens => rest_set
*/
doc.setCharacterAttributes(0, doc.getLength(),rest_set,true);
/* Alle ParserExceptions werden aus errorVector extrahiert und die
* Tokens in den Vector errorTokens gesteckt.
*/
for(int i=0; i<errors.size(); i++) {
errorTokens.add(((ParserException)(errors.get(i))).getToken());
}
MutableAttributeSet currentSet; // aktuelle Formatierung des Tokens
/* Verarbeiten aller Tokens des Scanners
*/
try {
for (int i=0;;i++) {
/* Token holen und Anfang und Ende im String text bestimmen
*/
token = scanner.touchToken(i);
tokenAnfang = text.indexOf(token.toString());
tokenEnde = tokenAnfang + token.toString().length() - 1;
/* Den Typ des Tokens auslesen und die entsprechende
* Formatierung als aktuelle Formatierung ausw鋒len.
*/
switch(token.getType()) {
case SCHLUESSEL:
currentSet = schluessel_set;
break;
case ARRAY:
currentSet = array_set;
break;
case ZAHL:
currentSet = zahl_set;
break;
case FUNKTION:
if (isGueltigeWertvariable(token)) {
currentSet = funktion_set;
}
else {
currentSet = rest_set;
}
break;
case VERGLEICH:
currentSet = vergleich_set;
break;
case ARITHMETIK:
currentSet = arithmetik_set;
break;
case SONDERZEICHEN:
currentSet = sonderzeichen_set;
break;
default:
currentSet = rest_set;
}
/* Falls das Token einen Fehler verursachte und daher zu den
* errorTokens geh鰎t, setzte die Formatierung auf error_set.
* Au遝rdem wird beim ersten Fehler die caretPosition auf
* dessen Position ge鋘dert, damit der erste Fehler angezeigt
* wird.
*/
if (errorTokens.contains(token)) {
currentSet = error_set;
if (hasErrors == false) {
caretPosition = absoluteTextPosition + tokenAnfang;
hasErrors = true;
}
}
/* Wende die Formatierung auf den absoluten Text des Token an.
*/
doc.setCharacterAttributes(absoluteTextPosition + tokenAnfang,
tokenEnde - tokenAnfang + 1,
currentSet,true);
/* Schneide den Text bis inclusive dem aktuellen Token aus
* dem String text ab. Dadurch erh鰄t sich die aktuelle
* Position um tokenEnde + 1 Zeichen.
*/
text = text.substring(tokenEnde + 1);
absoluteTextPosition += tokenEnde + 1;
} // end for
}
catch (IndexOutOfBoundsException ioobe) {
// keine weiteren Tokens gefunden => fertig
}
this.setCaretPosition(caretPosition); // Caret an gespeicherte Stelle
} // end refresh()
/**
* L鰏chen des aktuellen Dokuments.
*/
public void clear() {
this.setDocument(new DefaultStyledDocument()); // neues Dokument
} // end clear()
} // end class RiesTextPane
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -