]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLPresentationReconciler.java
Change editor font in UI and update on editor reload.
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / SCLPresentationReconciler.java
1 package org.simantics.scl.ui.editor2;
2
3 import org.eclipse.jface.resource.FontDescriptor;
4 import org.eclipse.jface.resource.FontRegistry;
5 import org.eclipse.jface.resource.ResourceManager;
6 import org.eclipse.jface.text.IDocument;
7 import org.eclipse.jface.text.TextAttribute;
8 import org.eclipse.jface.text.presentation.PresentationReconciler;
9 import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
10 import org.eclipse.jface.text.rules.IRule;
11 import org.eclipse.jface.text.rules.ITokenScanner;
12 import org.eclipse.jface.text.rules.IWhitespaceDetector;
13 import org.eclipse.jface.text.rules.IWordDetector;
14 import org.eclipse.jface.text.rules.RuleBasedScanner;
15 import org.eclipse.jface.text.rules.Token;
16 import org.eclipse.jface.text.rules.WhitespaceRule;
17 import org.eclipse.jface.text.rules.WordRule;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.graphics.Font;
20 import org.eclipse.swt.graphics.RGB;
21 import org.eclipse.ui.PlatformUI;
22 import org.simantics.scl.ui.info.SCLInfo;
23
24 public class SCLPresentationReconciler extends PresentationReconciler {
25     
26     
27     private final FontRegistry fontRegistry = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getFontRegistry();
28     
29     private final FontDescriptor FONT_NORMAL = FontDescriptor.createFrom( fontRegistry.getFontData("org.simantics.scl.editorfont") );
30     private final FontDescriptor FONT_BOLD = FONT_NORMAL.setStyle(SWT.BOLD);
31     
32     public SCLPresentationReconciler(ResourceManager resourceManager) {
33         Font font = resourceManager.createFont(FONT_NORMAL);
34         {
35             DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(
36                     resourceManager.createColor(new RGB(63, 127, 95)),
37                     null,
38                     0,
39                     font
40                     )));
41             setDamager(dr, SCLPartitionScanner.SCL_COMMENT);
42             setRepairer(dr, SCLPartitionScanner.SCL_COMMENT);
43         }
44         {
45             DefaultDamagerRepairer dr = new DefaultDamagerRepairer(new StringTokenScanner(new TextAttribute(
46                     resourceManager.createColor(new RGB(42, 0, 255)),
47                     null,
48                     0,
49                     font
50                     )));
51             setDamager(dr, SCLPartitionScanner.SCL_STRING);
52             setRepairer(dr, SCLPartitionScanner.SCL_STRING);
53         }
54         {
55             DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getSclTokenScanner(resourceManager));
56
57             setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
58             setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
59         }
60     }
61
62     private ITokenScanner getSclTokenScanner(ResourceManager resourceManager) {
63         RuleBasedScanner scanner = new RuleBasedScanner();
64         
65         Token defaultToken = new Token(
66                 new TextAttribute(
67                         resourceManager.createColor(new RGB(0, 0, 0)),
68                         null,
69                         0,
70                         resourceManager.createFont(FONT_NORMAL)
71                 ));
72         Token reserved = new Token(
73                 new TextAttribute(
74                         resourceManager.createColor(new RGB(127, 0, 85)),
75                         null,
76                         SWT.BOLD,
77                         resourceManager.createFont(FONT_BOLD)
78                 ));
79
80         WordRule reservedWord = new WordRule(new IWordDetector() {
81             @Override
82             public boolean isWordStart(char c) {
83                 return ('a' <= c && c <= 'z')
84                      || ('A' <= c && c <= 'Z')
85                      || c == '_' || c == '?';
86             }
87             @Override
88             public boolean isWordPart(char c) {
89                 return ('a' <= c && c <= 'z')
90                         || ('A' <= c && c <= 'Z')
91                         || ('0' <= c && c <= '9')
92                         || c == '_' || c == '.' || c == '\'';
93             }
94         }, defaultToken);
95
96         for(String word : SCLInfo.RESERVED_WORDS)
97             reservedWord.addWord(word, reserved);
98         
99         scanner.setRules(new IRule[] {
100                 new WhitespaceRule(new IWhitespaceDetector() {
101                     @Override
102                     public boolean isWhitespace(char c) {
103                         return c==' ' || c=='\t' || c=='\n' || c=='\r';
104                     }
105                 }, defaultToken),
106                 reservedWord
107         });
108         scanner.setDefaultReturnToken(defaultToken);
109         
110         return scanner;
111     }
112 }