Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 07b9fa1145efe712ac5ffcab10871479ff929387 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
/*
 * Copyright (c) 2007, 2009 Borland Software Corporation
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Alexander Shatalin (Borland) - initial API and implementation
 */

«IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'»
«IMPORT 'http://www.eclipse.org/emf/2002/Ecore'»
«IMPORT 'http://www.eclipse.org/emf/2002/GenModel'»

«EXTENSION xpt::editor::Utils»
«EXTENSION xpt::GenModelUtils»
«EXTENSION xpt::diagram::editpolicies::LinkUtils»
«EXTENSION xpt::expressions::ValueExpression»
«EXTENSION xpt::StringOperations»

«DEFINE VisualIDRegistry FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::copyright FOR getDiagram().editorGen-»
package «editorGen.editor.packageName»;

	«EXPAND xpt::Common::generatedClassComment(
		'This registry is used to determine which type of visual object should be\n' + 
		'created for the corresponding Diagram, Node, ChildNode or Link represented\n' + 
		'by a domain model object.\n'	
	)»
public class «visualIDRegistryClassName» {

	«EXPAND attributes-»

	«EXPAND getViewVisualID-»
	
	«EXPAND getModelID-»
	
	«EXPAND getVisualID-»

	«EXPAND getType-»
	
	«EXPAND getDiagramVisualID-»
	
	«EXPAND getNodeVisualID-»
	
	«EXPAND canCreateNode-»
	
	«EXPAND getLinkWithClassVisualID-»
	
	«EXPAND isDiagram-»

	«EXPAND _constraintMethods-»

	«EXPAND additions-»	
}
«ENDDEFINE»

«REM»
	<Definitions of templates for outside usage>
«ENDREM»

«DEFINE visualID FOR gmfgen::GenCommonBase»«getEditPartQualifiedClassName()».VISUAL_ID«ENDDEFINE»

«DEFINE modelID FOR gmfgen::GenDiagram»«getEditPartQualifiedClassName()».MODEL_ID«ENDDEFINE»

«DEFINE getVisualIDMethodCall FOR gmfgen::GenDiagram»«getVisualIDRegistryQualifiedClassName()».«EXPAND getVisualIdMethodName»«ENDDEFINE»

«DEFINE getModelIDMethodCall FOR gmfgen::GenDiagram»«getVisualIDRegistryQualifiedClassName()».«EXPAND getModelIDMethodName»«ENDDEFINE»

«REM»
	XXX looks like these methods would produce incorrect result for visualID of GenDiagram itself - ask Vano if
	getType() method shouldn't be fixed similar to getVisualID, i.e. map diagram's visual id to MODEL_ID instead plain String.valueOf()
«ENDREM»
«DEFINE typeMethodCall(visualIdVar : String) FOR gmfgen::GenCommonBase»«getDiagram().getVisualIDRegistryQualifiedClassName()».«EXPAND getTypeMethodName FOR getDiagram()»(«visualIdVar»)«ENDDEFINE»
«DEFINE typeMethodCall FOR gmfgen::GenCommonBase»«getDiagram().getVisualIDRegistryQualifiedClassName()».«EXPAND getTypeMethodName FOR getDiagram()»(«EXPAND visualID»)«ENDDEFINE»

«DEFINE getDiagramVisualIDMethodCall FOR gmfgen::GenDiagram»«getVisualIDRegistryQualifiedClassName()».«EXPAND getDiagramVisualIDMethodName»«ENDDEFINE»

«DEFINE getNodeVisualIDMethodCall FOR gmfgen::GenDiagram»«getVisualIDRegistryQualifiedClassName()».«EXPAND getNodeVisualIDMethodName»«ENDDEFINE»

«DEFINE canCreateNodeMethodCall FOR gmfgen::GenDiagram»«getVisualIDRegistryQualifiedClassName()».«EXPAND canCreateNodeMethodName»«ENDDEFINE»

«DEFINE getLinkWithClassVisualIDMethodCall FOR gmfgen::GenDiagram»«getVisualIDRegistryQualifiedClassName()».«EXPAND getLinkWithClassVisualIDMethodName»«ENDDEFINE»

«REM»
	</Definitions of templates for outside usage>
«ENDREM»

«DEFINE attributes FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
	private static final String DEBUG_KEY = "«editorGen.plugin.iD»/debug/visualID"; «EXPAND xpt::Common::nonNLS»
«IF null <> editorGen.expressionProviders-»
	«EXPAND _constraintField FOREACH topLevelNodes-»
	«EXPAND _constraintField FOREACH childNodes-»
	«EXPAND _constraintField FOREACH links-»
«ENDIF-»
«ENDDEFINE»

«DEFINE getViewVisualID FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static int «EXPAND getVisualIdMethodName»(org.eclipse.gmf.runtime.notation.View view) {
	if (view instanceof org.eclipse.gmf.runtime.notation.Diagram) {
		if («EXPAND modelID».equals(view.getType())) {
			return «EXPAND visualID»;
		} else {
			«EXPAND unrecognizedVID-»
		}
	}
	return «EXPAND getVisualIDMethodCall»(view.getType());
}
«ENDDEFINE»

«DEFINE getVisualIdMethodName FOR gmfgen::GenDiagram»getVisualID«ENDDEFINE»

«DEFINE getModelID FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static String «EXPAND getModelIDMethodName»(org.eclipse.gmf.runtime.notation.View view) {
	org.eclipse.gmf.runtime.notation.View diagram = view.getDiagram();
	while (view != diagram) {
		org.eclipse.emf.ecore.EAnnotation annotation = view.getEAnnotation("Shortcut"); «EXPAND xpt::Common::nonNLS»
		if (annotation != null) {
			return (String) annotation.getDetails().get("modelID"); «EXPAND xpt::Common::nonNLS»
		}
		view = (org.eclipse.gmf.runtime.notation.View) view.eContainer();
	}
	return diagram != null ? diagram.getType() : null;
}
«ENDDEFINE»

«DEFINE getModelIDMethodName FOR gmfgen::GenDiagram»getModelID«ENDDEFINE»

«DEFINE getVisualID FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static int «EXPAND getVisualIdMethodName»(String type) {
	try {
		return Integer.parseInt(type);
	} catch (NumberFormatException e) {
		if (Boolean.TRUE.toString().equalsIgnoreCase(org.eclipse.core.runtime.Platform.getDebugOption(DEBUG_KEY))) {
			«editorGen.plugin.getActivatorQualifiedClassName()».getInstance().logError("Unable to parse view type as a visualID number: " + type);
		}
	}
	«EXPAND unrecognizedVID-»
}
«ENDDEFINE»

«DEFINE getType FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static String «EXPAND getTypeMethodName»(int visualID) {
	return String.valueOf(visualID);
}
«ENDDEFINE»

«DEFINE getTypeMethodName FOR gmfgen::GenDiagram»getType«ENDDEFINE»

«DEFINE getDiagramVisualID FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static int «EXPAND getDiagramVisualIDMethodName»(org.eclipse.emf.ecore.EObject domainElement) {
	if (domainElement == null) {
		«EXPAND unrecognizedVID-»
	}
«IF null <> domainDiagramElement-»
	«EXPAND returnVisualID-»
«ENDIF-»
	«EXPAND unrecognizedVID-»
}
«ENDDEFINE»

«DEFINE getDiagramVisualIDMethodName FOR gmfgen::GenDiagram»getDiagramVisualID«ENDDEFINE»

«DEFINE returnVisualID FOR gmfgen::GenCommonBase-»
if («EXPAND checkSemanticElement») {
	return «EXPAND visualID»;
}
«ENDDEFINE»

«DEFINE checkSemanticElement FOR gmfgen::GenCommonBase-»
	«ERROR 'checkSemanticElement not supported for: ' + self.repr()-»
«ENDDEFINE»

«DEFINE checkSemanticElement FOR gmfgen::GenDiagram»«EXPAND checkDomainElementMetaclass FOR domainDiagramElement» && isDiagram(«EXPAND MetaModel::CastEObject('domainElement') FOR domainDiagramElement»)«ENDDEFINE»
«DEFINE checkSemanticElement FOR gmfgen::GenNode»«EXPAND checkDomainElementMetaclass FOR modelFacet.metaClass»«EXPAND checkDomainElementConstraints(self) FOR modelFacet»«ENDDEFINE»
«DEFINE checkSemanticElement FOR gmfgen::GenLink»«EXPAND checkSemanticElement(self) FOR modelFacet»«ENDDEFINE»

«DEFINE checkDomainElementMetaclass FOR genmodel::GenClass»«EXPAND MetaModel::MetaClass».isSuperTypeOf(domainElement.eClass())«ENDDEFINE»

«DEFINE checkDomainElementConstraints(commonBase : gmfgen::GenCommonBase) FOR gmfgen::TypeModelFacet-»
«IF null <> modelElementSelector» && «EXPAND _domainElementConstraintMethodName FOR commonBase»(«EXPAND MetaModel::CastEObject('domainElement') FOR metaClass»)«ENDIF-»
«ENDDEFINE»

«DEFINE checkSemanticElement(genLink : gmfgen::GenLink) FOR gmfgen::LinkModelFacet»«ERROR 'checkSemanticElement is supported only for TypeLinkModelFacet: ' + self.repr()»«ENDDEFINE»
«DEFINE checkSemanticElement(genLink : gmfgen::GenLink) FOR gmfgen::TypeLinkModelFacet»«EXPAND checkDomainElementMetaclass FOR metaClass»«EXPAND checkDomainElementConstraints(genLink)»«ENDDEFINE»


«DEFINE getNodeVisualID FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static int «EXPAND getNodeVisualIDMethodName»(org.eclipse.gmf.runtime.notation.View containerView, org.eclipse.emf.ecore.EObject domainElement) {
	if (domainElement == null) {
		«EXPAND unrecognizedVID-»
	}
	String containerModelID = «EXPAND getModelIDMethodCall»(containerView);
	if (!«EXPAND modelID».equals(containerModelID)«EXPAND checkContainerModelID FOREACH shortcutsProvidedFor») { «EXPAND xpt::Common::nonNLS FOR shortcutsProvidedFor->asSequence()»
		«EXPAND unrecognizedVID-»
	}
	int containerVisualID;
	if («EXPAND modelID».equals(containerModelID)) {
		containerVisualID = «EXPAND getVisualIDMethodCall»(containerView);
	} else {
		if (containerView instanceof org.eclipse.gmf.runtime.notation.Diagram) {
			containerVisualID = «EXPAND visualID»;		
		} else {
			«EXPAND unrecognizedVID-»
		}
	}
	switch (containerVisualID) {
		«EXPAND caseDomainContainerVisualID FOREACH getAllContainers()-»
	}
	«EXPAND unrecognizedVID-»
}
«ENDDEFINE»

«DEFINE getNodeVisualIDMethodName FOR gmfgen::GenDiagram»getNodeVisualID«ENDDEFINE»

«DEFINE caseDomainContainerVisualID FOR gmfgen::GenContainerBase-»
	«IF getContainedSemanticNodes(self)->size() > 0-»
«EXPAND xpt::Common::caseVisualID»
	«EXPAND returnVisualID FOREACH getContainedSemanticNodes(self)-»
	break;
	«ENDIF-»
«ENDDEFINE»


«DEFINE canCreateNode FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static boolean «EXPAND canCreateNodeMethodName»(org.eclipse.gmf.runtime.notation.View containerView, int nodeVisualID) {
	String containerModelID = «EXPAND getModelIDMethodCall»(containerView);
	if (!«EXPAND modelID».equals(containerModelID)«EXPAND checkContainerModelID FOREACH shortcutsProvidedFor») { «EXPAND xpt::Common::nonNLS FOR shortcutsProvidedFor->asSequence()»
		return false;
	}
	int containerVisualID;
	if («EXPAND modelID».equals(containerModelID)) {
		containerVisualID = «EXPAND getVisualIDMethodCall»(containerView);
	} else {
		if (containerView instanceof org.eclipse.gmf.runtime.notation.Diagram) {
			containerVisualID = «EXPAND visualID»;		
		} else {
			return false;
		}
	}
	switch (containerVisualID) {
		«EXPAND caseVisualID FOREACH getAllContainers()->select(e | not e.getEssentialVisualChildren()->isEmpty())-»
		«EXPAND caseVisualID FOREACH links->select(e | not e.getEssentialVisualChildren()->isEmpty())-»
	}
	return false;
}
«ENDDEFINE»

«DEFINE canCreateNodeMethodName FOR gmfgen::GenDiagram»canCreateNode«ENDDEFINE»

«DEFINE checkContainerModelID FOR String» && !"«self»".equals(containerModelID)«ENDDEFINE»

«DEFINE caseVisualID FOR gmfgen::GenCommonBase-»
«EXPAND xpt::Common::caseVisualID»
	«EXPAND checkEssentialChild FOREACH self.getEssentialVisualChildren()-»
	break;
«ENDDEFINE»

«DEFINE checkEssentialChild FOR gmfgen::GenCommonBase-»
if («EXPAND visualID» == nodeVisualID) {
	return true;
}
«ENDDEFINE»

«DEFINE getLinkWithClassVisualID FOR gmfgen::GenDiagram-»
	«EXPAND xpt::Common::generatedMemberComment»
public static int «EXPAND getLinkWithClassVisualIDMethodName»(org.eclipse.emf.ecore.EObject domainElement) {
	if (domainElement == null) {
		«EXPAND unrecognizedVID-»
	}
	«EXPAND returnVisualID FOREACH links->select(isTypeLink())-»
	«EXPAND unrecognizedVID-»
}
«ENDDEFINE»

«DEFINE getLinkWithClassVisualIDMethodName FOR gmfgen::GenDiagram»getLinkWithClassVisualID«ENDDEFINE»


«DEFINE isDiagram FOR gmfgen::GenDiagram-»
	«IF null <> domainDiagramElement-»
		«EXPAND xpt::Common::generatedMemberComment(
			'User can change implementation of this method to handle some specific\n' + 
			'situations not covered by default logic.\n'
		)»
private static boolean isDiagram(«EXPAND MetaModel::QualifiedClassName FOR domainDiagramElement» element) {
	return true;
}
	«ENDIF-»
«ENDDEFINE»


«REM»

		Support for extra contstraints to check about model element.
		Includes expression fields for interpreted constrains (like ocl or regexp).
		For each model element that has an associated constraint, there's a method is<DomainElement>_<UID>()
		that performs extra specification as defined by value expression 

		FIXME don't use static fields, replace with instance/separate cache (e.g. accessible from Activator)
«ENDREM»

«DEFINE _constraintMethods FOR gmfgen::GenDiagram-»
«IF null <> editorGen.expressionProviders-»
	«EXPAND _constraintMethod FOREACH topLevelNodes->select(n | n.modelFacet.modelElementSelector <> null)-»
	«EXPAND _constraintMethod FOREACH childNodes->select(n | n.modelFacet.modelElementSelector <> null)-»
	«FOREACH links->asSequence() AS l»«EXPAND _constraintMethod(l) FOR l.modelFacet»«ENDFOREACH»
«ENDIF-»
«ENDDEFINE»

«DEFINE _constraintMethod FOR gmfgen::GenNode-»
«EXPAND _domainElementConstraintMethod(self, modelFacet.modelElementSelector, modelFacet.metaClass) FOR modelFacet.modelElementSelector.provider»
«ENDDEFINE»

«DEFINE _constraintMethod(l : gmfgen::GenLink) FOR gmfgen::LinkModelFacet»«ENDDEFINE» // no-op
«DEFINE _constraintMethod(l : gmfgen::GenLink) FOR gmfgen::TypeLinkModelFacet-»
«IF modelElementSelector <> null»«EXPAND _domainElementConstraintMethod(l, modelElementSelector, metaClass) FOR modelElementSelector.provider»«ENDIF-»
«ENDDEFINE»


«DEFINE _domainElementConstraintMethodName FOR gmfgen::GenCommonBase»is«getUniqueIdentifier()»«ENDDEFINE»

«DEFINE _domainElementConstraintMethod(diagramElement : gmfgen::GenCommonBase, expression : gmfgen::ValueExpression, context : genmodel::GenClass) FOR gmfgen::GenExpressionProviderBase»«ERROR 'Constraint method is not supported for ' + self.repr()»«ENDDEFINE»

«DEFINE _domainElementConstraintMethod(diagramElement : gmfgen::GenCommonBase, expression : gmfgen::ValueExpression, context : genmodel::GenClass) FOR gmfgen::GenJavaExpressionProvider-»
	«EXPAND xpt::Common::generatedMemberComment»
	private static boolean «EXPAND _domainElementConstraintMethodName FOR diagramElement»(«EXPAND MetaModel::QualifiedClassName FOR context» domainElement) {
«IF injectExpressionBody and (expression.body <> null and expression.body.xpandLength() <> 0)-»
		«expression.body»
«ELSEIF throwException or (injectExpressionBody and (expression.body = null or expression.body.xpandLength() = 0))-»
		// FIXME: implement this method 
		// Ensure that you remove @generated or mark it @generated NOT
		throw new java.lang.UnsupportedOperationException("No java implementation provided in '«EXPAND _domainElementConstraintMethodName FOR diagramElement»' operation");«EXPAND xpt::Common::nonNLS»
«ELSE-»
		return false;
«ENDIF-»
	}
«ENDDEFINE»

«DEFINE _domainElementConstraintMethod(diagramElement : gmfgen::GenCommonBase, expression : gmfgen::ValueExpression, context : genmodel::GenClass) FOR gmfgen::GenExpressionInterpreter-»
	«EXPAND xpt::Common::generatedMemberComment»
	private static boolean «EXPAND _domainElementConstraintMethodName FOR diagramElement»(«EXPAND MetaModel::QualifiedClassName FOR context» domainElement) {
		if («constraintFieldName(diagramElement)» == null) { // lazy initialization
			«constraintFieldName(diagramElement)» = «EXPAND xpt::expressions::getExpression::getExpression(expression, context)»; «EXPAND xpt::Common::nonNLS»
		}
		Object result = «constraintFieldName(diagramElement)».evaluate(domainElement);
		return result instanceof Boolean && ((Boolean)result).booleanValue();
	}			
«ENDDEFINE»


«DEFINE _constraintField FOR gmfgen::GenNode»«EXPAND _constraintField(self) FOR modelFacet»«ENDDEFINE»
«DEFINE _constraintField FOR gmfgen::GenLink»«EXPAND _constraintField(self) FOR modelFacet»«ENDDEFINE»

«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::ModelFacet»«ENDDEFINE»
«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::TypeModelFacet-»
«IF modelElementSelector <> null»«EXPAND _constraintField(diagramElement) FOR modelElementSelector.provider»«ENDIF-»
«ENDDEFINE»

«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::GenExpressionInterpreter»
	«EXPAND xpt::Common::generatedMemberComment»
	private static «container.getAbstractExpressionQualifiedClassName()» «constraintFieldName(diagramElement)»;
«ENDDEFINE»

«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::GenExpressionProviderBase»«ERROR 'Need to define approach to constraint fields for ' + self.repr()»«ENDDEFINE»
«DEFINE _constraintField(diagramElement : gmfgen::GenCommonBase) FOR gmfgen::GenJavaExpressionProvider»«ENDDEFINE»// IOW, no fields for Java

«REM»
		Constraints support end.
«ENDREM»


«DEFINE unrecognizedVID FOR gmfgen::GenDiagram-»
return -1;
«ENDDEFINE»

«DEFINE additions FOR gmfgen::GenDiagram»«ENDDEFINE»

Back to the top