/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.gef.tree.editpolicy; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.util.FeatureMap; import org.eclipse.emf.ecore.util.FeatureMapUtil; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.gef.DefaultEditDomain; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.LayoutEditPolicy; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.gef.requests.CreateRequest; import org.eclipse.ui.IEditorPart; import org.jboss.tools.smooks.editor.ISmooksModelProvider; import org.jboss.tools.smooks.gef.tree.command.GEFAdapterCommand; import org.jboss.tools.smooks.gef.tree.editparts.ChangeConstraintCommand; import org.jboss.tools.smooks.gef.tree.figures.IMoveableModel; import org.jboss.tools.smooks.graphical.editors.SmooksGraphicalEditorPart; import org.jboss.tools.smooks.graphical.editors.commands.DefaultSmooksCommandProvider; import org.jboss.tools.smooks.graphical.editors.commands.ISmooksCommandProvider; /** * @author Dart * */ public class SmooksRootEditPartLayoutEditPolicy extends LayoutEditPolicy { private ISmooksCommandProvider commandProvider = null; private GEFAdapterCommand createGEFCommand(EditingDomain domain, org.eclipse.emf.common.command.Command emfCommand, final ISmooksModelProvider provider, Object collections, Object owner, Object feature, IEditorPart editorPart) { GEFAdapterCommand command = (GEFAdapterCommand) getCommandProvider().createSmooksCommand(domain, emfCommand, provider, collections, owner, feature, editorPart); return command; } /** * @return the commandProvider */ public ISmooksCommandProvider getCommandProvider() { if (commandProvider == null) { commandProvider = new DefaultSmooksCommandProvider(); } return commandProvider; } @Override protected Command getCreateCommand(CreateRequest request) { Object model = request.getNewObject(); Object type = request.getNewObjectType(); GraphicalViewer viewer = (GraphicalViewer) ((GraphicalEditPart) getHost()).getViewer(); IEditorPart editorPart = ((DefaultEditDomain) viewer.getEditDomain()).getEditorPart(); if (editorPart instanceof SmooksGraphicalEditorPart) { EObject owner = ((SmooksGraphicalEditorPart) editorPart).getSmooksResourceList(); EditingDomain domain = ((SmooksGraphicalEditorPart) editorPart).getEditingDomain(); if (model instanceof FeatureMap.Entry) { EStructuralFeature type1 = ((FeatureMap.Entry) model).getEStructuralFeature(); model = ((FeatureMap.Entry) model).getValue(); model = EcoreUtil.copy((EObject) model); model = FeatureMapUtil.createEntry(type1, model); } org.eclipse.emf.common.command.Command emfCommand = AddCommand.create(domain, owner, type, model); final ISmooksModelProvider provider = (ISmooksModelProvider) ((SmooksGraphicalEditorPart) editorPart) .getSmooksModelProvider(); if (emfCommand.canExecute()) { GEFAdapterCommand command = createGEFCommand(domain, emfCommand, provider, model, owner, type, editorPart); if (command == null) { return null; } command.setCollections(model); command.setOwner(owner); command.setFeature(type); command.setX(request.getLocation().x); command.setY(request.getLocation().y); return command; } } return null; } @Override protected EditPolicy createChildEditPolicy(EditPart child) { return new FigureSelectEditPolicy() { @Override protected Command getMoveCommand(ChangeBoundsRequest request) { Object model = getHost().getModel(); if (request instanceof ChangeBoundsRequest && model instanceof IMoveableModel) { Point delta = ((ChangeBoundsRequest) request).getMoveDelta(); Rectangle rect = ((IMoveableModel) model).getBounds(); rect.setLocation(rect.x + delta.x, rect.y + delta.y); ChangeConstraintCommand command = new ChangeConstraintCommand((Rectangle) rect, (IMoveableModel) model); return command; } return null; } }; } @Override protected Command getMoveChildrenCommand(Request request) { return null; } }