blob: d2dbc471fb43ce2c31185f9019a22ef1503c46ef [file] [log] [blame]
/******************************************************************************
* 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 Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.diagram.ui.editpolicies;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.AccessibleHandleProvider;
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.common.core.command.ICommand;
import org.eclipse.gmf.runtime.diagram.core.internal.commands.IPropertyValueDeferred;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.requests.ChangeBoundsDeferredRequest;
import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
/**
* A resizable editpolicy for resizable shape editparts 1- It customizes the
* selection handles 2- It handles the autosize and deferred change bounds
* request
*
* @author melaasar
*/
public class ResizableShapeEditPolicy
extends ResizableEditPolicyEx {
/**
* Cfreates a new AutoSize comamnd
*
* @param request
* @return command
*/
protected Command getAutoSizeCommand(Request request) {
TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost()).getEditingDomain();
ICommand resizeCommand = new SetBoundsCommand(editingDomain,
DiagramUIMessages.SetAutoSizeCommand_Label,
new EObjectAdapter((View) getHost().getModel()), new Dimension(-1,
-1));
return new ICommandProxy(resizeCommand);
}
/**
* Method getMoveDeferredCommand.
*
* @param request
* @return Command
*/
protected Command getMoveDeferredCommand(ChangeBoundsDeferredRequest request) {
final class SetDeferredPropertyCommand
extends AbstractTransactionalCommand {
private IAdaptable newValue;
private IAdaptable viewAdapter;
/**
* constructor
*
* @param editingDomain
* the editing domain through which model changes are made
* @param label
* @param viewAdapter
* @param newValue
*/
public SetDeferredPropertyCommand(TransactionalEditingDomain editingDomain, String label,
IAdaptable viewAdapter, IAdaptable newValue) {
super(editingDomain, label, null);
this.viewAdapter = viewAdapter;
this.newValue = newValue;
}
protected CommandResult doExecuteWithResult(
IProgressMonitor progressMonitor, IAdaptable info)
throws ExecutionException {
if (null == viewAdapter || null == newValue)
return CommandResult.newCancelledCommandResult();
View view = (View) viewAdapter.getAdapter(View.class);
Point p = (Point) newValue
.getAdapter(IPropertyValueDeferred.class);
ViewUtil.setStructuralFeatureValue(view, NotationPackage.eINSTANCE.getLocation_X(),
Integer.valueOf(p.x));
ViewUtil.setStructuralFeatureValue(view, NotationPackage.eINSTANCE.getLocation_Y(),
Integer.valueOf(p.y));
// clear for garbage collection
viewAdapter = null;
newValue = null;
return CommandResult.newOKCommandResult();
}
}
View view = (View) getHost().getModel();
TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
.getEditingDomain();
SetDeferredPropertyCommand cmd = new SetDeferredPropertyCommand(editingDomain,
DiagramUIMessages.ResizableShapeEditPolicy_MoveDeferredCommand_label,
new EObjectAdapter(view), request
.getLocationAdapter());
return new ICommandProxy(cmd);
}
public Command getCommand(Request request) {
if (RequestConstants.REQ_AUTOSIZE.equals(request.getType()))
return getAutoSizeCommand(request);
if (RequestConstants.REQ_MOVE_DEFERRED.equals(request.getType()))
return getMoveDeferredCommand((ChangeBoundsDeferredRequest) request);
return super.getCommand(request);
}
public boolean understandsRequest(Request request) {
if (RequestConstants.REQ_AUTOSIZE.equals(request.getType())
|| RequestConstants.REQ_MOVE_DEFERRED.equals(request.getType()))
return true;
return super.understandsRequest(request);
}
/**
* Creates the figure used for feedback.
*
* @return the new feedback figure
*/
protected IFigure createDragSourceFeedbackFigure() {
// Use a ghost rectangle for feedback
RectangleFigure r = new RectangleFigure();
FigureUtilities.makeGhostShape(r);
r.setLineStyle(Graphics.LINE_DOT);
r.setForegroundColor(ColorConstants.white);
r.setBounds(getInitialFeedbackBounds());
addFeedback(r);
return r;
}
/**
* Override for AccessibleHandleProvider when deactivated
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=69316
*/
public Object getAdapter(Class key) {
if (key == AccessibleHandleProvider.class)
// handles == null when deactivated
if (handles == null) {
return null;
}
return super.getAdapter(key);
}
}