/*******************************************************************************
* Copyright (c) 2014 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.uml2.internal.provider.decorator;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.edit.provider.DecoratorAdapterFactory;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.emf.edit.provider.IItemProviderDecorator;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.edit.providers.UMLItemProviderAdapterFactory;
/**
* Decorator adapter factory for UML stereotyped element.
*
* @author <a href="mailto:arthur.daussy@obeo.fr">Arthur Daussy</a>
*/
public class UMLProfileItemProviderAdapterFactoryDecorator extends DecoratorAdapterFactory {
/**
* Map holding the {@link IItemProviderDecorator}s that decorate an
* {@link org.eclipse.emf.edit.provider.ItemProvider} of a stereotyped element.
*/
private Map<Object, IItemProviderDecorator> stereotypeItemProviderDecorators = new HashMap<Object, IItemProviderDecorator>();
/**
* Constructor.
*/
public UMLProfileItemProviderAdapterFactoryDecorator() {
super(new UMLItemProviderAdapterFactory());
}
@Override
public Object adapt(Object target, Object type) {
if (isStereotypedElement(target)) {
final Object adapter = decoratedAdapterFactory.adapt(target, type);
if (adapter instanceof IChangeNotifier) {
IItemProviderDecorator itemProviderDecorator = stereotypeItemProviderDecorators.get(adapter);
if (itemProviderDecorator == null) {
itemProviderDecorator = createStereotypeElementItemProvider();
stereotypeItemProviderDecorators.put(adapter, itemProviderDecorator);
itemProviderDecorator.setDecoratedItemProvider((IChangeNotifier)adapter);
}
return itemProviderDecorator;
}
}
return super.adapt(target, type);
}
/**
* Creates a new {@link IItemProviderDecorator} for a stereotyped element.
*
* @return {@link IItemProviderDecorator}.
*/
protected IItemProviderDecorator createStereotypeElementItemProvider() {
return new StereotypedElementItemProviderDecorator(this);
}
/**
* Returns <code>true</code> if the target is an UML {@link Element} with stereotypes.
*
* @param target
* Object to test.
* @return <code>true</code> if the input is a stereotyped {@link Element}.
*/
private boolean isStereotypedElement(Object target) {
return target instanceof Element && !((Element)target).getAppliedStereotypes().isEmpty();
}
@Override
protected IItemProviderDecorator createItemProviderDecorator(Object target, Object type) {
return new ForwardingItemProviderAdapterDecorator(this);
}
@Override
public void dispose() {
for (Object object : stereotypeItemProviderDecorators.values()) {
if (object instanceof IDisposable) {
((IDisposable)object).dispose();
}
}
super.dispose();
}
}