/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.painter;
import icy.sequence.Sequence;
import icy.util.XMLUtil;
import java.awt.Color;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import org.w3c.dom.Node;
/**
* Anchor for path type shape.<br>
* Support extra coordinate to store curve informations.
*
* @author Stephane
*/
public class PathAnchor2D extends Anchor2D
{
private static final String ID_POS_CEXT_X = "pos_ext1_x";
private static final String ID_POS_CEXT_Y = "pos_ext1_y";
private static final String ID_POS_QEXT_X = "pos_ext2_x";
private static final String ID_POS_QEXT_Y = "pos_ext2_y";
private static final String ID_TYPE = "type";
/**
* Curve extra coordinates
*/
private final Point2D.Double posCExt;
/**
* Quad extra coordinates
*/
private final Point2D.Double posQExt;
/**
* anchor type (used as PathIterator type)
*/
private int type;
public PathAnchor2D(double x1, double y1, double x2, double y2, double x3, double y3, int ray, Color color,
Color selectedColor, int type)
{
super(x3, y3, ray, color, selectedColor);
posCExt = new Point2D.Double(x1, y1);
posQExt = new Point2D.Double(x2, y2);
this.type = type;
}
public PathAnchor2D(double x1, double y1, double x2, double y2, double x3, double y3, int ray, Color color,
Color selectedColor)
{
this(x1, y1, x2, y2, x3, y3, ray, color, selectedColor, -1);
}
/**
* @deprecated Uses {@link #PathAnchor2D(double, double, double, double, double, double, int, Color, Color)}
* instead.
*/
@Deprecated
public PathAnchor2D(Sequence sequence, double x1, double y1, double x2, double y2, double x3, double y3, int ray,
Color color, Color selectedColor)
{
this(x1, y1, x2, y2, x3, y3, ray, color, selectedColor, -1);
if (sequence != null)
sequence.addOverlay(this);
}
public PathAnchor2D(double x1, double y1, double x2, double y2, double x3, double y3, Color color,
Color selectedColor)
{
this(x1, y1, x2, y2, x3, y3, DEFAULT_RAY, color, selectedColor, PathIterator.SEG_CUBICTO);
}
public PathAnchor2D(double x1, double y1, double x2, double y2, double x3, double y3)
{
this(x1, y1, x2, y2, x3, y3, DEFAULT_RAY, DEFAULT_NORMAL_COLOR, DEFAULT_SELECTED_COLOR,
PathIterator.SEG_CUBICTO);
}
public PathAnchor2D(double x1, double y1, double x2, double y2, Color color, Color selectedColor)
{
this(0d, 0d, x1, y1, x2, y2, DEFAULT_RAY, color, selectedColor, PathIterator.SEG_QUADTO);
}
public PathAnchor2D(double x1, double y1, double x2, double y2)
{
this(0d, 0d, x1, y1, x2, y2, DEFAULT_RAY, DEFAULT_NORMAL_COLOR, DEFAULT_SELECTED_COLOR, PathIterator.SEG_QUADTO);
}
public PathAnchor2D(double x1, double y1, Color color, Color selectedColor, int type)
{
this(0d, 0d, 0d, 0d, x1, y1, DEFAULT_RAY, color, selectedColor, type);
}
public PathAnchor2D(double x1, double y1, Color color, Color selectedColor)
{
this(0d, 0d, 0d, 0d, x1, y1, DEFAULT_RAY, color, selectedColor, PathIterator.SEG_LINETO);
}
/**
* @deprecated Uses {@link #PathAnchor2D(double, double, double, double, double, double, int, Color, Color)}
* instead.
*/
@Deprecated
public PathAnchor2D(double x1, double y1, int ray, Color color, Color selectedColor)
{
this(0d, 0d, 0d, 0d, x1, y1, ray, color, selectedColor, PathIterator.SEG_MOVETO);
}
public PathAnchor2D(double x1, double y1, int type)
{
this(0d, 0d, 0d, 0d, x1, y1, DEFAULT_RAY, DEFAULT_NORMAL_COLOR, DEFAULT_SELECTED_COLOR, type);
}
public PathAnchor2D(double x1, double y1)
{
this(0d, 0d, 0d, 0d, x1, y1, DEFAULT_RAY, DEFAULT_NORMAL_COLOR, DEFAULT_SELECTED_COLOR, PathIterator.SEG_MOVETO);
}
public PathAnchor2D()
{
this(0d, 0d, 0d, 0d, 0, 0, DEFAULT_RAY, DEFAULT_NORMAL_COLOR, DEFAULT_SELECTED_COLOR, PathIterator.SEG_MOVETO);
}
/**
* @return the type
*/
public int getType()
{
return type;
}
/**
* Set the type of this segment
*
* @see PathIterator
* @param value
* the type to set
*/
public void setType(int value)
{
if (type != value)
{
type = value;
painterChanged();
}
}
@Override
public boolean isVisible()
{
switch (getType())
{
// CLOSE type point are never visible
case PathIterator.SEG_CLOSE:
return false;
default:
return super.isVisible();
}
}
/**
* @return the posQExt
*/
public Point2D.Double getPosQExt()
{
return posQExt;
}
/**
* @return the posCExt
*/
public Point2D.Double getPosCExt()
{
return posCExt;
}
public void setPosQExt(Point2D p)
{
setPosQExt(p.getX(), p.getY());
}
public void setPosQExt(double x, double y)
{
if ((posQExt.x != x) || (posQExt.y != y))
{
posQExt.x = x;
posQExt.y = y;
positionChanged();
painterChanged();
}
}
public void setPosCExt(Point2D p)
{
setPosCExt(p.getX(), p.getY());
}
public void setPosCExt(double x, double y)
{
if ((posCExt.x != x) || (posCExt.y != y))
{
posCExt.x = x;
posCExt.y = y;
positionChanged();
painterChanged();
}
}
/**
* @return the PosQExt.x
*/
public double getPosQExtX()
{
return posQExt.x;
}
/**
* @param x
* the PosQExt.x to set
*/
public void setPosQExtX(double x)
{
setPosQExt(x, posQExt.y);
}
/**
* @return the PosQExt.y
*/
public double getPosQExtY()
{
return posQExt.y;
}
/**
* @param y
* the PosQExt.y to set
*/
public void setPosQExtY(double y)
{
setPosQExt(posQExt.x, y);
}
/**
* @return the PosCExt.x
*/
public double getPosCExtX()
{
return posCExt.x;
}
/**
* @param x
* the PosCExt.x to set
*/
public void setPosCExtX(double x)
{
setPosCExt(x, posCExt.y);
}
/**
* @return the PosCExt.y
*/
public double getPosCExtY()
{
return posCExt.y;
}
/**
* @param y
* the PosCExt.y to set
*/
public void setPosCExtY(double y)
{
setPosCExt(posCExt.x, y);
}
@Override
public void translate(double dx, double dy)
{
beginUpdate();
try
{
super.translate(dx, dy);
setPosCExt(posCExt.x + dx, posCExt.y + dy);
setPosQExt(posQExt.x + dx, posQExt.y + dy);
}
finally
{
endUpdate();
}
}
@Override
public boolean loadPositionFromXML(Node node)
{
if (node == null)
return false;
beginUpdate();
try
{
super.loadPositionFromXML(node);
setPosCExtX(XMLUtil.getElementDoubleValue(node, ID_POS_CEXT_X, 0d));
setPosCExtY(XMLUtil.getElementDoubleValue(node, ID_POS_CEXT_Y, 0d));
setPosQExtX(XMLUtil.getElementDoubleValue(node, ID_POS_QEXT_X, 0d));
setPosQExtY(XMLUtil.getElementDoubleValue(node, ID_POS_QEXT_Y, 0d));
setType(XMLUtil.getElementIntValue(node, ID_TYPE, -1));
}
finally
{
endUpdate();
}
return true;
}
@Override
public boolean loadFromXML(Node node)
{
if (node == null)
return false;
beginUpdate();
try
{
super.loadFromXML(node);
setPosCExtX(XMLUtil.getElementDoubleValue(node, ID_POS_CEXT_X, 0d));
setPosCExtY(XMLUtil.getElementDoubleValue(node, ID_POS_CEXT_Y, 0d));
setPosQExtX(XMLUtil.getElementDoubleValue(node, ID_POS_QEXT_X, 0d));
setPosQExtY(XMLUtil.getElementDoubleValue(node, ID_POS_QEXT_Y, 0d));
setType(XMLUtil.getElementIntValue(node, ID_TYPE, -1));
}
finally
{
endUpdate();
}
return true;
}
@Override
public boolean savePositionToXML(Node node)
{
if (node == null)
return false;
super.savePositionToXML(node);
XMLUtil.setElementDoubleValue(node, ID_POS_CEXT_X, getPosCExtX());
XMLUtil.setElementDoubleValue(node, ID_POS_CEXT_Y, getPosCExtY());
XMLUtil.setElementDoubleValue(node, ID_POS_QEXT_X, getPosQExtX());
XMLUtil.setElementDoubleValue(node, ID_POS_QEXT_Y, getPosQExtY());
XMLUtil.setElementIntValue(node, ID_TYPE, getType());
return true;
}
@Override
public boolean saveToXML(Node node)
{
if (node == null)
return false;
super.saveToXML(node);
XMLUtil.setElementDoubleValue(node, ID_POS_CEXT_X, getPosCExtX());
XMLUtil.setElementDoubleValue(node, ID_POS_CEXT_Y, getPosCExtY());
XMLUtil.setElementDoubleValue(node, ID_POS_QEXT_X, getPosQExtX());
XMLUtil.setElementDoubleValue(node, ID_POS_QEXT_Y, getPosQExtY());
XMLUtil.setElementIntValue(node, ID_TYPE, getType());
return true;
}
}