Skip to main content
summaryrefslogtreecommitdiffstats
blob: 25f1c6890dd1110f374fa21bbc22f98b65af9731 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package org.eclipse.fx.ide.fxml.compiler

import org.eclipse.fx.ide.fxgraph.fXGraph.Model
import org.eclipse.fx.ide.fxgraph.fXGraph.Element
import org.eclipse.fx.ide.fxgraph.fXGraph.SimpleValueProperty
import org.eclipse.fx.ide.fxgraph.fXGraph.ListValueProperty
import org.eclipse.fx.ide.fxgraph.fXGraph.StaticValueProperty

import static extension org.eclipse.fx.ide.fxml.compiler.ReflectionHelper.*
import java.util.Set
import java.util.HashSet

class FXGraphJavaGenerator {
	int varIndex = 0;
	Set<String> extraImports = new HashSet;
	
	def getVarIndex() {
		varIndex = varIndex + 1;
		return varIndex;
	}
	
	def generate(Model model) '''
	package «model.package.name»;
	
	import org.eclipse.fx.core.fxml.FXMLDocument;
	import java.util.ResourceBundle;
	
	«var content = generateElementDef("root", model.componentDef.rootNode)»
	
	«FOR i : model.imports»
	import «i.importedNamespace»;
	«ENDFOR»
	
	«FOR i : extraImports»
	import «i»;
	«ENDFOR»
	
	public class «model.componentDef.name» extends FXMLDocument<«model.componentDef.rootNode.type.simpleName»> {
		public «model.componentDef.rootNode.type.simpleName» load(ResourceBundle bundle) {
			«content»
			return root;
		}
	}
	'''
	
	def CharSequence generateElementDef(String name, Element element) '''
	«IF element.type.needsBuilder»
		«element.type.simpleName» «name»;
		«element.type.simpleName»Builder «name»Builder = «element.type.simpleName»Builder.create();
		«val dummy = extraImports.add(element.type.qualifiedName+"Builder")»
		«FOR p : element.properties»
			«IF p.value instanceof SimpleValueProperty»
				«name»Builder.«p.name»(«(p.value as SimpleValueProperty).simpleAttributeValue»);
			«ENDIF»
		«ENDFOR»
		«name» = «name»Builder.build();
	«ELSE»
		«element.type.simpleName» «name» = new «element.type.simpleName»();
		«FOR p : element.properties»
			«IF p.value instanceof SimpleValueProperty»
				«name».set«p.name.toFirstUpper»(«(p.value as SimpleValueProperty).simpleAttributeValue»);
			«ELSEIF p.value instanceof Element»
				{
					«val varName = 'e_'+getVarIndex»
					«generateElementDef(varName,p.value as Element)»
					«name».set«p.name.toFirstUpper»(«varName»);
					«staticProperties(varName,p.value as Element)»
				}
			«ELSEIF p.value instanceof ListValueProperty»
				«FOR l : (p.value as ListValueProperty).value»
					{
					«val i = getVarIndex»
					«val varName = 'e_'+i»
						«IF l instanceof Element»
						«generateElementDef(varName,l as Element)»
						«name».get«p.name.toFirstUpper»().add(«varName»);
						«staticProperties(varName,l as Element)»
						«ENDIF»
					}
				«ENDFOR»
			«ENDIF»
		«ENDFOR»
		«FOR p : element.defaultChildren»
			{
				«val i = getVarIndex»
				«val varName = 'e_'+i»
				«generateElementDef(varName,p)»
				«name».get«element.type.defaultAttribute.toFirstUpper»().add(«varName»);
			}
		«ENDFOR»
	«ENDIF»
	'''
	
	def staticProperties(String name, Element element) '''
	«FOR prop : element.staticProperties»
		«val type = prop.type»
		«IF prop.value instanceof SimpleValueProperty»
			«IF (prop.value as SimpleValueProperty).stringValue != null»
				«val enumType = ReflectionHelper.getEnumType(type, prop.name, true)»
				«IF enumType != null»
					«type.simpleName».set«prop.name.toFirstUpper»(«name»,«enumType».«(prop.value as SimpleValueProperty).stringValue»);
				«ELSE»
					«type.simpleName».set«prop.name.toFirstUpper»(«name»,«(prop.value as SimpleValueProperty).simpleAttributeValue»);
				«ENDIF»
			«ELSE»
				«type.simpleName».set«prop.name.toFirstUpper»(«name»,«(prop.value as SimpleValueProperty).simpleAttributeValue»);
			«ENDIF»
		«ELSEIF prop.value instanceof Element»
			«val varname = 'e_'+getVarIndex»
			«generateElementDef(varname,prop.value as Element)»
			«type.simpleName».set«prop.name.toFirstUpper»(«name»,«varname»);
		«ENDIF»
	«ENDFOR»
	'''
	
	def simpleAttributeValue(SimpleValueProperty value) {
		if( value.stringValue != null ) {
			return '"' + value.stringValue + '"';
		} else if( value.booleanValue != null ) {
			return value.booleanValue;
		} else if( value.number != null ) {
			if( value.negative ) {
				return "-" + value.number;
			} else {
				return value.number;
			}
		}
	}
	
	def type(StaticValueProperty prop) {
		var el = prop.eContainer
		while( el.eContainer != null ) {
			if( el.eContainer instanceof Element ) {
				val e = el.eContainer as Element
				return e.type;
			}
			el = el.eContainer;
		}
	}
}

Back to the top