Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/memoire/dja/DjaArcArrow.java


1   /**
2    * @modification $Date: 2002/07/17 17:23:10 $
3    * @statut       unstable
4    * @file         DjaArcArrow.java
5    * @version      0.36
6    * @author       Guillaume Desnoix
7    * @email        guillaume@desnoix.com
8    * @license      GNU General Public License 2 (GPL2)
9    * @copyright    1998-2001 Guillaume Desnoix
10   */
11  
12  package com.memoire.dja;
13  
14  import com.memoire.fu.*;
15  import com.memoire.dnd.*;
16  import com.memoire.bu.*;
17  import com.memoire.dja.*;
18  import com.memoire.mst.*;
19  
20  
21  import java.awt.*;
22  import java.awt.event.*;
23  import javax.swing.*;
24  import javax.swing.border.*;
25  
26  public class DjaArcArrow
27         extends DjaLink
28  {
29    protected int xr0,yr0,xr1,yr1;
30  
31    public DjaArcArrow(String _text)
32    {
33      super();
34  
35      yend_=ybegin_;
36      ybegin_+=deltaY;
37      obegin_=NORTH;
38      oend_  =SOUTH;
39      //putProperty("courbure","20.");
40  
41      xr0=xbegin_;
42      yr0=ybegin_;
43      xr1=xend_;
44      yr1=yend_;
45  
46      if(_text!=null) addText(_text);
47    }
48  
49    public DjaArcArrow()
50    {
51      this(null);
52    }
53  
54    public int getMiddleX()
55      { return (xr0+xr1)/2; }
56  
57    public int getMiddleY()
58      { return (yr0+yr1)/2; }
59  
60    private static class PC extends DjaControl
61    {
62        public PC(DjaObject _f,int _p,int _o,int _x,int _y)
63        {
64    super(_f,_p,_o,_x,_y);
65        }
66  
67        public void draggedTo(int _x, int _y)
68        {
69    DjaArcArrow p=(DjaArcArrow)getParent();
70    p.setCourbure(_x,_y);
71        }
72    }
73  
74    public double getCourbure()
75    {
76      double r=Math.PI*1.25;
77  
78      String courbure=getProperty("courbure");
79      if(courbure!=null)
80    r*=new Double(courbure).doubleValue()
81        /Math.sqrt((xr0-xr1)*(xr0-xr1)+(yr0-yr1)*(yr0-yr1));
82  
83      return r;
84    }
85  
86    public void setCourbure(int _x,int _y)
87    {
88        int xm=getMiddleX();
89        int ym=getMiddleY();
90        double c=Math.sqrt((xm-_x)*(xm-_x)+(ym-_y)*(ym-_y));
91        if((xr0-xm)*(_y-ym)-(yr0-ym)*(_x-xm)>0) c=-c;
92        putProperty("courbure",""+c);
93    }
94  
95    public Rectangle getExtendedBounds()
96    {
97      double c=getCourbure();
98      int vx0=(int)((yr0-yr1)*c);
99      int vy0=(int)((xr1-xr0)*c);
100     int vx1=(int)((yr1-yr0)*c);
101     int vy1=(int)((xr0-xr1)*c);
102 
103     Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
104 
105     Rectangle r=super.getExtendedBounds();
106     r=r.union(p.getBounds());
107     r.grow(3,3);
108 
109     String epaisseur=getProperty("epaisseur");
110     if(epaisseur!=null)
111     {
112       int e=Integer.parseInt(epaisseur);
113       r.grow(e,e);
114     }
115 
116     return r;
117   }
118 
119   public DjaControl[] getControls()
120   {
121     double c=getCourbure();
122     int vx0=(int)((yr0-yr1)*c);
123     int vy0=(int)((xr1-xr0)*c);
124     int vx1=(int)((yr1-yr0)*c);
125     int vy1=(int)((xr0-xr1)*c);
126 
127     Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
128     int i=p.npoints/2;
129 
130     DjaControl[] r=new DjaControl[1];
131     r[0]=new PC(this,0,BOTH,p.xpoints[i],p.ypoints[i]);
132     return r;
133   }
134 
135   public boolean contains(int _x, int _y)
136   {
137     double c=getCourbure();
138     int vx0=(int)((yr0-yr1)*c);
139     int vy0=(int)((xr1-xr0)*c);
140     int vx1=(int)((yr1-yr0)*c);
141     int vy1=(int)((xr0-xr1)*c);
142 
143     Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
144 
145     boolean r=false;
146     for(int i=0; i<p.npoints-1; i++)
147       r|=DjaLib.close(p.xpoints[i],p.ypoints[i],p.xpoints[i+1],p.ypoints[i+1],_x,_y);
148 
149     return r;
150   }
151 
152   public DjaAnchor[] getAnchors()
153   {
154     double c=getCourbure();
155     int vx0=(int)((yr0-yr1)*c);
156     int vy0=(int)((xr1-xr0)*c);
157     int vx1=(int)((yr1-yr0)*c);
158     int vy1=(int)((xr0-xr1)*c);
159 
160     Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
161     int i=p.npoints/2;
162 
163     DjaAnchor[] r=new DjaAnchor[1];
164     r[0]=new DjaAnchor(this,0,ANY,p.xpoints[i],p.ypoints[i]);
165     return r;
166   }
167 
168   public void paintObject(Graphics _g)
169   {
170     updateXYO();
171 
172     int x0=xbegin_;
173     int y0=ybegin_;
174     int o0=obegin_;
175     int x1=xend_;
176     int y1=yend_;
177     int o1=oend_;
178 
179     int x,y;
180 
181     xr0=x0;
182     yr0=y0;
183     xr1=x1;
184     yr1=y1;
185 
186     if(tbegin_!=0)
187     switch(o0)
188     {
189     case EAST:
190       drawBracket(_g,tbegin_,o0,x0,y0-5,x0+10,y0+5);
191       xr0+=11;
192       break;
193     case WEST:
194       drawBracket(_g,tbegin_,o0,x0,y0-5,x0-10,y0+5);
195       xr0-=11;
196       break;
197     case NORTH:
198       drawBracket(_g,tbegin_,o0,x0-5,y0,x0+5,y0-10);
199       yr0-=11;
200       break;
201     case SOUTH:
202       drawBracket(_g,tbegin_,o0,x0-5,y0,x0+5,y0+10);
203       yr0+=11;
204       break;
205     }
206     
207     if(tend_!=0)
208     switch(o1)
209     {
210     case EAST:
211       drawBracket(_g,tend_,o1,x1,y1-5,x1+10,y1+5);
212       xr1+=11;
213       break;
214     case WEST:
215       drawBracket(_g,tend_,o1,x1,y1-5,x1-10,y1+5);
216       xr1-=11;
217       break;
218     case NORTH:
219       drawBracket(_g,tend_,o1,x1-5,y1,x1+5,y1-10);
220       yr1-=11;
221       break;
222     case SOUTH:
223       drawBracket(_g,tend_,o1,x1-5,y1,x1+5,y1+10);
224       yr1+=11;
225       break;
226     }
227 
228     if((tbegin_==1)||(tbegin_==4)) { xr0=xbegin_; yr0=ybegin_; }
229     if((tend_  ==1)||(tend_  ==4)) { xr1=xend_;   yr1=yend_;   }
230 
231     double c=getCourbure();
232     int vx0=(int)((yr0-yr1)*c);
233     int vy0=(int)((xr1-xr0)*c);
234     int vx1=(int)((yr1-yr0)*c);
235     int vy1=(int)((xr0-xr1)*c);
236 
237     Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
238 
239     _g.setColor(getForeground());
240     DjaGraphics.BresenhamParams bp=DjaGraphics.getBresenhamParams(this);
241     DjaGraphics.drawPolyline(_g,p,bp);
242     super.paintObject(_g);
243   }
244 
245   public void paintInteractive(Graphics _g)
246   {
247     super.paintInteractive(_g);
248 
249     if(isSelected())
250     {
251       int x1=getMiddleX();
252       int y1=getMiddleY();
253       DjaControl c=getControls()[0];
254       int x2=c.getX();
255       int y2=c.getY();
256 
257       _g.setColor(controlsColor);
258       DjaGraphics.BresenhamParams bp=new DjaGraphics.BresenhamParams(2,2);
259       DjaGraphics.drawLine(_g,x1,y1,x2,y2,bp);
260     }
261   }
262 }