blob: 52025b6cab6206caf65b14291de9b3fa41b23093 [file] [log] [blame]
///------------------------------------------------------------------------------
// 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;
}
}
}