/**
* 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.action;
import java.util.Collection;
import java.util.EventObject;
import java.util.HashSet;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.edit.command.CommandActionDelegate;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.ui.action.CommandAction;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.emf.mapping.Mapping;
import org.eclipse.emf.mapping.MappingPlugin;
import org.eclipse.emf.mapping.MappingRoot;
import org.eclipse.emf.mapping.command.CreateMappingCommand;
import org.eclipse.emf.mapping.command.TypeMatchMappingCommand;
import org.eclipse.emf.mapping.domain.MappingDomain;
import org.eclipse.emf.mapping.presentation.IComposedSelection;
import org.eclipse.emf.mapping.presentation.MappingUIPlugin;
/**
*/
public class TypeMatchMappingAction extends CommandAction implements CommandStackListener
{
@Override
public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart)
{
if (editingDomain != null)
{
editingDomain.getCommandStack().removeCommandStackListener(this);
}
super.setActiveWorkbenchPart(workbenchPart);
if (editingDomain != null)
{
editingDomain.getCommandStack().addCommandStackListener(this);
}
}
public void commandStackChanged(EventObject event)
{
selectionChanged(action, ((ISelectionProvider)workbenchPart).getSelection());
}
@Override
public void selectionChanged(IAction action, ISelection selection)
{
if (selection instanceof IComposedSelection)
{
super.selectionChanged(action,((IComposedSelection)selection).getCombinedSelection());
}
else
{
super.selectionChanged(action, selection);
}
}
/**
* This returns the image that is used if the command does not provide an override.
*/
protected Object getDefaultImage()
{
return MappingUIPlugin.getPlugin().getImage("full/etool16/MatchByType");
}
public static class DelegateCommand extends CompoundCommand implements CommandActionDelegate
{
protected MappingDomain mappingDomain;
protected Collection<?> collection;
protected Command createMappingCommand;
public DelegateCommand(EditingDomain editingDomain, CommandParameter commandParameter)
{
super
(MappingUIPlugin.getPlugin().getString("_UI_TypeMatchMappingAction_label"),
MappingUIPlugin.getPlugin().getString("_UI_TypeMatchMappingAction_description"));
collection = commandParameter.getCollection();
mappingDomain = (MappingDomain)editingDomain;
}
@Override
protected boolean prepare()
{
boolean result = false;
if (collection != null)
{
Collection<Object> mappedObjects = new HashSet<Object>();
Collection<Object> mappingObjects = new HashSet<Object>();
MappingRoot mappingRoot = mappingDomain.getMappingRoot();
for (Object object : collection)
{
if (object instanceof Mapping)
{
appendIfCanExecute(TypeMatchMappingCommand.create(mappingDomain, (Mapping)object));
mappingObjects.add(object);
}
else if (mappingRoot.isInputObject(object) || mappingRoot.isOutputObject(object))
{
mappedObjects.add(object);
}
}
if (!mappedObjects.isEmpty())
{
Collection<? extends Mapping> mappings = mappingRoot.getAllMappings(mappedObjects);
switch (mappings.size())
{
case 0:
{
createMappingCommand = CreateMappingCommand.create(mappingDomain, mappedObjects);
result = appendIfCanExecute(createMappingCommand);
break;
}
case 1:
{
result = appendIfCanExecute(TypeMatchMappingCommand.create(mappingDomain, mappings.iterator().next()));
break;
}
default:
{
break;
}
}
}
}
result = result || !isEmpty();
return result;
}
@Override
public void execute()
{
super.execute();
if (createMappingCommand != null)
{
appendAndExecute(TypeMatchMappingCommand.create(mappingDomain, (Mapping)createMappingCommand.getResult().iterator().next()));
}
}
/**
* This returns the icon, if any, of the action.
*/
public Object getImage()
{
return "Placeholder";
}
public String getText()
{
return getLabel();
}
/**
* This returns the tool tip text, if any, of the action.
*/
public String getToolTipText()
{
return getDescription();
}
@Override
public void dispose()
{
if (createMappingCommand != null)
{
createMappingCommand.dispose();
}
super.dispose();
}
}
@Override
protected ImageDescriptor objectToImageDescriptor(Object object)
{
((Action)action).setHoverImageDescriptor
(ExtendedImageRegistry.getInstance().getImageDescriptor(MappingPlugin.getPlugin().getImage("full/ctool16/MatchByType")));
((Action)action).setDisabledImageDescriptor
(ExtendedImageRegistry.getInstance().getImageDescriptor(MappingPlugin.getPlugin().getImage("full/dtool16/MatchByType")));
return
ExtendedImageRegistry.getInstance().getImageDescriptor(MappingPlugin.getPlugin().getImage("full/etool16/MatchByType"));
}
/**
* Match the command for this action
*/
@Override
protected Command createActionCommand(EditingDomain editingDomain, final Collection<?> collection)
{
return editingDomain.createCommand(DelegateCommand.class, new CommandParameter(null, null, collection));
}
}