import 'ECoreUtil.eol'; | |
var ePackage := ECore!EPackage.all.first(); | |
var genDiagram := GmfGen!GenDiagram.all.first(); | |
var genEditorGenerator := GmfGen!GenEditorGenerator.all.first(); | |
// Set copyright | |
genEditorGenerator.copyrightText := copyright; | |
// Set same file for model and diagram | |
var onefile := getDiagramClass().getAnnotationValue('gmf.diagram','onefile'); | |
if (onefile.isDefined()) { | |
genEditorGenerator.sameFileForDiagramAndModel := onefile.asBoolean(); | |
} | |
// Set the model and diagram file extensions | |
var modelExtension := getDiagramClass().getAnnotationValue('gmf.diagram','model.extension'); | |
var diagramExtension := getDiagramClass().getAnnotationValue('gmf.diagram','diagram.extension'); | |
if (modelExtension.isDefined()) { | |
genEditorGenerator.domainFileExtension := modelExtension; | |
} | |
if (diagramExtension.isDefined()) { | |
genEditorGenerator.diagramFileExtension := diagramExtension; | |
} | |
// Set the units property | |
var units := getDiagramClass().getAnnotationValue('gmf.diagram','units'); | |
if (units.isDefined()) { | |
genDiagram.units := units; | |
} | |
// Enable shortcuts | |
if (modelExtension.isDefined()) { | |
genDiagram.containsShortcutsTo := Sequence{genEditorGenerator.domainFileExtension}; | |
genDiagram.shortcutsProvidedFor := Sequence{genEditorGenerator.domainFileExtension}; | |
} | |
else { | |
genDiagram.containsShortcutsTo := Sequence{ePackage.name}; | |
genDiagram.shortcutsProvidedFor := Sequence{ePackage.name}; | |
} | |
// Enable validation | |
genDiagram.validationDecorators := true; | |
genDiagram.validationEnabled := true; | |
genDiagram.liveValidationUIFeedback := true; | |
// Enable printing if not RCP | |
if (getDiagramClass().getAnnotationValue("gmf.diagram", "rcp") <> "true") { | |
var genPlugin := GmfGen!GenPlugin.all.first(); | |
genPlugin.printingEnabled := true; | |
} | |
// Adjust compartment layout | |
for (class in getNodes()) { | |
for (ref in class.getCompartmentReferences()) { | |
var genCompartments := GmfGen!GenCompartment.all.select(c|c.title = class.name + ref.name.firstToUpperCase() + 'Compartment'); | |
for (genCompartment in genCompartments) { | |
genCompartment.listLayout := ref.isListLayout(); | |
genCompartment.canCollapse := ref.isCollapsible(); | |
genCompartment.hideIfEmpty := true; | |
} | |
} | |
} | |
// Adjust open diagram behaviour | |
for (class in getDiagramClass().getAllConcreteSubTypes() + Sequence{getDiagramClass()}) { | |
var genTopLevelNodes := GmfGen!GenTopLevelNode.all.select(n|n.createCommandClassName = class.name + 'CreateCommand'); | |
for (genTopLevelNode in genTopLevelNodes) { | |
genTopLevelNode.behaviour.add(new GmfGen!OpenDiagramBehaviour); | |
} | |
} | |
// Process incoming annotations | |
for (link in getReferenceLinks()) { | |
setIncoming(link.getLongName(), link.getLinkIncoming()); | |
} | |
for (link in getLinks()) { | |
setIncoming(link.name, link.getLinkIncoming()); | |
} | |
// Add runtime.lite.svg dependency if using a GMF SVGFigure | |
if (GmfGraph!SVGFigure.all.size > 0) { | |
var genPlugin = GmfGen!GenPlugin.all.first(); | |
genPlugin.requiredPlugins.add('org.eclipse.gmf.runtime.lite.svg'); | |
} | |
// Make not resizable upon request | |
for (node in getNodes()) { | |
if (node.getAnnotationValue('gmf.node', 'resizable') == 'false') { | |
var figureClass = node.name + 'Figure'; | |
var figure_viewmaps = GmfGen!InnerClassViewmap.all.select(r|r.className = figureClass); | |
for (figure_viewmap in figure_viewmaps) { | |
// Resize constraint which forbids resizing | |
// NORTH (1), SOUTH (4), EAST (8) and WEST (16): all handles are not resizable | |
var resizeconstraint_not_resizable = new GmfGen!ResizeConstraints; | |
resizeconstraint_not_resizable.nonResizeHandles := 31; | |
figure_viewmap.attributes.add(resizeconstraint_not_resizable); | |
} | |
} | |
/* In order to honour label.color, we must disable editable fonts */ | |
if (node.getAnnotationValue('gmf.node', 'label.color').isDefined()) { | |
var typeNodeFacet = GmfGen!TypeModelFacet.all.selectOne(tmf|tmf.metaClass.ecoreClass = node); | |
var styleAttributes = typeNodeFacet.eContainer.viewmap.attributes.first; | |
styleAttributes.fixedFont = true; | |
} | |
} | |
// Add parsers | |
var genParsers = GmfGen!GenParsers.all.first; | |
for (genNode in GmfGen!GenNode.all) { | |
var canBeNodeLabel = true; | |
for (featureLabelMF in genNode.labels.collect(l|l.modelFacet).select(f|f.isKindOf(GmfGen!FeatureLabelModelFacet))) { | |
var feature = featureLabelMF.metaFeatures.first.ecoreFeature; | |
var class = feature.eContainingClass; | |
if (canBeNodeLabel and class.isNode() and class.getLabelPlacement() <> 'none') { | |
addParserIfDefined(class.getLabelParser(), genParsers, featureLabelMF); | |
} | |
else if (feature.isLabelled()) { | |
addParserIfDefined(feature.getLabelParser(), genParsers, featureLabelMF); | |
} | |
// Only the first GenNodeLabel may be the label for the entire node, | |
// according to ECore2GMF.eol. | |
canBeNodeLabel = false; | |
} | |
} | |
for (genLink in GmfGen!GenLink.all) { | |
// We assume that there can be only one label (the middle one). | |
// If EuGENia added support for labels in the source or target ends, | |
// we'd need to revise this. | |
var genLabel = genLink.labels.first; | |
if (genLabel.isUndefined()) { | |
continue; | |
} | |
var featureLabelMF = genLabel.modelFacet; | |
if (featureLabelMF.isKindOf(GmfGen!FeatureLabelModelFacet)) { | |
var class = featureLabelMF.metaFeatures.first.ecoreFeature.eContainingClass; | |
if (class.isLink() and not class.getLabelAttributes().isEmpty()) { | |
addParserIfDefined(class.getLabelParser(), genParsers, featureLabelMF); | |
} | |
} | |
} | |
operation addParserIfDefined(parserName : String, genParsers : GmfGen!GenParsers, featureLabelMF : GmfGen!FeatureLabelModelFacet) { | |
if (parserName.isDefined()) { | |
var parser = genParsers.implementations.selectOne(p | p.isKindOf(GmfGen!PredefinedParser) and p.className == parserName); | |
if (parser.isUndefined()) { | |
parser = new GmfGen!PredefinedParser; | |
parser.className = parserName; | |
genParsers.implementations.add(parser); | |
} | |
featureLabelMF.parser = parser; | |
} | |
} | |
operation setIncoming(name : String, value : Boolean) { | |
var genEditPart := GmfGen!GenLink.all.selectOne(l|l.editPartClassName = name + 'EditPart'); | |
if (genEditPart.isDefined()) { | |
genEditPart.incomingCreationAllowed := value; | |
} | |
} |