aboutsummaryrefslogtreecommitdiffstats
path: root/Application/org.eclipse.viatra.solver.language.ui/src/org/eclipse/viatra/solver/language/ui/highlight/SolverSemanticHighlightCalculator.xtend
blob: c9ceb36a5805b83cea18867dfbb864a3c01ba60c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package org.eclipse.viatra.solver.language.ui.highlight

import java.util.Random
import java.util.WeakHashMap
import org.eclipse.viatra.solver.language.solverLanguage.ModelSymbol
import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator
import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor
import org.eclipse.xtext.nodemodel.util.NodeModelUtils
import org.eclipse.xtext.resource.XtextResource
import org.eclipse.xtext.util.CancelIndicator

class SolverSemanticHighlightCalculator extends DefaultSemanticHighlightingCalculator {
	public static val SmybolCode = "SymbolCode"
	
	val symbolName2ID = new WeakHashMap<String,String>
	
	override provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator) {
		if (resource === null || resource.getParseResult() === null) {
			return
		} else {
			val modelSymbols = resource.allContents.filter(ModelSymbol)
			while(modelSymbols.hasNext) {
				val symbolElement = modelSymbols.next
				val node = NodeModelUtils::getNode(symbolElement)
				acceptor.addPosition(
					node.getOffset(),
					node.getLength(),
					getSymbolCode(symbolElement.name)
				)
			}
		}
	}
	
	def getSymbolCode(String name) {
		if(symbolName2ID.containsKey(name)) {
			return symbolName2ID.get(name)
		} else {
			val id = calculateSymbolCode(name)
			symbolName2ID.put(name,id)
			return id
		}
	}
	
	def String calculateSymbolCode(String name) {
		val Random random = new Random(name.hashCode)
		val hue = huePick(random.nextFloat)
		val saturation = 0.1+random.nextFloat*0.2
		val brightness = random.nextFloat/4+0.7f
		return '''«SmybolCode» «hue» «saturation» «brightness»'''
	}
	private def huePick(float random) {
		val pink = 300
		val tolerance = 10
		val degree = random*(360-2*tolerance)
		if(degree<pink-tolerance) return degree
		else return degree+2*tolerance
	}
}