blob: a9a5a9719114889d4528666b7384db0d4d374d9a [file] [log] [blame]
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;
}
}