import java.awt.event.*; import java.awt.*; public class EscalarHandler implements ActionListener { private Dibujo dibujo; private Point ancla; private double largoReferencia; private Cruz cruz; private int estado; private static final int INICIO_NUEVO_ESCALAMIENTO=0; private static final int ANCLA_FIJADA=1; private static final int TERMINO_ESCALAMIENTO=2; EscalarHandler(Dibujo dib) { dibujo=dib; cruz = new Cruz(); } public void actionPerformed(ActionEvent e) { dibujo.changeMouseListener(new MouseHandler()); dibujo.changeMouseMotionListener(new MouseMotionHandler()); estado = INICIO_NUEVO_ESCALAMIENTO; } class MouseHandler extends MouseAdapter { public void mouseClicked(MouseEvent event) { if (estado==INICIO_NUEVO_ESCALAMIENTO) { ancla = event.getPoint(); dibujo.remueva(cruz); cruz.setPoint(ancla); dibujo.incorpore(cruz); estado = ANCLA_FIJADA; } } public void mousePressed (MouseEvent event) { if (estado==ANCLA_FIJADA) { Point p = event.getPoint(); double x = p.getX()-ancla.getX(); double y = p.getY()-ancla.getY(); largoReferencia= Math.sqrt(x*x+y*y); } if (estado==TERMINO_ESCALAMIENTO) estado = INICIO_NUEVO_ESCALAMIENTO; } public void mouseReleased(MouseEvent event) { if (estado==ANCLA_FIJADA){ dibujo.remueva(cruz); estado = TERMINO_ESCALAMIENTO; } } } class MouseMotionHandler extends MouseMotionAdapter { public void mouseDragged(MouseEvent event) { if (estado == ANCLA_FIJADA) { Point p = event.getPoint(); double x = p.getX()-ancla.getX(); double y = p.getY()-ancla.getY(); double distanciaAlAncla = Math.sqrt(x*x+y*y); double factorEscala=distanciaAlAncla/largoReferencia; dibujo.escalar(ancla, factorEscala); largoReferencia= distanciaAlAncla; } } } }