/**
* Copyright (c) 2002-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 - Initial API and implementation
*/
package org.eclipse.emf.mapping.provider;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.UnexecutableCommand;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationWrapper;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptorDecorator;
import org.eclipse.emf.edit.provider.ItemProviderDecorator;
import org.eclipse.emf.mapping.MappedObjectState;
import org.eclipse.emf.mapping.Mapping;
/**
* This is the item provider adpater for a {@link org.eclipse.emf.mapping.Mapping} object.
*/
public class MappedObjectItemProvider
extends
ItemProviderDecorator
implements
IEditingDomainItemProvider,
IStructuredItemContentProvider,
ITreeItemContentProvider,
IItemLabelProvider,
IItemPropertySource
{
protected Mapping mapping;
protected EObject mappedObject;
protected MappedObjectState mappedObjectState;
/**
* This constructs an instance from a factory and a notifier.
*/
public MappedObjectItemProvider(AdapterFactory adapterFactory, EObject mappedObject, Mapping mapping)
{
super(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory());
setDecoratedItemProvider((IChangeNotifier)this.adapterFactory.adapt(mappedObject, IItemLabelProvider.class));
this.mappedObject = mappedObject;
this.mapping = mapping;
mappedObjectState = mapping.getMappingRoot().getMappedObjectState(mappedObject);
mappedObjectState.addListener(this);
}
/**
* This returns the nestedIn of the Mapping.
*/
@Override
public Object getParent(Object object)
{
// Returning null here causes RemoveCommand.create(domain, mappedObjectItemProvider) to be delegated
// to MappedObjectItemProvider.createCommand() and there we return a command to remove mappedObject instead.
//
// return null;
return mapping;
}
@Override
public Collection<?> getElements(Object object)
{
return Collections.EMPTY_LIST;
}
@Override
public Collection<?> getChildren(Object object)
{
return Collections.EMPTY_LIST;
}
@Override
public Collection<?> getNewChildDescriptors(Object object, EditingDomain editingDomain, Object sibling)
{
return Collections.EMPTY_LIST;
}
@Override
public boolean hasChildren(Object object)
{
return false;
}
@Override
public Object getImage(Object object)
{
return super.getImage(mappedObject);
}
@Override
public String getText(Object object)
{
return super.getText(mappedObject);
}
@Override
public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
{
List<IItemPropertyDescriptor> descriptors = super.getPropertyDescriptors(mappedObject);
List<IItemPropertyDescriptor> result = new ArrayList<IItemPropertyDescriptor>();
for (int i = 0; i < descriptors.size(); ++i)
{
result.add(new ItemPropertyDescriptorDecorator(mappedObject, descriptors.get(i)));
}
return result;
}
@Override
public IItemPropertyDescriptor getPropertyDescriptor(Object object, Object propertyId)
{
IItemPropertyDescriptor descriptor = super.getPropertyDescriptor(mappedObject, propertyId);
if (descriptor != null)
{
return new ItemPropertyDescriptorDecorator(mappedObject, descriptor);
}
return null;
}
/**
* This handles notification by delegating to {@link #fireNotifyChanged fireNotifyChanged}.
*/
@Override
public void notifyChanged(Notification msg)
{
if (msg.getFeature() == null)
{
Notification notification = new NotificationWrapper(this, msg);
super.notifyChanged(notification);
}
else
{
super.notifyChanged(msg);
}
}
@Override
public Command createCommand(Object object, EditingDomain editingDomain, Class<? extends Command> commandClass, CommandParameter commandParameter)
{
if (commandClass == org.eclipse.emf.edit.command.DragAndDropCommand.class)
{
return super.createCommand(object, editingDomain, commandClass, commandParameter);
}
else
{
return UnexecutableCommand.INSTANCE;
}
}
public EObject getMappedObject()
{
return mappedObject;
}
public Mapping getMapping()
{
return mapping;
}
@Override
public void dispose()
{
mappedObjectState.removeListener(this);
super.dispose();
}
}