Demonstrates multiline comments
//Send questions, comments, bug reports, etc. to the authors: //Rob Warner (rwarner@interspatial.com) //Robert Harris (rbrt_harris@yahoo.com) import org.eclipse.swt.*; import org.eclipse.swt.custom.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import java.util.LinkedList; import java.util.ArrayList; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.widgets.Display; /** * This program demonstrates multiline comments. It uses MultiLineCommentListener * to do the syntax coloring */ public class MultiLineComment { /** * Runs the application */ public void run() { Display display = new Display(); Shell shell = new Shell(display); shell.setText("Multiline Comments"); createContents(shell); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } /** * Creates the main window contents * * @param shell the main window */ private void createContents(Shell shell) { shell.setLayout(new FillLayout()); final StyledText styledText = new StyledText(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); // Add the line style listener final MultiLineCommentListener lineStyleListener = new MultiLineCommentListener(); styledText.addLineStyleListener(lineStyleListener); // Add the modification listener styledText.addExtendedModifyListener(new ExtendedModifyListener() { public void modifyText(ExtendedModifyEvent event) { // Recalculate the comments lineStyleListener.refreshMultilineComments(styledText.getText()); // Redraw the text styledText.redraw(); } }); } /** * The application entry point * * @param args the command line arguments */ public static void main(String[] args) { new MultiLineComment().run(); } } //Send questions, comments, bug reports, etc. to the authors: //Rob Warner (rwarner@interspatial.com) //Robert Harris (rbrt_harris@yahoo.com) /** * This class supports multiline comments. It turns comments green. */ class MultiLineCommentListener implements LineStyleListener { // Markers for multiline comments private static final String COMMENT_START = "/*"; private static final String COMMENT_END = "*/"; // Color for comments private static final Color COMMENT_COLOR = Display.getCurrent().getSystemColor( SWT.COLOR_DARK_GREEN); // Offsets for all multiline comments List commentOffsets; /** * MultilineCommentListener constructor */ public MultiLineCommentListener() { commentOffsets = new LinkedList(); } /** * Refreshes the offsets for all multiline comments in the parent StyledText. * The parent StyledText should call this whenever its text is modified. Note * that this code doesn't ignore comment markers inside strings. * * @param text the text from the StyledText */ public void refreshMultilineComments(String text) { // Clear any stored offsets commentOffsets.clear(); // Go through all the instances of COMMENT_START for (int pos = text.indexOf(COMMENT_START); pos > -1; pos = text.indexOf( COMMENT_START, pos)) { // offsets[0] holds the COMMENT_START offset // and COMMENT_END holds the ending offset int[] offsets = new int[2]; offsets[0] = pos; // Find the corresponding end comment. pos = text.indexOf(COMMENT_END, pos); // If no corresponding end comment, use the end of the text offsets[1] = pos == -1 ? text.length() - 1 : pos + COMMENT_END.length() - 1; pos = offsets[1]; // Add the offsets to the collection commentOffsets.add(offsets); } } /** * Called by StyledText to get the styles for a line * * @param event the event */ public void lineGetStyle(LineStyleEvent event) { // Create a collection to hold the StyleRanges List styles = new ArrayList(); // Store the length for convenience int length = event.lineText.length(); for (int i = 0, n = commentOffsets.size(); i < n; i++) { int[] offsets = (int[]) commentOffsets.get(i); // If starting offset is past current line--quit if (offsets[0] > event.lineOffset + length) break; // Check if we're inside a multiline comment if (offsets[0] <= event.lineOffset + length && offsets[1] >= event.lineOffset) { // Calculate starting offset for StyleRange int start = Math.max(offsets[0], event.lineOffset); // Calculate length for style range int len = Math.min(offsets[1], event.lineOffset + length) - start + 1; // Add the style range styles.add(new StyleRange(start, len, COMMENT_COLOR, null)); } } // Copy all the ranges into the event event.styles = (StyleRange[]) styles.toArray(new StyleRange[0]); } }