Source code: com/memoire/dja/DjaGridInteractive.java
1 /**
2 * @modification $Date: 2003/01/23 09:59:29 $
3 * @statut unstable
4 * @file DjaGridInteractive.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.io.*;
24 import java.util.*;
25 import javax.swing.*;
26 import javax.swing.border.*;
27
28 public class DjaGridInteractive
29 extends DjaGrid
30 {
31 public DjaGridInteractive()
32 {
33 this(true,null);
34 }
35
36 public DjaGridInteractive(boolean _interactive)
37 {
38 this(_interactive,null);
39 }
40
41 public DjaGridInteractive(boolean _interactive, DjaVector _objects)
42 {
43 super(_objects);
44
45 anchorsVisible_=true;
46 attachsVisible_=true;
47 dotsVisible_ =true;
48
49 clearSelection();
50 setInteractive(_interactive);
51 }
52
53 private boolean anchorsVisible_;
54 public boolean isAnchorsVisible() { return anchorsVisible_; }
55 public void setAnchorsVisible(boolean _v) { anchorsVisible_=_v; }
56
57 private boolean attachsVisible_;
58 public boolean isAttachsVisible() { return attachsVisible_; }
59 public void setAttachsVisible(boolean _v) { attachsVisible_=_v; }
60
61 private boolean dotsVisible_;
62 public boolean isDotsVisible() { return dotsVisible_; }
63 public void setDotsVisible(boolean _v) { dotsVisible_=_v; }
64
65 public DjaVector getSelection()
66 {
67 if(!isInteractive()) return null; //new DjaVector(0);
68
69 DjaVector r=new DjaVector();
70 for(Enumeration e=getObjects().elements(); e.hasMoreElements(); )
71 {
72 DjaObject o=(DjaObject)e.nextElement();
73 if(o.isSelected()) r.addElement(o);
74 }
75 return r;
76 }
77
78 public void setSelection(DjaVector _selection)
79 {
80 boolean refresh=false;
81
82 if(_selection==null) _selection=new DjaVector(0);
83
84 for(Enumeration e=getObjects().elements(); e.hasMoreElements(); )
85 {
86 DjaObject o=(DjaObject)e.nextElement();
87 if(o.isSelected()&&!_selection.contains(o))
88 { o.setSelected(false); refresh=true; }
89 }
90
91 for(Enumeration e=_selection.elements(); e.hasMoreElements(); )
92 {
93 DjaObject o=(DjaObject)e.nextElement();
94 if(!o.isSelected()&&getObjects().contains(o))
95 { o.setSelected(true); refresh=true; }
96 }
97
98 if(refresh) repaint();
99 }
100
101 public void clearSelection()
102 {
103 setSelection((DjaVector)null);
104 }
105
106 public void setSelectionToAll()
107 {
108 setSelection(getObjects());
109 }
110
111 public void setSelection(DjaObject _o)
112 {
113 DjaVector s=new DjaVector(1);
114 if(_o!=null) s.addElement(_o);
115 setSelection(s);
116 }
117
118 public void addSelection(DjaObject _o)
119 {
120 DjaVector s=getSelection();
121 if((_o!=null)&&!s.contains(_o))
122 {
123 s.addElement(_o);
124 setSelection(s);
125 }
126 }
127
128 public void removeSelection(DjaObject _o)
129 {
130 DjaVector s=getSelection();
131 if((_o!=null)&&s.contains(_o))
132 {
133 s.removeElement(_o);
134 setSelection(s);
135 }
136 }
137
138 public DjaVector cloneSelection()
139 { return DjaLib.clone(getSelection()); }
140
141 public void moveSelection(int _dx, int _dy)
142 {
143 DjaVector s=getSelection();
144 int l=s.size();
145
146 if(l==0) return;
147
148 if(l==1)
149 {
150 DjaObject o=(DjaObject)s.elementAt(0);
151 Rectangle r=DjaLib.getDirtyArea(o);//o.getExtendedBounds();
152 o.setX(o.getX()+_dx);
153 o.setY(o.getY()+_dy);
154 r=DjaLib.getDirtyArea(o).union(r);
155 repaint(r);
156 }
157 else
158 {
159 for(Enumeration e=s.elements(); e.hasMoreElements(); )
160 {
161 DjaObject o=(DjaObject)e.nextElement();
162 o.setX(o.getX()+_dx);
163 o.setY(o.getY()+_dy);
164 }
165 repaint();
166 }
167 }
168
169 public void putSelectionToFront()
170 {
171 // quiet
172 DjaVector s=getSelection();
173 for(Enumeration e=s.elements(); e.hasMoreElements(); )
174 remove((DjaObject)e.nextElement(),true);
175 int l=s.size();
176 for(int i=l-1;i>=0;i--)
177 add((DjaObject)s.elementAt(i),true);
178 }
179
180 public void putSelectionToBack()
181 {
182 // quiet
183 DjaVector s=getSelection();
184 for(Enumeration e=s.elements(); e.hasMoreElements(); )
185 remove((DjaObject)e.nextElement(),true);
186 int l=s.size();
187 for(int i=0;i<l;i++)
188 insert(getObjects().size(),
189 (DjaObject)s.elementAt(i),true);
190 }
191
192 protected DjaMouseListener createInteractiveMouseListener()
193 {
194 return new DjaMouseListener(this);
195 }
196
197 protected DjaKeyListener createInteractiveKeyListener()
198 {
199 return new DjaKeyListener(this);
200 }
201
202 private DjaMouseListener ml_;
203 private DjaKeyListener kl_;
204 private DjaVector ss_; // saved selection
205
206 private boolean interactive_;
207 public boolean isInteractive() { return interactive_; }
208 public void setInteractive(boolean _s)
209 {
210 if(interactive_!=_s)
211 {
212 interactive_=_s;
213 if(interactive_)
214 {
215 ml_=createInteractiveMouseListener();
216 addMouseListener (ml_);
217 addMouseMotionListener(ml_);
218 addKeyListener (ml_);
219 kl_=createInteractiveKeyListener();
220 addKeyListener(kl_);
221
222 for(Enumeration e=getObjects().elements(); e.hasMoreElements(); )
223 {
224 DjaObject o=(DjaObject)e.nextElement();
225 if(o instanceof DjaEmbed)
226 {
227 JComponent c=((DjaEmbed)o).getEmbed();
228 if(c!=null) remove(c);
229 }
230 if(o instanceof DjaGroup)
231 removeEmbeds((DjaGroup)o);
232 if((ss_!=null)&&ss_.contains(o))
233 o.setSelected(true);
234 }
235 ss_=null;
236
237 if(!hasFocus()) requestFocus();
238 }
239 else
240 {
241 removeMouseListener (ml_);
242 removeMouseMotionListener(ml_);
243 removeKeyListener (ml_);
244 ml_=null;
245 removeKeyListener(kl_);
246 kl_=null;
247
248 ss_=new DjaVector();
249 for(Enumeration e=getObjects().elements(); e.hasMoreElements(); )
250 {
251 DjaObject o=(DjaObject)e.nextElement();
252 if(o instanceof DjaEmbed)
253 {
254 JComponent c=((DjaEmbed)o).getEmbed();
255 if(c!=null) add(c);
256 }
257 if(o instanceof DjaGroup)
258 addEmbeds((DjaGroup)o);
259 if(o.isSelected())
260 {
261 ss_.addElement(o);
262 o.setSelected(false);
263 }
264
265 DjaText[] texts=o.getTexts();
266 for(int k=0;k<texts.length;k++)
267 texts[k].setSelected(false);
268 }
269
270 transferFocus();
271 }
272 repaint();
273 }
274 }
275
276 public boolean isFocusTraversable()
277 { return isInteractive(); }
278
279 protected void processFocusEvent(FocusEvent _evt)
280 {
281 super.processFocusEvent(_evt);
282 repaint();
283 }
284
285 public void paintGrid(Graphics _g)
286 {
287 super.paintGrid(_g);
288
289 if(isDotsVisible()&&isInteractive())
290 {
291 Insets i=getInsets();
292 int w=getWidth() -i.left-i.right;
293 int h=getHeight()-i.top-i.bottom;
294 Rectangle r=new Rectangle(i.left,i.top,w,h);
295
296 Rectangle clip=_g.getClipBounds();
297 if(clip!=null) r=r.intersection(clip);
298 if(r!=null)
299 {
300 final int dx=5*deltaX;
301 final int dy=5*deltaY;
302 final int x0=i.left+Math.max(0,r.x-(r.x%dx));
303 final int y0=i.top +Math.max(0,r.y-(r.y%dy));
304 final int x1=Math.min(i.left+w,x0+r.width +dx);
305 final int y1=Math.min(i.top +h,y0+r.height+dy);
306
307 //System.err.println("XY01="+x0+","+y0+" "+x1+","+y1);
308 _g.setColor(getForeground());
309 /*
310 for(int x=i.left;x<w;x+=5*deltaX)
311 for(int y=i.top;y<h;y+=deltaY)
312 _g.drawLine(x,y,x,y);
313 for(int y=i.top;y<h;y+=5*deltaY)
314 for(int x=i.left;x<w;x+=deltaX)
315 _g.drawLine(x,y,x,y);
316 */
317 for(int x=x0;x<x1;x+=dx)
318 for(int y=y0;y<y1;y+=deltaY)
319 _g.drawLine(x,y,x,y);
320 for(int y=y0;y<y1;y+=dy)
321 for(int x=x0;x<x1;x+=deltaX)
322 _g.drawLine(x,y,x,y);
323 }
324 }
325 }
326
327 public void paintComponent(Graphics _g)
328 {
329 super.paintComponent(_g);
330
331 if(hasFocus())
332 {
333 Insets i=getInsets();
334 int w=getWidth() -i.left-i.right;
335 int h=getHeight()-i.top-i.bottom;
336
337 _g.setColor(UIManager.getColor("Button.focus"));
338 _g.drawRect(i.left+1,i.top+1,w-3,h-3);
339
340 if(kl_!=null)
341 {
342 int kp=kl_.getPreviousKey();
343 if(kp!=-1)
344 {
345 Font ft=getFont();
346 int fs=ft.getSize();
347 _g.fillOval(-32,-fs-3,64,2*fs+6);
348 _g.setFont(ft);
349 _g.setColor(Color.white);
350 _g.drawString(KeyEvent.getKeyText(kp),4,fs);
351 }
352 }
353 }
354 }
355
356 public static void main(String[] args)
357 {
358 final JFrame f =new JFrame("test Dja");
359 final DjaGridInteractive g =new DjaGridInteractive(false);
360 final BuToggleButton tbi=new BuToggleButton("Interactive");
361 final BuButton tbs=new BuButton("Write");
362 final BuButton tbl=new BuButton("Read");
363
364 DjaBox b1 =new DjaBox("boite");
365 DjaDiamond d1 =new DjaDiamond("losange");
366 DjaBox r1 =new DjaRoundBox("rond");
367 DjaLabel l1 =new DjaLabel("étiquette\nsur 2 lignes");
368 DjaBrokenArrow a1 =new DjaBrokenArrow("flèche");
369 DjaDirectArrow a2 =new DjaDirectArrow("flèche");
370 DjaEllipse e1 =new DjaEllipse("ellipse");
371 DjaPoint p1 =new DjaPoint("point");
372 DjaIcon ic1=new DjaIcon("icône",
373 UIManager.getIcon("InternalFrame.icon"));
374 DjaImage im1=new DjaImage("image",
375 new ImageIcon("logo-dja.gif").getImage());
376
377 BuLabelMultiLine m1=new BuLabelMultiLine("Salut tout\nle monde !");
378 DjaEmbed c1=new DjaEmbed("composant",m1);
379 c1.setX(220);
380 c1.setY(30);
381 g.add(c1);
382
383 BuButton j1=new BuButton("Bouton");
384 DjaEmbed c2=new DjaEmbed("composant",j1);
385 c2.setX(160);
386 c2.setY(210);
387 g.add(c2);
388
389 e1.setBackground(new Color(0x80CFFFFF));
390 l1.setFont(new Font("SansSerif",Font.PLAIN,18));
391
392 l1 .setX(100);
393 r1 .setX(200); r1 .setY(100);
394 e1 .setX(100); e1 .setY(100);
395 d1 .setX( 20); d1 .setY(250);
396 p1 .setX( 20); p1 .setY( 60);
397 ic1.setX( 20); ic1.setY(100);
398 im1.setX( 20); im1.setY(140);
399
400 a1.setBegin(b1,4,11);
401 a1.setEnd (e1,6, 8);
402 a2.setBegin(e1,4, 3);
403 a2.setEnd (d1,2, 6);
404
405 g.add(b1);
406 g.add(l1);
407 g.add(d1);
408 g.add(r1);
409 g.add(e1);
410 g.add(p1);
411 g.add(ic1);
412 g.add(im1);
413 g.add(a1);
414 g.add(a2);
415
416 f.getContentPane().add("Center",g);
417
418 tbi.addActionListener
419 (new ActionListener()
420 {
421 public void actionPerformed(ActionEvent _evt)
422 { g.setInteractive(tbi.isSelected()); }
423 }
424 );
425
426 tbs.addActionListener
427 (new ActionListener()
428 {
429 public void actionPerformed(ActionEvent _evt)
430 {
431 try
432 {
433 FileOutputStream out;
434 out=new FileOutputStream("essai.dja");
435 DjaSaver.saveAsText(g.getObjects(),out);
436 out.close();
437 /*
438 out=new FileOutputStream("essai.ser");
439 DjaSaver.saveAsSer(g,out);
440 out.close();
441 */
442 }
443 catch(IOException ex) { ex.printStackTrace(); }
444 }
445 }
446 );
447
448 tbl.addActionListener
449 (new ActionListener()
450 {
451 public void actionPerformed(ActionEvent _evt)
452 {
453 try
454 {
455 FileInputStream in;
456 DjaVector v;
457 DjaGroup gp;
458
459 in=new FileInputStream("essai.dja");
460 v=DjaLoader.loadAsText(in);
461 in.close();
462
463 gp=new DjaGroup("essai.dja");
464 Enumeration e=v.elements();
465 while(e.hasMoreElements())
466 {
467 DjaObject o=(DjaObject)e.nextElement();
468 gp.add(o);
469 }
470
471 gp.setSelected(true);
472 gp.setX(gp.getX()+deltaX);
473 gp.setY(gp.getY()+deltaY);
474 g.add(gp);
475
476 /*
477 in=new FileInputStream("essai.ser");
478 r=DjaLoader.loadAsSer(in);
479 in.close();
480
481 gp=new DjaGroup("essai.ser");
482 for(Enumeration e=r.getObjects().elements();
483 e.hasMoreElements(); )
484 {
485 DjaObject o=(DjaObject)e.nextElement();
486 gp.add(o);
487 }
488 gp.setSelected(true);
489 gp.setX(gp.getX()+2*deltaX);
490 gp.setY(gp.getY()+2*deltaY);
491 g.add(gp);
492 */
493
494 g.repaint();
495 }
496 catch(IOException ex1) { ex1.printStackTrace(); }
497 //catch(ClassNotFoundException ex2) { ex2.printStackTrace(); }
498 }
499 }
500 );
501
502 g.addGridListener
503 (new DjaGridListener()
504 {
505 public void objectAdded (DjaGridEvent _evt) { System.err.println("EVT: "+_evt); }
506 public void objectRemoved (DjaGridEvent _evt) { System.err.println("EVT: "+_evt); }
507 public void objectConnected (DjaGridEvent _evt) { System.err.println("EVT: "+_evt); }
508 public void objectDisconnected(DjaGridEvent _evt) { System.err.println("EVT: "+_evt); }
509 public void objectSelected (DjaGridEvent _evt) { System.err.println("EVT: "+_evt); }
510 public void objectUnselected (DjaGridEvent _evt) { System.err.println("EVT: "+_evt); }
511 public void objectModified (DjaGridEvent _evt) { System.err.println("EVT: "+_evt); }
512 });
513
514 JPanel p=new JPanel(new GridLayout(1,3));
515 p.add(tbi);
516 p.add(tbs);
517 p.add(tbl);
518 f.getContentPane().add("South",p);
519
520 f.pack();
521 f.setSize(500,500);
522 f.show();
523 f.setLocation(200,100);
524
525 tbi.requestFocus();
526 }
527 }