/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.transformation.ui.part;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.gef.EditPart;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
import org.teiid.designer.diagram.ui.connection.AnchorManager;
import org.teiid.designer.diagram.ui.connection.ChopBoxAnchorManager;
import org.teiid.designer.diagram.ui.connection.NodeConnectionEditPart;
import org.teiid.designer.diagram.ui.figure.DiagramFigureFactory;
import org.teiid.designer.diagram.ui.model.DiagramModelNode;
import org.teiid.designer.diagram.ui.model.LabelModelNode;
import org.teiid.designer.diagram.ui.notation.NotationPartGenerator;
import org.teiid.designer.diagram.ui.notation.uml.model.UmlClassifierNode;
import org.teiid.designer.diagram.ui.notation.uml.part.UmlClassifierEditPart;
import org.teiid.designer.diagram.ui.part.AbstractDiagramEditPart;
import org.teiid.designer.diagram.ui.part.AbstractDiagramEditPartFactory;
import org.teiid.designer.diagram.ui.part.DiagramEditPart;
import org.teiid.designer.diagram.ui.part.LabelEditPart;
import org.teiid.designer.diagram.ui.util.DiagramUiUtilities;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.transformation.ui.PluginConstants;
import org.teiid.designer.transformation.ui.UiConstants;
import org.teiid.designer.transformation.ui.actions.TransformationSourceManager;
import org.teiid.designer.transformation.ui.connection.TransformationAnchorManager;
import org.teiid.designer.transformation.ui.connection.TransformationLink;
import org.teiid.designer.transformation.ui.figure.TransformationDiagramFigureFactory;
import org.teiid.designer.transformation.ui.model.TransformationDiagramNode;
import org.teiid.designer.transformation.ui.model.TransformationNode;
import org.teiid.designer.transformation.util.TransformationHelper;
/**
* TransformationPartFactory
*
* @since 8.0
*/
public class TransformationDiagramPartFactory extends AbstractDiagramEditPartFactory implements UiConstants {
private DiagramFigureFactory figureFactory;
private static final String diagramTypeId = PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID;
/**
* @see org.eclipse.gef.EditPartFactory#createEditPart(EditPart, Object)
**/
@Override
public EditPart createEditPart( EditPart iContext,
Object iModel ) {
EditPart editPart = null;
if (figureFactory == null) figureFactory = new TransformationDiagramFigureFactory();
if (iModel instanceof TransformationDiagramNode) {
editPart = new TransformationDiagramEditPart();
((AbstractDiagramEditPart)editPart).setFigureFactory(figureFactory);
Object transform = getTransformation(iModel);
if (transform != null) {
((TransformationDiagramEditPart)editPart).setDropHelper(new TransformationDropEditPartHelper(transform));
}
} else if (iModel instanceof TransformationNode) {
editPart = new TransformationEditPart(diagramTypeId);
((AbstractDiagramEditPart)editPart).setFigureFactory(figureFactory);
((DiagramEditPart)editPart).setResizable(false);
Object transform = getTransformation(iModel);
if (transform != null) {
((TransformationEditPart)editPart).setDropHelper(new TransformationDropEditPartHelper(transform));
}
} else if (iModel instanceof LabelModelNode) {
editPart = new LabelEditPart();
((DiagramEditPart)editPart).setResizable(false);
} else if (iModel instanceof TransformationLink) {
editPart = getConnectionEditPart(iModel);
} else {
// Here's where we get the notation manager and tell it to create an EditPart
// for this modelObject. So it'll come back in whatever "Notation" it desires.
NotationPartGenerator generator = DiagramUiPlugin.getDiagramNotationManager().getEditPartGenerator(getNotationId());
if (generator != null) {
editPart = generator.createEditPart(iContext, iModel, diagramTypeId);
} else {
ModelerCore.Util.log(IStatus.ERROR, Util.getString(DiagramUiConstants.Errors.PART_GENERATOR_FAILURE)
+ " Model Object = " + iModel); //$NON-NLS-1$
}
}
if (editPart != null) {
if (editPart instanceof UmlClassifierEditPart) {
Object transform = getTransformation(iModel);
if (transform != null) {
((UmlClassifierEditPart)editPart).setDropHelper(new TransformationDropEditPartHelper(transform));
}
}
if (editPart instanceof NodeConnectionEditPart) {
editPart.setModel(iModel);
((NodeConnectionEditPart)editPart).setSourceAndTarget(iContext);
} else if (editPart instanceof DiagramEditPart) {
editPart.setModel(iModel);
((DiagramEditPart)editPart).setNotationId(getNotationId());
((DiagramEditPart)editPart).setSelectionHandler(getSelectionHandler());
((DiagramEditPart)editPart).setDiagramTypeId(diagramTypeId);
}
} else {
ModelerCore.Util.log(IStatus.ERROR, Util.getString(DiagramUiConstants.Errors.EDIT_PART_FAILURE)
+ " Model Object = " + iModel); //$NON-NLS-1$);
}
if (editPart instanceof DiagramEditPart) {
((DiagramEditPart)editPart).setUnderConstruction(true);
}
return editPart;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.part.DiagramEditPartFactory#getConnectionEditPart()
*/
public NodeConnectionEditPart getConnectionEditPart( Object iModel ) {
return new TransformationLinkEditPart();
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.part.DiagramEditPartFactory#getAnchorManager(org.teiid.designer.diagram.ui.part.DiagramEditPart)
*/
@Override
public AnchorManager getAnchorManager( DiagramEditPart editPart ) {
if (editPart instanceof TransformationEditPart) {
return new ChopBoxAnchorManager(editPart);
}
return new TransformationAnchorManager(editPart);
}
private Object getTransformation( Object iModel ) {
if (iModel instanceof TransformationDiagramNode) {
Diagram diagram = (Diagram)((TransformationDiagramNode)iModel).getModelObject();
if (diagram != null) return TransformationSourceManager.getTransformationFromDiagram(diagram);
} else if (iModel instanceof TransformationNode) {
return ((TransformationNode)iModel).getModelObject();
} else if (iModel instanceof UmlClassifierNode) {
// check to see if it's the "Target"
DiagramModelNode parentClassifierNode = DiagramUiUtilities.getClassifierParentNode((DiagramModelNode)iModel);
if (parentClassifierNode != null) {
Object thisTransform = null;
if (TransformationHelper.isValidSqlTransformationTarget(parentClassifierNode.getModelObject())) {
thisTransform = TransformationHelper.getTransformationMappingRoot(parentClassifierNode.getModelObject());
if (thisTransform != null) {
// Now we get the parent (DiagramEditPart)
TransformationDiagramNode tdep = (TransformationDiagramNode)parentClassifierNode.getParent();
Diagram diagram = (Diagram)tdep.getModelObject();
if (diagram != null) {
Object diagramTransform = TransformationSourceManager.getTransformationFromDiagram(diagram);
if (diagramTransform != null && diagramTransform.equals(thisTransform)) return thisTransform;
}
}
}
// Now we check for is Virtual?
}
}
return null;
}
}