/*
* 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 WhiteboardShapeRect, in XML :
* <rect x="0" y="0" width="100" height="100" />
*
* @author Julien Waechter
*/
public class WhiteboardShapeRect
extends WhiteboardShape implements WhiteboardObjectRect
{
/**
* The coordinates of this object.
*/
private WhiteboardPoint point;
/**
* The width value of this object (in pixel)
*/
private double width;
/**
* The height value of this object (in pixel)
*/
private double height;
/**
* True is filled, false is unfilled.
*/
private boolean fill = false;
/**
* The background color of this object
*/
private Color backgroundColor;
/**
* Stores all selection points for this shape.
*/
private List<WhiteboardPoint> selectionPoints
= new ArrayList<WhiteboardPoint>();
/**
* WhiteboardShapeRect constructor.
*
* @param id String that uniquely identifies this WhiteboardObject
* @param thickness number of pixels that this object (or its border)
* should be thick
* @param color WhiteboardShapeRect's color (or rather it's border)
* @param point coordinates of this object.
* @param width width value of this object (in pixel)
* @param height height value of this object (in pixel)
* @param fill True is filled, false is unfilled
*/
public WhiteboardShapeRect (String id,
int thickness,
Color color,
WhiteboardPoint point,
double width,
double height,
boolean fill)
{
super (id);
this.initShape(thickness, color, point, width, height, fill);
}
/**
* WhiteboardShapeRect constructor.
*
* @param id String that uniquely identifies this WhiteboardShapeRect
* @param thickness number of pixels that this object (or its border)
* should be thick
* @param color WhiteboardShapeRect's color (or rather it's border)
* @param point coordinates of this object.
* @param width width value of this object (in pixel)
* @param height height value of this object (in pixel)
* @param fill True is filled, false is unfilled
* @param transform 2D affine transformation
*/
public WhiteboardShapeRect (String id,
int thickness,
Color color,
WhiteboardPoint point,
double width,
double height,
boolean fill,
AffineTransform transform)
{
super (id);
Point2D v0 = new Point2D.Double (point.getX (), point.getY ());
Point2D w0 = transform.transform (v0, null);
double x = w0.getX ();
double y = w0.getY ();
point.setX(x);
point.setY(y);
Point2D v1 = new Point2D.Double (x + width, y + height);
Point2D w1 = transform.transform (v1, null);
double transformedWidth = w1.getX () - x;
double transformedHeight = w1.getY () - y;
this.initShape(thickness, color, point,
transformedWidth, transformedHeight, fill);
}
/**
* Initializes this shape.
*
* @param thickness number of pixels that this object (or its border)
* should be thick
* @param color WhiteboardShapeRect's color (or rather it's border)
* @param point coordinates of this object.
* @param width width value of this object (in pixel)
* @param height height value of this object (in pixel)
* @param fill True is filled, false is unfilled
*/
private void initShape (int thickness,
Color color,
WhiteboardPoint point,
double width,
double height,
boolean fill)
{
this.setThickness (thickness);
this.setColor (color.getRGB ());
this.setWhiteboardPoint (point);
this.setWidth (width);
this.setHeight (height);
this.setFill (fill);
this.recalculateSelectionPoints();
}
/**
* Gets the height (in pixels) of the WhiteboardShapeRect.
*
* @return The height.
*/
public double getHeight ()
{
return height;
}
/**
* Sets the width (in pixels) of the WhiteboardShapeRect.
*
* @param height The new height.
*/
public void setHeight (double height)
{
this.height = height;
}
/**
* Returns the fill state of the WhiteboardShapeRect.
*
* @return True is filled, false is unfilled.
*/
public boolean isFill ()
{
return fill;
}
/**
* Sets the fill state of the WhiteboardShapeRect.
* True is filled, false is unfilled.
*
* @param fill The new fill state.
*/
public void setFill (boolean fill)
{
this.fill = fill;
}
/**
* Code to paint the WhiteboardShapeRect.
*
* @param g graphics context
* @param t 2D affine transformation
*/
@Override
public void paintShape (Graphics2D g, AffineTransform t)
{
double x = point.getX ();
double y = point.getY ();
g.setStroke (new BasicStroke (this.getThickness (),
BasicStroke.CAP_ROUND,BasicStroke.CAP_ROUND));
Point2D w0 = new Point2D.Double (x, y);
Point2D v0 = t.transform (w0, null);
int x0 = (int) v0.getX ();
int y0 = (int) v0.getY ();
Point2D w1 = new Point2D.Double (x + width, y + height);
Point2D v1 = t.transform (w1, null);
int xWidth = (int)v1.getX () - x0;
int yHeight = (int)v1.getY () - y0;
g.setColor (Color.getColor ("",this.getColor ()));
if (fill)
{
g.fillRect (x0, y0, xWidth, yHeight);
}
else
{
g.drawRect (x0, y0, xWidth, yHeight);
}
}
/**
* Returns the list of selected points.
*
* @return list of selected points
*/
@Override
public List<WhiteboardPoint> getSelectionPoints ()
{
return selectionPoints;
}
/**
* Tests if the shape contains a point.
*
* @param p coord point
* @return true if shape contains p
*/
@Override
public boolean contains (Point2D p)
{
Rectangle2D rect = new Rectangle2D.Double (
point.getX (), point.getY (), width, height);
return rect.contains (p);
}
/**
* Translates the shape.
*
* @param deltaX x coordinate
* @param deltaY y coordinate
*/
@Override
public void translate (double deltaX, double deltaY)
{
double x = point.getX ();
double y = point.getY ();
x += deltaX;
y += deltaY;
this.point = new WhiteboardPoint (x, y);
this.recalculateSelectionPoints();
}
/**
* Translates a point from the shape.
*
* @param deltaX x coordinate
* @param deltaY y coordinate
*/
@Override
public void translateSelectedPoint (double deltaX, double deltaY)
{
WhiteboardPoint modifyPoint = getModifyPoint();
if (modifyPoint == null)
return;
double x = point.getX ();
double y = point.getY ();
if (modifyPoint.getX() == x && modifyPoint.getY() == y)
{
this.point.setX(x + deltaX);
this.point.setY(y + deltaY);
this.width -= deltaX;
this.height -= deltaY;
modifyPoint.setX(x + deltaX);
modifyPoint.setY(y + deltaY);
}
else if (modifyPoint.getX() == x + width && modifyPoint.getY() == y)
{
this.point.setY(y + deltaY);
this.width += deltaX;
this.height -= deltaY;
modifyPoint.setX(x + width);
modifyPoint.setY(y + deltaY);
}
else if (modifyPoint.getX() == x && modifyPoint.getY() == y + height)
{
this.point.setX(x + deltaX);
this.width -= deltaX;
this.height += deltaY;
modifyPoint.setX(x + deltaX);
modifyPoint.setY(y + height);
}
else if (modifyPoint.getX() == x + width
&& modifyPoint.getY() == y + height)
{
this.width += deltaX;
this.height += deltaY;
modifyPoint.setX(x + width);
modifyPoint.setY(y + height);
}
this.setModifyPoint(modifyPoint);
this.recalculateSelectionPoints();
}
/**
* 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());
for (WhiteboardPoint point : selectionPoints)
if (point.distance(givenPoint) < 18)
return point;
return null;
}
/**
* Returns the coordinates of this whiteboard object.
*
* @return the coordinates of this object.
*/
public WhiteboardPoint getWhiteboardPoint ()
{
return this.point;
}
/**
* Sets the coordinates of this whiteboard object.
*
* @param whiteboardPoint the coordinates of this object.
*/
public void setWhiteboardPoint (WhiteboardPoint whiteboardPoint)
{
this.point = whiteboardPoint;
}
/**
* Gets the width (in pixels) of the WhiteboardObject.
*
* @return The width.
*/
public double getWidth ()
{
return this.width;
}
/**
* Sets the width (in pixels) of the WhiteboardObject.
*
* @param width The new width.
*/
public void setWidth (double width)
{
this.width = width;
}
/**
* Specifies the background color for this object. The color parameter
* must be encoded with standard RGB encoding: bits 24-31 are alpha, 16-23
* are red, 8-15 are green, 0-7 are blue.
*
* @param color the color that we'd like to set for the background of this
* <tt>WhiteboardObject</tt> (using standard RGB encoding).
*/
public void setBackgroundColor (int color)
{
this.backgroundColor = Color.getColor ("", color);
}
/**
* Returns an integer representing the background color of this object. The
* return value uses standard RGB encoding: bits 24-31 are alpha, 16-23 are
* red, 8-15 are green, 0-7 are blue.
*
* @return the RGB value of the background color of this object.
*/
public int getBackgroundColor ()
{
return this.backgroundColor.getRGB ();
}
/**
* Recalculates the selection points coordinates and adds the new selection
* points to the list of selection points.
*/
private void recalculateSelectionPoints()
{
selectionPoints.clear();
selectionPoints.add (
new WhiteboardPoint ( point.getX(),
point.getY()));
selectionPoints.add (
new WhiteboardPoint ( point.getX() + width,
point.getY()));
selectionPoints.add (
new WhiteboardPoint ( point.getX(),
point.getY() + height));
selectionPoints.add (
new WhiteboardPoint ( point.getX() + width,
point.getY() + height));
}
}