/*
* File : EditableLine2D.java
* Created : 25-feb-2002 09:29
* By : allastar
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 (see the LICENSE file).
*/
package edu.xtec.jclic.shapers;
import java.awt.geom.*;
import java.awt.*;
/**
*
* @author allastar
* @version 1.0
*/
public class EditableLine2D extends Line2D.Double implements EditableShape {
private boolean selected=false;
private int border=0; //Border indicates if the last clicked point was the first or the second
private int selectedBorder=-1;
/** Creates new EditableLine2D */
public EditableLine2D(double x1, double y1, double x2, double y2) {
super(x1,y1,x2,y2);
}
public EditableLine2D(Point2D p1, Point2D p2) {
super(p1,p2);
}
public boolean isSelected() {
return selected;
}
public void drawBorders(java.awt.Graphics g) {
// g.setXORMode(Color.white);
g.drawRect((int)x1-(EditableShapeConstants.selectLength/2),(int)y1-(EditableShapeConstants.selectLength/2),EditableShapeConstants.selectLength,EditableShapeConstants.selectLength);
g.drawRect((int)x2-(EditableShapeConstants.selectLength/2),(int)y2-(EditableShapeConstants.selectLength/2),EditableShapeConstants.selectLength,EditableShapeConstants.selectLength);
g.setColor(EditableShapeConstants.SELECTED_BORDER_COLOR);
if (selectedBorder==1){
g.fillRect((int)x1-(EditableShapeConstants.selectLength/2),(int)y1-(EditableShapeConstants.selectLength/2),EditableShapeConstants.selectLength,EditableShapeConstants.selectLength);
}
else if (selectedBorder==2){
g.fillRect((int)x2-(EditableShapeConstants.selectLength/2),(int)y2-(EditableShapeConstants.selectLength/2),EditableShapeConstants.selectLength,EditableShapeConstants.selectLength);
}
// g.setXORMode(Color.black);
}
public boolean hasClickedBorder(double x, double y, boolean needSelected) {
boolean hasClicked=false;
if (!needSelected || selected){
Rectangle r1=new Rectangle((int)x1-(EditableShapeConstants.selectLength/2),(int)y1-(EditableShapeConstants.selectLength/2),EditableShapeConstants.selectLength,EditableShapeConstants.selectLength);
Rectangle r2=new Rectangle((int)x2-(EditableShapeConstants.selectLength/2),(int)y2-(EditableShapeConstants.selectLength/2),EditableShapeConstants.selectLength,EditableShapeConstants.selectLength);
if (r1.contains(x,y)){
border=1;
hasClicked=true;
}
else if (r2.contains(x,y)){
border=2;
hasClicked=true;
}
}
return hasClicked;
}
public void aproximateNearestBorder(double x, double y) {
if (getP1().distance(x,y)<getP2().distance(x,y)){
x1=x;
y1=y;
}
else{
x2=x;
y2=y;
}
}
public java.awt.geom.Point2D getNearestBorder(double x, double y) {
return (getP1().distance(x,y)<getP2().distance(x,y))? getP1():getP2();
}
public void setSelected(boolean b) {
selected=b;
}
public void paintWithColor(java.awt.Graphics g, int drawingMode, java.awt.Color c) {
g.setColor(EditableShapeConstants.BORDER_COLOR);
drawBorders(g);
if (selected && drawingMode!=PolygonDrawPanel.MOVING){
paintSelection(g);
}
else if (drawingMode==PolygonDrawPanel.NEW_POINT){
g.setColor(Color.red);
drawBorders(g);
g.setColor(c);
}
else
g.setColor(c);
g.drawLine((int)getX1(),(int)getY1(),(int)getX2(),(int)getY2());
}
public void paint(java.awt.Graphics g, int drawingMode) {
paintWithColor(g,drawingMode,EditableShapeConstants.defaultColor);
}
public void paintSelection(java.awt.Graphics g) {
g.setColor(Color.black);
drawBorders(g);
g.setColor(EditableShapeConstants.selectedColor);
}
public void changeBorder(double x, double y){
if (border==1){
x1=x;
y1=y;
}
else{
x2=x;
y2=y;
}
}
public double distanceTo(double x, double y) {
return ptSegDist(x,y);
}
public boolean isInto(java.awt.geom.Rectangle2D r) {
return r.intersectsLine(this);
}
public void move(double incX, double incY) {
x1+=incX; x2+=incX;
y1+=incY; y2+=incY;
}
public void transform(java.awt.geom.AffineTransform aTransf) {
Point2D p1=getP1();
Point2D p2=getP2();
aTransf.transform(p1,p1);
aTransf.transform(p2,p2);
setLine(p1,p2);
}
public EditableShape[] divide(double x, double y) {
EditableShape[] newShapes=new EditableShape[2];
Point2D p=new Point2D.Double(x,y);
//setLine(getP1(),p);
newShapes[0]=new EditableLine2D(p,getP2());
newShapes[1]=new EditableLine2D(getP1(),p);//this;
return newShapes;
}
public boolean isAdjacentTo(java.awt.geom.Point2D p) {
if (getP1().equals(p)) return true;
else if (getP2().equals(p)){
setLine(getP2(),getP1());
return true;
}
else return false;
}
public java.awt.geom.Point2D getEndPoint() {
return getP2();
}
public java.awt.geom.Point2D getInitialPoint() {
return getP1();
}
public Object clone(){
EditableLine2D el=new EditableLine2D(getInitialPoint(),getEndPoint());
el.setSelected(isSelected());
return el;
}
public java.awt.geom.Point2D[] getBorders() {
return new Point2D[]{getP1(),getP2()};
}
public void selectBorder(double x, double y) {
Point2D p=new Point2D.Double(x,y);
if (getP1().equals(p)) selectedBorder=1;
else if (getP2().equals(p)) selectedBorder=2;
else selectedBorder=-1;
}
public void deselectBorder(){
selectedBorder=-1;
}
public boolean hasSelectedBorder(){
return (selectedBorder!=-1);
}
public java.awt.geom.Point2D getNotSelectedBorder(){
if (selectedBorder==1) return getP2();
else return getP1();
}
}