| /******************************************************************************* |
| * 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); |
| } |
| } |
| } |