/**
* Copyright (c) 2012 committers of YAKINDU 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:
* Markus Muehlbrandt - initial API and implementation
*
*/
package org.yakindu.base.gmf.runtime.treelayout.commands;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewAndElementRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.notation.View;
import org.yakindu.base.gmf.runtime.treelayout.TreeLayoutUtil;
/**
*
* @author Markus Muehlbrandt
*
*/
public class UpdateAnnotationsOnCreationCommand extends
AbstractTransactionalCommand {
public static final String TREE_NODE_PARENT = "TreeNodeParent";
public static final String ELEMENTS_TO_MERGE = "ElementsToMerge";
private final CreateViewAndElementRequest request;
public UpdateAnnotationsOnCreationCommand(
TransactionalEditingDomain domain,
CreateViewAndElementRequest request) {
super(domain, "Update Annotations On Creation", null);
this.request = request;
}
@SuppressWarnings("unchecked")
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor,
IAdaptable info) throws ExecutionException {
final Object parent = request.getExtendedData().get(TREE_NODE_PARENT);
if (parent != null && parent instanceof IGraphicalEditPart) {
final IGraphicalEditPart parentEditPart = (IGraphicalEditPart) parent;
final List<IGraphicalEditPart> editPartList = TreeLayoutUtil
.getOrderedTreeChildren(parentEditPart);
// Look if creation is done in context of merging elements, remove
// elements to merge and update
// annotation of elements.
final Object object = request.getExtendedData().get(
ELEMENTS_TO_MERGE);
if (object != null && object instanceof List<?>) {
final List<IGraphicalEditPart> elements = (List<IGraphicalEditPart>) object;
editPartList.removeAll(elements);
final List<View> viewList = TreeLayoutUtil.getViews(elements);
TreeLayoutUtil.setTreeNodesPositionAnnotation(viewList);
}
final int position = TreeLayoutUtil.getNewTreeNodePosition(
request.getLocation(), editPartList);
if (position != -1 && !request.getViewDescriptors().isEmpty()) {
final ViewDescriptor viewDescriptor = request
.getViewDescriptors().get(0);
final View newView = (View) viewDescriptor
.getAdapter(View.class);
final List<View> viewList = TreeLayoutUtil
.getViews(editPartList);
if (position == viewList.size()) {
viewList.add(newView);
} else {
viewList.add(position, newView);
}
TreeLayoutUtil.setTreeNodesPositionAnnotation(viewList);
TreeLayoutUtil.setTreeNodeParentAnnotation(newView,
parentEditPart.getNotationView());
return CommandResult.newOKCommandResult();
}
}
return CommandResult.newErrorCommandResult(new ExecutionException(
"ParentTreeNode EditPart not found."));
}
}