/**
* @author Jean BRESSON
*
* Programme kartoMNT v2.0
* Copyright (C) 2003 Roland DERHI & Jean BRESSON
*
* Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence
* Publique G�n�rale GNU publi�e par la Free Software Foundation (version 2).
*
* Ce programme est distribu� car potentiellement utile, mais SANS AUCUNE GARANTIE, ni explicite ni implicite,
* y compris les garanties de commercialisation ou d'adaptation dans un but sp�cifique. Reportez-vous � la
* Licence Publique G�n�rale GNU pour plus de d�tails.
*
* Vous devez avoir re�u une copie de la Licence Publique G�n�rale GNU en m�me temps que ce programme ; si
* ce n'est pas le cas, �crivez � la
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, �tats-Unis.
*/
package kartoMNT;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.Vector;
import java.io.*;
import java.util.StringTokenizer;
import kartoMNT.karto.outils.MsgInfo;
/**
* Un dialogue permettant l'ouverture d'un ou plusieurs MNT,
* afin de les fusionner, les redimensionner, les r�echantillonner, ...
* @author Jean Bresson
*/
public class FusionMNTDialog extends JDialog {
// Mode d'�chantillonnage: choix du pas OU du nombre d'�chatillons
public static final int PAS_ECHANTILLONNAGE = 0;
public static final int NB_ECHANTILLONS = 1;
int modeSelect = PAS_ECHANTILLONNAGE;
DocumentKartoContainer documentKartoContainer;
DocumentMNTContainer documentMNTContainer;
java.awt.Frame parent;
int nbMNT; // Nobre de MNT charg�s
Vector vectMNT; // Vecteur contenant les diff�rents MNT charg�s
Vector vectListe; // Vecteur contenant les noms des MNT charg�s
MNTGenerateur mntGen; // R�alisera la g�n�ration du MNT
// Donn�es du nouveau MNT (celui que l'on souhaite g�n�rer
float x0 = Float.MAX_VALUE;
float y0 = Float.MAX_VALUE;
float xm = Float.MIN_VALUE;
float ym = Float.MIN_VALUE;
float pasX, pasY;
int nbEchX, nbEchY;
// Swing components
JPanel panelHaut;
JPanel panelBas;
JPanel panelInfo;
JPanel panelZoom;
JPanel panelDroite;
JPanel panelSelect;
JPanel panelS1;
JPanel panelS2;
JPanel panelS3;
JPanel panelNew;
JPanel panelFin;
JButton boutonAdd;
JButton boutonRemove;
JButton boutonOK;
JButton boutonAnnuler;
JButton boutonPlus;
JButton boutonMoins;
JList listeMNT;
JScrollPane scrollPane;
JScrollPane scrollPaneListe;
JTextArea txtInfo;
JLabel echXLabel;
JTextField echXTextField;
JLabel echYLabel;
JTextField echYTextField;
JRadioButton selecPas;
JRadioButton selecNb;
JLabel xoLabel;
JTextField xoTextField;
JLabel yoLabel;
JTextField yoTextField;
JLabel xmLabel;
JTextField xmTextField;
JLabel ymLabel;
JTextField ymTextField;
JPanelMNT panelMNT;
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
JFileChooser chooser;
/**
* Constructeur
*/
public FusionMNTDialog(java.awt.Frame _parent, DocumentKartoContainer _documentKartoContainer,
DocumentMNTContainer _documentMNTContainer){
super(_parent,ResourceManager.get("creatMNT"));
documentKartoContainer=_documentKartoContainer;
documentMNTContainer=_documentMNTContainer;
parent = _parent;
vectMNT = new Vector();
vectListe = new Vector();
nbMNT=0;
initComponents();
}
/**
* Cr�ation des composants de l'interface
*/
public void initComponents(){
panelHaut = new JPanel();
panelBas = new JPanel();
panelInfo = new JPanel();
panelZoom = new JPanel();
panelDroite = new JPanel();
panelSelect = new JPanel();
panelS1 = new JPanel();
panelS2 = new JPanel();
panelFin = new JPanel();
panelNew = new JPanel();
// PANEL GERNERAL //
BorderLayout borderLayout = new BorderLayout();
getContentPane().setLayout(borderLayout);
getContentPane().add(panelHaut, BorderLayout.CENTER);
getContentPane().add(panelBas, BorderLayout.SOUTH);
panelBas.setLayout(new BorderLayout());
panelBas.add(panelSelect, BorderLayout.WEST);
panelBas.add(panelNew, BorderLayout.CENTER);
panelBas.add(panelFin, BorderLayout.SOUTH);
// SELECTION DES MNT
// Ajout d'un MNT
boutonAdd = new JButton(ResourceManager.get("add"));
boutonAdd.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
addMNT();
}
}
);
// Suppression d'un MNT
boutonRemove = new JButton(ResourceManager.get("suppr"));
boutonRemove.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
removeMNT();
}
}
);
// Selection d'un MNT dans la liste:
// le MNT selectionn� est dessin� d'une autre couleur dans panelMNT
// et ses propri�t�s sont affich�es dans panelInfo
listeMNT = new JList(vectMNT);
scrollPaneListe = new JScrollPane(listeMNT);
scrollPaneListe.setPreferredSize(new Dimension(180, 80));
listeMNT.addListSelectionListener(new javax.swing.event.ListSelectionListener(){
public void valueChanged(javax.swing.event.ListSelectionEvent lse){
panelMNT.setSelected(listeMNT.getSelectedIndex());
panelMNT.repaint();
setInfo(listeMNT.getSelectedIndex());
}
}
);
panelSelect.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED),ResourceManager.get("selecMNT")));
panelSelect.setLayout(new FlowLayout());
panelSelect.add(panelS1);
panelSelect.add(panelS2);
panelS1.setLayout(new BorderLayout());
panelS1.add(boutonAdd, BorderLayout.NORTH);
panelS3 = new JPanel();
panelS1.add(panelS3, BorderLayout.CENTER);
panelS1.add(boutonRemove, BorderLayout.SOUTH);
panelS2.add(scrollPaneListe);
// CARACTERISTIQUES DU NOUVEAU MNT
panelNew.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED),ResourceManager.get("nouvMNT")));
panelNew.setLayout(new BorderLayout());
// Choix du pas d'�chantillonnage OU du nombre d'�chantillons (l'un ou l'autre)
// (Ces deux valeurs sont inversement proportionnelles pour une dimension fix�e)
echXLabel=new JLabel(ResourceManager.get("pX"));
echXTextField = new JTextField(4);
echYLabel=new JLabel(ResourceManager.get("pY"));
echYTextField = new JTextField(4);
selecPas = new JRadioButton(ResourceManager.get("pasEch"));
selecPas.setSelected(true);
selecNb = new JRadioButton(ResourceManager.get("nbEch"));
ButtonGroup echantillons = new ButtonGroup();
echantillons.add(selecPas);
echantillons.add(selecNb);
selecNb.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
modeSelect = NB_ECHANTILLONS;
echXLabel.setText(ResourceManager.get("nX"));
echYLabel.setText(ResourceManager.get("nY"));
echXTextField.setText(""+nbEchX);
echYTextField.setText(""+nbEchY);
}
}
);
selecPas.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
modeSelect = PAS_ECHANTILLONNAGE;
echXLabel.setText(ResourceManager.get("pX"));
echYLabel.setText(ResourceManager.get("pY"));
echXTextField.setText(""+pasX);
echYTextField.setText(""+pasY);
}
}
);
MyDocumentListener2 listenerEchantillonnageX=new MyDocumentListener2(){
public void run(){
updateEchantillonnageX();
}
};
MyDocumentListener2 listenerEchantillonnageY=new MyDocumentListener2(){
public void run(){
updateEchantillonnageY();
}
};
echXTextField.getDocument().addDocumentListener(listenerEchantillonnageX);
echYTextField.getDocument().addDocumentListener(listenerEchantillonnageY);
JPanel pp = new JPanel();
JPanel ppL = new JPanel();
JPanel ppR = new JPanel();
JPanel po = new JPanel();
JPanel pm = new JPanel();
ppL.setLayout(new BorderLayout());
ppL.add(selecPas,BorderLayout.NORTH);
ppL.add(selecNb,BorderLayout.SOUTH);
ppR.add(echXLabel);
ppR.add(echXTextField);
ppR.add(echYLabel);
ppR.add(echYTextField);
pp.add(ppL);
pp.add(ppR);
// Choix des dimensions du MNT
xoLabel=new JLabel("Xo");
xoTextField = new JTextField(8);
yoLabel=new JLabel("Yo");
yoTextField = new JTextField(8);
xmLabel=new JLabel("Xm");
xmTextField = new JTextField(8);
ymLabel=new JLabel("Ym");
ymTextField = new JTextField(8);
po.add(xoLabel);
po.add(xoTextField);
po.add(yoLabel);
po.add(yoTextField);
pm.add(xmLabel);
pm.add(xmTextField);
pm.add(ymLabel);
pm.add(ymTextField);
// Le contour d�fini est dessin� dans panelMNT
MyDocumentListener2 listenerSize = new MyDocumentListener2(){
public void run(){
updateSize();
}
};
xoTextField.getDocument().addDocumentListener(listenerSize);
xmTextField.getDocument().addDocumentListener(listenerSize);
yoTextField.getDocument().addDocumentListener(listenerSize);
ymTextField.getDocument().addDocumentListener(listenerSize);
panelNew.add(pp,BorderLayout.NORTH);
panelNew.add(po,BorderLayout.CENTER);
panelNew.add(pm,BorderLayout.SOUTH);
// BAS DU DIALOGUE
boutonOK = new JButton(ResourceManager.get("genMNT"));
boutonOK.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
genererMNT();
}
}
);
boutonAnnuler = new JButton(ResourceManager.get("CancelKey"));
boutonAnnuler.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
annuler();
}
}
);
panelFin.setLayout(new FlowLayout());
panelFin.add(boutonOK);
panelFin.add(boutonAnnuler);
// HAUT DU DIALOGUE
// PanelInfo dans lequel sont affich�es les caracteristiques
// du MNT selectionn�.
panelInfo.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED),ResourceManager.get("selectedMNT")));
txtInfo = new JTextArea();
txtInfo.setEditable(false);
txtInfo.setBackground(Color.lightGray);
panelInfo.setPreferredSize(new Dimension(120,200));
txtInfo.setText("");
panelInfo.add(txtInfo);
// PanelZoom contenant les boutons pour le zoom sur panelMNT
panelZoom.setLayout(new FlowLayout());
panelZoom.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED),ResourceManager.get("zoom")));
boutonPlus = new JButton("+");
boutonPlus.setPreferredSize(new Dimension(20,20));
boutonPlus.setMargin(new Insets(0,0,0,0));
boutonMoins = new JButton("-");
boutonMoins.setPreferredSize(new Dimension(20,20));
boutonMoins.setMargin(new Insets(0,0,0,0));
boutonPlus.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
panelMNT.zoomin();
}
}
);
boutonMoins.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
panelMNT.zoomout();
}
}
);
panelZoom.add(boutonPlus);
panelZoom.add(boutonMoins);
panelDroite = new JPanel();
panelDroite.setLayout(new BorderLayout());
panelDroite.add(panelZoom, BorderLayout.NORTH);
panelDroite.add(panelInfo, BorderLayout.CENTER);
// PANEL D'AFFICHAGE RECTANGLES
panelMNT = new JPanelMNT(this);
scrollPane = new JScrollPane(panelMNT);
panelHaut.setPreferredSize(new Dimension(200,220));
panelHaut.setLayout(new BorderLayout());
panelHaut.add(scrollPane, BorderLayout.CENTER);
panelHaut.add(p1, BorderLayout.NORTH);
panelHaut.add(p2, BorderLayout.SOUTH);
panelHaut.add(p3, BorderLayout.WEST);
panelHaut.add(panelDroite, BorderLayout.EAST);
// FILE CHOOSER POUR L'AJOUT DE MNT
chooser = new JFileChooser(Options.getDirRead());
/*ExampleFileFilter filterMNT = new ExampleFileFilter();
filterMNT.addExtension("mnt");
filterMNT.addExtension("sur");
filterMNT.setDescription(ResourceManager.get("ModelNT"));
chooser.addChoosableFileFilter(filterMNT);*/
GestionnaireMntFormat.initFilter(chooser,MntFormat.IMPORT);
// dimensionne la fen�tre
pack();
}
/**
* Affiche les caracteristiques du MNT ind dans le panelInfo
* @param ind Numero du MNT dans la liste
*/
public void setInfo(int ind){
String info="";
if(ind!=-1){
float xo = ((MNT)(vectMNT.elementAt(ind))).getX1();
float yo = ((MNT)(vectMNT.elementAt(ind))).getY1();
float xm = ((MNT)(vectMNT.elementAt(ind))).getX2();
float ym = ((MNT)(vectMNT.elementAt(ind))).getY2();
float px = ((MNT)(vectMNT.elementAt(ind))).getPasX();
float py = ((MNT)(vectMNT.elementAt(ind))).getPasY();
info="Xo: "+xo+"\nYo: "+yo+"\nXm: "+xm+"\nYm: "+ym+"\n"+ResourceManager.get("pX")+": "+px+"\n"+ResourceManager.get("pY")+": "+py+"";
}
txtInfo.setText(info);
}
/**
* Met � jour les dimensions du MNT � g�n�rer � partir des valeurs
* des TextFields correspondants
*/
public void updateSize(){
float x1,y1,x2,y2;
try{
x1=Float.parseFloat(xoTextField.getText());
y1=Float.parseFloat(yoTextField.getText());
x2=Float.parseFloat(xmTextField.getText());
y2=Float.parseFloat(ymTextField.getText());
panelMNT.setSelectedRegion(x1,y1,x2,y2);
x0=x1;
xm=x2;
y0=y1;
ym=y2;
panelMNT.repaint();
updateEchantillonnageX();
updateEchantillonnageY();
} catch(NumberFormatException nfe){
}
}
/**
* Met � jour les dimensions du MNT avec les dimensions maximales
* en fonction des MNT charg�s
*/
public void updateDimension(){
MNT currentMNT;
x0 = Float.MAX_VALUE;
y0 = Float.MAX_VALUE;
xm = Float.MIN_VALUE;
ym = Float.MIN_VALUE;
for(int i = 0; i< vectMNT.size(); i++){
currentMNT = (MNT) vectMNT.elementAt(i);
float x1=currentMNT.getX1();
float y1=currentMNT.getY1();
float x2=currentMNT.getX2();
float y2=currentMNT.getY2();
if(x1<x0) x0=x1;
if(y1<y0) y0=y1;
if(x2>xm) xm=x2;
if(y2>ym) ym=y2;
}
}
/**
* Met � jour les donn�es d'�chantillonnage en X � partir du TextField
* correspondant.
* Calcule, selon le mode de s�l�ction et si la taille du MNT est valable,
* le nombre d'�chantillon en fonction du pas, ou l'inverse.
*/
public void updateEchantillonnageX(){
if (modeSelect==PAS_ECHANTILLONNAGE){
try{
float f=Float.parseFloat(echXTextField.getText());
if(f>0){
pasX = f;
if(x0<xm){
nbEchX = (int)((xm-x0)/pasX);
}
}
} catch(Exception e){}
} else {
try{
int f=Integer.parseInt(echXTextField.getText());
if(f>0){
nbEchX = f;
if(x0<xm){
pasX = (xm-x0)/nbEchX;
}
}
} catch(Exception e){}
}
}
/**
* Met � jour les donn�es d'�chantillonnage en Y � partir du TextField
* correspondant.
* Calcule, selon le mode de s�l�ction et si la taille du MNT est valable,
* le nombre d'�chantillon en fonction du pas, ou l'inverse.
*/
public void updateEchantillonnageY(){
if (modeSelect==PAS_ECHANTILLONNAGE){
try{
float f=Float.parseFloat(echYTextField.getText());
if(f>0){
pasY = f;
if(y0<ym){
nbEchY = (int)((ym-y0)/pasY);
}
}
} catch(Exception e){}
} else {
try{
int f=Integer.parseInt(echYTextField.getText());
if(f>0){
nbEchY = f;
if(y0<ym){
pasY = (ym-y0)/nbEchY;
}
}
} catch(Exception e){}
}
}
/**
* Charge un MNT � l'aide d'un FileChooser
* Utilise GestionnaireFormat pour permettre d'importer tous les formats
* de MNT support�s
*/
public void addMNT(){
String fileName;
int returnVal = chooser.showOpenDialog(parent);
if(returnVal == JFileChooser.APPROVE_OPTION) {
// Charger le MNT
fileName = chooser.getSelectedFile().getPath();
try {
MntFormat format = GestionnaireMntFormat.donneFormat(fileName);
if (format.support()==MntFormat.EXPORT){
throw new IOException();
}
MNT mnt = format.importMNT(fileName);
// Ajout du nouveau MNT
vectMNT.addElement(mnt);
vectListe.addElement(fileName);
listeMNT.setListData(vectListe);
nbMNT++;
// Mise � jour des dimensions et du graphique des MNT
updateDimension();
panelMNT.addRectangle(new Rectangle2D.Float(mnt.getX1(),mnt.getY1(),mnt.getX2()-mnt.getX1(),mnt.getY2()-mnt.getY1()));
}catch (FileNotFoundException ex){
MsgInfo msg=new MsgInfo(parent,MsgInfo.INFO,MsgInfo.OK,"\""+fileName+"\":\n"+ResourceManager.get("fileNotFound"));
}
catch (IOException ex){
MsgInfo msg=new MsgInfo(parent,MsgInfo.INFO,MsgInfo.OK,"\""+fileName+"\":\n"+ResourceManager.get("readError")+"\n"+ex.getMessage());
}
}
}
/**
* Supprime le MNT selectionn� dans la liste
*/
public void removeMNT(){
int ind = listeMNT.getSelectedIndex();
if(ind!=-1){
vectMNT.remove(ind);
vectListe.remove(ind);
panelMNT.removeRectangle(ind);
listeMNT.setListData(vectListe);
nbMNT--;
updateDimension();
}
}
/**
* Lance la g�n�ration du nouveau MNT.
* Dans un premier temps teste toutes les donn�es et:
* - affecte des valeurs par d�faut quand aucune donn�e n'est pass�e
* - envoie un message d'erreur quand des donn�es ne sont pas valides.
*/
public void genererMNT(){
// pour la saisie des pas d'�chantillonnage
boolean fail=false;
MNT currentMNT;
if(nbMNT<=0){
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("selecMNTError"));
} else {
// R�cup�ration des valeurs des pas d'�chantillonnage
// Si le champ est laiss� vide, on laisse le pas � 0 et
// on lui donnera la valeur du pas du premier MNT
currentMNT = (MNT) vectMNT.elementAt(0);
float pasx = currentMNT.getPasX();
float pasy = currentMNT.getPasY();
try{
// Gestion des param�tres du MNT:
// PAR DEFAUT:
// les pas sont ceux du premier MNT de la liste
// les dimensions sont les dimensions maximales possibles (actualis�es au furet � mesure)
// PASX
if(echXTextField.getText().equals("")){
// aucune valeur n'a �t� donn�e pour pasX,
// On donne celle du premier MNT:
pasX = pasx;
System.out.println(ResourceManager.get("defPX")+": "+pasX);
} else {
if(modeSelect==PAS_ECHANTILLONNAGE){
pasX=Float.parseFloat(echXTextField.getText());
if(pasX<=0){
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("pXErr"));
fail=true;
}
} else {
nbEchX=Integer.parseInt(echXTextField.getText());
if(nbEchX<=0){
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("nXErr"));
fail=true;
}
}
}
// PASY
if(echYTextField.getText().equals("")){
// aucune valeur n'a �t� donn�e pour pasY,
// On donne celle du premier MNT:
pasY = pasy;
System.out.println(ResourceManager.get("defPY")+": "+pasY);
} else {
if(modeSelect==PAS_ECHANTILLONNAGE){
pasY=Float.parseFloat(echYTextField.getText());
if(pasY<=0){
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("pXErr"));
fail=true;
}
} else {
nbEchY=Integer.parseInt(echYTextField.getText());
if(nbEchY<=0){
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("nXErr")); fail=true;
}
}
}
// X0
if(xoTextField.getText().equals("")){
// aucune valeur n'a �t� donn�e pour X0,
System.out.println(ResourceManager.get("defXo")+": "+x0);
} else {
x0=Float.parseFloat(xoTextField.getText());
}
// Y0
if(yoTextField.getText().equals("")){
// aucune valeur n'a �t� donn�e pour Y0;
System.out.println(ResourceManager.get("defYo")+": "+y0);
} else {
y0=Float.parseFloat(yoTextField.getText());
}
// XM
if(xmTextField.getText().equals("")){
// aucune valeur n'a �t� donn�e pour Xm,
System.out.println(ResourceManager.get("defXm")+": "+xm);
} else {
xm=Float.parseFloat(xmTextField.getText());
}
// YM
if(ymTextField.getText().equals("")){
// aucune valeur n'a �t� donn�e pour Ym,
System.out.println(ResourceManager.get("defYm")+": "+ym);
} else {
ym=Float.parseFloat(ymTextField.getText());
}
if(x0>=xm){
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("xDimErr"));
fail=true;
}
if(y0>=ym){
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("yDimErr")); fail=true;
}
} catch (Exception nfe){
// Erreur(s) dans les valeurs entr�es
MsgInfo msg=new MsgInfo(parent,MsgInfo.WARN,MsgInfo.OK,ResourceManager.get("dataMNTErr"));
fail=true;
}
// Tests sur les donn�es:
if(fail){
System.out.println(ResourceManager.get("cancelGen"));
// annulation des dimensions entr�es
updateDimension();
}else {
// Creation du nouveau MNT
int w,h;
if(modeSelect==PAS_ECHANTILLONNAGE){
// Les donn�e d'�chantillonnage sont les pas d'�chantillonnage
w = (int) ((xm-x0)/pasX);
h = (int) ((ym-y0)/pasY);
} else {
// Les donn�es d'�chantillonnage sont le nombre d'�chantillons
w = nbEchX;
h = nbEchY;
pasX = (xm-x0)/nbEchX;
pasY = (ym-y0)/nbEchY;
}
mntGen = new MNTGenerateur(w, h, x0, y0, pasX, pasY, vectMNT);
MNT newMNT = mntGen.genererMNT();
System.out.println("\n"+ResourceManager.get("nouvMNT")+" : ("+newMNT.getX1()+","+newMNT.getY1()+")->("+newMNT.getX2()+","+newMNT.getY2()+") ["+newMNT.getXMax()+"x"+newMNT.getYMax()+"] pasX="+newMNT.getPasX()+" pasY="+newMNT.getPasY()+"");
// creation du document
DocumentMNTContainer cont=documentMNTContainer.nextDocumentMNTContainer();
DocumentMNT dmnt=new DocumentMNT(cont);
dmnt.setMNT(newMNT);
dmnt.setFileName(ResourceManager.get("noTitle"));
cont.addDocument(dmnt);
setVisible(false);
dispose();
}
}
}
/**
* Action annul�e: sortie du dialogue
*/
public void annuler(){
setVisible(false);
dispose();
}
/**
* DocumentListener pour �couter les changements dans les TextFields
*/
protected class MyDocumentListener2 implements DocumentListener{
public void changedUpdate(DocumentEvent e){
run();
}
public void insertUpdate(DocumentEvent e){
run();
}
public void removeUpdate(DocumentEvent e){
run();
}
public void run(){}
}
}
/**
* Un panel adapt� permettant d'afficher des rectangles
* correpondant aux MNT charg�s
* Affiche d'une couleur sp�ciale le MNT s�l�ctionn�,
* et d'une autre le rectangle correspondant aux dimensions choisies
*/
class JPanelMNT extends JPanel {
private Vector rectangles; // Les rectangles correspondant aux MNT
float w,h; // taille de l'ensemble des rectangles
float xm,ym; // minima des coordonn�es
JDialog parent; // le Dialogue parent
double zoom; // indice de zoom
int selection; // indice du MNT selectionn�
private Rectangle2D.Float selectedRegion; // la zone correpondant aux dimensions sp�cifi�es
/**
* Constructeur
*/
public JPanelMNT(JDialog d){
super();
parent = d;
rectangles = new Vector();
setBackground(Color.white); // marche pas...
w=0;
h=0;
xm=Integer.MAX_VALUE;
ym=Integer.MAX_VALUE;
zoom=1;
selection=-1;
}
/**
* Ajoute un rectangle et remet � jour les dimensions de l'ensemble
*/
public void addRectangle(Rectangle2D.Float r){
rectangles.addElement(r);
if(r.width+r.x>w)
w=r.width+r.x;
if(r.height+r.y>h)
h=r.height+r.y;
if(r.x<xm)
xm=r.x;
if(r.y<ym)
ym=r.y;
//System.out.println("x:"+r.x+" y:"+r.y+" w:"+r.width+" h:"+r.height);
setPreferredSize(new Dimension((int)((w-xm)*zoom)+20, (int)((h-ym)*zoom)+20));
revalidate();
repaint();
}
/**
* Supprime un rectangle et remet � jour les dimensions
*/
public void removeRectangle(int i){
rectangles.remove(i);
w = Integer.MIN_VALUE;
h = Integer.MIN_VALUE;
xm = Integer.MAX_VALUE;
ym = Integer.MAX_VALUE;
for(int j = 0; j< rectangles.size(); j++){
Rectangle2D.Float r = (Rectangle2D.Float) rectangles.elementAt(j);
if(r.width+r.x>w)
w=r.width+r.x;
if(r.height+r.y>h)
h=r.height+r.y;
if(r.x<xm)
xm=r.x;
if(r.y<ym)
ym=r.y;
}
repaint();
}
/**
* Multiplie par 2 le zoom et redimensionne
*/
public void zoomin(){
zoom*=2;
setPreferredSize(new Dimension((int)((w-xm)*zoom)+20, (int)((h-ym)*zoom)+20));
revalidate();
repaint();
}
/**
* Divise par 2 le zoom et redimensionne
*/
public void zoomout(){
zoom/=2;
setPreferredSize(new Dimension((int)((w-xm)*zoom)+20, (int)((h-ym)*zoom)+20));
revalidate();
repaint();
}
/**
* Sp�cifie le rectangle selectionn�
* @param s l'indice du rectangle ,selectionn�
*/
public void setSelected(int s){
selection=s;
}
/**
* Sp�cifie la zone selectionn�e pour la g�n�ration
* @param x1 la coordonn�e x du coin superieur gauche
* @param y1 la coordonn�e y du coin superieur gauche
* @param x2 la coordonn�e x du coin inferieur droit
* @param y2 la coordonn�e y du coin inferieur droit
*/
public void setSelectedRegion(float x1,float y1,float x2,float y2){
selectedRegion = new Rectangle2D.Float(x1,y1,x2-x1,y2-y1);
}
/**
* Redessine le panel
* Les rectangles sont trac�s en noir
* Le rectangle selectionn� est trac� en rouge
* La zone selectionn�e est trac�e en vert
*/
public void paint(Graphics g){
int w=0;
int h=0;
g.clearRect(0,0,getWidth(),getHeight());
g.setColor(Color.black);
// Les rectangles
Rectangle2D.Float r;
for(int i = 0; i < rectangles.size(); i++){
r = (Rectangle2D.Float) rectangles.elementAt(i);
if(i!=selection){
//g.drawRect((int)((r.x-xm)*zoom)+10,(int)((r.y-ym)*zoom)+10,(int)(r.width*zoom),(int)(r.height*zoom));
g.drawRect((int)((r.x-xm)*zoom)+10,(int)(getHeight()+(-( r.y-ym) - r.height)*zoom-10),(int)(r.width*zoom),(int)(r.height*zoom));
}
}
// Le rectangle selectionn�
if(selection!=-1){
r = (Rectangle2D.Float) rectangles.elementAt(selection);
g.setColor(new Color(210,80,15));
//g.drawRect((int)((r.x-xm)*zoom)+10,(int)((r.y-ym)*zoom)+10,(int)(r.width*zoom),(int)(r.height*zoom));
g.drawRect((int)((r.x-xm)*zoom)+10,(int)(getHeight()+(-(r.y-ym)-r.height)*zoom-10),(int)(r.width*zoom),(int)(r.height*zoom));
}
// La zone selectionn�e
if (selectedRegion!=null){
g.setColor(new Color(50,170,120));
//g.drawRect((int)((selectedRegion.x-xm)*zoom)+10,(int)((selectedRegion.y-ym)*zoom)+10,(int)(selectedRegion.width*zoom),(int)(selectedRegion.height*zoom));
g.drawRect((int)((selectedRegion.x-xm)*zoom)+10,(int)(getHeight()+( -(selectedRegion.y-ym)-selectedRegion.height)*zoom-10),(int)(selectedRegion.width*zoom),(int)(selectedRegion.height*zoom));
}
}
}