// Last edited on 2001-05-22 21:18:04 by stolfi // Classe principal - applet da interface grafica com o usuario import java.util.*; import java.io.*; import java.lang.Math; import java.awt.*; import java.applet.Applet; import java.net.URL; import Planta; import Trecho; import Elemento; import Nodo; import Planta; import PlantaImpl; import Otimizador; import OtimizadorImpl; import Engenho; import PlinLayout; import PlinMapa; import PlinVistaGlobal; import PlinPainelDeFerramentas; import PlinMenuBar; import PlinDados; public class Plin extends InterfaceGrafica { // Localização de recursos String mainDir = "file:/home/staff/stolfi/programs/java/Plin-2001"; String dirDados = "maps"; String dirIcones = "icons"; // URL URLBase = this.getCodeBase(); // Estado da aplicação e engenho geográfico: Planta planta; Engenho engenho; Retangulo rTudo; // Retangulo que engloba a planta inteira // Parâmetros para zoom: private double minTamanho; // Dimensão mínima para o retângulo de interesse private double maxTamanho; // Dimensão máxima para o retângulo de interesse // Sub-janelas e layout: PlinMapa mapa; PlinPainelDeFerramentas ferramentas; PlinVistaGlobal vistaGlobal; PlinMenuBar menuBar; PlinDados dados; PlinLayout layout; // A planta da cidade: String nomeDaPlanta = "big"; // Usado pelo sistema para inicializar o applet: public void init() { Graphics g; int NOFILL = GridBagConstraints.NONE; int XYFILL = GridBagConstraints.BOTH; int NWALIGN = GridBagConstraints.NORTHWEST; int NALIGN = GridBagConstraints.NORTH; int CTALIGN = GridBagConstraints.CENTER; // if (URLBase != null) // { mensagem("URLBase = \"" + URLBase.toString() + "\""); } this.setFont(new Font("Helvetica", Font.PLAIN, 14)); this.setBackground(Color.white); // this.setSize(800, 600); { String dataName = dirDados + "/" + nomeDaPlanta; mensagem("Carregando a planta " + dataName + "..."); try { planta = new PlantaImpl(dataName); } catch (IOException e) { mensagem(e.toString()); mensagem("Erro ao carregar planta. Execucao Abortada."); termina(); } engenho = new EngenhoImpl(planta, this); rTudo = planta.dominio(); double xTam = rTudo.xMax - rTudo.xMin; double yTam = rTudo.yMax - rTudo.yMin; double tamanho = (xTam + yTam)/2; minTamanho = 5.0; maxTamanho = 10.0*tamanho; } layout = new PlinLayout(this, 2,4); // { mensagem("Criando barra de menu..."); // menuBar = new PlinMenuBar(this, planta); // layout.acrescentaComponente(menuBar, 1.0,0.0, 0,2, ?,1, XYFILL, CTALIGN); // } { mensagem("Criando painel de ferramentas..."); ferramentas = new PlinPainelDeFerramentas(dirIcones, this); layout.acrescentaComponente(ferramentas, 0.0,0.0, 0,1, 0,1, NOFILL, NWALIGN); } { mensagem("Criando mapa principal..."); mapa = new PlinMapa(engenho, rTudo, this); layout.acrescentaComponente(mapa, 1.0,1.0, 1,1, 0,3, XYFILL, CTALIGN); } mensagem("Criando a janela de vista global..."); { String nomeDaVista = dirDados + "/" + nomeDaPlanta + "-thumb.jpg"; vistaGlobal = new PlinVistaGlobal(nomeDaVista, rTudo, this); layout.acrescentaComponente(vistaGlobal, 0.0,1.0, 0,1, 1,1, NOFILL, NALIGN); } { mensagem("Criando área de dados..."); dados = new PlinDados(this); layout.acrescentaComponente(dados, 1.0,0.0, 0,2, 3,1, XYFILL, CTALIGN); } } // Usado pelo sistema para startar o applet: public void start() { layout.layoutContainer(this); this.validate(); if (mapa != null) { mapa.repaint(); } if (vistaGlobal != null) { vistaGlobal.repaint(); } if (ferramentas != null) { ferramentas.repaint(); } if (dados != null) { dados.repaint(); } this.repaint(); } ////////////////////////////////////////////////////////////////////// // MÉTODOS GERAIS public Retangulo pegaFoco() { return(mapa.pegaFoco()); } public void mensagem(String msg) { System.out.println(msg); showStatus(msg); } public void termina() { mensagem("deveria terminar aqui"); } ////////////////////////////////////////////////////////////////////// // MÉTODOS PARA RESPONDER A COMANDOS DO USUÁRIO public void comandoMudarModo(int md) { engenho.mudaModo(md); } public void comandoMudarFoco(Retangulo r) { mapa.mudaFoco(r); r = mapa.pegaFoco(); vistaGlobal.mudaFoco(r); } public void comandoZoom(double fatorDeZoom) { Retangulo rMapa = pegaFoco(); double xTamVelho = rMapa.xMax - rMapa.xMin; double yTamVelho = rMapa.yMax - rMapa.yMin; double tamVelho = (xTamVelho < yTamVelho ? xTamVelho : yTamVelho); double tamNovo = tamVelho / fatorDeZoom; if ((tamNovo >= minTamanho) && (tamNovo <= maxTamanho)) { double xC = (rMapa.xMin + rMapa.xMax)/2; double yC = (rMapa.yMin + rMapa.yMax)/2; double xR = xTamVelho / fatorDeZoom /2; double yR = yTamVelho / fatorDeZoom /2; double xMin = xC - xR; double yMin = yC - yR; comandoMudarFoco(new Retangulo(xC - xR, xC + xR, yC - yR, yC + yR)); } } public void comandoSelecionarElemento(Elemento ob) { engenho.cutucaElemento(ob); } public void comandoMudarTipoDesejado(String tipo) { engenho.mudaTipoDesejado(tipo); } public void comandoMudarCustoMaximo(double cMax) { engenho.mudaCustoMaximo(cMax); } public void comandoMudarNumeroDesejado(int nDes) { engenho.mudaNumeroDesejado(nDes); } private int seqImpressao = 0; public void comandoImprimir() { seqImpressao++; String nomeDoArquivo = nomeDaPlanta + seqImpressao; engenho.imprimeMapa(nomeDoArquivo, pegaFoco()); } ////////////////////////////////////////////////////////////////////// // MÉTODOS PARA CALL-BACK DO ENGENHO public void avisoMudouModo(int md) { // Deveria dar algum feedback ao usuário... this.repaint(); } public void avisoMudaramSelecoes(Elemento[] sel) { mapa.repaint(); } public void avisoMudaramCaminhos(Nodo[] cam) { mapa.repaint(); } }