/*******************************************************************************
* Copyright (c) 2014, 2015 Cisco Systems, Inc. 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
*
*******************************************************************************/
package com.cisco.yangide.ext.model.editor.patterns.objects;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.graphiti.features.context.IAddContext;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.features.context.ILayoutContext;
import org.eclipse.graphiti.features.context.ILocationContext;
import org.eclipse.graphiti.features.context.IMoveShapeContext;
import org.eclipse.graphiti.features.context.IResizeShapeContext;
import org.eclipse.graphiti.features.context.impl.AddContext;
import org.eclipse.graphiti.features.context.impl.CreateContext;
import org.eclipse.graphiti.features.context.impl.MoveShapeContext;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.graphiti.pattern.AbstractPattern;
import org.eclipse.graphiti.pattern.IPattern;
import com.cisco.yangide.ext.model.ModelFactory;
import com.cisco.yangide.ext.model.editor.util.LayoutUtil;
import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
public abstract class DomainObjectPattern extends AbstractPattern implements IPattern {
public DomainObjectPattern() {
super(null);
}
@Override
public boolean canLayout(ILayoutContext context) {
return super.canLayout(context) && context.getPictogramElement() instanceof ContainerShape;
}
@Override
public boolean layout(ILayoutContext context) {
if (context.getPictogramElement() instanceof ContainerShape
&& (!(context.getPictogramElement() instanceof Diagram))) {
LayoutUtil.layoutContainerShape((ContainerShape) context.getPictogramElement(), getFeatureProvider());
return true;
}
return false;
}
public abstract EClass getObjectEClass();
protected String getHeaderText(Object obj) {
return getCreateName();
}
@Override
public boolean canCreate(ICreateContext context) {
boolean canCreate = canCreateInitial(context);
while (!canCreate && !(context.getTargetContainer().getContainer() instanceof Diagram)) {
((CreateContext) context).setY(context.getY() + context.getTargetContainer().getGraphicsAlgorithm().getY());
((CreateContext) context).setTargetContainer(context.getTargetContainer().getContainer());
canCreate = canCreateInitial(context);
}
return canCreate;
}
public boolean canCreateInitial(ICreateContext context) {
return canContain(context, context.getTargetContainer());
}
@Override
protected boolean isPatternControlled(PictogramElement pictogramElement) {
Object domainObject = getBusinessObjectForPictogramElement(pictogramElement);
return isMainBusinessObjectApplicable(domainObject);
}
@Override
protected boolean isPatternRoot(PictogramElement pictogramElement) {
Object domainObject = getBusinessObjectForPictogramElement(pictogramElement);
return isMainBusinessObjectApplicable(domainObject);
}
protected EObject createEObject() {
return ModelFactory.eINSTANCE.create(getObjectEClass());
}
@Override
public Object[] create(ICreateContext context) {
EObject newDomainObject = createEObject();
ContainerShape con = context.getTargetContainer();
addGraphicalRepresentation(context, newDomainObject);
getDiagram().eResource().getContents().add(newDomainObject);
YangModelUtil.add(getBusinessObjectForPictogramElement(con), newDomainObject, YangModelUIUtil
.getPositionInParent(context.getTargetContainer(), context.getY(), getFeatureProvider()));
return new Object[] { newDomainObject };
}
protected boolean canContain(ILocationContext context, ContainerShape shape, Object n) {
Object parent = getBusinessObjectForPictogramElement(shape);
if (null != parent && YangModelUtil.canContain(parent) && YangModelUtil.canContain(parent, n)) {
setFeedBackPosition(context, shape);
return true;
}
return false;
}
protected boolean canContain(ILocationContext context, ContainerShape shape) {
Object parent = getBusinessObjectForPictogramElement(shape);
if (null != parent && YangModelUtil.canContain(parent) && parent instanceof EObject
&& YangModelUtil.canContain(((EObject) parent).eClass(), getObjectEClass())) {
setFeedBackPosition(context, shape);
return true;
}
return false;
}
@Override
public boolean canMoveShape(IMoveShapeContext context) {
boolean canMove = canMoveInitial(context);
while (!canMove && !(context.getTargetContainer().getContainer() instanceof Diagram)) {
((MoveShapeContext) context)
.setY(context.getY() + context.getTargetContainer().getGraphicsAlgorithm().getY());
((MoveShapeContext) context).setTargetContainer(context.getTargetContainer().getContainer());
canMove = canMoveInitial(context);
}
return canMove;
}
public boolean canMoveInitial(IMoveShapeContext context) {
if (context.getTargetContainer() == context.getSourceContainer()) {
setFeedBackPosition(context, context.getTargetContainer());
return true;
}
return canContain(context, context.getTargetContainer(),
getBusinessObjectForPictogramElement(context.getPictogramElement()));
}
@Override
public void moveShape(IMoveShapeContext context) {
super.moveShape(context);
if (!(context.getTargetContainer() instanceof Diagram && context.getSourceContainer() instanceof Diagram)) {
int pos = YangModelUtil.getPositionInParent(
getBusinessObjectForPictogramElement(context.getSourceContainer()),
getBusinessObjectForPictogramElement(context.getPictogramElement()));
int newPos = YangModelUIUtil.getPositionInParent(context.getTargetContainer(),
(Shape) context.getPictogramElement(), getFeatureProvider());
if (context.getTargetContainer() != context.getSourceContainer() || pos != newPos) {
YangModelUtil.move(getBusinessObjectForPictogramElement(context.getSourceContainer()),
getBusinessObjectForPictogramElement(context.getTargetContainer()),
getBusinessObjectForPictogramElement(context.getPictogramElement()), newPos);
if (!(context.getTargetContainer() instanceof Diagram)) {
layoutPictogramElement(context.getTargetContainer());
}
}
}
LayoutUtil.layoutDiagramConnections(getFeatureProvider());
}
@Override
public void resizeShape(IResizeShapeContext context) {
super.resizeShape(context);
layoutPictogramElement(context.getPictogramElement());
if (!(context.getShape().getContainer() instanceof Diagram)) {
layoutPictogramElement(context.getShape().getContainer());
}
}
@Override
public boolean isMainBusinessObjectApplicable(Object mainBusinessObject) {
return checkEClass(mainBusinessObject);
}
@Override
public boolean canAdd(IAddContext context) {
boolean canAdd = canAddInitial(context);
while (!canAdd && !(context.getTargetContainer().getContainer() instanceof Diagram)) {
((AddContext) context).setY(context.getY() + context.getTargetContainer().getGraphicsAlgorithm().getY());
((AddContext) context).setTargetContainer(context.getTargetContainer().getContainer());
canAdd = canAddInitial(context);
}
return canAdd;
}
public boolean canAddInitial(IAddContext context) {
Object parent = getBusinessObjectForPictogramElement(context.getTargetContainer());
return canContain(context, context.getTargetContainer(), context.getNewObject())
&& checkEClass(context.getNewObject()) && null != parent
&& YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(), parent);
}
@Override
public PictogramElement add(IAddContext context) {
PictogramElement result = YangModelUIUtil.drawPictogramElement(context, getFeatureProvider(),
getCreateImageId(), getHeaderText(context.getNewObject()));
YangModelUIUtil.updateConnections((EObject) context.getNewObject(), getFeatureProvider());
return result;
}
protected boolean checkEClass(Object obj) {
return obj instanceof EObject && getObjectEClass().isSuperTypeOf(((EObject) obj).eClass());
}
@Override
public String getCreateDescription() {
return "Creates new " + getCreateName() + " object";
}
protected void setFeedBackPosition(ILocationContext context, ContainerShape parent) {
context.putProperty("parent", parent);
context.putProperty("parent_position",
YangModelUIUtil.getPositionInParent(parent, context.getY(), getFeatureProvider()));
}
}