// Last edited on 2001-05-15 22:50:10 by mc726 import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Dimension; import java.awt.Point; import java.awt.Canvas; import java.awt.Event; import java.awt.Color; import Ponto; import Retangulo; import Nodo; import Planta; import Elemento; import Trecho; import Escala; import Gravura; import GravuraImpl; import InterfaceGrafica; import Desenhador; import Localizador; import DesenhadorImpl; import LocalizadorImpl; class PlinMapa extends Canvas { InterfaceGrafica raiz; // Janela principal Engenho engenho; Retangulo rFoco; Dimension tamanhoMin = null; Dimension tamanhoBom = null; Color corFundoMapa = new Color(255,245,235); public PlinMapa(Engenho eng, Retangulo rInicial, InterfaceGrafica z) { engenho = eng; rFoco = rInicial; raiz = z; setBackground(Color.white); calculaTamanho(rInicial); } public Retangulo pegaFoco() // Devolve o retângulo de interesse corrente. { return(rFoco); } public void mudaFoco(Retangulo r) // Altera o retângulo de interesse corrente. { rFoco = r; repaint(); } private Escala e = new EscalaImpl(); private Rectangle rClip = new Rectangle(); public void paint (Graphics gTela) { Rectangle tR = getBounds(); e.define(tR, rFoco); engenho.desenhaMapa(new GravuraImpl(gTela, e, 75/25.4), rFoco); } public void start() { this.repaint(); } public boolean mouseDown(Event evt, int x, int y) { Rectangle rTela = getBounds(); Ponto pMapa = new Ponto(); Point pTela = new Point(); pTela.x = x; pTela.y = y; System.out.println("Clique(Plin) X,Y -> (" + pTela.x + "," + pTela.y + ")"); System.out.print("Area do Mapa -> (" + rTela.width + "," + rTela.height + ")"); e.define(rTela, rFoco); e.telaParaMapa(pTela, pMapa); System.out.println(" X,Y corrigidos -> (" + pMapa.x + "," + pMapa.y + ")"); Trecho tr = engenho.loc().trechoMaisProximo(pMapa); Servico sv = engenho.loc().servicoMaisProximo(pMapa); Elemento ob = (tr.distancia(pMapa) < sv.distancia(pMapa) ? (Elemento)tr : (Elemento)sv ); raiz.comandoSelecionarElemento(ob); return(true); } private void calculaTamanho(Retangulo r) { double forma = (r.yMax - r.yMin)/(r.xMax - r.xMin); if (forma > 2.0) { forma = 2.0; } if (forma < 0.5) { forma = 0.5; } forma = Math.sqrt(forma); int bom = 500; // Tamanho ideal em pixels int min = 300; // Tamanho mínimo em pixels tamanhoMin = new Dimension((int)(min/forma), (int)(min*forma)); tamanhoBom = new Dimension((int)(bom/forma), (int)(bom*forma)); } public Dimension getMinimumSize() { return tamanhoMin; } public Dimension getPreferredSize() { return tamanhoBom; } }