/******************************************************************************* * 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; } }