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

Quick Search    Search Deep

Source code: org/fudaa/ebli/calque/BCalqueTailleInteraction.java


1   /*
2    * $RCSfile: BCalqueTailleInteraction.java,v $
3    * @creation 10/02/99
4    * @modification $Date: 2003/01/30 10:56:50 $
5    * @statut instable
6    */
7   
8   package org.fudaa.ebli.calque;
9   
10  import org.fudaa.ebli.geometrie.*;
11  import java.awt.*;
12  import java.awt.event.*;
13  import java.util.*;
14  
15  /**
16   * Un calque de redimensionnement d'objets sélectionnes en coordonnees
17   * reelles.
18   * <p>
19   * L'objet doit être d'abord sélectionné. Le redimensionnement de l'objet
20   * est effectuée en cliquant sur une de ses poignées de sélection. Lors de
21   * l'opération, l'objet est retaillé en conservant comme point fixe la poignée
22   * directement opposée à celle saisie.
23   *
24   * @version $Id: BCalqueTailleInteraction.java,v 1.1 2003/01/30 10:56:50 deniger Exp $
25   * @author Bertrand Marchand
26   */
27  public class BCalqueTailleInteraction
28   extends    BCalqueInteraction
29   implements MouseMotionListener, MouseListener {
30  
31    /**
32     * Objets sélectionnés, prêts à être redimensionnés.
33     */
34    private VecteurGrContour selection_;
35  
36    /**
37     * Point de souris saisi à l'évenement MouseEvent précédent.
38     */
39    private GrPoint ptPrec_;
40  
41    /**
42     * Point fixe pour redimensionnement de l'objet.
43     */
44    private GrPoint ptFixe_=null;
45  
46    /**
47     * Point cliqué à l'écran.
48     */
49    private GrPoint ptClic_=null;
50  
51    /**
52     * Vue calque contenant le calque.
53     */
54    private BVueCalque vc_=null;
55  
56  
57    /**
58     * Création du calque de redimensionnement.
59     */
60    public BCalqueTailleInteraction() {
61      super();
62      selection_=new VecteurGrContour();
63      ptPrec_=null;
64    }
65  
66    /**
67     * Définition des objets sélectionnés, prêts pour être redimensionnés.
68     * @param _s Liste de sélection.
69     */
70    public void setSelection(VecteurGrContour _s) {
71      if ( _s==null ) return;
72      if ( _s==selection_ ) return;
73      VecteurGrContour vp=selection_;
74      selection_=_s;
75      firePropertyChange("selection", vp, selection_);
76    }
77  
78    /**
79     * Retourne la liste des objets sélectionnés.
80     * @return La liste.
81     */
82    public VecteurGrContour getSelection() { return selection_; }
83  
84    // >>> Interface MouseListener -----------------------------------------------
85  
86    /**
87     * Bouton souris pressé.
88     * On repère le coin de la boite englobante de l'objet le plus éloigné du
89     * point cliqué. C'est le point fixe.
90     */
91    public void mousePressed(MouseEvent _evt) {
92      if (isGele()) return;
93      if (selection_.nombre()==0) return;
94  
95      GrBoite btAll=new GrBoite();
96      for (int i=0; i<selection_.nombre(); i++) {
97        GrContour o=selection_.renvoie(i);
98        if (o instanceof GrObjet) btAll.ajuste(((GrObjet)o).boite());
99        else System.out.println(o.getClass()+": Not instance of GrObjet");
100     }
101 
102     ptPrec_=new GrPoint(_evt.getX(),_evt.getY(),0);
103     GrPolygone pgBt=btAll.enPolygoneXY();
104     double dstMax=Double.NEGATIVE_INFINITY;
105     double dst;
106     for (int i=0; i<pgBt.nombre(); i++) {
107       dst=pgBt.sommet(i).applique(getVersEcran()).distanceXY(ptPrec_);
108       if (dstMax<dst) {
109         dstMax=dst;
110         ptFixe_=pgBt.sommet(i);
111       }
112     }
113 
114     ptPrec_.autoApplique(getVersReel());
115 
116     // Stockage de la vueCalque qui contient ce calque.
117     if (vc_==null) {
118       Container parent=this;
119       while ((parent=parent.getParent())!=null && !(parent instanceof BVueCalque)) ;
120       vc_=(BVueCalque)parent;
121     }
122   }
123 
124   /**
125    * Bouton relaché.
126    * On réaffiche la vue calque.
127    */
128   public void mouseReleased(MouseEvent _evt) {
129     if (isGele()) return;
130     if (_evt.getModifiers()!=MouseEvent.BUTTON1_MASK ) return;
131     if (selection_.nombre()==0) return;
132 
133     ptPrec_=null;
134 
135     if (vc_!=null) vc_.repaint();
136   }
137 
138   /** Non utilisé. */
139   public void mouseClicked(MouseEvent _evt) {}
140 
141   /** Non utilisé. */
142   public void mouseEntered(MouseEvent _evt) {}
143 
144   /** Non utilisé. */
145   public void mouseExited(MouseEvent _evt) {}
146 
147   // <<< Interface MouseListener -----------------------------------------------
148 
149   // >>> Interface MouseMotionListener -----------------------------------------
150 
151   /**
152    * Drag souris.
153    * La taille de l'objet est modifiée, la vue est rafraichie.
154    */
155   public void mouseDragged(MouseEvent _evt) {
156     if (isGele()) return;
157     if (_evt.getModifiers()!=MouseEvent.BUTTON1_MASK) return;
158     if (selection_.nombre()==0) return;
159 
160     GrPoint ptOrig=ptFixe_.applique(getVersReel());
161     GrPoint ptCur=new GrPoint(_evt.getX(),_evt.getY(),0.).applique(getVersReel());
162     double ech=ptCur.distance(ptOrig)/ptPrec_.distance(ptOrig);
163 
164     for(int i=0; i<selection_.nombre(); i++) {
165       GrContour o=selection_.renvoie(i);
166       if (o instanceof GrObjet) {
167         ((GrObjet)o).autoApplique(GrMorphisme.translation(-ptFixe_.x,-ptFixe_.y,-ptFixe_.z));
168         ((GrObjet)o).autoApplique(GrMorphisme.dilatation(ech));
169         ((GrObjet)o).autoApplique(GrMorphisme.translation(ptFixe_.x,ptFixe_.y,ptFixe_.z));
170       }
171       else System.out.println(o.getClass()+": Not instance of GrObjet");
172     }
173     ptPrec_=ptCur;
174 
175     if (vc_!=null) vc_.repaint();
176   }
177 
178   /** Non utilisé. */
179   public void mouseMoved(MouseEvent _evt) {}
180 
181   // <<< Interface MouseMotionListener -----------------------------------------
182 }