blob: 805fc4e7c33476ea0cbbc6c9cc3358d4a7237efb [file] [log] [blame]
/**
* 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
*/
import Utils;
modeltype GMFMAP uses mappings('http://www.eclipse.org/gmf/2006/mappings');
modeltype GMFGEN uses gmfgen('http://www.eclipse.org/gmf/2009/GenModel');
modeltype ECORE uses ecore('http://www.eclipse.org/emf/2002/Ecore');
modeltype GENMODEL uses genmodel('http://www.eclipse.org/emf/2002/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.childNodes->collect(n | n.containers.getNode().map navigator(n));
childReferences += genDiagram.topLevelNodes.map navigator();
childReferences += genDiagram.links.map navigator();
childReferences += genDiagram.links->collect(l | l.getTargetGenNodes()->asSet().showLinkTargets(l));
childReferences += genDiagram.links->collect(l | l.getSourceGenNodes().showLinkSources(l));
-- Instead, may use GenLinkEnd.genOutgoingLinks/genIncomingLinks, but they seem to be less effective as they
-- go through GenLink.sources/targets anyway
childReferences += genDiagram.links->collect(l | l.getTargetGenNodes().showIncomingLinks(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 {
parent := self.diagram;
child := self;
referenceType := GenNavigatorReferenceType::children;
}
mapping GMFGEN::GenNode::navigator(childNode : GMFGEN::GenChildNode) : GMFGEN::GenNavigatorChildReference {
parent := self;
child := childNode;
referenceType := GenNavigatorReferenceType::children;
}
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/incomingLinksNavigatorGroup.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.getAllPossibleLinkEnds() endif;
return self.sources;
}
query GMFGEN::GenLink::getTargetGenNodes() : OrderedSet(GMFGEN::GenLinkEnd) {
if self.modelFacet.oclIsUndefined() then {
return self.diagram.getAllPossibleLinkEnds()
} endif;
return self.targets;
}
query GMFGEN::GenDiagram::getAllPossibleLinkEnds() : OrderedSet(GMFGEN::GenLinkEnd) {
-- XXX original DGMT's NavigatorHandler used getAllNodes here, which is not completely correct:
-- first, links can go to links, second, links can't go to GenChildLabelNode
var rs : OrderedSet(GenLinkEnd) = OrderedSet{};
rs += self.topLevelNodes;
rs += self.childNodes->reject(oclIsKindOf(GMFGEN::GenChildLabelNode)); -- child nodes, excluding labels
rs += self.links;
return rs;
}