blob: af179e181c7aa8b6861563339579c6ae46fa4bef [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002, 2009 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 java.util.ArrayList;
import java.util.Iterator;
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.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.AbstractEditPolicy;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.diagram.core.commands.SetPropertyCommand;
import org.eclipse.gmf.runtime.diagram.core.util.ViewRefactorHelper;
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.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.TopGraphicEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.requests.ApplyAppearancePropertiesRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.ChangeChildPropertyValueRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.ChangePropertyValueRequest;
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;
/**
* @author sshaw
*
* Edit policy to handle any property change requests. In the case of the change
* request for ID_AUTOSIZE we will create a AUTO_SIZE request and return the command
* for that instead of a property change request.
*/
public class PropertyHandlerEditPolicy extends AbstractEditPolicy {
static private final String APPLY_APPEARANCE_PROPERTIES_UNDO_COMMAND_NAME = "Apply appearance properties"; //$NON-NLS-1$
/**
* @see org.eclipse.gef.EditPolicy#getCommand(Request)
*/
public Command getCommand(Request request) {
if (!understandsRequest(request)) {
return null;
}
if (RequestConstants.REQ_PROPERTY_CHANGE.equals(request.getType()) ||
RequestConstants.REQ_CHILD_PROPERTY_CHANGE.equals(request.getType())) {
EditPart ep = getHost();
if (ep instanceof IGraphicalEditPart) {
View view = ((IGraphicalEditPart) ep).getNotationView();
ChangePropertyValueRequest cpvr =
(ChangePropertyValueRequest) request;
if (RequestConstants.REQ_CHILD_PROPERTY_CHANGE.equals(request.getType())){
view = ViewUtil.getChildBySemanticHint(view,((ChangeChildPropertyValueRequest)cpvr).getNotationViewType());
}
if (view !=null){
if (ViewUtil.isPropertySupported(view,cpvr.getPropertyID())) {
return new ICommandProxy(
new SetPropertyCommand(getEditingDomain(),
new EObjectAdapter(view),
cpvr.getPropertyID(),
cpvr.getPropertyName(),
((ChangePropertyValueRequest) request).getValue()));
}
}
}
} else if (RequestConstants.REQ_SHOW_ALL_COMPARTMENTS.equals(request.getType())){
EditPart ep = getHost();
if (ep instanceof TopGraphicEditPart) {
TopGraphicEditPart topEP = (TopGraphicEditPart) ep;
List resizableViews = topEP.getResizableNotationViews();
if (resizableViews.isEmpty())
return null;
ChangePropertyValueRequest cpvr =
(ChangePropertyValueRequest) request;
CompositeCommand compositeCommand =
new CompositeCommand(cpvr.getPropertyName());
for (Iterator iter = resizableViews.iterator(); iter.hasNext();) {
View childView = (View) iter.next();
if (ViewUtil.isPropertySupported(childView,cpvr.getPropertyID())) {
compositeCommand.compose(new SetPropertyCommand(getEditingDomain(),
new EObjectAdapter(childView),
cpvr.getPropertyID(),
cpvr.getPropertyName(),
((ChangePropertyValueRequest) request).getValue()));
}
}
return new ICommandProxy(compositeCommand);
}
}else if (
request instanceof ApplyAppearancePropertiesRequest
&& getHost() instanceof IGraphicalEditPart) {
final ApplyAppearancePropertiesRequest aapr =
(ApplyAppearancePropertiesRequest) request;
final IGraphicalEditPart gep = (IGraphicalEditPart)getHost();
final ViewRefactorHelper vrh = new ViewRefactorHelper(gep.getDiagramPreferencesHint());
final List exclusions = getStyleExclusionsForCopyAppearance();
ICommand viewStyleCommand = new AbstractTransactionalCommand(getEditingDomain(),
APPLY_APPEARANCE_PROPERTIES_UNDO_COMMAND_NAME, null) {
protected CommandResult doExecuteWithResult(
IProgressMonitor progressMonitor, IAdaptable info)
throws ExecutionException {
vrh.copyViewAppearance(aapr.getViewToCopyFrom(), gep.getNotationView(), exclusions);
return CommandResult.newOKCommandResult();
}
};
return new ICommandProxy(viewStyleCommand);
}
return null;
}
/**
* @return a <code>List</code> of <code>EClass</code> <code>Style</code> types that are
* to be excluded from the copy process.
*/
protected List getStyleExclusionsForCopyAppearance() {
List exclusions = new ArrayList();
exclusions.add(NotationPackage.eINSTANCE.getDescriptionStyle());
exclusions.add(NotationPackage.eINSTANCE.getImageBufferStyle());
return exclusions;
}
/**
* @see org.eclipse.gef.EditPolicy#understandsRequest(Request)
*/
public boolean understandsRequest(Request request) {
if (RequestConstants.REQ_PROPERTY_CHANGE.equals(request.getType()) ||
RequestConstants.REQ_CHILD_PROPERTY_CHANGE.equals(request.getType()) ||
RequestConstants.REQ_SHOW_ALL_COMPARTMENTS.equals(request.getType()))
return true;
if (request instanceof ApplyAppearancePropertiesRequest
&& getHost() instanceof IGraphicalEditPart)
return true;
return super.understandsRequest(request);
}
/**
* @see org.eclipse.gef.EditPolicy#getTargetEditPart(org.eclipse.gef.Request)
*/
public EditPart getTargetEditPart(Request request) {
if (!understandsRequest(request))
return null;
if (RequestConstants.REQ_PROPERTY_CHANGE.equals(request.getType()) ||
RequestConstants.REQ_CHILD_PROPERTY_CHANGE.equals(request.getType()) ||
RequestConstants.REQ_SHOW_ALL_COMPARTMENTS.equals(request.getType())) {
return getHost();
} else if (request instanceof ApplyAppearancePropertiesRequest) {
return getHost();
}
return super.getTargetEditPart(request);
}
protected TransactionalEditingDomain getEditingDomain() {
return ((IGraphicalEditPart) getHost()).getEditingDomain();
}
}