// Last edited on 2000-09-05 04:33:38 by stolfi import java.awt.Rectangle; import java.awt.Point; import java.awt.Graphics; import java.awt.Canvas; import java.awt.Image; import java.awt.Color; import java.awt.Dimension; import java.awt.Event; import InterfaceGrafica; import PlinImage; import Retangulo; import Ponto; import Escala; import EscalaImpl; class PlinVistaGlobal extends Canvas { // Estado da interface InterfaceGrafica raiz; Image imagem; Rectangle rImagem = new Rectangle(); Retangulo rFoco = new Retangulo(); Escala e = new EscalaImpl(); Retangulo rTudo; // Áreas de trabalho: Rectangle rTela = new Rectangle(); Retangulo rMapa = new Retangulo(); PlinVistaGlobal(String nomeDaImagem, Retangulo rT, Plin z) { rTudo = new Retangulo(rT.xMin, rT.xMax, rT.yMin, rT.yMax); raiz = z; raiz.mensagem("Carregando imagem " + nomeDaImagem + "..."); imagem = PlinImage.getImage(raiz, nomeDaImagem); rImagem.x = 0; rImagem.width = imagem.getWidth(null); rImagem.y = 0; rImagem.height = imagem.getHeight(null); e.define(rImagem, rTudo); raiz.mensagem("dimensoes " + rImagem.width + " × " + rImagem.height); mudaFoco(rTudo); } public void mudaFoco(Retangulo r) { rFoco.xMin = r.xMin; rFoco.xMax = r.xMax; rFoco.yMin = r.yMin; rFoco.yMax = r.yMax; this.repaint(); } public void paint (Graphics g) { g.drawImage(imagem, rImagem.x, rImagem.y, rImagem.width, rImagem.height, this); g.setColor(Color.red); e.mapaParaTela(rFoco, rTela); g.drawRect(rTela.x, rTela.y, rTela.width, rTela.height); } public Dimension getPreferredSize() { return getMinimumSize(); } public Dimension getMinimumSize() { return new Dimension(rImagem.width+2, rImagem.height+2); } // Variaveis para processamento de eventos de mouse na janela private boolean arrastando = false; // true = arrastando o retangulo private boolean selecionando = false; // true = selecionando o retangulo // Estas variáveis só são válidas durante um drag: private Rectangle rMouse = new Rectangle(); // retângulo selecionado com mouse private Point pDown = new Point(); // ponto onde o mouse desceu private Point pLast = new Point(); // ponto do último evento public boolean mouseDown(Event evt, int x, int y) { if ((evt.modifiers & Event.META_MASK) != 0) { // Botão da direita return true; } else if ((evt.modifiers & Event.ALT_MASK) != 0) { // Botão do meio selecionando = true; } else { // Botão da esquerda arrastando = true; } Graphics g = getGraphics(); g.drawImage(imagem, rImagem.x, rImagem.y, rImagem.width, rImagem.height, this); e.mapaParaTela(rFoco, rMouse); pDown.x = x; pDown.y = y; pLast.x = x; pLast.y = y; g.setXORMode(Color.white); g.drawRect(rMouse.x, rMouse.y, rMouse.width, rMouse.height); return true; } public boolean mouseDrag(Event evt, int x, int y) { if (arrastando || selecionando) { Graphics g = getGraphics(); g.setXORMode(Color.white); g.drawRect(rMouse.x, rMouse.y, rMouse.width, rMouse.height); atualizaRetanguloDoMouse(x, y); g.drawRect(rMouse.x, rMouse.y, rMouse.width, rMouse.height); pLast.x = x; pLast.y = y; } return true; } public boolean mouseUp(Event evt, int x, int y) { if (arrastando || selecionando) { Graphics g = getGraphics(); g.setXORMode(Color.white); g.drawRect(rMouse.x, rMouse.y, rMouse.width, rMouse.height); atualizaRetanguloDoMouse(x, y); e.telaParaMapa(rMouse, rMapa); raiz.comandoMudarFoco(rMapa); arrastando = false; selecionando = false; } return true; } private void atualizaRetanguloDoMouse(int x, int y) { if (arrastando) { // Desloca rMouse conforme movimento do mouse rMouse.x += (x - pLast.x); rMouse.y += (y - pLast.y); } else if (selecionando) { // Recalcula envoltória do primeiro e último ponto: rMouse.x = (x < pDown.x ? x : pDown.x); rMouse.y = (y < pDown.y ? y : pDown.y); rMouse.width = (x <= pDown.x ? pDown.x - x : x - pDown.x); rMouse.height = (y <= pDown.y ? pDown.y - y : y - pDown.y); } else { // Ignora evento. } } }