Source code: com/memoire/dja/DjaBezierArrow.java
1 /**
2 * @modification $Date: 2001/12/03 16:28:07 $
3 * @statut unstable
4 * @file DjaBezierArrow.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 java.util.*;
24 import javax.swing.*;
25 import javax.swing.border.*;
26
27 public class DjaBezierArrow
28 extends DjaLink
29 {
30 private int xr0,yr0,xr1,yr1;
31
32 public DjaBezierArrow(String _text)
33 {
34 super();
35
36 xr0=xbegin_;
37 yr0=ybegin_;
38 xr1=xend_;
39 yr1=yend_;
40
41 putProperty("x2",""+(xbegin_+3*deltaX));
42 putProperty("y2",""+ybegin_);
43 putProperty("x3",""+(xend_-3*deltaX));
44 putProperty("y3",""+yend_);
45
46 if(_text!=null) addText(_text);
47 }
48
49 public DjaBezierArrow()
50 {
51 this(null);
52 }
53
54 public void setX(int _x)
55 {
56 int dx=_x-getX();
57
58 if(begin_==null)
59 {
60 xbegin_+=dx;
61 int x2=Integer.parseInt(getProperty("x2"));
62 putProperty("x2",""+(x2+dx));
63 }
64
65 if(end_==null)
66 {
67 xend_+=dx;
68 int x3=Integer.parseInt(getProperty("x3"));
69 putProperty("x3",""+(x3+dx));
70 }
71
72 updateXYO();
73 }
74
75 public void setY(int _y)
76 {
77 int dy=_y-getY();
78
79 if(begin_==null)
80 {
81 ybegin_+=dy;
82 int y2=Integer.parseInt(getProperty("y2"));
83 putProperty("y2",""+(y2+dy));
84 }
85
86 if(end_!=null)
87 {
88 yend_ +=dy;
89 int y3=Integer.parseInt(getProperty("y3"));
90 putProperty("y3",""+(y3+dy));
91 }
92
93 updateXYO();
94 }
95
96 public void setWidth(int _w)
97 {
98 int w=getWidth();
99 if(w!=0)
100 {
101 int x=getX();
102 xbegin_=x+(xbegin_-x)*_w/w;
103 xend_ =x+(xend_ -x)*_w/w;
104
105 /*
106 int x2=Integer.parseInt(getProperty("x2"));
107 int x3=Integer.parseInt(getProperty("x3"));
108 putProperty("x2",""+(x+(x2-x)*_w/w));
109 putProperty("x3",""+(x+(x3-x)*_w/w));
110 */
111
112 updateXYO();
113 }
114 }
115
116 public void setHeight(int _h)
117 {
118 int h=getHeight();
119 if(h!=0)
120 {
121 int y=getY();
122 ybegin_=y+(ybegin_-y)*_h/h;
123 yend_ =y+(yend_ -y)*_h/h;
124
125 /*
126 int y2=Integer.parseInt(getProperty("y2"));
127 int y3=Integer.parseInt(getProperty("y3"));
128 putProperty("y2",""+(y+(y2-y)*_h/h));
129 putProperty("y3",""+(y+(y3-y)*_h/h));
130 */
131
132 updateXYO();
133 }
134 }
135
136 public void setPoints(Vector _v)
137 {
138 super.setPoints(_v);
139
140 // System.out.println("SET-POINTS: "+_v.size());
141
142 if(_v.size()!=4) return;
143
144 Point p2=(Point)_v.elementAt(1);
145 Point p3=(Point)_v.elementAt(2);
146
147 putProperty("x2",""+p2.x);
148 putProperty("y2",""+p2.y);
149 putProperty("x3",""+p3.x);
150 putProperty("y3",""+p3.y);
151 }
152
153 private static class PC extends DjaControl
154 {
155 public PC(DjaObject _f,int _p,int _o,int _x,int _y)
156 {
157 super(_f,_p,_o,_x,_y);
158 }
159
160 public void draggedTo(int _x, int _y)
161 {
162 DjaObject p=getParent();
163 int n=2+getP();
164 p.putProperty("x"+n,""+_x);
165 p.putProperty("y"+n,""+_y);
166 }
167 }
168
169 public DjaControl[] getControls()
170 {
171 int x2=Integer.parseInt(getProperty("x2"));
172 int y2=Integer.parseInt(getProperty("y2"));
173 int x3=Integer.parseInt(getProperty("x3"));
174 int y3=Integer.parseInt(getProperty("y3"));
175
176 DjaControl[] r=new DjaControl[2];
177 r[0]=new PC(this,0,BOTH,x2,y2);
178 r[1]=new PC(this,1,BOTH,x3,y3);
179 return r;
180 }
181
182 public boolean contains(int _x, int _y)
183 {
184 int x2=Integer.parseInt(getProperty("x2"));
185 int y2=Integer.parseInt(getProperty("y2"));
186 int x3=Integer.parseInt(getProperty("x3"));
187 int y3=Integer.parseInt(getProperty("y3"));
188
189 double c=Math.PI;
190 int vx0=(int)((x2-xr0)*c);
191 int vy0=(int)((y2-yr0)*c);
192 int vx1=(int)((xr1-x3)*c);
193 int vy1=(int)((yr1-y3)*c);
194
195 Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
196 boolean r=false;
197 for(int i=0; i<p.npoints-1; i++)
198 r|=DjaLib.close(p.xpoints[i],p.ypoints[i],p.xpoints[i+1],p.ypoints[i+1],_x,_y);
199
200 return r;
201 }
202
203 public DjaAnchor[] getAnchors()
204 {
205 DjaAnchor[] r=new DjaAnchor[1];
206 Point m=getMiddle();
207 r[0]=new DjaAnchor(this,0,ANY,m.x,m.y);
208 return r;
209 }
210
211 public Point getMiddle()
212 {
213 int x2=Integer.parseInt(getProperty("x2"));
214 int y2=Integer.parseInt(getProperty("y2"));
215 int x3=Integer.parseInt(getProperty("x3"));
216 int y3=Integer.parseInt(getProperty("y3"));
217
218 double c=Math.PI;
219 int vx0=(int)((x2-xr0)*c);
220 int vy0=(int)((y2-yr0)*c);
221 int vx1=(int)((xr1-x3)*c);
222 int vy1=(int)((yr1-y3)*c);
223
224 Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
225
226 return new Point(p.xpoints[p.npoints/2],p.ypoints[p.npoints/2]);
227 }
228
229 public void paintObject(Graphics _g)
230 {
231 updateXYO();
232
233 int x0=xbegin_;
234 int y0=ybegin_;
235 int o0=obegin_;
236 int x1=xend_;
237 int y1=yend_;
238 int o1=oend_;
239
240 int x,y;
241
242 xr0=x0;
243 yr0=y0;
244 xr1=x1;
245 yr1=y1;
246
247 if(tbegin_!=0)
248 switch(o0)
249 {
250 case EAST:
251 drawBracket(_g,tbegin_,o0,x0,y0-5,x0+10,y0+5);
252 xr0+=11;
253 break;
254 case WEST:
255 drawBracket(_g,tbegin_,o0,x0,y0-5,x0-10,y0+5);
256 xr0-=11;
257 break;
258 case NORTH:
259 drawBracket(_g,tbegin_,o0,x0-5,y0,x0+5,y0-10);
260 yr0-=11;
261 break;
262 case SOUTH:
263 drawBracket(_g,tbegin_,o0,x0-5,y0,x0+5,y0+10);
264 yr0+=11;
265 break;
266 }
267
268 if(tend_!=0)
269 switch(o1)
270 {
271 case EAST:
272 drawBracket(_g,tend_,o1,x1,y1-5,x1+10,y1+5);
273 xr1+=11;
274 break;
275 case WEST:
276 drawBracket(_g,tend_,o1,x1,y1-5,x1-10,y1+5);
277 xr1-=11;
278 break;
279 case NORTH:
280 drawBracket(_g,tend_,o1,x1-5,y1,x1+5,y1-10);
281 yr1-=11;
282 break;
283 case SOUTH:
284 drawBracket(_g,tend_,o1,x1-5,y1,x1+5,y1+10);
285 yr1+=11;
286 break;
287 }
288
289 if((tbegin_==1)||(tbegin_==4)) { xr0=xbegin_; yr0=ybegin_; }
290 if((tend_ ==1)||(tend_ ==4)) { xr1=xend_; yr1=yend_; }
291
292 _g.setColor(getForeground());
293 DjaGraphics.BresenhamParams bp=DjaGraphics.getBresenhamParams(this);
294
295 int x2=Integer.parseInt(getProperty("x2"));
296 int y2=Integer.parseInt(getProperty("y2"));
297 int x3=Integer.parseInt(getProperty("x3"));
298 int y3=Integer.parseInt(getProperty("y3"));
299
300 double c=Math.PI;
301 int vx0=(int)((x2-xr0)*c);
302 int vy0=(int)((y2-yr0)*c);
303 int vx1=(int)((xr1-x3)*c);
304 int vy1=(int)((yr1-y3)*c);
305
306 Polygon p=DjaMatrixHermite.arc2polyline(xr0,yr0,xr1,yr1,vx0,vy0,vx1,vy1);
307 DjaGraphics.drawPolyline(_g,p,bp);
308
309 super.paintObject(_g);
310 }
311
312 public void paintInteractive(Graphics _g)
313 {
314 super.paintInteractive(_g);
315
316 if(isSelected())
317 {
318 int x2=Integer.parseInt(getProperty("x2"));
319 int y2=Integer.parseInt(getProperty("y2"));
320 int x3=Integer.parseInt(getProperty("x3"));
321 int y3=Integer.parseInt(getProperty("y3"));
322
323 _g.setColor(controlsColor);
324 DjaGraphics.BresenhamParams bp=new DjaGraphics.BresenhamParams(2,2);
325 DjaGraphics.drawLine(_g,xbegin_,ybegin_,x2,y2,bp);
326 DjaGraphics.drawLine(_g,x3,y3,xend_,yend_,bp);
327 }
328 }
329 }