/******************************************************************************* * <copyright> * * Copyright (c) 2005, 2012 SAP AG. * 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: * mwenz - Bug 324859 - initial API, implementation and documentation * mwenz - Bug 389380 - Undo/Redo handling wrong Command executed by undo action * * </copyright> * *******************************************************************************/ package org.eclipse.graphiti.ui.internal.services.impl; import java.util.List; import org.eclipse.emf.common.command.Command; import org.eclipse.gef.commands.CompoundCommand; import org.eclipse.graphiti.IExecutionInfo; import org.eclipse.graphiti.features.IContextHolder; import org.eclipse.graphiti.features.IFeature; import org.eclipse.graphiti.features.IFeatureAndContext; import org.eclipse.graphiti.features.IFeatureHolder; import org.eclipse.graphiti.features.context.IContext; import org.eclipse.graphiti.internal.DefaultFeatureAndContext; import org.eclipse.graphiti.internal.command.CommandContainer; import org.eclipse.graphiti.internal.command.DefaultExecutionInfo; import org.eclipse.graphiti.internal.command.GFPreparableCommand2; import org.eclipse.graphiti.internal.command.ICommand; import org.eclipse.graphiti.tb.IContextEntry; import org.eclipse.graphiti.ui.internal.command.AddModelObjectCommand; import org.eclipse.graphiti.ui.internal.command.ContextEntryCommand; import org.eclipse.graphiti.ui.internal.command.CreateConnectionCommand; import org.eclipse.graphiti.ui.internal.command.GFCommand; import org.eclipse.graphiti.ui.internal.command.GefCommandWrapper; import org.eclipse.graphiti.ui.internal.command.ReconnectCommand; import org.eclipse.graphiti.ui.internal.editor.EmfOnGefCommand; import org.eclipse.graphiti.ui.internal.editor.GefOnEmfCommand; import org.eclipse.graphiti.ui.internal.services.ICommandService; /** * @noinstantiate This class is not intended to be instantiated by clients. * @noextend This class is not intended to be subclassed by clients. */ public class CommandService implements ICommandService { public org.eclipse.emf.common.command.Command transformFromGefToEmfCommand(org.eclipse.gef.commands.Command gefCommand) { if (gefCommand instanceof GefOnEmfCommand) { GefOnEmfCommand gefOnEmfCommand = (GefOnEmfCommand) gefCommand; return gefOnEmfCommand.getEmfCommand(); } return new EmfOnGefCommand(gefCommand); } public org.eclipse.gef.commands.Command transformFromEmfToGefCommand(org.eclipse.emf.common.command.Command emfCommand) { if (emfCommand instanceof EmfOnGefCommand) { EmfOnGefCommand emfOnGefCommand = (EmfOnGefCommand) emfCommand; return emfOnGefCommand.getGefCommand(); } else if (emfCommand instanceof GFPreparableCommand2) { Command command = ((GFPreparableCommand2) emfCommand).getCommand(); return transformFromEmfToGefCommand(command); } return new GefOnEmfCommand(emfCommand); } public DefaultExecutionInfo completeExecutionInfo(DefaultExecutionInfo executionInfo, org.eclipse.gef.commands.Command gefCommand) { if (gefCommand instanceof CompoundCommand) { CompoundCommand compoundCommand = (CompoundCommand) gefCommand; @SuppressWarnings("unchecked") final List<org.eclipse.gef.commands.Command> commands = compoundCommand.getCommands(); for (org.eclipse.gef.commands.Command childCommand : commands) { completeExecutionInfo(executionInfo, childCommand); } } if (gefCommand instanceof CreateConnectionCommand) { CreateConnectionCommand createConnectionCommand = (CreateConnectionCommand) gefCommand; final IFeatureAndContext[] features = createConnectionCommand.getFeaturesAndContexts(); for (IFeatureAndContext feature : features) { executionInfo.addFeatureAndContext(feature); } } if (gefCommand instanceof ReconnectCommand) { ReconnectCommand reconnectCommand = (ReconnectCommand) gefCommand; executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(reconnectCommand.getFeature(), reconnectCommand.getContext())); } if (gefCommand instanceof GefCommandWrapper) { GefCommandWrapper gefCommandWrapper = (GefCommandWrapper) gefCommand; final ICommand graphitiCommand = gefCommandWrapper.getCommand(); completeExecutionInfo(executionInfo, graphitiCommand); } if (gefCommand instanceof GFCommand) { final GFCommand gfCommand = (GFCommand) gefCommand; executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(gfCommand.getFeature(), gfCommand.getContext())); } if (gefCommand instanceof ContextEntryCommand) { ContextEntryCommand cec = (ContextEntryCommand) gefCommand; IContextEntry contextEntry = cec.getContextEntry(); executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(contextEntry.getFeature(), contextEntry.getContext())); } if (gefCommand instanceof AddModelObjectCommand) { AddModelObjectCommand addModelObjectCommand = (AddModelObjectCommand) gefCommand; final IFeatureAndContext[] features = addModelObjectCommand.getFeaturesAndContexts(); for (IFeatureAndContext feature : features) { executionInfo.addFeatureAndContext(feature); } } return executionInfo; } public DefaultExecutionInfo completeExecutionInfo(DefaultExecutionInfo executionInfo, ICommand gfCommand) { if (gfCommand instanceof CommandContainer) { CommandContainer cc = (CommandContainer) gfCommand; final ICommand[] childCommands = cc.getCommands(); for (int i = 0; i < childCommands.length; i++) { ICommand childCommand = childCommands[i]; completeExecutionInfo(executionInfo, childCommand); } } else { IContext context = null; IFeature feature = null; if (gfCommand instanceof IFeatureHolder) { IFeatureHolder featureHolder = (IFeatureHolder) gfCommand; feature = featureHolder.getFeature(); } if (gfCommand instanceof IContextHolder) { IContextHolder contextHolder = (IContextHolder) gfCommand; context = contextHolder.getContext(); } executionInfo.addFeatureAndContext(new DefaultFeatureAndContext(feature, context)); } return executionInfo; } public IExecutionInfo removeFeaturesWithoutChanges(IExecutionInfo executionInfo) { DefaultExecutionInfo result = new DefaultExecutionInfo(); for (IFeatureAndContext featureAndContext : executionInfo.getExecutionList()) { if (featureAndContext.getFeature().hasDoneChanges()) { result.addFeatureAndContext(featureAndContext); } } return result; } }