/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package feuille.drawing.lib; import feuille.drawing.lib.IShape; import java.awt.Rectangle; /** * Cette classe définit un élément de type "ligne" comme étant un dérivé de * "forme" en implementant les méthodes demandées par "forme". Une "ligne" se * compose de la coordonnée 'origine' donnant la point de début et de la * coordonnée 'dernier' donnant le bout de la "ligne". * @author The Wingate 2940 */ public class Line implements IShape, Cloneable { //Les points de coordonnées 'origine' et 'dernier'. java.awt.Point origin, last; //Les variables suivantes avertissent d'un changement de position en cours //sur le point 'origine' (ochange) ou le point dernier (lchange). boolean oChange = false; boolean lChange = false; //marked sert à signalé un changement de position de façon globale. boolean marked = false; private Thickness thickness = Thickness.Big; private boolean inSelection = false, firstInSelection = false; /** Création d'une "ligne". */ public Line(){ //nothing } /** Création d'une "ligne" avec coordonnées. */ public Line(int originX1, int originY1, int lastX2, int lastY2){ origin = new java.awt.Point(originX1,originY1); last = new java.awt.Point(lastX2, lastY2); } public enum Thickness{ Big(10),Large(8),Medium(6),Small(4); private int thick; Thickness(int thick){ this.thick = thick; } public int getThickness(){ return thick; } } public void updateThickness(Thickness thickness){ this.thickness = thickness; } /** Donne la commande ASS spécifique à la "ligne". */ @Override public String getCommand() { return "l "+(int)last.getX()+" "+(int)last.getY(); } /** Définit le point de 'origine' */ @Override public void setOriginPoint(int x, int y) { origin = new java.awt.Point(x,y); } /** Obtient le point de 'origine' */ @Override public java.awt.Point getOriginPoint() { return origin; } /** Définit le point de 'dernier' */ @Override public void setLastPoint(int x, int y) { last = new java.awt.Point(x, y); } /** Obtient le point de 'dernier' */ @Override public java.awt.Point getLastPoint() { return last; } /** Renvoie <b>true</b> si une extrémité de la "ligne" est concernée par * un changement et définit lequel dans l'élément "ligne". */ public boolean isPointisNear(java.awt.Point p){ int xp = (int)p.getX(); int yp = (int)p.getY(); Rectangle rect = new Rectangle( xp-thickness.getThickness()/2, yp-thickness.getThickness()/2, thickness.getThickness(), thickness.getThickness()); if(rect.contains(origin)){oChange=true; return true;} if(rect.contains(last)){lChange=true; return true;} return false; } /** Met à jour la position du point concerné. */ public void updatePointPosition(java.awt.Point p){ if(oChange==true){origin = p;} if(lChange==true){last = p;} } /** Retourne à la configuration par défaut. */ public void updatehasEnded(){ oChange=false; lChange=false; } /** Marque l'élément "ligne" comme 'en train de changer. */ @Override public void setMarked(boolean b){ marked = b; } /** Obtient le status de changement de l'élément "ligne". */ @Override public boolean getMarked() { return marked; } @Override public Object clone() { Object o = null; try { // On récupère l'instance à renvoyer par l'appel de la // méthode super.clone() o = super.clone(); } catch(CloneNotSupportedException cnse) { // Ne devrait jamais arriver car nous implémentons // l'interface Cloneable cnse.printStackTrace(System.err); } // on renvoie le clone return o; } @Override public void setInSelection(boolean b){ inSelection = b; } @Override public boolean isInSelection(){ return inSelection; } @Override public void setFirstInSelection(boolean b){ firstInSelection = b; } @Override public boolean isFirstInSelection(){ return firstInSelection; } }