Completely changed the structure and switched to Eclipse Plugin.
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / asm / editor / AsmPresentationReconciler.java
1 package net.mograsim.plugin.asm.editor;
2
3 import java.util.Set;
4
5 import org.eclipse.jface.resource.ColorRegistry;
6 import org.eclipse.jface.resource.FontRegistry;
7 import org.eclipse.jface.text.IDocument;
8 import org.eclipse.jface.text.TextAttribute;
9 import org.eclipse.jface.text.presentation.PresentationReconciler;
10 import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
11 import org.eclipse.jface.text.rules.EndOfLineRule;
12 import org.eclipse.jface.text.rules.IRule;
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.WordRule;
17 import org.eclipse.ui.PlatformUI;
18 import org.eclipse.ui.themes.ITheme;
19
20 import net.mograsim.plugin.AsmOps;
21
22 public class AsmPresentationReconciler extends PresentationReconciler
23 {
24
25         private final Token comment = new Token(null);
26         private final Token std = new Token(null);
27         private final Token op = new Token(null);
28         private final Token label = new Token(null);
29         private final Token number = new Token(null);
30
31         private IRule[] rules;
32
33         public AsmPresentationReconciler()
34         {
35                 RuleBasedScanner scanner = new RuleBasedScanner();
36                 rules = new IRule[4];
37                 rules[0] = new EndOfLineRule(";", comment);
38                 rules[1] = new AsmLabelRule(label);
39                 WordRule ops = new WordRule(new IWordDetector()
40                 {
41
42                         @Override
43                         public boolean isWordStart(char c)
44                         {
45                                 return Character.isJavaIdentifierStart(c);
46                         }
47
48                         @Override
49                         public boolean isWordPart(char c)
50                         {
51                                 return Character.isJavaIdentifierPart(c);
52                         }
53                 }, std, true)
54                 {
55                         {
56                                 AsmOps.addListener(this::update);
57                         }
58
59                         void update(Set<String> words)
60                         {
61                                 fWords.clear();
62                                 words.forEach(s -> fWords.put(s, op));
63                         }
64                 };
65                 rules[2] = ops;
66                 rules[3] = new AsmNumberRule(number);
67
68                 scanner.setRules(rules);
69                 DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner);
70                 this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
71                 this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
72
73                 ITheme current = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme();
74                 updateStyle(current);
75                 current.getColorRegistry().addListener(e -> updateStyle(current));
76                 current.getFontRegistry().addListener(e -> updateStyle(current));
77         }
78
79         void updateStyle(ITheme current)
80         {
81                 ColorRegistry cr = current.getColorRegistry();
82                 FontRegistry fr = current.getFontRegistry();
83                 comment.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_comment_color")));
84                 op.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_operation_color"), null, 0,
85                                 fr.get("net.mograsim.plugin.asm_operation_font")));
86                 label.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_label_color")));
87                 number.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_number_color")));
88         }
89 }