blob: 289cba2e8144d203cd66b6ab0b73f4992d6bc7a5 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2012, 2012 SAP AG.
* 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:
* SAP AG - initial API, implementation and documentation
*
* </copyright>
*/
package org.eclipse.graphiti.examples.filesystem.features;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.graphiti.examples.mm.filesystem.File;
import org.eclipse.graphiti.examples.mm.filesystem.Filesystem;
import org.eclipse.graphiti.examples.mm.filesystem.Folder;
import org.eclipse.graphiti.features.ICreateConnectionFeature;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateConnectionContext;
import org.eclipse.graphiti.features.context.impl.AddConnectionContext;
import org.eclipse.graphiti.features.impl.AbstractCreateConnectionFeature;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.Shape;
public class CreateContainmentConnectionFeature extends AbstractCreateConnectionFeature implements
ICreateConnectionFeature {
public CreateContainmentConnectionFeature(IFeatureProvider fp) {
super(fp, "Containment", "Creates a new containment relation between two folders");
}
public boolean canStartConnection(ICreateConnectionContext context) {
// Defines the start of the connection; allowed are objects that may
// contain other objects
Object domainObject = getBusinessObjectForPictogramElement(context.getSourcePictogramElement());
return domainObject instanceof Folder || domainObject instanceof Filesystem;
}
public boolean canCreate(ICreateConnectionContext context) {
PictogramElement sourcePictogramElement = context.getSourcePictogramElement();
PictogramElement targetPictogramElement = context.getTargetPictogramElement();
if (sourcePictogramElement == null || targetPictogramElement == null) {
return false;
}
Object sourceDomainObject = getBusinessObjectForPictogramElement(sourcePictogramElement);
Object targetDomainObject = getBusinessObjectForPictogramElement(targetPictogramElement);
return (sourceDomainObject instanceof Folder || sourceDomainObject instanceof Filesystem)
&& (targetDomainObject instanceof Folder || targetDomainObject instanceof File);
}
public Connection create(ICreateConnectionContext context) {
Anchor sourceAnchor = context.getSourceAnchor();
Anchor targetAnchor = context.getTargetAnchor();
if (targetAnchor == null) {
// Target destination is somewhere inside structured folder
// representation
Shape shape = (Shape) context.getTargetPictogramElement();
while (shape.getAnchors().isEmpty()) {
shape = shape.getContainer();
}
targetAnchor = shape.getAnchors().get(0);
}
EObject sourceObject = (EObject) getBusinessObjectForPictogramElement(sourceAnchor.getParent());
EObject targetObject = (EObject) getBusinessObjectForPictogramElement(targetAnchor.getParent());
if (sourceObject instanceof Filesystem) {
if (targetObject instanceof Folder) {
((Filesystem) sourceObject).getFolders().add((Folder) targetObject);
} else if (targetObject instanceof File) {
((Filesystem) sourceObject).getFiles().add((File) targetObject);
} else {
throw new IllegalStateException("Filesystem may only contain Folders or Files");
}
} else if (sourceObject instanceof Folder) {
if (targetObject instanceof Folder) {
((Folder) sourceObject).getFolders().add((Folder) targetObject);
} else if (targetObject instanceof File) {
((Folder) sourceObject).getFiles().add((File) targetObject);
} else {
throw new IllegalStateException("Folder may only contain Folders or Files");
}
} else {
throw new IllegalStateException("Unknown container object");
}
AddConnectionContext addContext = new AddConnectionContext(sourceAnchor, targetAnchor);
getFeatureProvider().addIfPossible(addContext);
return null;
}
}