+package org.simantics.scl.ui.editor;\r
+\r
+import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy;\r
+import org.eclipse.jface.text.IAutoEditStrategy;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.TextAttribute;\r
+import org.eclipse.jface.text.presentation.IPresentationReconciler;\r
+import org.eclipse.jface.text.presentation.PresentationReconciler;\r
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;\r
+import org.eclipse.jface.text.rules.IRule;\r
+import org.eclipse.jface.text.rules.ITokenScanner;\r
+import org.eclipse.jface.text.rules.IWhitespaceDetector;\r
+import org.eclipse.jface.text.rules.IWordDetector;\r
+import org.eclipse.jface.text.rules.RuleBasedScanner;\r
+import org.eclipse.jface.text.rules.Token;\r
+import org.eclipse.jface.text.rules.WhitespaceRule;\r
+import org.eclipse.jface.text.rules.WordRule;\r
+import org.eclipse.jface.text.source.ISourceViewer;\r
+import org.eclipse.jface.text.source.SourceViewerConfiguration;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.simantics.scl.ui.info.SCLInfo;\r
+\r
+public class SCLSourceViewerConfiguration extends SourceViewerConfiguration {\r
+\r
+ ColorManager colorManager;\r
+ \r
+ public SCLSourceViewerConfiguration(ColorManager colorManager) {\r
+ this.colorManager = colorManager;\r
+ }\r
+ \r
+ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {\r
+ PresentationReconciler reconciler = new PresentationReconciler();\r
+ reconciler.setDocumentPartitioning(SCLDocumentSetup.SCL_PARTIONING);\r
+ \r
+ {\r
+ final Token string = new Token(new TextAttribute(colorManager.get(new RGB(42, 0, 255)))); \r
+ RuleBasedScanner scanner = new RuleBasedScanner();\r
+ scanner.setDefaultReturnToken(string);\r
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner);\r
+ reconciler.setRepairer(dr, SCLDocumentSetup.STRING);\r
+ reconciler.setDamager(dr, SCLDocumentSetup.STRING);\r
+ }\r
+ \r
+ {\r
+ Token comment = new Token(new TextAttribute(colorManager.get(new RGB(63, 127, 95)))); \r
+ RuleBasedScanner scanner = new RuleBasedScanner();\r
+ scanner.setDefaultReturnToken(comment);\r
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner);\r
+ reconciler.setRepairer(dr, SCLDocumentSetup.COMMENT);\r
+ reconciler.setDamager(dr, SCLDocumentSetup.COMMENT);\r
+ }\r
+ \r
+ {\r
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getSclTokenScanner()); \r
+ reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);\r
+ reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);\r
+ }\r
+ \r
+ return reconciler;\r
+ }\r
+\r
+ private ITokenScanner getSclTokenScanner() {\r
+ RuleBasedScanner scanner = new RuleBasedScanner();\r
+ \r
+ final Token reserved = new Token(new TextAttribute(colorManager.get(new RGB(127, 0, 85)), null, SWT.BOLD));\r
+\r
+ WordRule reservedWord = new WordRule(new IWordDetector() { \r
+ @Override\r
+ public boolean isWordStart(char c) {\r
+ return Character.isJavaIdentifierStart(c);\r
+ }\r
+ \r
+ @Override\r
+ public boolean isWordPart(char c) {\r
+ return Character.isJavaIdentifierPart(c);\r
+ }\r
+ }, new Token(new TextAttribute(colorManager.get(new RGB(0, 0, 0)))));\r
+\r
+ for(String word : SCLInfo.RESERVED_WORDS)\r
+ reservedWord.addWord(word, reserved);\r
+ \r
+ IRule[] rules = new IRule[] {\r
+ reservedWord,\r
+ new WhitespaceRule(new IWhitespaceDetector() {\r
+ \r
+ @Override\r
+ public boolean isWhitespace(char c) {\r
+ return Character.isWhitespace(c);\r
+ }\r
+ }),\r
+ };\r
+ scanner.setRules(rules);\r
+ \r
+ return scanner; \r
+ }\r
+ \r
+ @Override\r
+ public IAutoEditStrategy[] getAutoEditStrategies(\r
+ ISourceViewer sourceViewer, String contentType) {\r
+ return new IAutoEditStrategy[] { \r
+ new ReplaceTabsBySpaces(),\r
+ new DefaultIndentLineAutoEditStrategy()/*,\r
+ new MatchingBracketsEditStrategy()*/\r
+ };\r
+ }\r
+}\r