/* * Copyright (c) 2006, 2010 Borland Software Corporation and others * * 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: * Alexander Shatalin (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.bridge.genmodel.navigator; import java.util.Collection; import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory; import org.eclipse.gmf.codegen.gmfgen.GenChildContainer; import org.eclipse.gmf.codegen.gmfgen.GenChildNode; import org.eclipse.gmf.codegen.gmfgen.GenCommonBase; import org.eclipse.gmf.codegen.gmfgen.GenCompartment; import org.eclipse.gmf.codegen.gmfgen.GenDiagram; import org.eclipse.gmf.codegen.gmfgen.GenLink; import org.eclipse.gmf.codegen.gmfgen.GenLinkEnd; import org.eclipse.gmf.codegen.gmfgen.GenNavigator; import org.eclipse.gmf.codegen.gmfgen.GenNavigatorChildReference; import org.eclipse.gmf.codegen.gmfgen.GenNavigatorReferenceType; import org.eclipse.gmf.codegen.gmfgen.GenNode; import org.eclipse.gmf.codegen.gmfgen.GenTopLevelNode; public class NavigatorHandler { private GenDiagram myDiagram; private GenNavigator myNavigator; private boolean myShowLinkTargets; private boolean myShowOutgoingLinks; private boolean myShowLinkSources; private boolean myShowIncomingLinks; public NavigatorHandler() { myShowIncomingLinks = true; myShowOutgoingLinks = true; myShowLinkSources = true; myShowLinkTargets = true; } public void initialize(GenDiagram genDiagram, GenNavigator genNavigator) { myDiagram = genDiagram; myNavigator = genNavigator; process(myDiagram); } public void process(GenDiagram diagram) { createChildReference(diagram, null, GenNavigatorReferenceType.CHILDREN_LITERAL); } public void process(GenTopLevelNode topLevelNode) { createChildNodeReference(topLevelNode, myDiagram); } public void process(GenChildNode childNode, GenChildContainer container) { GenNode parent = null; if (container instanceof GenCompartment) { parent = ((GenCompartment) container).getNode(); } else if (container instanceof GenNode) { parent = (GenNode) container; } assert parent != null; createChildNodeReference(childNode, parent); } public void process(GenLink link) { GenNavigatorChildReference childReference = createChildReference(link, myDiagram, GenNavigatorReferenceType.CHILDREN_LITERAL); childReference.setGroupName("links"); childReference.setGroupIcon("icons/linksNavigatorGroup.gif"); for (GenLinkEnd linkEnd : getTargetGenNodes(link)) { if (myShowLinkTargets) { GenNavigatorChildReference reference = createChildReference(linkEnd, link, GenNavigatorReferenceType.OUT_TARGET_LITERAL); reference.setGroupName("target"); reference.setGroupIcon("icons/linkTargetNavigatorGroup.gif"); } if (myShowIncomingLinks) { GenNavigatorChildReference reference = createChildReference(link, linkEnd, GenNavigatorReferenceType.IN_SOURCE_LITERAL); reference.setGroupName("incoming links"); reference.setGroupIcon("icons/incomingLinksNavigatorGroup.gif"); } } for (GenLinkEnd linkEnd : getSourceGenNodes(link)) { if (myShowLinkSources) { GenNavigatorChildReference reference = createChildReference(linkEnd, link, GenNavigatorReferenceType.IN_SOURCE_LITERAL); reference.setGroupName("source"); reference.setGroupIcon("icons/linkSourceNavigatorGroup.gif"); } if (myShowOutgoingLinks) { GenNavigatorChildReference reference = createChildReference(link, linkEnd, GenNavigatorReferenceType.OUT_TARGET_LITERAL); reference.setGroupName("outgoing links"); reference.setGroupIcon("icons/outgoingLinksNavigatorGroup.gif"); } } } private Collection<? extends GenLinkEnd> getTargetGenNodes(GenLink link) { // FIXME link.getTargets gives empty list when no model facet set, but allNodes (which is legacy approach) is perhaps the // correct one, and GenLink#sources/targets should be modified? if (link.getModelFacet() == null) { return myDiagram.getAllNodes(); } return link.getTargets(); } private Collection<? extends GenLinkEnd> getSourceGenNodes(GenLink link) { if (link.getModelFacet() == null) { return myDiagram.getAllNodes(); } return link.getSources(); } private void createChildNodeReference(GenNode childNode, GenCommonBase parent) { createChildReference(childNode, parent, GenNavigatorReferenceType.CHILDREN_LITERAL); } private GenNavigatorChildReference createChildReference(GenCommonBase child, GenCommonBase parent, GenNavigatorReferenceType referenceType) { GenNavigatorChildReference childReference = GMFGenFactory.eINSTANCE.createGenNavigatorChildReference(); if (parent != null) { childReference.setParent(parent); } childReference.setChild(child); childReference.setReferenceType(referenceType); myNavigator.getChildReferences().add(childReference); return childReference; } }