blob: 832d6f4c70ef50d9fa09d7eaaf25b109b7dafba6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.adapters.delegates;
import java.util.Collections;
import org.eclipse.bpel.model.Activity;
import org.eclipse.bpel.model.BPELFactory;
import org.eclipse.bpel.model.Sequence;
import org.eclipse.bpel.model.util.ElementFactory;
import org.eclipse.bpel.ui.BPELEditor;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.w3c.dom.Element;
/**
* An IContainer implementation for containers of a single Activity (such as While and
* ElseIf and RepeatUntil). This container will actually allow multiple children, and will manage the
* necessary implicit sequence without directly exposing it to the code above.
*/
public class ActivityContainer extends ReferenceContainer {
/**
* Brand new shiny ImplicitSequenceContainer
* @param aFeature
*/
public ActivityContainer(EReference aFeature) {
super(aFeature);
}
/**
* @see org.eclipse.bpel.ui.adapters.delegates.ReferenceContainer#addChild(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean addChild (EObject object, EObject newChild, EObject insertBefore) {
Object currentChild = getSingleChild (object);
/** No activity, just set the current activity as the new child */
if (currentChild == null) {
// adding first child.
// For a single child container, insertBefore can't be valid
setSingleChild(object, newChild);
return true;
}
if (currentChild instanceof Sequence) {
Sequence sequence = (Sequence) currentChild;
if (insertBefore == null) {
sequence.getActivities().add( (Activity) newChild );
} else {
sequence.getActivities().add(0, (Activity)newChild);
}
} else {
// already have one child, adding a 2nd one. poof up a sequence.
BPELEditor bpelEditor = ModelHelper.getBPELEditor(object);
Sequence sequence = BPELFactory.eINSTANCE.createSequence();
Element childElement = ElementFactory.getInstance().createElement(sequence, object);
sequence.setElement(childElement);
sequence.setName(BPELUtil.getUniqueModelName(bpelEditor.getProcess(),
Messages.BPELUtil_Sequence_1, Collections.singletonList(sequence)));
// Object originalChild = getSingleChild(object);
// Node parentNode = null;
// if (originalChild instanceof ExtensibleElement) {
// ExtensibleElement child = (ExtensibleElement) originalChild;
// parentNode = child.getElement().getParentNode();
//// removeChild(object, child);
// }
// NOTE: its important that the implicit sequence be added to the model
// *before* we insert the other children in it. Otherwise Undo/Redo
// will not be able to correctly handle changes to the parentage of
// those children.
// if (parentNode != null) {
// parentNode.appendChild(childElement);
// }
setSingleChild(object, sequence);
if (insertBefore==currentChild) {
sequence.getActivities().add( (Activity) newChild);
}
sequence.getActivities().add( (Activity)currentChild);
if (insertBefore != currentChild) {
sequence.getActivities().add((Activity) newChild);
}
}
return true;
}
/**
* @param object
* @param child
* @param insertBefore
* @return if we can add this object
* @see org.eclipse.bpel.ui.adapters.IContainer#canAddObject(java.lang.Object, java.lang.Object, java.lang.Object)
*/
@Override
public boolean canAddObject (EObject object, EObject child, EObject insertBefore) {
return child != null && child instanceof Activity;
}
}