blob: eca4c008b6d6eaced04470a46dbe426149103e1a [file] [log] [blame]
/*******************************************************************************
* <copyright>
*
* Copyright (c) 2005, 2012 SAP AG.
* 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:
* SAP AG - initial API, implementation and documentation
* jpasch - BUG 341180: Graphiti fails to handle resize after custom feature addition in the tutorial
* Patch 185019 from Bug 332360 contributed by Volker Wegert
* mwenz - Bug 346487 - No selection feedback for non-resizable diagram nodes
* mgorning - Bug 363186 - Allow modification of selection and hover state also for anchors
* mwenz - Bug 373298 - Possible Resource leaks in Graphiti
*
* </copyright>
*
*******************************************************************************/
package org.eclipse.graphiti.ui.internal.policy;
import java.util.List;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.editpolicies.ResizableEditPolicy;
import org.eclipse.graphiti.features.IResizeConfiguration;
import org.eclipse.graphiti.features.IResizeShapeFeature;
import org.eclipse.graphiti.features.context.IResizeShapeContext;
import org.eclipse.graphiti.internal.services.GraphitiInternal;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.ui.internal.config.IConfigurationProviderInternal;
import org.eclipse.graphiti.ui.internal.util.draw2d.GFHandleHelper;
import org.eclipse.graphiti.ui.internal.util.draw2d.TransparentGhostFigure;
/**
* @noinstantiate This class is not intended to be instantiated by clients.
* @noextend This class is not intended to be subclassed by clients.
*/
public class GFResizableEditPolicy extends ResizableEditPolicy {
private GFEditPolicyDelegate delegate;
private IResizeShapeContext resizeShapeContext;
public GFResizableEditPolicy(IConfigurationProviderInternal cfgProvider) {
setDelegate(new GFEditPolicyDelegate(cfgProvider));
}
public GFResizableEditPolicy(IConfigurationProviderInternal configurationProvider, IResizeShapeContext resizeShapeContext) {
this(configurationProvider);
setResizeShapeContext(resizeShapeContext);
}
@Override
protected IFigure createDragSourceFeedbackFigure() {
IFigure feedback = new TransparentGhostFigure(70);
addFeedback(feedback);
return feedback;
}
@Override
protected List<?> createSelectionHandles() {
boolean resizeAllowed = false;
if (getResizeShapeContext() != null) {
resizeAllowed = !(getResizeShapeFeature() == null || !getResizeShapeFeature().canResizeShape(
getResizeShapeContext()));
}
GraphicalEditPart owner = (GraphicalEditPart) getHost();
List<?> list = GFHandleHelper.createShapeHandles(owner, getConfigurationProvider(), getResizeDirections(),
isDragAllowed(), resizeAllowed);
return list;
}
@Override
public void eraseSourceFeedback(Request request) {
/* dispose ghosts */
@SuppressWarnings("unchecked")
List<IFigure> children = getFeedbackLayer().getChildren();
for (IFigure child : children) {
if (child instanceof TransparentGhostFigure) {
((TransparentGhostFigure) child).dispose();
}
}
super.eraseSourceFeedback(request);
}
protected IConfigurationProviderInternal getConfigurationProvider() {
return getDelegate().getConfigurationProvider();
}
private GFEditPolicyDelegate getDelegate() {
return this.delegate;
}
@Override
public int getResizeDirections() {
int ret = 0;
if (!(getResizeShapeContext() == null)) {
IResizeShapeFeature resizeShapeFeature = getResizeShapeFeature();
if (resizeShapeFeature != null) {
IResizeConfiguration resizeConfiguration = resizeShapeFeature
.getResizeConfiguration(getResizeShapeContext());
if (resizeConfiguration.isHorizontalResizeAllowed()) {
ret = ret | PositionConstants.EAST_WEST;
}
if (resizeConfiguration.isVerticalResizeAllowed()) {
ret = ret | PositionConstants.NORTH_SOUTH;
}
}
}
return ret;
}
private IResizeShapeContext getResizeShapeContext() {
return this.resizeShapeContext;
}
private IResizeShapeFeature getResizeShapeFeature() {
if (getResizeShapeContext() == null) {
return null;
}
return getConfigurationProvider().getFeatureProvider().getResizeShapeFeature(getResizeShapeContext());
}
private void setDelegate(GFEditPolicyDelegate delegate) {
this.delegate = delegate;
}
private void setResizeShapeContext(IResizeShapeContext resizeShapeContext) {
this.resizeShapeContext = resizeShapeContext;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#hideSelection()
*/
@Override
protected void hideSelection() {
getDelegate().hideSelection(getHostFigure());
removeSelectionHandles();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editpolicies.SelectionEditPolicy#showPrimarySelection()
*/
@Override
protected void showPrimarySelection() {
if (GraphitiInternal.getEmfService().isObjectAlive((PictogramElement) getHost().getModel())) {
getDelegate().showPrimarySelection(getHostFigure());
addSelectionHandles();
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
*/
@Override
protected void showSelection() {
getDelegate().showSelection(getHostFigure());
addSelectionHandles();
}
}