import vix.*; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import java.util.ArrayList; public class FiltroZoom extends Filter { protected static final float FATOR_AFASTAMENTO = 0.8F; protected static final Color COR_XOR = Color.white; protected static final Cursor CURSOR = new Cursor(Cursor.CROSSHAIR_CURSOR); protected Point2D p1, p2; protected boolean arrastando; protected boolean termina; protected Mapa mapa; public FiltroZoom(Mapa mapa) { this.mapa = mapa; } protected void inicia() { p1 = null; p2 = null; arrastando = false; } public boolean changeVS(TypeVS old_vs, TypeVS new_vs) { if (super.changeVS(old_vs, new_vs)) { if (vs != null) { PegaMapaMsg pega_mapa = new PegaMapaMsg(); if (pega_mapa.sendVS(vs)) mapa.setCursor(CURSOR); inicia(); } return true; } return false; } public void callbackKey(KeyEvent ev) { if (ev.getKeyCode() == ev.VK_ESCAPE) { if (arrastando) marca(); mapa.insertFilter(null); return; } super.callbackKey(ev); } public void callbackButton(Point2D pt, MouseEvent ev) { if (ev.getID() == MouseEvent.MOUSE_PRESSED) { p1 = pt; return; } if (ev.getID() == MouseEvent.MOUSE_RELEASED) { if (p1!=null && arrastando) { p2 = pt; aproxima(); p1 = null; p2 = null; arrastando = false; } else termina = true; } if (ev.getID() == MouseEvent.MOUSE_CLICKED) { if (termina) mapa.insertFilter(null); } } public void callbackDrag(Point2D pt, MouseEvent ev) { if (p1!=null && p2!=null) marca(); p2 = pt; marca(); arrastando = true; } protected void marca() { Graphics2D g = vs.getGraphics2D(); float x = (float)Math.min(p1.getX(), p2.getX()); float y = (float)Math.min(p1.getY(), p2.getY()); float w = (float)Math.max(p1.getX(), p2.getX())-x+1; float h = (float)Math.max(p1.getY(), p2.getY())-y+1; Rectangle2D área = new Rectangle2D.Float(x, y, w, h); AffineTransform matriz = mapa.getMatriz(); float espessura = (float)Math.min(1,1/matriz.getScaleX()); g.setStroke(new BasicStroke(espessura)); g.setXORMode(COR_XOR); g.draw(área); } protected void aproxima() { float x = (float)Math.min(p1.getX(), p2.getX()); float y = (float)Math.min(p1.getY(), p2.getY()); float w = (float)Math.max(p1.getX(), p2.getX())-x+1; float h = (float)Math.max(p1.getY(), p2.getY())-y+1; float apw = ((float)mapa.getWidth())/w; float aph = ((float)mapa.getHeight())/h; float escala = (apw