/*
* Copyright (c) 2006, 2007 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.examples.design2d.providers;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.examples.design2d.edit.parts.CustomNodeEditPart;
import org.eclipse.gmf.examples.design2d.edit.parts.Design2DEditPart;
import org.eclipse.gmf.examples.design2d.edit.parts.InnerSolidEllipseEditPart;
import org.eclipse.gmf.examples.design2d.edit.parts.InnerSolidRectangleEditPart;
import org.eclipse.gmf.examples.design2d.edit.parts.SolidEllipseEditPart;
import org.eclipse.gmf.examples.design2d.edit.parts.SolidLineCommentEditPart;
import org.eclipse.gmf.examples.design2d.edit.parts.SolidLineEditPart;
import org.eclipse.gmf.examples.design2d.edit.parts.SolidRectangleEditPart;
import org.eclipse.gmf.examples.design2d.part.DesignVisualIDRegistry;
import org.eclipse.gmf.examples.design2d.view.factories.CustomNodeViewFactory;
import org.eclipse.gmf.examples.design2d.view.factories.Design2DViewFactory;
import org.eclipse.gmf.examples.design2d.view.factories.InnerSolidEllipseViewFactory;
import org.eclipse.gmf.examples.design2d.view.factories.InnerSolidRectangleViewFactory;
import org.eclipse.gmf.examples.design2d.view.factories.SolidEllipseViewFactory;
import org.eclipse.gmf.examples.design2d.view.factories.SolidLineCommentViewFactory;
import org.eclipse.gmf.examples.design2d.view.factories.SolidLineViewFactory;
import org.eclipse.gmf.examples.design2d.view.factories.SolidRectangleViewFactory;
import org.eclipse.gmf.runtime.diagram.core.providers.AbstractViewProvider;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
import org.eclipse.gmf.runtime.notation.View;
/**
* @generated
*/
public class DesignViewProvider extends AbstractViewProvider {
/**
* @generated
*/
protected Class getDiagramViewClass(IAdaptable semanticAdapter, String diagramKind) {
if (Design2DEditPart.MODEL_ID.equals(diagramKind)) {
return Design2DViewFactory.class;
}
return null;
}
/**
* @generated
*/
protected Class getNodeViewClass(IAdaptable semanticAdapter, View containerView, String semanticHint) {
if (containerView == null) {
return null;
}
IElementType elementType = getSemanticElementType(semanticAdapter);
EObject domainElement = getSemanticElement(semanticAdapter);
int visualID;
if (semanticHint == null) {
// Semantic hint is not specified. Can be a result of call from CanonicalEditPolicy.
// In this situation there should be NO elementType, visualID will be determined
// by VisualIDRegistry.getNodeVisualID() for domainElement.
if (elementType != null || domainElement == null) {
return null;
}
visualID = DesignVisualIDRegistry.getNodeVisualID(containerView, domainElement);
} else {
visualID = DesignVisualIDRegistry.getVisualID(semanticHint);
if (elementType != null) {
// Semantic hint is specified together with element type.
// Both parameters should describe exactly the same diagram element.
// In addition we check that visualID returned by VisualIDRegistry.getNodeVisualID() for
// domainElement (if specified) is the same as in element type.
if (!DesignElementTypes.isKnownElementType(elementType) || (!(elementType instanceof IHintedType))) {
return null; // foreign element type
}
String elementTypeHint = ((IHintedType) elementType).getSemanticHint();
if (!semanticHint.equals(elementTypeHint)) {
return null; // if semantic hint is specified it should be the same as in element type
}
if (domainElement != null && visualID != DesignVisualIDRegistry.getNodeVisualID(containerView, domainElement)) {
return null; // visual id for node EClass should match visual id from element type
}
} else {
// Element type is not specified. Domain element should be present (except pure design elements).
// This method is called with EObjectAdapter as parameter from:
// - ViewService.createNode(View container, EObject eObject, String type, PreferencesHint preferencesHint)
// - generated ViewFactory.decorateView() for parent element
if (!Design2DEditPart.MODEL_ID.equals(DesignVisualIDRegistry.getModelID(containerView))) {
return null; // foreign diagram
}
switch (visualID) {
case SolidRectangleEditPart.VISUAL_ID:
case SolidEllipseEditPart.VISUAL_ID:
case CustomNodeEditPart.VISUAL_ID:
case InnerSolidRectangleEditPart.VISUAL_ID:
case InnerSolidEllipseEditPart.VISUAL_ID:
break; // pure design element
case SolidLineCommentEditPart.VISUAL_ID:
if (SolidLineEditPart.VISUAL_ID != DesignVisualIDRegistry.getVisualID(containerView) || containerView.getElement() != domainElement) {
return null; // wrong container
}
break;
default:
return null;
}
}
}
return getNodeViewClass(containerView, visualID);
}
/**
* @generated
*/
protected Class getNodeViewClass(View containerView, int visualID) {
if (containerView == null || !DesignVisualIDRegistry.canCreateNode(containerView, visualID)) {
return null;
}
switch (visualID) {
case SolidRectangleEditPart.VISUAL_ID:
return SolidRectangleViewFactory.class;
case SolidEllipseEditPart.VISUAL_ID:
return SolidEllipseViewFactory.class;
case CustomNodeEditPart.VISUAL_ID:
return CustomNodeViewFactory.class;
case InnerSolidRectangleEditPart.VISUAL_ID:
return InnerSolidRectangleViewFactory.class;
case InnerSolidEllipseEditPart.VISUAL_ID:
return InnerSolidEllipseViewFactory.class;
case SolidLineCommentEditPart.VISUAL_ID:
return SolidLineCommentViewFactory.class;
}
return null;
}
/**
* @generated
*/
protected Class getEdgeViewClass(IAdaptable semanticAdapter, View containerView, String semanticHint) {
IElementType elementType = getSemanticElementType(semanticAdapter);
if (!DesignElementTypes.isKnownElementType(elementType) || (!(elementType instanceof IHintedType))) {
return null; // foreign element type
}
String elementTypeHint = ((IHintedType) elementType).getSemanticHint();
if (elementTypeHint == null) {
return null; // our hint is visual id and must be specified
}
if (semanticHint != null && !semanticHint.equals(elementTypeHint)) {
return null; // if semantic hint is specified it should be the same as in element type
}
int visualID = DesignVisualIDRegistry.getVisualID(elementTypeHint);
EObject domainElement = getSemanticElement(semanticAdapter);
if (domainElement != null && visualID != DesignVisualIDRegistry.getLinkWithClassVisualID(domainElement)) {
return null; // visual id for link EClass should match visual id from element type
}
return getEdgeViewClass(visualID);
}
/**
* @generated
*/
protected Class getEdgeViewClass(int visualID) {
switch (visualID) {
case SolidLineEditPart.VISUAL_ID:
return SolidLineViewFactory.class;
}
return null;
}
/**
* @generated
*/
private IElementType getSemanticElementType(IAdaptable semanticAdapter) {
if (semanticAdapter == null) {
return null;
}
return (IElementType) semanticAdapter.getAdapter(IElementType.class);
}
}