aboutsummaryrefslogtreecommitdiffstats
path: root/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/highlight/ApplicationConfigurationSemanticHighlightingCalculator.xtend
blob: f99105be8fa6f38753d3fd480479656ed59ac0a9 (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
59
60
61
62
package hu.bme.mit.inf.dslreasoner.application.ui.highlight

import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.MetamodelElement
import java.util.WeakHashMap
import org.eclipse.emf.ecore.EClassifier
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 ApplicationConfigurationSemanticHighlightingCalculator extends DefaultSemanticHighlightingCalculator {
	public static val MetamodelElementIDPrefix = "MetamodelElementColor";

	val metamodelElement2ID = new WeakHashMap<EClassifier,String>
	val colorCalculator = new ColorCalculator
	
		override provideHighlightingFor(XtextResource resource, IHighlightedPositionAcceptor acceptor, CancelIndicator cancelIndicator) {
		if (resource == null || resource.getParseResult() == null) {
			return
		} else {
			val metamodelElements = resource.allContents.filter(MetamodelElement)
//			val root = resource.getParseResult().getRootNode();
//			for (node : root.getAsTreeIterable()) {
//				
//				if (node.getGrammarElement() instanceof CrossReference) {
//					acceptor.addPosition(node.getOffset(), node.getLength(), ApplicationConfigurationHighlightConfiguration.CROSS_REF);
//				}
//			}
			while(metamodelElements.hasNext) {
				val mentamodelElement = metamodelElements.next
				val node = NodeModelUtils::getNode(mentamodelElement)
				acceptor.addPosition(
					node.getOffset(),
					node.getLength(),
					getMetamodelElementColorID(mentamodelElement)
				)
			}
		}
	}
	
	def getMetamodelElementColorID(MetamodelElement element) {
		val classifier = element.classifier
		if(classifier === null) {
			return "default"
		} else if(classifier.eIsProxy) {
			return "default"
		} else {
			if(metamodelElement2ID.containsKey(classifier)) {
				return metamodelElement2ID.get(classifier)
			} else {
				val id = calculateMetamodelElementID(classifier)
				metamodelElement2ID.put(classifier,id)
				return id
			}
		}
	}
	private def String calculateMetamodelElementID(EClassifier c) {
		val randomColor = colorCalculator.getColor(c)
		'''«MetamodelElementIDPrefix» «randomColor.get(0)» «randomColor.get(1)» «randomColor.get(2)»'''
	}
}