/**
* 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:
/**
* 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:
/**
* 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);