[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