/* * 02/28/2002 - 22:19:42 * * MCDLien - Copyright (C) 2002 Dreux Loic dreuxl@free.fr * * * 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 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. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.analyse.merise.mcd.composant; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import org.analyse.core.gui.zgraph.ZElement; import org.analyse.core.gui.zgraph.ZLien; import org.analyse.core.util.Constantes; public class MPDLien extends ZLien { private boolean doubleFleche; public MPDLien() { this(false); } public MPDLien(boolean doubleFleche) { super(); this.doubleFleche = doubleFleche; } /** * Lie l'objet passé en parametre. */ public void setElement(ZElement elem, String index) { super.setElement(elem, index); /* if (elem != null) { MPDEntite obj = (MPDEntite) elem; } */ } public MPDEntite getMPDObjet(String index) { return (MPDEntite) (getElement(index)); } public void clearElement() { } /** * Affichage de l'objet. */ public void paint(Graphics g) { double x, y; Point2D p1, p2, p3, p4; updateLocation(); Graphics2D g2d = (Graphics2D) g; // Les 2 extremites du lien // Attention p1=(x2,y2), et p2=(x1,x2) ! p1 = new Point2D.Double(x2, y2); p2 = new Point2D.Double(x1, y1); int hauteur = x1 - x2; int largeur = y1 - y2; //Pythagore, calcul de l'hypothenuse, donc la longueur de [P1,P2] double lt = Math.sqrt(hauteur * hauteur + largeur * largeur); //Calcul du point sur le segment [P1,P2] qui va servir de point de depart //pour faire les 2 rotations qui donneront les 2 extremites de la fleche //Ce point ne sera jamais affiche, il va juste servir pour les 2 rotations x = x1 + (x2 > x1 ? (Math.abs(x2 - x1) * 15) / lt : -(Math .abs(x2 - x1) * 15) / lt); y = y1 + (y2 > y1 ? (Math.abs(y2 - y1) * 15) / lt : -(Math .abs(y2 - y1) * 15) / lt); p4 = new Point2D.Double(x, y); //On trace la ligne entre les 2 elements du MPD Line2D l = new Line2D.Double(p1, p2); g2d.setColor(Color.RED); g2d.draw(l); AffineTransform affineTransform = new AffineTransform(); //Rotation de PI/6 (30D) autour de x1,y1 (p2,point au bout de la fleche) affineTransform.setToRotation(Math.PI/6, x1, y1); //On applique la transformation au point p4, ce qui donne le point p3 p3 = affineTransform.transform(p4, null); //On trace le premier bout de la fleche (entre l'extremite p2 et le point obtenu p3) l = new Line2D.Double(p2, p3); g2d.draw(l); //Rotation de -PI/6 (-30D) (dans l'autre sens donc) autour de x1,y1 //(p2,point au bout de la fleche) affineTransform.setToRotation(-Math.PI/6, x1, y1); //On applique la transformation au point p4, ce qui donne le point p3 p3 = affineTransform.transform(p4, null); //On trace le premier bout de la fleche (entre l'extremite p2 et le point obtenu p3) l = new Line2D.Double(p2, p3); g2d.draw(l); if (this.doubleFleche) { x = x2 + (x2 < x1 ? (Math.abs(x2 - x1) * 15) / lt : -(Math .abs(x2 - x1) * 15) / lt); y = y2 + (y2 < y1 ? (Math.abs(y2 - y1) * 15) / lt : -(Math .abs(y2 - y1) * 15) / lt); p4 = new Point2D.Double(x, y); affineTransform = new AffineTransform(); affineTransform.setToRotation(Math.PI/6, x2, y2); g2d.setColor(Color.RED); p3 = affineTransform.transform(p4, null); l = new Line2D.Double(p1, p3); g2d.draw(l); affineTransform.setToRotation(-Math.PI/6, x2, y2); p3 = affineTransform.transform(p4, null); l = new Line2D.Double(p1, p3); g2d.draw(l); } } /** * Evite d'avoir des lignes de travers. */ public void updateLocation() { super.updateLocation(); if (getElement( Constantes.MCDENTITE2 ).getX() > getElement( Constantes.MCDENTITE1 ).getX() + getElement( Constantes.MCDENTITE1 ).getWidth() || getElement( Constantes.MCDENTITE2 ).getX() + getElement( Constantes.MCDENTITE2 ).getWidth() < getElement( Constantes.MCDENTITE1 ).getX()) { if (getElement( Constantes.MCDENTITE1 ).getY() < getElement( Constantes.MCDENTITE1 ).getY() + getElement( Constantes.MCDENTITE1 ).getHeight() && getElement( Constantes.MCDENTITE1 ).getY() < getElement( Constantes.MCDENTITE2 ).getY() + getElement( Constantes.MCDENTITE2 ).getHeight()) { if (y2 > getElement( Constantes.MCDENTITE1 ).getY() + getElement( Constantes.MCDENTITE1 ).getHeight()) y2 = getElement( Constantes.MCDENTITE1 ).getY() + getElement( Constantes.MCDENTITE1 ).getHeight(); else if (y2 < getElement( Constantes.MCDENTITE1 ).getY()) y2 = getElement( Constantes.MCDENTITE1 ).getY(); y1 = y2; } } else if (getElement( Constantes.MCDENTITE2 ).getY() > getElement( Constantes.MCDENTITE1 ).getY() + getElement( Constantes.MCDENTITE1 ).getWidth() || getElement( Constantes.MCDENTITE2 ).getY() + getElement( Constantes.MCDENTITE2 ).getHeight() < getElement(Constantes.MCDENTITE1 ).getY()) { if (getElement( Constantes.MCDENTITE2 ).getX() < getElement( Constantes.MCDENTITE1 ).getX() + getElement( Constantes.MCDENTITE1 ).getHeight() && getElement( Constantes.MCDENTITE1 ).getX() < getElement( Constantes.MCDENTITE2 ).getX() + getElement( Constantes.MCDENTITE2 ).getWidth()) { if (x2 > getElement( Constantes.MCDENTITE1 ).getX() + getElement( Constantes.MCDENTITE1 ).getWidth()) x2 = getElement( Constantes.MCDENTITE1 ).getY() + getElement( Constantes.MCDENTITE1 ).getWidth(); else if (x2 < getElement( Constantes.MCDENTITE1 ).getX()) x2 = getElement( Constantes.MCDENTITE1 ).getX(); x1 = x2; } } } public String toString() { return "MCDLien, " + info(); } }