package net.sourceforge.pmd.eclipse.ui.editors;
import java.util.Collection;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
/**
* This class manages the syntax coloring and styling data
*/
public class SyntaxManager {
private static Map<String, SyntaxData> syntaxByExtension = new Hashtable<String, SyntaxData>();
public static ModifyListener adapt(final StyledText codeField, String languageCode, ModifyListener oldListener) {
if (oldListener != null) {
codeField.removeModifyListener(oldListener);
}
SyntaxData sd = SyntaxManager.getSyntaxData(languageCode);
if (sd == null) {
//codeField.set clear the existing style ranges TODO
return null;
}
final BasicLineStyleListener blsl = new BasicLineStyleListener(sd);
codeField.addLineStyleListener(blsl);
ModifyListener ml = new ModifyListener() {
public void modifyText(ModifyEvent event) {
blsl.refreshMultilineComments(codeField.getText());
codeField.redraw();
}
};
codeField.addModifyListener(ml);
return ml;
}
/**
* Gets the syntax data for an extension
*/
public static synchronized SyntaxData getSyntaxData(String extension) {
// Check in cache
SyntaxData sd = syntaxByExtension.get(extension);
if (sd == null) {
// Not in cache; load it and put in cache
sd = loadSyntaxData(extension);
if (sd != null)
syntaxByExtension.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 filename) {
SyntaxData sd = null;
try {
ResourceBundle rb = ResourceBundle.getBundle("net.sourceforge.pmd.eclipse.ui.editors." + filename);
sd = new SyntaxData(filename);
sd.stringStart = rb.getString("stringstart");
sd.stringEnd = rb.getString("stringend");
sd.setMultiLineCommentStart(rb.getString("multilinecommentstart"));
sd.setMultiLineCommentEnd(rb.getString("multilinecommentend"));
// Load the keywords
Collection<String> keywords = new HashSet<String>();
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"));
if (rb.containsKey("comment")) {
sd.setComment( rb.getString("comment") );
}
if (rb.containsKey("varnamedelimiter")) {
sd.varnameReference = rb.getString("varnamedelimiter");
}
} catch (MissingResourceException e) {
// Ignore
}
return sd;
}
}