/*******************************************************************************
* Copyright (c) 2006-2012
* Software Technology Group, Dresden University of Technology
* DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026
*
* 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:
* Software Technology Group - TU Dresden, Germany;
* DevBoost GmbH - Berlin, Germany
* - initial API and implementation
******************************************************************************/
/*
* @(#)ArrowTip.java 1.0 19. November 2003
*
* Copyright (c) 1996-2006 by the original authors of JHotDraw
* and all its contributors.
* All rights reserved.
*
* The copyright of this software is owned by the authors and
* contributors of the JHotDraw project ("the copyright holders").
* You may not use, copy or modify this software, except in
* accordance with the license agreement you entered into with
* the copyright holders. For details see accompanying license terms.
*/
package org.jhotdraw.draw;
import java.io.*;
import java.awt.*;
import java.awt.geom.*;
import org.jhotdraw.util.*;
import org.jhotdraw.xml.DOMInput;
import org.jhotdraw.xml.DOMOutput;
import org.jhotdraw.xml.DOMStorable;
/**
* An arrow tip line decoration.
*
* @author Werner Randelshofer
* @version 2.0 2006-01-14 Changed to support double precison coordinates.
* <br>1.0 2003-12-01 Derived from JHotDraw 5.4b1.
*/
public class ArrowTip extends AbstractLineDecoration
implements DOMStorable {
/**
* Pointiness of arrow.
*/
private double angle;
private double outerRadius;
private double innerRadius;
public ArrowTip() {
this(0.35, 12, 11.3);
}
/**
* Constructs an arrow tip with the specified angle and outer and inner
* radius.
*/
public ArrowTip(double angle, double outerRadius, double innerRadius) {
this(angle, outerRadius, innerRadius, true, false, true);
}
/**
* Constructs an arrow tip with the specified parameters.
*/
public ArrowTip(double angle, double outerRadius, double innerRadius, boolean isFilled, boolean isStroked, boolean isSolid) {
super(isFilled, isStroked, isSolid);
this.angle = angle;
this.outerRadius = outerRadius;
this.innerRadius = innerRadius;
}
protected GeneralPath getDecoratorPath(Figure f) {
// FIXME - This should take the stroke join an the outer radius into
// account to compute the offset properly.
double offset = (isStroked()) ? 1 : 0;
GeneralPath path = new GeneralPath();
path.moveTo((float) (outerRadius * Math.sin(-angle)), (float) (offset + outerRadius * Math.cos(-angle)));
path.lineTo(0, (float) offset);
path.lineTo((float) (outerRadius * Math.sin(angle)), (float) (offset + outerRadius * Math.cos(angle)));
if (innerRadius != 0) {
path.lineTo(0, (float) (innerRadius + offset));
path.closePath();
}
return path;
}
protected double getDecoratorPathRadius(Figure f) {
double offset = (isStroked()) ? 0.5 : -0.1;
return innerRadius + offset;
}
public void read(DOMInput in) {
angle = in.getAttribute("angle", 0.35f);
innerRadius = in.getAttribute("innerRadius", 12f);
outerRadius = in.getAttribute("outerRadius", 12f);
setFilled(in.getAttribute("isFilled", false));
setStroked(in.getAttribute("isStroked", false));
setSolid(in.getAttribute("isSolid", false));
}
public void write(DOMOutput out) {
out.addAttribute("angle", angle);
out.addAttribute("innerRadius", innerRadius);
out.addAttribute("outerRadius", outerRadius);
out.addAttribute("isFilled", isFilled());
out.addAttribute("isStroked", isStroked());
out.addAttribute("isSolid", isSolid());
}
}