Newer
Older
KisoJikkenNWP / src / main / java / istlab / KisoJikken / Test / SyntaxSchemeDemo.java
package istlab.KisoJikken.Test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rsyntaxtextarea.SyntaxScheme;
import org.fife.ui.rsyntaxtextarea.Theme;
import org.fife.ui.rsyntaxtextarea.Token;
import org.fife.ui.rtextarea.RTextScrollPane;

/**
 * A simple example showing how to modify the fonts and colors used in an
 * RSyntaxTextArea. There are two methods to do this - via the Java API, and via
 * an XML file. The latter method is preferred since it's more modular, and
 * provides a way for your users to customize RSTA in your application.
 * <p>
 *
 * This example uses RSyntaxTextArea 3.1.4.
 */
public final class SyntaxSchemeDemo extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    private RSyntaxTextArea textArea;

    private static final String TEXT = "public class ExampleSource {\n\n" +
            "   // Check out the crazy modified styles!\n" +
            "   public static void main(String[] args) {\n" +
            "      System.out.println(\"Hello, world!\");\n" +
            "   }\n\n" +
            "}\n";

    private SyntaxSchemeDemo() {

        JPanel cp = new JPanel(new BorderLayout());

        textArea = new RSyntaxTextArea(20, 60);
        textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
        textArea.setCodeFoldingEnabled(true);
        textArea.setAntiAliasingEnabled(true);
        RTextScrollPane sp = new RTextScrollPane(textArea);
        cp.add(sp);

        textArea.setText(TEXT);

        JMenuBar mb = new JMenuBar();
        JMenu menu = new JMenu("File");
        mb.add(menu);
        JMenuItem changeStyleProgrammaticallyItem = new JMenuItem(
                "Change Style Programmatically");
        changeStyleProgrammaticallyItem
                .setActionCommand("ChangeProgrammatically");
        changeStyleProgrammaticallyItem.addActionListener(this);
        menu.add(changeStyleProgrammaticallyItem);
        JMenuItem changeStyleViaThemesItem = new JMenuItem(
                "Change Style via Theme XML");
        changeStyleViaThemesItem.setActionCommand("ChangeViaThemes");
        changeStyleViaThemesItem.addActionListener(this);
        menu.add(changeStyleViaThemesItem);
        setJMenuBar(mb);

        setContentPane(cp);
        setTitle("Syntax Scheme Demo");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);

    }

    /**
     * Listens for the selection of a menu item and performs an action
     * accordingly.
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        if ("ChangeProgrammatically".equals(command)) {
            changeStyleProgrammatically();
        } else if ("ChangeViaThemes".equals(command)) {
            changeStyleViaThemeXml();
        }
    }

    /**
     * Changes the styles used in the editor programmatically.
     */
    private void changeStyleProgrammatically() {

        // Set the font for all token types.
        setFont(textArea, new Font("Comic Sans MS", Font.PLAIN, 16));

        // Change a few things here and there.
        SyntaxScheme scheme = textArea.getSyntaxScheme();
        scheme.getStyle(Token.RESERVED_WORD).background = Color.pink;
        scheme.getStyle(Token.DATA_TYPE).foreground = Color.blue;
        scheme.getStyle(Token.LITERAL_STRING_DOUBLE_QUOTE).underline = true;
        scheme.getStyle(Token.COMMENT_EOL).font = new Font("Georgia",
                Font.ITALIC, 12);
        scheme.getStyle(Token.COMMENT_EOL).background = Color.cyan;

        textArea.revalidate();

    }

    /**
     * Changes the styles used by the editor via an XML file specification. This
     * method is preferred because of its ease and modularity.
     */
    private void changeStyleViaThemeXml() {
        try {
            Theme theme = Theme.load(getClass().getResourceAsStream(
                    "/org/fife/ui/rsyntaxtextarea/themes/eclipse.xml"));
            theme.apply(textArea);
        } catch (IOException ioe) { // Never happens
            ioe.printStackTrace();
        }
    }

    /**
     * Set the font for all token types.
     *
     * @param textArea The text area to modify.
     * @param font     The font to use.
     */
    private static void setFont(RSyntaxTextArea textArea, Font font) {
        if (font != null) {
            SyntaxScheme ss = textArea.getSyntaxScheme();
            ss = (SyntaxScheme) ss.clone();
            for (int i = 0; i < ss.getStyleCount(); i++) {
                if (ss.getStyle(i) != null) {
                    ss.getStyle(i).font = font;
                }
            }
            textArea.setSyntaxScheme(ss);
            textArea.setFont(font);
        }
    }

    public static void main(String[] args) {
        // Start all Swing applications on the EDT.
        SwingUtilities.invokeLater(() -> new SyntaxSchemeDemo().setVisible(true));
    }

}