blob: 2ed22999130b58803d2f101418ef841ab8cd48aa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 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.bpel.ui.editparts.policies;
import org.eclipse.bpel.ui.editparts.BPELEditPart;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Polyline;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gef.requests.CreateRequest;
public class FlowHighlightEditPolicy extends ContainerHighlightEditPolicy {
private Polyline insertionLine = null;
private Polyline insertionLine2 = null;
private IFigure feedbackfig = null;
private Point translatedPt;
public FlowHighlightEditPolicy(boolean resizable) {
super(resizable, true);
}
private Point translateToRelativePoint(Point pt) {
Point newpt = pt.getCopy();
((GraphicalEditPart)getHost()).getContentPane().translateToRelative(newpt);
((GraphicalEditPart)getHost().getRoot()).getFigure().translateToAbsolute(newpt);
return newpt;
}
@Override
public void eraseTargetFeedback(Request request) {
super.eraseTargetFeedback(request);
if (insertionLine != null) {
// JM: Don't use the crosshairs.
// removeFeedback(insertionLine2);
// removeFeedback(insertionLine);
insertionLine = null;
insertionLine2 = null;
}
if (feedbackfig != null) {
removeFeedback(feedbackfig);
feedbackfig = null;
}
}
@Override
public void showTargetFeedback(Request request) {
super.showTargetFeedback(request);
if (request.getType().equals(RequestConstants.REQ_ADD)
|| request.getType().equals(RequestConstants.REQ_CREATE)) {
if (((BPELEditPart) getHost()).canExecuteRequest(request)) {
showHighlight(request);
}
}
}
protected void showHighlight(Request request) {
final int WIDTH = 25;
Point p = null;
if (request instanceof ChangeBoundsRequest) {
p = ((ChangeBoundsRequest)request).getLocation().getCopy();
}
else if (request instanceof CreateRequest) {
p = ((CreateRequest)request).getLocation().getCopy();
}
if (p != null) {
if (insertionLine != null) {
// JM: Don't use the crosshairs.
// removeFeedback(insertionLine2);
// removeFeedback(insertionLine);
}
IFigure oldfeedback = feedbackfig;
if (feedbackfig != null)
removeFeedback(feedbackfig);
if (request instanceof CreateRequest && feedbackfig != null) {
oldfeedback.translate(-translatedPt.x, -translatedPt.y);
}
insertionLine = new Polyline();
insertionLine.setLineWidth(1);
insertionLine.setOutlineXOR(true);
insertionLine.setForegroundColor(ColorConstants.darkGray);
insertionLine2 = new Polyline();
insertionLine2.setLineWidth(1);
insertionLine2.setOutlineXOR(true);
insertionLine2.setForegroundColor(ColorConstants.darkGray);
insertionLine.addPoint(translateToRelativePoint(new Point(p.x, p.y - WIDTH)));
insertionLine.addPoint(translateToRelativePoint(new Point(p.x, p.y + WIDTH)));
insertionLine2.addPoint(translateToRelativePoint(new Point(p.x - WIDTH, p.y)));
insertionLine2.addPoint(translateToRelativePoint(new Point(p.x + WIDTH, p.y)));
// JM: Don't use the crosshairs.
// addFeedback(insertionLine);
// addFeedback(insertionLine2);
if (request instanceof CreateRequest) {
if (feedbackfig != null) {
translatedPt = translateToRelativePoint(new Point(p.x, p.y));
oldfeedback.translate(translatedPt.x, translatedPt.y);
addFeedback(oldfeedback);
} else {
// JM: Don't show the new activity node as part of the feedback. This causes
// problems with the new decorator code, which assumes that the model of the
// edit part is actually a real model, not a dummy object as below.
// CreateRequest createreq = (CreateRequest)request;
// Object newobj = createreq.getNewObject();
// GraphicalEditPart gep = (GraphicalEditPart)getHost().getRoot().getViewer().getEditPartFactory().createEditPart(getHost(), newobj);
// feedbackfig = gep.getFigure();
// translatedPt = translateToRelativePoint(new Point(p.x, p.y));
// feedbackfig.translate(translatedPt.x, translatedPt.y);
// addFeedback(feedbackfig);
}
}
}
}
protected int selectedState = -1;
@Override
protected void setSelectedState(int type) {
selectedState = type;
super.setSelectedState(type);
}
// make this visible so the editpart can poke it when the collapsed state changes
public void setResizable(boolean resizable) {
this.fResizable = resizable;
if (selectedState != -1) {
// force selection handles to be refreshed.
int previousState = selectedState;
setSelectedState(-1);
setSelectedState(previousState);
}
}
}