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

Quick Search    Search Deep

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