/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.eclipse.bpmn2.modeler.ui.features.event; import org.eclipse.bpmn2.BoundaryEvent; import org.eclipse.bpmn2.di.BPMNShape; import org.eclipse.bpmn2.modeler.core.features.BusinessObjectUtil; import org.eclipse.dd.dc.Bounds; import org.eclipse.graphiti.datatypes.ILocation; import org.eclipse.graphiti.features.context.ICreateContext; import org.eclipse.graphiti.features.context.IMoveShapeContext; import org.eclipse.graphiti.mm.PropertyContainer; import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm; import org.eclipse.graphiti.mm.pictograms.ContainerShape; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.Shape; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.graphiti.services.IPeService; public class BoundaryEventPositionHelper { public static final String BOUNDARY_EVENT_RELATIVE_POS = "boundary.event.relative.pos"; public static boolean canCreateEventAt(ICreateContext context, GraphicsAlgorithm ga, int padding) { return canCreateEventAt(context.getX(), context.getY(), ga.getWidth(), ga.getHeight(), padding); } public static boolean canCreateEventAt(int x, int y, GraphicsAlgorithm ga, int padding) { return canCreateEventAt(x, y, ga.getWidth(), ga.getHeight(), padding); } public static boolean canCreateEventAt(int x, int y, int w, int h, int padding) { int x1 = 0; int x2 = 0 + padding; int x3 = w - padding; int x4 = w; int y1 = 0; int y2 = 0 + padding; int y3 = h - padding; int y4 = h; if ((y >= y1 && y <= y2) || (y >= y3 && y <= y4)) { return true; } if ((x >= x1 && x <= x2) || (x >= x3 && x <= x4)) { return true; } return false; } public static boolean canMoveTo(IMoveShapeContext context, Diagram diagram) { IPeService peService = Graphiti.getPeService(); int x = context.getX(); int y = context.getY(); if (!(context.getTargetContainer() instanceof Diagram)) { ILocation loc = peService.getLocationRelativeToDiagram(context.getTargetContainer()); x += loc.getX(); y += loc.getY(); } BoundaryEvent event = BusinessObjectUtil.getFirstElementOfType(context.getShape(), BoundaryEvent.class); GraphicsAlgorithm eventGa = context.getShape().getGraphicsAlgorithm(); ContainerShape activityContainer = (ContainerShape) BusinessObjectUtil.getFirstBaseElementFromDiagram(diagram, event.getAttachedToRef()); GraphicsAlgorithm activityGa = activityContainer.getGraphicsAlgorithm(); ILocation activityLoc = peService.getLocationRelativeToDiagram(activityContainer); if (!(activityContainer.equals(context.getTargetContainer()) || activityContainer.eContainer().equals( context.getTargetContainer()))) { return false; } PositionOnLine pos = getPositionOnLine(x, y, eventGa.getWidth(), eventGa.getHeight(), activityLoc.getX(), activityLoc.getY(), activityGa.getWidth(), activityGa.getHeight()); return pos.isLegalPosition(); } public static PositionOnLine getPositionOnLineUsingBPMNShape(Shape eventShape, Shape activityShape) { BPMNShape event = BusinessObjectUtil.getFirstElementOfType(eventShape, BPMNShape.class); Bounds eventBounds = event.getBounds(); BPMNShape activity = BusinessObjectUtil.getFirstElementOfType(activityShape, BPMNShape.class); Bounds activityBounds = activity.getBounds(); return getPositionOnLine((int) eventBounds.getX(), (int) eventBounds.getY(), (int) eventBounds.getWidth(), (int) eventBounds.getHeight(), (int) activityBounds.getX(), (int) activityBounds.getY(), (int) activityBounds.getWidth(), (int) activityBounds.getHeight()); } public static PositionOnLine getPositionOnLineUsingAbsoluteCoordinates(Shape eventShape, Shape activityShape) { IPeService peService = Graphiti.getPeService(); GraphicsAlgorithm eventGa = eventShape.getGraphicsAlgorithm(); ILocation eventLoc = peService.getLocationRelativeToDiagram(eventShape); GraphicsAlgorithm activityGa = activityShape.getGraphicsAlgorithm(); ILocation activityLoc = peService.getLocationRelativeToDiagram(activityShape); return getPositionOnLine(eventLoc.getX(), eventLoc.getY(), eventGa.getWidth(), eventGa.getHeight(), activityLoc.getX(), activityLoc.getY(), activityGa.getWidth(), activityGa.getHeight()); } public static PositionOnLine getPositionOnLine(int eventX, int eventY, int eventW, int eventH, int activityX, int activityY, int activityW, int activityH) { int x = eventX + eventW / 2; int y = eventY + eventH / 2; int x1 = activityX; int x2 = x1 + 10; int x3 = x1 + activityW - 10; int x4 = x1 + activityW + 10; int y1 = activityY; int y2 = y1 + 10; int y3 = y1 + activityH - 10; int y4 = y1 + activityH + 10; boolean alongLeftX = x >= x1 && x <= x2; boolean alongRightX = x >= x3 && x <= x4; boolean alongTopY = y >= y1 && y <= y2; boolean alongBottomY = y >= y3 && y <= y4; PositionOnLine pos = new PositionOnLine(alongLeftX, alongRightX, alongTopY, alongBottomY); return pos; } public static void assignPositionOnLineProperty(PropertyContainer propertyContainer, PositionOnLine pos) { IPeService peService = Graphiti.getPeService(); peService.setPropertyValue(propertyContainer, BOUNDARY_EVENT_RELATIVE_POS, pos.toString()); } public static PositionOnLine getPositionOnLineProperty(PropertyContainer propertyContainer) { IPeService peService = Graphiti.getPeService(); String value = peService.getPropertyValue(propertyContainer, BOUNDARY_EVENT_RELATIVE_POS); return PositionOnLine.fromString(value); } }