/******************************************************************************* * Copyright (c) 2013 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.rdb.erd.core.figures.decoration.relation; import org.apache.log4j.Logger; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.RotatableDecoration; import org.eclipse.draw2d.Shape; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.PointList; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.draw2d.geometry.Transform; import com.hangum.tadpole.rdb.model.RelationKind; /** * relation decoration * * @author hangum * */ public class RelationDecorator extends Shape implements RotatableDecoration { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(RelationDecorator.class); /** location */ private Point location = new Point(); /** relation kind */ private PointList relation = new PointList(); private Transform transform = new Transform(); /** bend point */ private PointList points; /** one or many */ public static final PointList ONE_OR_MANY = new PointList(); static { ONE_OR_MANY.addPoint(0, 3); ONE_OR_MANY.addPoint(-8, 0); ONE_OR_MANY.addPoint(-8, 3); ONE_OR_MANY.addPoint(-8, 0); ONE_OR_MANY.addPoint(-8, -3); ONE_OR_MANY.addPoint(-8, 0); ONE_OR_MANY.addPoint(0, -3); } /** zero or many */ public static final PointList ZERO_OR_MANY = new PointList(); static { ZERO_OR_MANY.addPoint(-8, 0); ZERO_OR_MANY.addPoint(0, 3); ZERO_OR_MANY.addPoint(-8, 0); ZERO_OR_MANY.addPoint(0, -3); ZERO_OR_MANY.addPoint(-8, 0); ZERO_OR_MANY.addPoint(-8, -1); ZERO_OR_MANY.addPoint(-9, -2); ZERO_OR_MANY.addPoint(-11, -2); ZERO_OR_MANY.addPoint(-12, -1); ZERO_OR_MANY.addPoint(-12, 1); ZERO_OR_MANY.addPoint(-11, 2); ZERO_OR_MANY.addPoint(-9, 2); ZERO_OR_MANY.addPoint(-8, 1); ZERO_OR_MANY.addPoint(-8, 0); } /** only one */ public static final PointList ONE_ONLY = new PointList(); static { ONE_ONLY.addPoint(-4, -3); ONE_ONLY.addPoint(-4, 0); ONE_ONLY.addPoint(-4, 3); ONE_ONLY.addPoint(-4, 0); ONE_ONLY.addPoint(-7, 0); ONE_ONLY.addPoint(-7, -3); ONE_ONLY.addPoint(-7, 3); } /** zero or one */ public static final PointList ZERO_OR_ONE = new PointList(); static { ZERO_OR_ONE.addPoint(-4, 0); ZERO_OR_ONE.addPoint(-4, -3); ZERO_OR_ONE.addPoint(-4, 0); ZERO_OR_ONE.addPoint(-4, 3); ZERO_OR_ONE.addPoint(-4, 0); ZERO_OR_ONE.addPoint(-7, 0); ZERO_OR_ONE.addPoint(-7, -1); ZERO_OR_ONE.addPoint(-8, -2); ZERO_OR_ONE.addPoint(-10, -2); ZERO_OR_ONE.addPoint(-11, -1); ZERO_OR_ONE.addPoint(-11, 1); ZERO_OR_ONE.addPoint(-10, 2); ZERO_OR_ONE.addPoint(-8, 2); ZERO_OR_ONE.addPoint(-7, 1); ZERO_OR_ONE.addPoint(-7, 0); } /** * relation decoreator * * @param relationKindName */ public RelationDecorator(String relationKindName) { setRelationKind(RelationKind.getByName(relationKindName)); // setBackgroundColor(ColorConstants.black); } public Rectangle getBounds() { if (bounds == null) { bounds = getPoints().getBounds().getExpanded(getLineWidth() / 2, getLineWidth() / 2); } return bounds; } protected void outlineShape(Graphics g) { g.drawPolyline(points); } public void primTranslate(int i, int j) { } public void setPoints(PointList points) { erase(); this.points = points; bounds = null; firePropertyChange("points", null, points); repaint(); } public PointList getPoints() { if (points == null) { points = new PointList(); for (int i = 0; i < relation.size(); i++) { points.addPoint(transform.getTransformed(relation.getPoint(i))); } } return points; } public void setLocation(Point p) { points = null; bounds = null; location.setLocation(p); transform.setTranslation(p.x, p.y); } public void setReferencePoint(Point ref) { Point pt = Point.SINGLETON; pt.setLocation(ref); pt.negate().translate(location); setRotation(Math.atan2(pt.y, pt.x)); } public void setRotation(double angle) { points = null; bounds = null; transform.setRotation(angle); } // public void paintFigure(Graphics graphics) { // graphics.setAntialias(1); // super.paintFigure(graphics); // } @Override protected void fillShape(Graphics graphics) { } private void setRelationKind(RelationKind relationKind) { switch(relationKind.getValue()) { case RelationKind.ONLY_ONE_VALUE: relation = ONE_ONLY; break; case RelationKind.ONE_OR_MANY_VALUE: relation = ONE_OR_MANY; break; case RelationKind.ZERO_OR_MANY_VALUE: relation = ZERO_OR_MANY; break; case RelationKind.ZERO_OR_ONE_VALUE: relation = ZERO_OR_ONE; break; } setPoints(null); } }