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