/******************************************************************************* * 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; public class PositionOnLine { public enum LineType { X, Y, XY, UNKNOWN } public enum LocationType { TOP, TOP_LEFT, TOP_RIGHT, BOTTOM, BOTTOM_LEFT, BOTTOM_RIGHT, LEFT, RIGHT, UNKNOWN } private LineType lineType; private LocationType locationType; public PositionOnLine(LineType lineType, LocationType locationType) { this.lineType = lineType; this.locationType = locationType; } public PositionOnLine(boolean alongLeftX, boolean alongRightX, boolean alongTopY, boolean alongBottomY) { boolean alongX = alongLeftX || alongRightX; boolean alongY = alongTopY || alongBottomY; if (alongX && alongY) { lineType = LineType.XY; } else if (alongX) { lineType = LineType.X; } else if (alongY) { lineType = LineType.Y; } else { lineType = LineType.UNKNOWN; } if (lineType != null) { switch (lineType) { case XY: if (alongLeftX) { if (alongTopY) { locationType = LocationType.TOP_LEFT; } else { locationType = LocationType.BOTTOM_LEFT; } } else if (alongRightX) { if (alongTopY) { locationType = LocationType.TOP_RIGHT; } else { locationType = LocationType.BOTTOM_RIGHT; } } break; case X: if (alongLeftX) { locationType = LocationType.LEFT; } else { locationType = LocationType.RIGHT; } break; case Y: if (alongTopY) { locationType = LocationType.TOP; } else { locationType = LocationType.BOTTOM; } break; default: locationType = LocationType.UNKNOWN; break; } } if (locationType == null) { locationType = LocationType.UNKNOWN; } } public LineType getLineType() { return lineType; } public LocationType getLocationType() { return locationType; } public boolean isLegalPosition() { return lineType != LineType.UNKNOWN && locationType != LocationType.UNKNOWN; } public static PositionOnLine fromString(String s) { if (s == null) { return null; } String[] arr = s.split(":"); if (!arr[0].equals(PositionOnLine.class.getSimpleName().toLowerCase())) { return null; } return new PositionOnLine(LineType.valueOf(arr[1]), LocationType.valueOf(arr[2])); } @Override public String toString() { String prefix = PositionOnLine.class.getSimpleName().toLowerCase(); String lineType = this.lineType.toString(); String locationType = this.locationType.toString(); String colon = ":"; return new StringBuilder().append(prefix).append(colon).append(lineType).append(colon).append(locationType) .toString(); } }