package org.eclipse.uml2.diagram.timing.providers; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.ecore.EObject; 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; import org.eclipse.uml2.diagram.timing.edit.parts.DBlockDisplayNameEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DBlockEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DFrameContainerEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DFrameDisplayNameEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DFrameEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DIntervalDurationEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DIntervalEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DMessageDisplayNameEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DMessageEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DSegmentEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DSegmentEndEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DSegmentMiddlePointEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DSegmentStartEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DStateSwitchEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DTickEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DValueLineDisplayNameEditPart; import org.eclipse.uml2.diagram.timing.edit.parts.DValueLineEditPart; import org.eclipse.uml2.diagram.timing.part.TimingDVisualIDRegistry; import org.eclipse.uml2.diagram.timing.view.factories.DBlockDisplayNameViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DBlockViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DFrameContainerViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DFrameDisplayNameViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DFrameViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DIntervalDurationViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DIntervalViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DMessageDisplayNameViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DMessageViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DSegmentEndViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DSegmentMiddlePointViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DSegmentStartViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DSegmentViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DStateSwitchViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DTickViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DValueLineDisplayNameViewFactory; import org.eclipse.uml2.diagram.timing.view.factories.DValueLineViewFactory; /** * @generated */ public class TimingDViewProvider extends AbstractViewProvider { /** * @generated */ protected Class getDiagramViewClass(IAdaptable semanticAdapter, String diagramKind) { EObject semanticElement = getSemanticElement(semanticAdapter); if (DFrameContainerEditPart.MODEL_ID.equals(diagramKind) && TimingDVisualIDRegistry.getDiagramVisualID(semanticElement) != -1) { return DFrameContainerViewFactory.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 = TimingDVisualIDRegistry.getNodeVisualID(containerView, domainElement); } else { visualID = TimingDVisualIDRegistry.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 (!TimingDElementTypes.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 && !TimingDVisualIDRegistry.checkNodeVisualID(containerView, domainElement, visualID)) { return null; // visual id for node EClass should match visual id from element type, or at least be substitutable for it } } else { // Element type is not specified. Domain element should be present. // 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 (!DFrameContainerEditPart.MODEL_ID.equals(TimingDVisualIDRegistry.getModelID(containerView))) { return null; // foreign diagram } switch (visualID) { case DFrameEditPart.VISUAL_ID: case DBlockEditPart.VISUAL_ID: case DValueLineEditPart.VISUAL_ID: case DSegmentEditPart.VISUAL_ID: case DSegmentMiddlePointEditPart.VISUAL_ID: case DSegmentStartEditPart.VISUAL_ID: case DSegmentEndEditPart.VISUAL_ID: case DTickEditPart.VISUAL_ID: if (domainElement == null || visualID != TimingDVisualIDRegistry.getNodeVisualID(containerView, domainElement)) { return null; // visual id in semantic hint should match visual id for domain element } break; case DFrameDisplayNameEditPart.VISUAL_ID: if (DFrameEditPart.VISUAL_ID != TimingDVisualIDRegistry.getVisualID(containerView) || containerView.getElement() != domainElement) { return null; // wrong container } break; case DBlockDisplayNameEditPart.VISUAL_ID: if (DBlockEditPart.VISUAL_ID != TimingDVisualIDRegistry.getVisualID(containerView) || containerView.getElement() != domainElement) { return null; // wrong container } break; case DValueLineDisplayNameEditPart.VISUAL_ID: if (DValueLineEditPart.VISUAL_ID != TimingDVisualIDRegistry.getVisualID(containerView) || containerView.getElement() != domainElement) { return null; // wrong container } break; case DMessageDisplayNameEditPart.VISUAL_ID: if (DMessageEditPart.VISUAL_ID != TimingDVisualIDRegistry.getVisualID(containerView) || containerView.getElement() != domainElement) { return null; // wrong container } break; case DIntervalDurationEditPart.VISUAL_ID: if (DIntervalEditPart.VISUAL_ID != TimingDVisualIDRegistry.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 || !TimingDVisualIDRegistry.canCreateNode(containerView, visualID)) { return null; } switch (visualID) { case DFrameEditPart.VISUAL_ID: return DFrameViewFactory.class; case DFrameDisplayNameEditPart.VISUAL_ID: return DFrameDisplayNameViewFactory.class; case DBlockEditPart.VISUAL_ID: return DBlockViewFactory.class; case DBlockDisplayNameEditPart.VISUAL_ID: return DBlockDisplayNameViewFactory.class; case DValueLineEditPart.VISUAL_ID: return DValueLineViewFactory.class; case DValueLineDisplayNameEditPart.VISUAL_ID: return DValueLineDisplayNameViewFactory.class; case DSegmentEditPart.VISUAL_ID: return DSegmentViewFactory.class; case DSegmentMiddlePointEditPart.VISUAL_ID: return DSegmentMiddlePointViewFactory.class; case DSegmentStartEditPart.VISUAL_ID: return DSegmentStartViewFactory.class; case DSegmentEndEditPart.VISUAL_ID: return DSegmentEndViewFactory.class; case DTickEditPart.VISUAL_ID: return DTickViewFactory.class; case DMessageDisplayNameEditPart.VISUAL_ID: return DMessageDisplayNameViewFactory.class; case DIntervalDurationEditPart.VISUAL_ID: return DIntervalDurationViewFactory.class; } return null; } /** * @generated */ protected Class getEdgeViewClass(IAdaptable semanticAdapter, View containerView, String semanticHint) { IElementType elementType = getSemanticElementType(semanticAdapter); if (!TimingDElementTypes.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 = TimingDVisualIDRegistry.getVisualID(elementTypeHint); EObject domainElement = getSemanticElement(semanticAdapter); if (domainElement != null && visualID != TimingDVisualIDRegistry.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 DStateSwitchEditPart.VISUAL_ID: return DStateSwitchViewFactory.class; case DMessageEditPart.VISUAL_ID: return DMessageViewFactory.class; case DIntervalEditPart.VISUAL_ID: return DIntervalViewFactory.class; } return null; } /** * @generated */ private IElementType getSemanticElementType(IAdaptable semanticAdapter) { if (semanticAdapter == null) { return null; } return (IElementType) semanticAdapter.getAdapter(IElementType.class); } }