/******************************************************************************* * Copyright (c) 2013, 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.provider; import java.util.List; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.compare.provider.spec.OverlayImageProvider; import org.eclipse.emf.edit.provider.ComposeableAdapterFactory; import org.eclipse.emf.edit.provider.ItemProviderDecorator; /** * And extended {@link ItemProviderDecorator} that provides an {@link OverlayImageProvider} and and * {@link ExtendedAdapterFactoryItemDelegator}. * * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a> * @since 4.0 */ public class ExtendedItemProviderDecorator extends ItemProviderDecorator implements Adapter.Internal { /** The item delegator to reuse root adapter factory (if any). */ private final ExtendedAdapterFactoryItemDelegator itemDelegator; /** The image provider used with this item provider. */ private final OverlayImageProvider overlayProvider; /** The list of target notifier we are installed on. */ private final List<Notifier> targets; /** * An instance is created from an adapter factory. The factory is used as a key so that we always know * which factory created this adapter. * * @param adapterFactory * the adapter factory to use to adapt. */ public ExtendedItemProviderDecorator(ComposeableAdapterFactory adapterFactory) { super(adapterFactory); itemDelegator = new ExtendedAdapterFactoryItemDelegator(adapterFactory.getRootAdapterFactory()); overlayProvider = new OverlayImageProvider(EMFCompareEditPlugin.INSTANCE.getPluginResourceLocator()); targets = new BasicEList.FastCompare<Notifier>(); } /** * Returns the overlay provider. * * @return the overlayProvider */ protected OverlayImageProvider getOverlayProvider() { return overlayProvider; } /** * Returns the itemDelegator. * * @return the itemDelegator */ protected ExtendedAdapterFactoryItemDelegator getItemDelegator() { return itemDelegator; } /** * {@inheritDoc} * * @see org.eclipse.emf.common.notify.Adapter#getTarget() */ public Notifier getTarget() { return null; } /** * {@inheritDoc} * * @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier) */ public void setTarget(Notifier newTarget) { targets.add(newTarget); } /** * {@inheritDoc} * * @see org.eclipse.emf.common.notify.Adapter.Internal#unsetTarget(org.eclipse.emf.common.notify.Notifier) */ public void unsetTarget(Notifier oldTarget) { targets.remove(oldTarget); } /** * {@inheritDoc} * * @see org.eclipse.emf.edit.provider.ItemProviderDecorator#dispose() */ @Override public void dispose() { for (Notifier otherTarget : targets) { otherTarget.eAdapters().remove(this); } targets.clear(); super.dispose(); } }