]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLPresentationReconciler.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / SCLPresentationReconciler.java
diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLPresentationReconciler.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLPresentationReconciler.java
new file mode 100644 (file)
index 0000000..e45252e
--- /dev/null
@@ -0,0 +1,106 @@
+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