| /******************************************************************************* |
| * 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 java.util.List; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EReference; |
| |
| /** |
| * A container which allows you to re-map the target object for other containers. |
| * |
| * In particular, this class allows you to specify a single-valued EReference feature |
| * and use the value read from that as the target object. |
| */ |
| public class IndirectContainer extends AbstractContainer { |
| |
| protected EReference fIndirectionFeature; |
| protected AbstractContainer fInnerContainer; |
| |
| /** |
| * Brand new shiny IndirectContainer |
| * @param feature |
| * @param innerContainer |
| */ |
| public IndirectContainer (EReference feature, AbstractContainer innerContainer) { |
| if (feature.isMany()) throw new IllegalArgumentException(); |
| this.fIndirectionFeature = feature; |
| this.fInnerContainer = innerContainer; |
| } |
| |
| protected EObject getTarget(Object object) { |
| return (EObject)((EObject)object).eGet(fIndirectionFeature); |
| } |
| |
| // TODO: this is kind of a hack. We shouldn't need to know it's an AbstractContainer :( |
| |
| @Override |
| protected boolean isValidChild(EObject object, EObject child) { |
| return fInnerContainer.isValidChild(object, child); |
| } |
| |
| /** |
| * @param object |
| * @param child |
| * @param insertBefore |
| * @return |
| * @see org.eclipse.bpel.ui.adapters.IContainer#addChild(java.lang.Object, java.lang.Object, java.lang.Object) |
| */ |
| |
| public boolean addChild(EObject object, EObject child, EObject insertBefore) { |
| EObject target = getTarget(object); |
| return (target == null)? false : fInnerContainer.addChild(target, child, insertBefore); |
| } |
| |
| /** |
| * @param object |
| * @return the list of children. |
| * @see org.eclipse.bpel.ui.adapters.IContainer#getChildren(java.lang.Object) |
| */ |
| |
| public List<EObject> getChildren (EObject object) { |
| EObject target = getTarget(object); |
| if (target == null) { |
| return Collections.emptyList(); |
| } |
| return fInnerContainer.getChildren(target); |
| } |
| |
| /** |
| * @param object |
| * @param child |
| * @return |
| * @see org.eclipse.bpel.ui.adapters.IContainer#removeChild(java.lang.Object, java.lang.Object) |
| */ |
| |
| public boolean removeChild(EObject object, EObject child) { |
| EObject target = getTarget(object); |
| if (target == null) { |
| return false; |
| } |
| return fInnerContainer.removeChild(target, child); |
| } |
| |
| /** |
| * @param object |
| * @param oldChild |
| * @param newChild |
| * @return |
| * @see org.eclipse.bpel.ui.adapters.IContainer#replaceChild(java.lang.Object, java.lang.Object, java.lang.Object) |
| */ |
| public boolean replaceChild(EObject object, EObject oldChild, EObject newChild) { |
| EObject target = getTarget(object); |
| if (target == null) { |
| return false; |
| } |
| return fInnerContainer.replaceChild(target, oldChild, newChild); |
| } |
| |
| /** |
| * @param object |
| * @param child |
| * @return |
| * @see org.eclipse.bpel.ui.adapters.IContainer#canRemoveChild(java.lang.Object, java.lang.Object) |
| */ |
| public boolean canRemoveChild (EObject object, EObject child) { |
| EObject target = getTarget(object); |
| if (target == null) { |
| return false; |
| } |
| return fInnerContainer.canRemoveChild(target, child); |
| } |
| |
| |
| } |