+package org.simantics.scl.ui.editor2;\r
+\r
+import org.eclipse.jface.resource.FontDescriptor;\r
+import org.eclipse.jface.resource.ResourceManager;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.TextAttribute;\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.swt.SWT;\r
+import org.eclipse.swt.graphics.Font;\r
+import org.eclipse.swt.graphics.RGB;\r
+import org.simantics.scl.ui.info.SCLInfo;\r
+\r
+public class SCLPresentationReconciler extends PresentationReconciler {\r
+ private static final FontDescriptor FONT_NORMAL = FontDescriptor.createFrom("Consolas", 10, SWT.NORMAL);\r
+ private static final FontDescriptor FONT_BOLD = FontDescriptor.createFrom("Consolas", 10, SWT.BOLD);\r
+ \r
+ public SCLPresentationReconciler(ResourceManager resourceManager) {\r
+ Font font = resourceManager.createFont(FONT_NORMAL);\r
+ {\r
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(\r
+ resourceManager.createColor(new RGB(63, 127, 95)),\r
+ null,\r
+ 0,\r
+ font\r
+ )));\r
+ setDamager(dr, SCLPartitionScanner.SCL_COMMENT);\r
+ setRepairer(dr, SCLPartitionScanner.SCL_COMMENT);\r
+ }\r
+ {\r
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new StringTokenScanner(new TextAttribute(\r
+ resourceManager.createColor(new RGB(42, 0, 255)),\r
+ null,\r
+ 0,\r
+ font\r
+ )));\r
+ setDamager(dr, SCLPartitionScanner.SCL_STRING);\r
+ setRepairer(dr, SCLPartitionScanner.SCL_STRING);\r
+ }\r
+ {\r
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getSclTokenScanner(resourceManager));\r
+\r
+ setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);\r
+ setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);\r
+ }\r
+ }\r
+ \r
+ private static ITokenScanner getSclTokenScanner(ResourceManager resourceManager) {\r
+ RuleBasedScanner scanner = new RuleBasedScanner();\r
+ \r
+ Token defaultToken = new Token(\r
+ new TextAttribute(\r
+ resourceManager.createColor(new RGB(0, 0, 0)),\r
+ null,\r
+ 0,\r
+ resourceManager.createFont(FONT_NORMAL)\r
+ ));\r
+ Token reserved = new Token(\r
+ new TextAttribute(\r
+ resourceManager.createColor(new RGB(127, 0, 85)),\r
+ null,\r
+ SWT.BOLD,\r
+ resourceManager.createFont(FONT_BOLD)\r
+ ));\r
+\r
+ WordRule reservedWord = new WordRule(new IWordDetector() {\r
+ @Override\r
+ public boolean isWordStart(char c) {\r
+ return ('a' <= c && c <= 'z')\r
+ || ('A' <= c && c <= 'Z')\r
+ || c == '_' || c == '?';\r
+ }\r
+ @Override\r
+ public boolean isWordPart(char c) {\r
+ return ('a' <= c && c <= 'z')\r
+ || ('A' <= c && c <= 'Z')\r
+ || ('0' <= c && c <= '9')\r
+ || c == '_' || c == '.' || c == '\'';\r
+ }\r
+ }, defaultToken);\r
+\r
+ for(String word : SCLInfo.RESERVED_WORDS)\r
+ reservedWord.addWord(word, reserved);\r
+ \r
+ scanner.setRules(new IRule[] {\r
+ new WhitespaceRule(new IWhitespaceDetector() {\r
+ @Override\r
+ public boolean isWhitespace(char c) {\r
+ return c==' ' || c=='\t' || c=='\n' || c=='\r';\r
+ }\r
+ }, defaultToken),\r
+ reservedWord\r
+ });\r
+ scanner.setDefaultReturnToken(defaultToken);\r
+ \r
+ return scanner;\r
+ }\r
+}\r