SyntaxTest.java Source code

Java tutorial

Introduction

Here is the source code for SyntaxTest.java

Source

//Send questions, comments, bug reports, etc. to the authors:

//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)
import java.util.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

/**
 * This class implements syntax coloring using the StyledText API
 */
public class SyntaxTest {
    // Punctuation
    private static final String PUNCTUATION = "(){};!&|.+-*/";

    // Color for the StyleRanges
    private Color red;

    /**
     * Runs the application
     */
    public void run() {
        Display display = new Display();
        Shell shell = new Shell(display);

        // Get color for style ranges
        red = display.getSystemColor(SWT.COLOR_RED);

        createContents(shell);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }

        // No need to dispose red

        display.dispose();
    }

    /**
     * Creates the main window contents
     * 
     * @param shell the main window
     */
    private void createContents(Shell shell) {
        shell.setLayout(new FillLayout());

        // Create the StyledText
        final StyledText styledText = new StyledText(shell, SWT.BORDER);

        // Add the syntax coloring handler
        styledText.addExtendedModifyListener(new ExtendedModifyListener() {
            public void modifyText(ExtendedModifyEvent event) {
                // Determine the ending offset
                int end = event.start + event.length - 1;

                // If they typed something, get it
                if (event.start <= end) {
                    // Get the text
                    String text = styledText.getText(event.start, end);

                    // Create a collection to hold the StyleRanges
                    java.util.List ranges = new java.util.ArrayList();

                    // Turn any punctuation red
                    for (int i = 0, n = text.length(); i < n; i++) {
                        if (PUNCTUATION.indexOf(text.charAt(i)) > -1) {
                            ranges.add(new StyleRange(event.start + i, 1, red, null, SWT.BOLD));
                        }
                    }

                    // If we have any ranges to set, set them
                    if (!ranges.isEmpty()) {
                        styledText.replaceStyleRanges(event.start, event.length,
                                (StyleRange[]) ranges.toArray(new StyleRange[0]));
                    }
                }
            }
        });
    }

    /**
     * The application entry point
     * 
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new SyntaxTest().run();
    }
}
//Send questions, comments, bug reports, etc. to the authors:

//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)

/**
 * This class contains information for syntax coloring and styling for an
 * extension
 */
class SyntaxData {
    private String extension;
    private Collection keywords;
    private String punctuation;
    private String comment;
    private String multiLineCommentStart;
    private String multiLineCommentEnd;

    /**
     * Constructs a SyntaxData
     * 
     * @param extension the extension
     */
    public SyntaxData(String extension) {
        this.extension = extension;
    }

    /**
     * Gets the extension
     * 
     * @return String
     */
    public String getExtension() {
        return extension;
    }

    /**
     * Gets the comment
     * 
     * @return String
     */
    public String getComment() {
        return comment;
    }

    /**
     * Sets the comment
     * 
     * @param comment The comment to set.
     */
    public void setComment(String comment) {
        this.comment = comment;
    }

    /**
     * Gets the keywords
     * 
     * @return Collection
     */
    public Collection getKeywords() {
        return keywords;
    }

    /**
     * Sets the keywords
     * 
     * @param keywords The keywords to set.
     */
    public void setKeywords(Collection keywords) {
        this.keywords = keywords;
    }

    /**
     * Gets the multi-line comment end
     * 
     * @return String
     */
    public String getMultiLineCommentEnd() {
        return multiLineCommentEnd;
    }

    /**
     * Sets the multi-line comment end
     * 
     * @param multiLineCommentEnd The multiLineCommentEnd to set.
     */
    public void setMultiLineCommentEnd(String multiLineCommentEnd) {
        this.multiLineCommentEnd = multiLineCommentEnd;
    }

    /**
     * Gets the multi-line comment start
     * 
     * @return String
     */
    public String getMultiLineCommentStart() {
        return multiLineCommentStart;
    }

    /**
     * Sets the multi-line comment start
     * 
     * @param multiLineCommentStart The multiLineCommentStart to set.
     */
    public void setMultiLineCommentStart(String multiLineCommentStart) {
        this.multiLineCommentStart = multiLineCommentStart;
    }

    /**
     * Gets the punctuation
     * 
     * @return String
     */
    public String getPunctuation() {
        return punctuation;
    }

    /**
     * Sets the punctuation
     * 
     * @param punctuation The punctuation to set.
     */
    public void setPunctuation(String punctuation) {
        this.punctuation = punctuation;
    }
}
//Send questions, comments, bug reports, etc. to the authors:

//Rob Warner (rwarner@interspatial.com)
//Robert Harris (rbrt_harris@yahoo.com)

/**
 * This class manages the syntax coloring and styling data
 */
class SyntaxManager {
    // Lazy cache of SyntaxData objects
    private static Map data = new Hashtable();

    /**
     * Gets the syntax data for an extension
     */
    public static synchronized SyntaxData getSyntaxData(String extension) {
        // Check in cache
        SyntaxData sd = (SyntaxData) data.get(extension);
        if (sd == null) {
            // Not in cache; load it and put in cache
            sd = loadSyntaxData(extension);
            if (sd != null)
                data.put(sd.getExtension(), sd);
        }
        return sd;
    }

    /**
     * Loads the syntax data for an extension
     * 
     * @param extension the extension to load
     * @return SyntaxData
     */
    private static SyntaxData loadSyntaxData(String extension) {
        SyntaxData sd = null;
        try {
            ResourceBundle rb = ResourceBundle.getBundle("examples.ch11." + extension);
            sd = new SyntaxData(extension);
            sd.setComment(rb.getString("comment"));
            sd.setMultiLineCommentStart(rb.getString("multilinecommentstart"));
            sd.setMultiLineCommentEnd(rb.getString("multilinecommentend"));

            // Load the keywords
            Collection keywords = new ArrayList();
            for (StringTokenizer st = new StringTokenizer(rb.getString("keywords"), " "); st.hasMoreTokens();) {
                keywords.add(st.nextToken());
            }
            sd.setKeywords(keywords);

            // Load the punctuation
            sd.setPunctuation(rb.getString("punctuation"));
        } catch (MissingResourceException e) {
            // Ignore
        }
        return sd;
    }
}