aboutsummaryrefslogtreecommitdiffstats
path: root/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend')
-rw-r--r--Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend59
1 files changed, 59 insertions, 0 deletions
diff --git a/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend
new file mode 100644
index 00000000..5242a82e
--- /dev/null
+++ b/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/syntaxcoloring/SolverSemanticHighlightCalculator.xtend
@@ -0,0 +1,59 @@
1package org.eclipse.viatra.solver.language.ui.syntaxcoloring
2
3import java.util.Random
4import java.util.WeakHashMap
5import org.eclipse.viatra.solver.language.solverLanguage.Reference
6import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator
7import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor
8import org.eclipse.xtext.nodemodel.util.NodeModelUtils
9import org.eclipse.xtext.resource.XtextResource
10import org.eclipse.xtext.util.CancelIndicator
11
12class SolverSemanticHighlightCalculator extends DefaultSemanticHighlightingCalculator {
13 public static val SYMBOL_CODE = "SymbolCode::"
14
15 val symbolName2ID = new WeakHashMap<String, String>
16
17 override provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor,
18 CancelIndicator cancelIndicator) {
19 if (resource === null || resource.getParseResult() === null) {
20 return
21 } else {
22 val modelSymbols = resource.allContents.filter(Reference)
23 while (modelSymbols.hasNext) {
24 val symbolElement = modelSymbols.next
25 val node = NodeModelUtils.getNode(symbolElement)
26 acceptor.addPosition(
27 node.getOffset(),
28 node.getLength(),
29 getSymbolCode(node.text)
30 )
31 }
32 }
33 }
34
35 def getSymbolCode(String name) {
36 if (symbolName2ID.containsKey(name)) {
37 return symbolName2ID.get(name)
38 } else {
39 val id = calculateSymbolCode(name)
40 symbolName2ID.put(name, id)
41 return id
42 }
43 }
44
45 def String calculateSymbolCode(String name) {
46 val Random random = new Random(name.hashCode)
47 val hue = huePick(random.nextFloat)
48 val saturation = 0.2 + random.nextFloat * 0.3
49 val brightness = random.nextFloat * 0.2 + 0.7f
50 return '''«SYMBOL_CODE» «hue» «saturation» «brightness»'''
51 }
52
53 private def huePick(float random) {
54 val pink = 300
55 val tolerance = 10
56 val degree = random * (360 - 2 * tolerance)
57 if(degree < pink - tolerance) return degree else return degree + 2 * tolerance
58 }
59}