Source code: org/fudaa/ebli/volume/EbliFilleVue3D.java
1 /*
2 * @file EbliFilleVue3D.java
3 * @creation 2000-02-04
4 * @modification $Date: 2003/01/17 14:33:28 $
5 * @license GNU General Public License 2
6 * @copyright (c)1998-2001 CETMEF 2 bd Gambetta F-60231 Compiegne
7 * @mail devel@fudaa.org
8 */
9
10 package org.fudaa.ebli.volume;
11
12 import java.awt.BorderLayout;
13 import java.awt.Color;
14 import java.awt.Dimension;
15 import java.awt.FlowLayout;
16 import java.awt.Font;
17 import java.awt.Graphics;
18 import java.awt.Image;
19 import java.awt.Rectangle;
20 import java.awt.Toolkit;
21 import java.awt.event.ActionEvent;
22 import java.awt.event.ActionListener;
23 import java.awt.event.ItemEvent;
24 import java.awt.event.ItemListener;
25 import java.awt.event.KeyEvent;
26 import java.awt.event.KeyListener;
27 import java.awt.event.WindowEvent;
28 import java.awt.event.WindowListener;
29 import java.awt.print.PageFormat;
30 import java.awt.print.Printable;
31 import java.beans.PropertyChangeEvent;
32 import java.beans.PropertyChangeListener;
33 import java.beans.PropertyVetoException;
34
35 import javax.media.j3d.Transform3D;
36 import javax.swing.JButton;
37 import javax.swing.JCheckBox;
38 import javax.swing.JComboBox;
39 import javax.swing.JComponent;
40 import javax.swing.JFrame;
41 import javax.swing.JMenu;
42 import javax.swing.JPanel;
43 import javax.swing.JWindow;
44 import javax.swing.event.InternalFrameEvent;
45 import javax.swing.event.InternalFrameListener;
46
47 import org.fudaa.ebli.impression.EbliFilleImprimable;
48 import org.fudaa.ebli.impression.EbliPrinter;
49 import org.fudaa.ebli.palette.BSelecteurReduitPaletteCouleur;
50 import org.fudaa.ebli.commun.EbliPreferences;
51 import org.fudaa.ebli.ressource.EbliResource;
52 import org.fudaa.ebli.volume.controles.BArbreVolume;
53 import org.fudaa.ebli.volume.controles.BControleEchelle;
54 import org.fudaa.ebli.volume.controles.BControleLumiere;
55 import org.fudaa.ebli.volume.controles.BControleVolume;
56 import org.fudaa.ebli.volume.controles.BImportVolume;
57 import org.fudaa.ebli.volume.controles.BMagnetoscope;
58 import org.fudaa.ebli.volume.controles.BPas;
59 import org.fudaa.ebli.volume.controles.BSelecteurTexture;
60 import org.fudaa.ebli.volume.controles.BUniversInteraction;
61 import org.fudaa.ebli.volume.controles.BVolumeTransformation;
62 import org.fudaa.ebli.volume.controles.TransformTypeIn;
63
64 import com.memoire.bu.BuBorderLayout;
65 import com.memoire.bu.BuCommonInterface;
66 import com.memoire.bu.BuDesktop;
67 import com.memoire.bu.BuInformationsDocument;
68 import com.memoire.bu.BuMenu;
69 import com.memoire.bu.BuPopupButton;
70 import com.memoire.bu.BuResource;
71 import com.memoire.bu.BuVerticalLayout;
72
73
74 /**
75 * @version $Id: EbliFilleVue3D.java,v 1.4 2003/01/17 14:33:28 deniger Exp $
76 * @author Christophe Delhorbe
77 */
78 public class EbliFilleVue3D
79 extends EbliFilleImprimable
80 implements InternalFrameListener,WindowListener
81 {
82 private BUnivers u_;
83 private Color backgroundUnivers_;
84 private BArbreVolume av_;
85 private BuMenu mnVolumes;
86 private BuPopupButton pbPalette;
87 private BuPopupButton pbTexture;
88 private BuPopupButton pbLumiere;
89 private BuPopupButton pbEchelle;
90 private BuPopupButton pbTransfo;
91 private MyFrame frame;
92 private Transform3D[] t;
93 private BGroupeStandard gs;
94 private boolean hide=false;
95 private BuInformationsDocument idAppli_;
96 private BCartouche cart;
97 private BGroupeStandard objets2d;
98 private BControleLumiere controle_lumiere;
99 private BControleEchelle controle_echelle;
100 private BVolumeTransformation transfo_volume;
101 private BImportVolume import_volume;
102 private BMagnetoscope mag;
103
104 private boolean anim=false;
105
106 public BUnivers getUnivers() { return u_; }
107
108 public BArbreVolume getArbreVolume() { return av_; }
109 public void setArbreVolume(BArbreVolume _av) { av_=_av;controle_lumiere.addPropertyChangeListener(av_); }
110
111 public EbliFilleVue3D(BuInformationsDocument _idAppli,boolean _animation)
112 { this(_idAppli,null,_animation); }
113
114 public EbliFilleVue3D(BuInformationsDocument _idAppli,
115 BuCommonInterface _appli,boolean _animation)
116 {
117 super("Vue 3D",true,false,true,true,_appli,_idAppli);
118 addInternalFrameListener(this);
119
120 av_=new BArbreVolume();
121 mnVolumes=av_.buildNormalMenu();
122
123 idAppli_=_idAppli;
124 build(_animation);
125 }
126
127 public void build(boolean _animation)
128 {
129 frame=new MyFrame("Vue 3D");
130 u_=new BUnivers(null);
131 u_.addPropertyChangeListener(frame);
132
133 String s=EbliPreferences.EBLI.getStringProperty("volume.background");
134 System.out.println("preference fond: "+s);
135 try
136 {
137 String red=s.substring(0,s.indexOf(','));
138 String green=s.substring(s.indexOf(',')+1,s.lastIndexOf(','));
139 String blue=s.substring(s.lastIndexOf(',')+1);
140 backgroundUnivers_=new Color(Integer.parseInt(red),Integer.parseInt(green),Integer.parseInt(blue));
141 }
142 catch (StringIndexOutOfBoundsException ex)
143 {
144 backgroundUnivers_=Color.black;
145 }
146 System.out.println("--> couleur "+backgroundUnivers_);
147 u_.setImmediateBackground(backgroundUnivers_);
148
149
150 frame.addPropertyChangeListener(av_);
151 // Panel Sud : controle deplacement
152
153 JPanel jp=new JPanel();
154 jp.setLayout(new FlowLayout());
155
156 BUniversInteraction ui=new BUniversInteraction(u_);
157 JButton init=new JButton("Init");
158 init.addActionListener(ui);
159
160
161
162 JComboBox vue=new JComboBox();
163 vue.addItem("Perspective");
164 vue.addItem("Dessus");
165 vue.addItem("Face");
166 vue.addItem("Gauche");
167 vue.setEditable(false);
168
169 vue.addItemListener(new VueListener());
170
171
172
173 BControleVolume cv=new BControleVolume();
174 cv.addRepereEventListener(ui);
175 cv.addPropertyChangeListener(ui);
176 cv.setFrame(frame);
177 BPas coef=new BPas(cv);
178 // BPosition pos=new BPosition();
179 // u_.addPropertyChangeListener("position",pos);
180 TransformTypeIn transf=new TransformTypeIn();
181 transf.addRepereEventListener(ui);
182 transf.addItemListener(ui);
183 u_.addPropertyChangeListener("position",transf);
184
185 JCheckBox orbital=new JCheckBox("Orbital");
186 orbital.addItemListener(ui);
187 orbital.setSelected(false);
188
189 JPanel boutons=new JPanel();
190 boutons.setLayout(new BuVerticalLayout());
191 boutons.add(init);
192 boutons.add(vue);
193 boutons.add(orbital);
194
195 cart=new BCartouche();
196 cv.addPropertyChangeListener(cart);
197 cart.setName("Cartouche");
198 cart.setFont(new Font("SansSerif",Font.PLAIN,10));
199 cart.setInformations(idAppli_);
200 cart.setForeground(Color.black);
201 cart.setBackground(new Color(255,255,224));
202 cart.setVisible(false);
203
204 objets2d=new BGroupeStandard();
205 objets2d.setName("2D");
206 objets2d.add(cart);
207
208 // jp.add(pos);
209 jp.add(transf);
210 jp.add(cv);
211 jp.add(coef);
212 jp.add(boutons);
213 jp.add(cart);
214
215 BSelecteurReduitPaletteCouleur palette=new BSelecteurReduitPaletteCouleur();
216 palette.addPropertyChangeListener(av_);
217
218 pbPalette=new BuPopupButton(EbliResource.EBLI.getString("Palette"),palette);
219 pbPalette.setToolTipText(EbliResource.EBLI.getString("Couleurs du volume"));
220 pbPalette.setIcon(EbliResource.EBLI.getIcon("palettecouleur"));
221
222 BSelecteurTexture stex=new BSelecteurTexture();
223 stex.addPropertyChangeListener(av_);
224
225 pbTexture=new BuPopupButton(EbliResource.EBLI.getString("Texture"),stex);
226 pbTexture.setToolTipText(EbliResource.EBLI.getString("Texture du volume"));
227 pbTexture.setIcon(EbliResource.EBLI.getIcon("texture"));
228
229 controle_lumiere=new BControleLumiere();
230 controle_lumiere.addPropertyChangeListener(av_);
231 pbLumiere=new BuPopupButton(EbliResource.EBLI.getString("Lumiere"),controle_lumiere);
232 pbLumiere.setToolTipText(EbliResource.EBLI.getString("Réglage de la lumiere"));
233 pbLumiere.setIcon(EbliResource.EBLI.getIcon("lumiere"));
234
235 controle_echelle=new BControleEchelle();
236 controle_echelle.addPropertyChangeListener(av_);
237 pbEchelle=new BuPopupButton(EbliResource.EBLI.getString("Echelle"),controle_echelle);
238 pbEchelle.setToolTipText(EbliResource.EBLI.getString("Deformation suivant les Z"));
239 pbEchelle.setIcon(EbliResource.EBLI.getIcon("echellez"));
240
241 transfo_volume=new BVolumeTransformation();
242 transfo_volume.addPropertyChangeListener(av_);
243 pbTransfo=new BuPopupButton(EbliResource.EBLI.getString("Transfo"),transfo_volume);
244 pbTransfo.setToolTipText(EbliResource.EBLI.getString("Transformation"));
245 pbTransfo.setIcon(EbliResource.EBLI.getIcon("transform"));
246
247 import_volume=new BImportVolume();
248 import_volume.addPropertyChangeListener(av_);
249 import_volume.setToolTipText(EbliResource.EBLI.getString("Importer un Objet VRML"));
250 import_volume.setIcon(BuResource.BU.getIcon("importer"));
251 JPanel est=new JPanel(new BuVerticalLayout());
252 est.add(av_);
253
254 if (_animation)
255 {
256 JButton animbu=new JButton("Anim");
257 // anim.addPropertyChangeListener(av_);
258 animbu.addActionListener(new AL());
259 est.add(animbu);
260 }
261 //est.add(controle_echelle);
262
263 mag=new BMagnetoscope(u_);
264 est.add(mag);
265
266
267 JComponent content_=(JComponent)frame.getContentPane();
268 content_.setLayout(new BorderLayout());
269 content_.add("Center",u_);
270 content_.add("South" ,jp);
271 content_.add("East",est);
272
273 if (gs!=null) u_.setRoot(gs);
274 if (t!=null) u_.setUniversTransforms(t);
275 u_.freeze(false);
276 setVisible(false);
277 frame.addWindowListener(this);
278 frame.setSize(new Dimension(600,600));
279 frame.setVisible(true);
280 }
281 // BuInternalFrame
282 public void cache()
283 {
284 hide=true;
285 frame.setVisible(false);
286 }
287
288 public void montre()
289 {
290 frame.setVisible(true);
291 }
292
293 public JMenu[] getSpecificMenus()
294 {
295 JMenu[] r=new JMenu[1];
296 r[0]=mnVolumes;
297 return r;
298 }
299
300 public JComponent[] getSpecificTools()
301 {
302 pbPalette.setDesktop((BuDesktop)getDesktopPane());
303 pbTexture.setDesktop((BuDesktop)getDesktopPane());
304 pbLumiere.setDesktop((BuDesktop)getDesktopPane());
305 pbEchelle.setDesktop((BuDesktop)getDesktopPane());
306 pbTransfo.setDesktop((BuDesktop)getDesktopPane());
307 // import_volume.setDesktop((BuDesktop)getDesktopPane());
308
309 JComponent[] r=new JComponent[6];
310 r[0]=pbPalette;
311 r[1]=pbTexture;
312 r[2]=pbLumiere;
313 r[3]=pbEchelle;
314 r[4]=pbTransfo;
315 r[5]=import_volume;
316 return r;
317 }
318
319 public String[] getEnabledActions()
320 {
321 String[] r=new String[]
322 {
323 "IMPRIMER","MISEENPAGE","PREVISUALISER"
324 };
325 return r;
326 }
327
328 public void setRoot(BGroupeStandard _root)
329 {
330
331 gs=_root;
332 gs.add(objets2d);
333 u_.setRoot(gs);
334 av_.setVolume(u_.getRoot());
335 }
336
337 // InternalFrameListener
338 public void internalFrameActivated(InternalFrameEvent e)
339 {}
340
341 public void internalFrameClosed(InternalFrameEvent e)
342 {}
343
344 public void internalFrameClosing(InternalFrameEvent e)
345 {}
346
347 public void internalFrameDeactivated(InternalFrameEvent e)
348 {}
349
350 public void internalFrameDeiconified(InternalFrameEvent e)
351 {}
352
353 public void internalFrameIconified(InternalFrameEvent e)
354 {}
355
356 public void internalFrameOpened(InternalFrameEvent e)
357 {}
358
359 // WindowListener
360 public void windowActivated(WindowEvent e)
361 {
362 try {
363 setSelected(true);
364 }
365 catch(PropertyVetoException ex) {}
366 }
367
368 public void windowClosed(WindowEvent e)
369 {}
370
371 public void windowClosing(WindowEvent e)
372 {
373 cache();
374 u_.animate(false);
375 try{
376 setClosed(true);
377 }
378 catch(PropertyVetoException ex) {}
379 }
380
381 public void windowDeactivated(WindowEvent e)
382 {
383
384 if (hide==false)
385 frame.toFront();
386 /* else
387 hide=true;*/
388 }
389
390 public void windowDeiconified(WindowEvent e)
391 {}
392
393 public void windowIconified(WindowEvent e)
394 {}
395
396 public void windowOpened(WindowEvent e)
397 {}
398
399 // BuPrintable
400
401 /* public void print(PrintJob _job, Graphics _g)
402 {
403 BuPrinter.INFO_DOC =new BuInformationsDocument();
404 BuPrinter.INFO_DOC.name=getTitle();
405 BuPrinter.INFO_DOC.logo=BuResource.BU.getIcon("calque");
406 u_.setBackground(Color.white);
407
408 try{
409 Thread.currentThread().sleep(1000);
410 } catch(InterruptedException ex) {System.out.println(ex);}
411
412
413 Image i=u_.print();
414 System.out.println("Image OK, on imprime");
415 BuPrinter.printImage(_job,_g,i);
416 u_.setBackground(backgroundUnivers_);
417 }
418 */
419
420 public int getNumberOfPages()
421 {return 1; }
422
423 public int print(Graphics _g,PageFormat _f,int _page)
424 {
425 if( _page!=0) return Printable.NO_SUCH_PAGE;
426 u_.setBackground(Color.white);
427 Image i=u_.print();
428 EbliPrinter.printImage(_g,_f,i);
429 u_.setBackground(backgroundUnivers_);
430
431 return Printable.PAGE_EXISTS;
432 }
433 public BuInformationsDocument getInformationsDocument()
434 { return idAppli_;}
435
436
437 class MyFrame extends JFrame implements PropertyChangeListener
438 {
439
440 public MyFrame(String s) { super(s); }
441 int indice=0;
442
443 synchronized public void propertyChange(PropertyChangeEvent e)
444 {
445 if (e.getPropertyName()=="swap")
446 {
447 Graphics g=u_.getGraphics();
448 if (cart!=null)
449 {
450 Rectangle rect=u_.getBounds();
451 Dimension size=cart.getPreferredSize();
452 if (size.equals(new Dimension(0,0))) size=new Dimension(300,150);
453 int x=rect.x+rect.width-size.width;
454 int y=rect.y+rect.height-size.height;
455 cart.setLocation(x,y);
456 cart.paint(g);
457 }
458 /* if (anim==true)
459 {
460
461 System.out.println ("Anim frame "+indice);
462 this.firePropertyChange("temps",new Long((indice-1)),new Long(indice));
463 indice++;
464 if (indice==200) indice=0;
465
466
467
468 }
469 */
470 }
471 }
472 }
473
474 class AL implements ActionListener
475 {
476
477 public double t=0;
478
479 public void actionPerformed(ActionEvent e)
480 {
481
482 anim=!anim;
483 u_.animate(anim);
484 // ((JButton)e.getSource()).firePropertyChange("temps",0d,0.1d);
485 // u_.startRenderer();
486 }
487 }
488
489 class VueListener implements ItemListener
490 {
491 public void itemStateChanged(ItemEvent e)
492 {
493 u_.setVue(((JComboBox)e.getSource()).getSelectedIndex());
494 }
495 }
496
497 public void fullscreen()
498 {
499 final JWindow win =new JWindow();
500 final JComponent cwin =(JComponent)win.getContentPane();
501 final Dimension de =Toolkit.getDefaultToolkit().getScreenSize();
502
503 cwin.add(u_,BuBorderLayout.CENTER);
504
505 win.setSize(de.width,de.height);
506 win.setLocation(0,0);
507 frame.setVisible(false);
508 win.doLayout();
509 win.validate();
510 win.setVisible(true);
511 win.setLocation(0,0);
512 win.requestFocus();
513
514 win.addKeyListener(new KeyListener()
515 {
516 public void keyPressed(KeyEvent _ke)
517 {}
518 public void keyReleased(KeyEvent _ke)
519 {}
520 public void keyTyped(KeyEvent _ke)
521 {
522 if (_ke.getKeyChar()==27)
523 {
524 win.setVisible(false);
525 cwin.remove(u_);
526 frame.getContentPane().add("Center",u_);
527 frame.setVisible(true);
528 }
529 else
530 if (_ke.getKeyChar()==' ')
531 {
532 mag.play();
533 }
534 else System.out.println("Touche appuyée: "+_ke.getKeyChar()+" , code "+_ke.getKeyCode());
535 }
536 }
537 );
538 }
539
540 }
541
542