⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 riestextpane.java

📁 Pasc+Java 这是一个国外的随机自动机*(RAM)一个学习用的程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        }
        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 + -