/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.whiteboard.gui.whiteboardshapes;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import java.util.List;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.whiteboardobjects.*;
/**
*
* a WhiteboardShapeLine, in XML :
* <line id="" x1="x1" y1="y1" x2="x2" y2="y2"/>
*
* @author Julien Waechter
*/
public class WhiteboardShapeLine
extends WhiteboardShape implements WhiteboardObjectLine
{
/**
* The start coordinates for this line.
*/
private WhiteboardPoint startPoint;
/**
* The end coordinates for this line.
*/
private WhiteboardPoint endPoint;
/**
* WhiteboardShapeLine constructor.
*
* @param id String that uniquely identifies this WhiteboardObject.
* @param t number of pixels that this object (or its border)
* should be thick.
* @param c WhiteboardShapeLine's color (or rather it's border)
* @param startPoint the start coordinates of this line.
* @param endPoint the end coordinates of this line.
*/
public WhiteboardShapeLine (String id, int t, Color c,
WhiteboardPoint startPoint, WhiteboardPoint endPoint)
{
super (id);
this.setThickness (t);
setColor (c);
setColor (c.getRGB ());
this.endPoint = endPoint;
this.startPoint = startPoint;
}
/**
* WhiteboardShapeLine constructor
* @param id String that uniquely identifies this WhiteboardObject.
* @param t number of pixels that this object (or its border)
* @param c WhiteboardShapeLine's color (or rather it's border)
* @param startPoint the start coordinates of this line.
* @param endPoint the end coordinates of this line.
* @param v2w 2D affine transform
*/
public WhiteboardShapeLine (String id, int t, Color c,
WhiteboardPoint startPoint, WhiteboardPoint endPoint, AffineTransform v2w)
{
super (id);
this.setThickness (t);
setColor (c);
Point2D v0 = new Point2D.Double (startPoint.getX (), startPoint.getY ());
Point2D w0 = v2w.transform (v0, null);
this.startPoint = new WhiteboardPoint (w0.getX (), w0.getY ());
Point2D v1 = new Point2D.Double (endPoint.getX (), endPoint.getY ());
Point2D w1 = v2w.transform (v1, null);
this.endPoint = new WhiteboardPoint (w1.getX (), w1.getY ());
}
/**
* Code to paint the specific shape
* @param w2v 2D affine transform
* @param g graphics context
*/
@Override
public void paintShape (Graphics2D g, AffineTransform w2v)
{
double x = startPoint.getX ();
double y = startPoint.getY ();
double xEnd = endPoint.getX ();
double yEnd = endPoint.getY ();
g.setStroke (new BasicStroke (this.getThickness (),
BasicStroke.CAP_ROUND,BasicStroke.CAP_ROUND));
Point2D v0 = w2v.transform (new Point2D.Double (x, y), null);
int ix = (int) v0.getX ();
int iy = (int) v0.getY ();
Point2D v1 = w2v.transform (new Point2D.Double (xEnd, yEnd), null);
g.drawLine (ix, iy, (int)v1.getX (), (int)v1.getY ());
}
/**
* Tests if the shape contains a point.
*
* @param p coord point
* @return true if shape contains p
*/
@Override
public boolean contains (Point2D p)
{
double x = startPoint.getX ();
double y = startPoint.getY ();
double xEnd = endPoint.getX ();
double yEnd = endPoint.getY ();
Line2D line = new Line2D.Double (x, y, xEnd, yEnd);
return line.intersects (p.getX (), p.getY (), 10, 10);
}
/**
* Returns the list of selected points.
*
* @return list of selected points
*/
@Override
public List<WhiteboardPoint> getSelectionPoints ()
{
ArrayList<WhiteboardPoint> selectionPoints = new ArrayList<WhiteboardPoint>();
selectionPoints.add (startPoint);
selectionPoints.add (endPoint);
return selectionPoints;
}
/**
* Translates the shape.
*
* @param deltaX x coordinate
* @param deltaY y coordinate
*/
@Override
public void translate (double deltaX, double deltaY)
{
double x = startPoint.getX ();
double y = startPoint.getY ();
double xEnd = endPoint.getX ();
double yEnd = endPoint.getY ();
x += deltaX;
xEnd += deltaX;
y += deltaY;
yEnd += deltaY;
startPoint = new WhiteboardPoint (x, y);
endPoint = new WhiteboardPoint (xEnd, yEnd);
}
/**
* Translates a point from the shape.
*
* @param deltaX x coordinate
* @param deltaY y coordinate
*/
@Override
public void translateSelectedPoint (double deltaX, double deltaY)
{
if (getModifyPoint() == null)
return;
if (getModifyPoint().equals(startPoint))
{
startPoint.setX (startPoint.getX() + deltaX);
startPoint.setY (startPoint.getY() + deltaY);
this.setModifyPoint(startPoint);
}
else if (getModifyPoint().equals(endPoint))
{
endPoint.setX (endPoint.getX() + deltaX);
endPoint.setY (endPoint.getY() + deltaY);
this.setModifyPoint(endPoint);
}
}
/**
* Tests if a point p is over a selection point.
*
* @param p point
* @return nearest selection point
*/
@Override
public WhiteboardPoint getSelectionPoint (Point2D p)
{
WhiteboardPoint givenPoint = new WhiteboardPoint(p.getX(), p.getY());
if(startPoint.distance (givenPoint) < 10)
return startPoint;
else if(endPoint.distance (givenPoint) < 10)
return endPoint;
return null;
}
/**
* Returns the coordinates of start point for the line
*
* @return the start coordinates of this line.
*/
public WhiteboardPoint getWhiteboardPointStart ()
{
return this.startPoint;
}
/**
* Returns the coordinates of end point for the line
*
* @return the end coordinates of this line.
*/
public WhiteboardPoint getWhiteboardPointEnd ()
{
return this.endPoint;
}
/**
* Sets the coordinates of start point for the line
*
* @param whiteboardPointStart the new start coordinates for this line.
*/
public void setWhiteboardPointStart (WhiteboardPoint whiteboardPointStart)
{
this.startPoint = whiteboardPointStart;
}
/**
* Sets the coordinates of end point for the line
*
* @param whiteboardPointEnd the new end coordinates for this line.
*/
public void setWhiteboardPointEnd (WhiteboardPoint whiteboardPointEnd)
{
this.endPoint = whiteboardPointEnd;
}
}