/***************************************************************************** * Copyright (c) 2012 CEA LIST. * * 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.infra.gmfdiag.dnd.strategy; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gef.EditPart; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gmf.runtime.common.core.command.CommandResult; import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand; import org.eclipse.papyrus.infra.emf.utils.EMFHelper; import org.eclipse.papyrus.infra.gmfdiag.common.Activator; /** * An abstract implementation for TransactionalDropStrategies. Extenders do not * need to implement their commands' #undo and #redo methods. * * @author Camille Letavernier */ public abstract class TransactionalDropStrategy extends AbstractDropStrategy { public final Command getCommand(Request request, EditPart targetEditPart) { final Command command = doGetCommand(request, targetEditPart); if(command == null) { return null; } String label = command.getLabel(); if(label == null || "".equals(label)) { label = getLabel(); } AbstractTransactionalCommand transactionalCommand = new AbstractTransactionalCommand(getTransactionalEditingDomain(targetEditPart), label, null) { @Override protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { try { command.execute(); return CommandResult.newOKCommandResult(); } catch (Exception ex) { Activator.log.error(ex); return CommandResult.newErrorCommandResult(ex); } } }; return new ICommandProxy(transactionalCommand); } protected boolean isTransactional(EditPart targetEditPart) { return getTransactionalEditingDomain(targetEditPart) != null; } protected TransactionalEditingDomain getTransactionalEditingDomain(EditPart targetEditPart) { EditingDomain domain = getEditingDomain(targetEditPart); if(domain instanceof TransactionalEditingDomain) { return (TransactionalEditingDomain)domain; } return null; } protected EditingDomain getEditingDomain(EditPart targetEditPart) { return EMFHelper.resolveEditingDomain(targetEditPart); } public abstract Command doGetCommand(Request request, EditPart targetEditPart); }