[259583] employ real m2m transformation - QVTO transfromation to handle GMFMap to GMFGen step - GenNavigator
diff --git a/plugins/org.eclipse.gmf.bridge/transforms/Map2Gen.qvto b/plugins/org.eclipse.gmf.bridge/transforms/Map2Gen.qvto
index d6f3d94..24fe842 100644
--- a/plugins/org.eclipse.gmf.bridge/transforms/Map2Gen.qvto
+++ b/plugins/org.eclipse.gmf.bridge/transforms/Map2Gen.qvto
@@ -19,6 +19,7 @@
--import DiagramRunTimeModel;
import PropertySheet;
import PreferencePages;
+import Navigator;
configuration property rcp : Boolean;
configuration property useMapMode : Boolean;
@@ -66,6 +67,7 @@
--new DiagramRunTimeModel(domainGenModel XXX need notation.genmodel here instead, gmfgenModel).transform();
new PropertySheet(mapModel, gmfgenModel).transform();
new PreferencePages(mapModel, gmfgenModel).transform();
+ if not rcp then new Navigator(mapModel, gmfgenModel).transform() endif;
}
mapping GMFMAP::Mapping::structure() : GMFGEN::GenEditorGenerator@gmfgenModel {
diff --git a/plugins/org.eclipse.gmf.bridge/transforms/Navigator.qvto b/plugins/org.eclipse.gmf.bridge/transforms/Navigator.qvto
new file mode 100644
index 0000000..d2ea8b4
--- /dev/null
+++ b/plugins/org.eclipse.gmf.bridge/transforms/Navigator.qvto
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 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:
+ * Artem Tikhomirov (Borland) - initial API and implementation
+ */
+modeltype GMFMAP uses mappings('http://www.eclipse.org/gmf/2006/mappings');
+modeltype GMFGEN uses gmfgen('http://www.eclipse.org/gmf/2008/GenModel');
+
+transformation Navigator(in mapModel : GMFMAP, inout gmfgenModel : GMFGEN);
+
+-- FIXME result is not completely correct now
+main() {
+ var mapRoot := mapModel.rootObjects()![GMFMAP::Mapping];
+ var genEditor := gmfgenModel.rootObjects()![GMFGEN::GenEditorGenerator];
+ genEditor.navigator := mapRoot.diagram.map navigator(genEditor.diagram);
+}
+
+mapping GMFMAP::CanvasMapping::navigator(genDiagram : GMFGEN::GenDiagram) : GMFGEN::GenNavigator {
+ childReferences += genDiagram.map navigator();
+ childReferences += genDiagram.topLevelNodes.map navigator();
+ childReferences += genDiagram.childNodes->collect(n | n.containers.getNode().map navigator(n));
+ childReferences += genDiagram.links.map navigator();
+ childReferences += genDiagram.links->collect(l | l.getTargetGenNodes().showLinkTargets(l));
+ childReferences += genDiagram.links->collect(l | l.getTargetGenNodes().showIncomingLinks(l));
+ childReferences += genDiagram.links->collect(l | l.getSourceGenNodes().showLinkSources(l));
+ childReferences += genDiagram.links->collect(l | l.getSourceGenNodes().showOutgoingLinks(l));
+}
+
+mapping GMFGEN::GenDiagram::navigator() : GMFGEN::GenNavigatorChildReference {
+ GMFGEN::GenNavigatorReferenceType::children.populate(result, self, null);
+}
+mapping GMFGEN::GenTopLevelNode::navigator() : GMFGEN::GenNavigatorChildReference {
+ GMFGEN::GenNavigatorReferenceType::children.populate(result, self, self.diagram);
+}
+mapping GMFGEN::GenNode::navigator(childNode : GMFGEN::GenChildNode) : GMFGEN::GenNavigatorChildReference {
+ GMFGEN::GenNavigatorReferenceType::children.populate(result, childNode, self);
+}
+
+mapping GMFGEN::GenLink::navigator() : GMFGEN::GenNavigatorChildReference {
+ GMFGEN::GenNavigatorReferenceType::children.populate(result, self, self.diagram);
+ groupName := 'links';
+ groupIcon := 'icons/linksNavigatorGroup.gif';
+}
+
+helper GMFGEN::GenNavigatorReferenceType::populate(inout ref : GMFGEN::GenNavigatorChildReference, child : GMFGEN::GenCommonBase, parent : GMFGEN::GenCommonBase) : GMFGEN::GenNavigatorChildReference {
+ ref.child := child;
+ ref.referenceType := self;
+ ref.parent := parent;
+ return ref;
+}
+
+helper GMFGEN::GenLinkEnd::showLinkTargets(link : GMFGEN::GenLink) : GMFGEN::GenNavigatorChildReference {
+ var rv := object GMFGEN::GenNavigatorChildReference {};
+ GMFGEN::GenNavigatorReferenceType::out_target.populate(rv, self, link);
+ rv.groupName := 'target';
+ rv.groupIcon := 'icons/linkTargetNavigatorGroup.gif';
+ return rv;
+}
+-- XXX Odd. Processing a link, adding a childreference to GenNode. Perhaps, using GenLinkEnd.genIncomingLinks would be better?
+helper GMFGEN::GenLinkEnd::showIncomingLinks(link : GMFGEN::GenLink) : GMFGEN::GenNavigatorChildReference {
+ var rv := object GMFGEN::GenNavigatorChildReference {};
+ GMFGEN::GenNavigatorReferenceType::in_source.populate(rv, link, self);
+ rv.groupName := 'incoming links';
+ rv.groupIcon := 'icons/linkTargetNavigatorGroup.gif';
+ return rv;
+}
+helper GMFGEN::GenLinkEnd::showLinkSources(link : GMFGEN::GenLink) : GMFGEN::GenNavigatorChildReference {
+ var rv := object GMFGEN::GenNavigatorChildReference {};
+ GMFGEN::GenNavigatorReferenceType::in_source.populate(rv, self, link);
+ rv.groupName := 'source';
+ rv.groupIcon := 'icons/linkSourceNavigatorGroup.gif';
+ return rv;
+}
+helper GMFGEN::GenLinkEnd::showOutgoingLinks(link : GMFGEN::GenLink) : GMFGEN::GenNavigatorChildReference {
+ var rv := object GMFGEN::GenNavigatorChildReference {};
+ GMFGEN::GenNavigatorReferenceType::out_target.populate(rv, link, self);
+ rv.groupName := 'outgoing links';
+ rv.groupIcon := 'icons/outgoingLinksNavigatorGroup.gif';
+ return rv;
+}
+
+query GMFGEN::GenChildContainer::getNode() : GMFGEN::GenNode { assert (false) with log ('Abstract query call'); return null }
+query GMFGEN::GenNode::getNode() : GMFGEN::GenNode { return self }
+query GMFGEN::GenCompartment::getNode() : GMFGEN::GenNode { return self.node }
+
+query GMFGEN::GenLink::getSourceGenNodes() : OrderedSet(GMFGEN::GenLinkEnd) {
+ if self.modelFacet.oclIsUndefined() then return self.diagram.getAllNodes() endif;
+ return self.sources;
+}
+query GMFGEN::GenLink::getTargetGenNodes() : OrderedSet(GMFGEN::GenLinkEnd) {
+ if self.modelFacet.oclIsUndefined() then return self.diagram.getAllNodes() endif;
+ return self.targets;
+}
\ No newline at end of file