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 }