///------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 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 implementation //------------------------------------------------------------------------------ package org.eclipse.epf.library.edit.util; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.edit.command.CommandParameter; import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider; import org.eclipse.emf.edit.provider.IDisposable; import org.eclipse.emf.edit.provider.IWrapperItemProvider; /** * Manages wrappers of an item provider * * @author Phong Nguyen Le - Feb 15, 2006 * @since 1.0 */ public class WrapperManager implements IDisposable { private HashMap valueToWrapperMap; private AdapterFactory adapterFactory; /** * */ public WrapperManager(AdapterFactory adapterFactory) { super(); this.adapterFactory = adapterFactory; } public Object getWrapper(Object value) { if(valueToWrapperMap != null) { return valueToWrapperMap.get(value); } return null; } public Collection getWrappers() { if(valueToWrapperMap != null) { return valueToWrapperMap.values(); } else { return Collections.EMPTY_LIST; } } /** * Creates a new instance of this wrapper for the given value, owner, and adapter factory. */ protected IWrapperItemProvider createWrapper(Object value, Object owner, AdapterFactory adapterFactory) { return new DelegatingWrapperItemProvider(value, owner, null, CommandParameter.NO_INDEX, adapterFactory); } public void update(Collection delegateValues) { boolean changed = false; Set oldDelegateValues = delegateValues != null ? new HashSet(delegateValues) : Collections.EMPTY_SET; if (valueToWrapperMap == null && !delegateValues.isEmpty()) { valueToWrapperMap = new HashMap(); } // Wrap any new children and add them to the map. Remove each current child from the set of old children. // for (Iterator i = delegateValues.iterator(); i.hasNext(); ) { Object child = i.next(); if (!valueToWrapperMap.containsKey(child)) { IWrapperItemProvider wrapper = createWrapper(child, this, adapterFactory); valueToWrapperMap.put(child, wrapper); changed = true; } oldDelegateValues.remove(child); } // Remove and dispose any wrappers for remaining old children. // if (!oldDelegateValues.isEmpty()) { changed = true; for (Iterator i = oldDelegateValues.iterator(); i.hasNext(); ) { Object child = i.next(); IWrapperItemProvider wrapper = (IWrapperItemProvider)valueToWrapperMap.remove(child); if (wrapper != null) { wrapper.dispose(); } } } // If any children were added or removed, reset the indices. if (changed) { int index = 0; for (Iterator i = delegateValues.iterator(); i.hasNext(); index++) { ((IWrapperItemProvider)valueToWrapperMap.get(i.next())).setIndex(index); } } } /* (non-Javadoc) * @see org.eclipse.emf.edit.provider.IDisposable#dispose() */ public void dispose() { if (valueToWrapperMap != null) { for (Iterator i = valueToWrapperMap.values().iterator(); i.hasNext();) { ((IDisposable)i.next()).dispose(); } valueToWrapperMap.clear(); valueToWrapperMap = null; } } }