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 }