blob: b48f051e1ec2d9a12ae0bf97f5faa3705e86a352 [file] [log] [blame]
/*
* Copyright (c) 2006 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:
* Dmitry Stadnik (Borland) - initial API and implementation
*/
package org.eclipse.gmf.map.editor.navigator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.gmf.map.editor.edit.parts.CanvasMappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.ChildReferenceEditPart;
import org.eclipse.gmf.map.editor.edit.parts.ChildReferenceOwnedChildEditPart;
import org.eclipse.gmf.map.editor.edit.parts.ChildReferenceReferencedChildEditPart;
import org.eclipse.gmf.map.editor.edit.parts.CompartmentMappingChildrenEditPart;
import org.eclipse.gmf.map.editor.edit.parts.CompartmentMappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.DesignLabelMapping2EditPart;
import org.eclipse.gmf.map.editor.edit.parts.DesignLabelMappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.FeatureLabelMapping2EditPart;
import org.eclipse.gmf.map.editor.edit.parts.FeatureLabelMappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.LabelMapping2EditPart;
import org.eclipse.gmf.map.editor.edit.parts.LabelMappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.LinkMappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.MappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.NodeMappingEditPart;
import org.eclipse.gmf.map.editor.edit.parts.TopNodeReferenceEditPart;
import org.eclipse.gmf.map.editor.edit.parts.TopNodeReferenceOwnedChildEditPart;
import org.eclipse.gmf.map.editor.part.GMFMapVisualIDRegistry;
import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;
/**
* @generated
*/
public class GMFMapNavigatorContentProvider implements ICommonContentProvider {
/**
* @generated
*/
private static final Object[] EMPTY_ARRAY = new Object[0];
/**
* @generated
*/
public void dispose() {
}
/**
* @generated
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
/**
* @generated
*/
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
/**
* @generated
*/
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof GMFMapAbstractNavigatorItem) {
GMFMapAbstractNavigatorItem abstractNavigatorItem = (GMFMapAbstractNavigatorItem) parentElement;
if (!MappingEditPart.MODEL_ID.equals(abstractNavigatorItem.getModelID())) {
return EMPTY_ARRAY;
}
if (abstractNavigatorItem instanceof GMFMapNavigatorItem) {
GMFMapNavigatorItem navigatorItem = (GMFMapNavigatorItem) abstractNavigatorItem;
switch (navigatorItem.getVisualID()) {
case CanvasMappingEditPart.VISUAL_ID: {
Collection result = new ArrayList();
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(TopNodeReferenceEditPart.VISUAL_ID), navigatorItem));
return result.toArray();
}
case NodeMappingEditPart.VISUAL_ID: {
Collection result = new ArrayList();
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(FeatureLabelMappingEditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(DesignLabelMappingEditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(LabelMappingEditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(ChildReferenceEditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(CompartmentMappingEditPart.VISUAL_ID), navigatorItem));
GMFMapNavigatorGroup incominglinks = new GMFMapNavigatorGroup("incoming links", "icons/incomingLinksNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
incominglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(TopNodeReferenceOwnedChildEditPart.VISUAL_ID), false, incominglinks));
incominglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(ChildReferenceOwnedChildEditPart.VISUAL_ID), false, incominglinks));
incominglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(ChildReferenceReferencedChildEditPart.VISUAL_ID), false, incominglinks));
if (!incominglinks.isEmpty()) {
result.add(incominglinks);
}
return result.toArray();
}
case LinkMappingEditPart.VISUAL_ID: {
Collection result = new ArrayList();
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(FeatureLabelMapping2EditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(DesignLabelMapping2EditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(LabelMapping2EditPart.VISUAL_ID), navigatorItem));
return result.toArray();
}
case TopNodeReferenceEditPart.VISUAL_ID: {
Collection result = new ArrayList();
GMFMapNavigatorGroup outgoinglinks = new GMFMapNavigatorGroup("outgoing links", "icons/outgoingLinksNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
outgoinglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(TopNodeReferenceOwnedChildEditPart.VISUAL_ID), true, outgoinglinks));
if (!outgoinglinks.isEmpty()) {
result.add(outgoinglinks);
}
return result.toArray();
}
case ChildReferenceEditPart.VISUAL_ID: {
Collection result = new ArrayList();
GMFMapNavigatorGroup outgoinglinks = new GMFMapNavigatorGroup("outgoing links", "icons/outgoingLinksNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
outgoinglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(ChildReferenceOwnedChildEditPart.VISUAL_ID), true, outgoinglinks));
outgoinglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(ChildReferenceReferencedChildEditPart.VISUAL_ID), true, outgoinglinks));
GMFMapNavigatorGroup incominglinks = new GMFMapNavigatorGroup("incoming links", "icons/incomingLinksNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
incominglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(CompartmentMappingChildrenEditPart.VISUAL_ID), false, incominglinks));
if (!outgoinglinks.isEmpty()) {
result.add(outgoinglinks);
}
if (!incominglinks.isEmpty()) {
result.add(incominglinks);
}
return result.toArray();
}
case CompartmentMappingEditPart.VISUAL_ID: {
Collection result = new ArrayList();
GMFMapNavigatorGroup outgoinglinks = new GMFMapNavigatorGroup("outgoing links", "icons/outgoingLinksNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
outgoinglinks.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(CompartmentMappingChildrenEditPart.VISUAL_ID), true, outgoinglinks));
if (!outgoinglinks.isEmpty()) {
result.add(outgoinglinks);
}
return result.toArray();
}
case MappingEditPart.VISUAL_ID: {
Collection result = new ArrayList();
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(CanvasMappingEditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(NodeMappingEditPart.VISUAL_ID), navigatorItem));
result.addAll(getChildByType(navigatorItem.getView().getChildren(), GMFMapVisualIDRegistry.getType(LinkMappingEditPart.VISUAL_ID), navigatorItem));
GMFMapNavigatorGroup links = new GMFMapNavigatorGroup("links", "icons/linksNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
links.addChildren(getViewByType(navigatorItem.getView().getDiagram().getEdges(), GMFMapVisualIDRegistry.getType(TopNodeReferenceOwnedChildEditPart.VISUAL_ID), links));
links.addChildren(getViewByType(navigatorItem.getView().getDiagram().getEdges(), GMFMapVisualIDRegistry.getType(ChildReferenceOwnedChildEditPart.VISUAL_ID), links));
links.addChildren(getViewByType(navigatorItem.getView().getDiagram().getEdges(), GMFMapVisualIDRegistry.getType(ChildReferenceReferencedChildEditPart.VISUAL_ID), links));
links.addChildren(getViewByType(navigatorItem.getView().getDiagram().getEdges(), GMFMapVisualIDRegistry.getType(CompartmentMappingChildrenEditPart.VISUAL_ID), links));
if (!links.isEmpty()) {
result.add(links);
}
return result.toArray();
}
case TopNodeReferenceOwnedChildEditPart.VISUAL_ID: {
Collection result = new ArrayList();
GMFMapNavigatorGroup target = new GMFMapNavigatorGroup("target", "icons/linkTargetNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
target.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(NodeMappingEditPart.VISUAL_ID), true, target));
GMFMapNavigatorGroup source = new GMFMapNavigatorGroup("source", "icons/linkSourceNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
source.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(TopNodeReferenceEditPart.VISUAL_ID), false, source));
if (!target.isEmpty()) {
result.add(target);
}
if (!source.isEmpty()) {
result.add(source);
}
return result.toArray();
}
case ChildReferenceOwnedChildEditPart.VISUAL_ID: {
Collection result = new ArrayList();
GMFMapNavigatorGroup target = new GMFMapNavigatorGroup("target", "icons/linkTargetNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
target.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(NodeMappingEditPart.VISUAL_ID), true, target));
GMFMapNavigatorGroup source = new GMFMapNavigatorGroup("source", "icons/linkSourceNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
source.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(ChildReferenceEditPart.VISUAL_ID), false, source));
if (!target.isEmpty()) {
result.add(target);
}
if (!source.isEmpty()) {
result.add(source);
}
return result.toArray();
}
case ChildReferenceReferencedChildEditPart.VISUAL_ID: {
Collection result = new ArrayList();
GMFMapNavigatorGroup target = new GMFMapNavigatorGroup("target", "icons/linkTargetNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
target.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(NodeMappingEditPart.VISUAL_ID), true, target));
GMFMapNavigatorGroup source = new GMFMapNavigatorGroup("source", "icons/linkSourceNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
source.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(ChildReferenceEditPart.VISUAL_ID), false, source));
if (!target.isEmpty()) {
result.add(target);
}
if (!source.isEmpty()) {
result.add(source);
}
return result.toArray();
}
case CompartmentMappingChildrenEditPart.VISUAL_ID: {
Collection result = new ArrayList();
GMFMapNavigatorGroup target = new GMFMapNavigatorGroup("target", "icons/linkTargetNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
target.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(ChildReferenceEditPart.VISUAL_ID), true, target));
GMFMapNavigatorGroup source = new GMFMapNavigatorGroup("source", "icons/linkSourceNavigatorGroup.gif", MappingEditPart.MODEL_ID, navigatorItem);
source.addChildren(getConnectedViews(navigatorItem.getView(), GMFMapVisualIDRegistry.getType(CompartmentMappingEditPart.VISUAL_ID), false, source));
if (!target.isEmpty()) {
result.add(target);
}
if (!source.isEmpty()) {
result.add(source);
}
return result.toArray();
}
}
} else if (abstractNavigatorItem instanceof GMFMapNavigatorGroup) {
GMFMapNavigatorGroup group = (GMFMapNavigatorGroup) parentElement;
return group.getChildren();
}
} else if (parentElement instanceof IFile) {
IFile file = (IFile) parentElement;
AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) GMFEditingDomainFactory.INSTANCE.createEditingDomain();
editingDomain.setResourceToReadOnlyMap(new HashMap() {
public Object get(Object key) {
if (!containsKey(key)) {
put(key, Boolean.TRUE);
}
return super.get(key);
}
});
ResourceSet resourceSet = editingDomain.getResourceSet();
URI fileURI = URI.createPlatformResourceURI(file.getFullPath().toString());
Resource resource = resourceSet.getResource(fileURI, true);
Collection result = new ArrayList();
result.addAll(getViewByType(resource.getContents(), MappingEditPart.MODEL_ID, file));
return result.toArray();
}
return EMPTY_ARRAY;
}
/**
* @generated
*/
public Object getParent(Object element) {
if (element instanceof GMFMapAbstractNavigatorItem) {
GMFMapAbstractNavigatorItem abstractNavigatorItem = (GMFMapAbstractNavigatorItem) element;
if (!MappingEditPart.MODEL_ID.equals(abstractNavigatorItem.getModelID())) {
return null;
}
return abstractNavigatorItem.getParent();
}
return null;
}
/**
* @generated
*/
public boolean hasChildren(Object element) {
return element instanceof IFile || getChildren(element).length > 0;
}
/**
* @generated
*/
public void init(ICommonContentExtensionSite aConfig) {
}
/**
* @generated
*/
public void restoreState(IMemento aMemento) {
}
/**
* @generated
*/
public void saveState(IMemento aMemento) {
}
/**
* @generated
*/
private Collection getViewByType(Collection childViews, String type, Object parent) {
Collection result = new ArrayList();
for (Iterator it = childViews.iterator(); it.hasNext();) {
Object next = it.next();
if (false == next instanceof View) {
continue;
}
View nextView = (View) next;
if (type.equals(nextView.getType())) {
result.add(new GMFMapNavigatorItem(nextView, parent));
}
}
return result;
}
/**
* @generated
*/
private Collection getChildByType(Collection childViews, String type, Object parent) {
Collection result = new ArrayList();
List children = new ArrayList(childViews);
for (int i = 0; i < children.size(); i++) {
if (false == children.get(i) instanceof View) {
continue;
}
View nextChild = (View) children.get(i);
if (type.equals(nextChild.getType())) {
result.add(new GMFMapNavigatorItem(nextChild, parent));
} else if (!stopGettingChildren(nextChild, type)) {
children.addAll(nextChild.getChildren());
}
}
return result;
}
/**
* @generated
*/
private boolean stopGettingChildren(View child, String type) {
return false;
}
/**
* @generated
*/
private Collection getConnectedViews(View rootView, String type, boolean isOutTarget, Object parent) {
Collection result = new ArrayList();
List connectedViews = new ArrayList();
connectedViews.add(rootView);
Set visitedViews = new HashSet();
for (int i = 0; i < connectedViews.size(); i++) {
View nextView = (View) connectedViews.get(i);
if (visitedViews.contains(nextView)) {
continue;
}
visitedViews.add(nextView);
if (type.equals(nextView.getType()) && nextView != rootView) {
result.add(new GMFMapNavigatorItem(nextView, parent));
} else {
if (isOutTarget && !stopGettingOutTarget(nextView, rootView, type)) {
connectedViews.addAll(nextView.getSourceEdges());
if (nextView instanceof Edge) {
connectedViews.add(((Edge) nextView).getTarget());
}
}
if (!isOutTarget && !stopGettingInSource(nextView, rootView, type)) {
connectedViews.addAll(nextView.getTargetEdges());
if (nextView instanceof Edge) {
connectedViews.add(((Edge) nextView).getSource());
}
}
}
}
return result;
}
/**
* @generated
*/
private boolean stopGettingInSource(View nextView, View rootView, String type) {
return !isOneHopConnection(nextView, rootView);
}
/**
* @generated
*/
private boolean stopGettingOutTarget(View nextView, View rootView, String type) {
return !isOneHopConnection(nextView, rootView);
}
/**
* @generated
*/
private boolean isOneHopConnection(View targetView, View sourceView) {
if (sourceView == targetView) {
return true;
}
if (sourceView instanceof Node) {
return targetView instanceof Edge;
}
if (sourceView instanceof Edge) {
return targetView instanceof Node;
}
return false;
}
}