import java.awt.*;
import java.io.*;
import java.util.GregorianCalendar;

import javax.swing.*;

public class PrisePhoto extends javax.swing.JFrame {
	
	private javax.swing.JLabel       debug;
	private javax.swing.JSlider      barreZoom;
	private javax.swing.JRadioButton rbFic;
	private javax.swing.JPanel		 choixUrlPanel;
	private javax.swing.ButtonGroup	 monGroupBoutons;
	private javax.swing.JButton		 bouttonRafraichir;
	private javax.swing.JLabel		 champPhoto;
	private javax.swing.JLabel		 labelZoom;
	private javax.swing.JLabel		 mapPhoto;
	private javax.swing.JRadioButton rbUrl2;
	private javax.swing.JTextField	 urlActuelle;
	private javax.swing.JRadioButton rbUrl1;
	private javax.swing.JButton		 boutonRotation;
	private javax.swing.JButton		 bOuvreFic;

	private Photo		 maPhoto;
	private long		 dernierTime;
	private int			 dernierZoom = 0;
	private ImageIcon	 iconePhoto,iconePhotoMap;
	private Point		 ref;
	private JFileChooser monSelFic;
	
	// Ex�cuter l'application.
	/* les parametres :
	 *
	 *  -u: url cam�ra 1 (ou nom de fichier en file:///)
	 *  -u2: url camera 2
	 *  -d: chemin du fichier de sortie
	 *  -x: largeur image en sortie (pixels)
	 *  -y: hauteur -----------------------
	 *
	 */
	/**
	 * @param args the command line arguments
	 */
	public static void main (String args[]) {

		if (args.length == 0) {
			System.exit(-1);
		}

		for (int i =0;i<args.length;i++) {
		}

		new PrisePhoto(args).show();
	}

	public PrisePhoto(String[] args) {
		initComponents ();
		pack ();

		setSize(550, 600);
		setVisible(true);

		maPhoto = new Photo(args, barreZoom.getValue());

		if (!maPhoto.urlAccessible()) {
			JOptionPane.showMessageDialog(this, "Pb avec l'URL... pas d'image accessible !", "Pb de connexion a la cam�era", JOptionPane.DEFAULT_OPTION);
			champPhoto.setText("Pb URL...");
		}
		else {
			champPhoto.setText("ok");
		}

		construitVisus();
		
		// affichages sur l'interface...
		urlActuelle.setText(maPhoto.texteUrlActuelle());

		monSelFic = new JFileChooser();
		monSelFic.setCurrentDirectory(new File("."));
		monSelFic.setFileFilter(new JpgFileFilter());
	}
	
	private void construitVisus() {
		// cr�ation d'une visu image pour le chp photo
		iconePhoto = new ImageIcon((Image)maPhoto.getVisuPhoto());
		champPhoto.setIcon(iconePhoto);
		
		// cr�ation d'une visu image pour le chp photo
		iconePhotoMap = new ImageIcon((Image)maPhoto.getMapPhoto());
		mapPhoto.setIcon(iconePhotoMap);
	}
	
	public void paint(Graphics g) {
		super.paint(g);
	}

	private void choixFic(java.awt.event.ActionEvent evt) {
		// on a demand� le s�lecteur pour un fic.
		int oldUrl = maPhoto.getNoUrl();
		
		maPhoto.setNoUrl(3);  // indique que l'on va sur la 3eme URL (fichier).
		String aLoader = selectFic();
		if (aLoader != null) { // fichier trouv� et charg� !
			ButtonModel model = rbFic.getModel();
			monGroupBoutons.setSelected(model, true);
		}
		else {
			maPhoto.setNoUrl(oldUrl);  // pas trouv�... on revient en arri�re !
		}
		repaint();
	}
	
	private void chgtRBUrl(java.awt.event.ActionEvent evt) {
		// switch entre les boutons...
		int noUrlSelected = Integer.parseInt(evt.getActionCommand());
		String nomFic = null;
		
		if (noUrlSelected == 3) { // ouverture d'un fichier
			// si pas de nom de fichier, alors ouvrir la boite de dialogue pour en choisir un...
			maPhoto.setNoUrl(3);  // indique que l'on va sur la 3eme URL (fichier).
			nomFic = maPhoto.texteUrlActuelle();
			
			if (nomFic == null || nomFic.equals("")) {
				// pas de nom de fichier : en demander un !
				nomFic = selectFic();
				if (nomFic == null) {    
					// on n'a rien demand�, ou alors pas un un fichier jpeg !
					ButtonModel model = rbUrl1.getModel();
					monGroupBoutons.setSelected(model, true);
					maPhoto.setNoUrl(1);  // indique que l'on va sur la 3eme URL (fichier).
				}
				repaint();
				return;
			}
		}
		// sinon choix d'une URL ou nom de fichier d�jˆ pr�sent ...
		champPhoto.setText("Tentative d'acc�s ˆ l'URL...");
		maPhoto.eteintVisu();   // pr�venir qu'on lance un chargement...
		champPhoto.paint(champPhoto.getGraphics());
		
		boolean ok = maPhoto.switchUrlActuelle(noUrlSelected);
		urlActuelle.setText(maPhoto.texteUrlActuelle());
		if (!ok) {
			JOptionPane.showMessageDialog(this, "aucun fichier image pour l'URL/Chemin " + maPhoto.texteUrlActuelle(), "Pb chargement image", JOptionPane.DEFAULT_OPTION);
		}
		else {
			construitVisus();  // rafraichir les visus qui ont �volu�es..
		}
		
		if (!maPhoto.urlAccessible()) {
			champPhoto.setText("Pb URL...");
		}
		else {
			champPhoto.setText("ok");
		}
		repaint();
	}
	
	private String selectFic() {
		// pas de nom de fichier : en demander un !
		String nomFic = null;
		
		int res = monSelFic.showOpenDialog(this);
		if (res ==JFileChooser.APPROVE_OPTION) {
			nomFic = monSelFic.getSelectedFile().getPath();
		}
		// on n'a rien demand�, ou alors pas un un fichier jpeg !
		if (res != JFileChooser.APPROVE_OPTION || !chargeFicUrl("file:///"+nomFic,false)) {
			nomFic = null;
		}
		return nomFic;
	}
	
	private void changeURL(java.awt.event.ActionEvent evt) {
		// On a modifi� l'ulr...
		String urlTest = new String(urlActuelle.getText());
		chargeFicUrl(urlTest,true);
		repaint();
	}
	
	private boolean chargeFicUrl(String urlTest, boolean mire) {
		if (mire) {
			champPhoto.setText("Tentative d'acc�s ˆ l'URL...");      
			maPhoto.eteintVisu();   // pr�venir qu'on lance un chargement...
			champPhoto.paint(champPhoto.getGraphics());
		}
		
		boolean ok = maPhoto.changeUrlActuelle(urlTest);
		urlActuelle.setText(maPhoto.texteUrlActuelle());
		if (!ok) {
			JOptionPane.showMessageDialog(this, "aucun fichier image pour l'URL/chemin " + urlTest, "Pb chargement image", JOptionPane.DEFAULT_OPTION);
		}
		else {
			construitVisus();  // rafraichir les visus qui ont �volu�es..
		}
		
		if (!maPhoto.urlAccessible()) {
			champPhoto.setText("Pb URL...");
		}
		else {
			champPhoto.setText("ok");
		}
		
		return ok;
	}
	
	private void sauveLaPhoto(java.awt.event.MouseEvent evt) {
		// sauve la photo en Jpeg a l'endroit demand�...
		// d�clench� quand la souris sort de la fenetre de prisePhoto (sauvegarde lengthtravail en cours)
		if (maPhoto!=null && !maPhoto.sauveImage()) {
			String fDest = maPhoto.fichierDestination();
			JOptionPane.showMessageDialog(this, "Pb de cr�ation pour le fichier " + fDest, "Pb sauvegarde image", JOptionPane.DEFAULT_OPTION);
		}     
	}
	
	private void debutDeplVisu(java.awt.event.MouseEvent evt) {
		// on vient de presser le bouton : les coord. souris actuelles deviennent la r�f�rence
		ref = new Point(evt.getX(), evt.getY());
	}
	
	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		// faire tourner l'image de 90¡ ˆ la fois ...
		maPhoto.rotation(90);
		construitVisus();  // dde aux icones de l'interface de se recr�er...
		repaint();
	}
	
	private void rafraichirPhoto(java.awt.event.ActionEvent evt) {
		// recharger l'image depuis la cam�ra...
		maPhoto.rafraichir();
		if (!maPhoto.urlAccessible()) {
			JOptionPane.showMessageDialog(this, "Pb avec l'URL... pas d'image accessible !", "Pb de connexion a la cam�ra", JOptionPane.DEFAULT_OPTION);
			champPhoto.setText("Pb URL...");
		}
		repaint();
	}
	
	private void afficheCoord(java.awt.event.MouseEvent evt) {
	}
	
	private void deplaceVisu(java.awt.event.MouseEvent evt) {
		// On d�place la visu dans la petite fen�tre
		int rx = evt.getX() - (int)ref.getX() ; 
		int ry = evt.getY() - (int)ref.getY() ;
		debug.setText("x=" + rx + " y=" + ry);       
		
		maPhoto.deplaceMap(rx, ry);
		ref = new Point(evt.getX(), evt.getY());
		
		repaint();
	}
	
	private void bougeContinue(java.awt.event.MouseEvent evt) {
		if ((System.currentTimeMillis()-dernierTime)>2) { // d�lai de latence de 100 ms
			dernierTime = System.currentTimeMillis();
			
			if (barreZoom.getValue() != dernierZoom) {
				dernierZoom = barreZoom.getValue();
				maPhoto.setZoom(dernierZoom);
				repaint();
			}
		}
	}
	
	private void sliderChanged(javax.swing.event.ChangeEvent evt) {
	}
	
	private void exitForm(java.awt.event.WindowEvent evt) {
		System.exit (0);
	}

	private void initComponents() {
		monGroupBoutons = new javax.swing.ButtonGroup();
		barreZoom = new javax.swing.JSlider();
		labelZoom = new javax.swing.JLabel();
		champPhoto = new javax.swing.JLabel();
		mapPhoto = new javax.swing.JLabel();
		debug = new javax.swing.JLabel();
		bouttonRafraichir = new javax.swing.JButton();
		boutonRotation = new javax.swing.JButton();
		choixUrlPanel = new javax.swing.JPanel();
		rbUrl1 = new javax.swing.JRadioButton();
		rbUrl2 = new javax.swing.JRadioButton();
		rbFic = new javax.swing.JRadioButton();
		urlActuelle = new javax.swing.JTextField();
		bOuvreFic = new javax.swing.JButton();
		
		getContentPane().setLayout(null);
		
		setName("Prise Photo");
		setResizable(false);
		addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseExited(java.awt.event.MouseEvent evt) {
				sauveLaPhoto(evt);
			}
		});
		
		addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent evt) {
				exitForm(evt);
			}
		});
		
		barreZoom.setPaintLabels(true);
		barreZoom.setPaintTicks(true);
		barreZoom.setMajorTickSpacing(10);
		barreZoom.setToolTipText("Le facteur de Zoom max correspond aux pixels r�els");
		barreZoom.setValue(1);
		barreZoom.setName("maBarreDeZoom");
		barreZoom.addChangeListener(new javax.swing.event.ChangeListener() {
			public void stateChanged(javax.swing.event.ChangeEvent evt) {
				sliderChanged(evt);
			}
		});
		
		barreZoom.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				bougeContinue(evt);
			}
		});
		
		barreZoom.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
			public void mouseDragged(java.awt.event.MouseEvent evt) {
				bougeContinue(evt);
			}
		});
		
		getContentPane().add(barreZoom);
		barreZoom.setBounds(340, 70, 130, 20);
		
		labelZoom.setText("Zoom");
		labelZoom.setForeground(java.awt.Color.black);
		labelZoom.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
		labelZoom.setFont(new java.awt.Font("Dialog", 0, 14));
		labelZoom.setName("factZoom");
		
		getContentPane().add(labelZoom);
		labelZoom.setBounds(480, 70, 50, 20);
		
		champPhoto.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
		champPhoto.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		champPhoto.setFont(new java.awt.Font("Dialog", 1, 14));
		champPhoto.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
		champPhoto.setIconTextGap(8);
		champPhoto.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
		champPhoto.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
		getContentPane().add(champPhoto);
		champPhoto.setBounds(10, 10, 330, 440);
		
		mapPhoto.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
		mapPhoto.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0)));
		mapPhoto.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				debutDeplVisu(evt);
			}
			public void mouseClicked(java.awt.event.MouseEvent evt) {
				deplaceVisu(evt);
			}
		});
		
		mapPhoto.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
			public void mouseDragged(java.awt.event.MouseEvent evt) {
				deplaceVisu(evt);
			}
		});
		
		getContentPane().add(mapPhoto);
		mapPhoto.setBounds(360, 100, 150, 150);
		
		debug.setText("jLabel3");
		debug.setForeground(new java.awt.Color(204, 204, 255));
		debug.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mousePressed(java.awt.event.MouseEvent evt) {
				deplaceVisu(evt);
				afficheCoord(evt);
			}
		});
		
		getContentPane().add(debug);
		debug.setBounds(410, 570, 120, 20);
		
		bouttonRafraichir.setToolTipText("Cliquer pour avoir une nouvelle image...");
		bouttonRafraichir.setFont(new java.awt.Font("Dialog", 1, 14));
		bouttonRafraichir.setText("Rafraichir Photo");
		bouttonRafraichir.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.RAISED));
		bouttonRafraichir.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				rafraichirPhoto(evt);
			}
		});
		
		getContentPane().add(bouttonRafraichir);
		bouttonRafraichir.setBounds(350, 10, 170, 50);
		
		boutonRotation.setFont(new java.awt.Font("Dialog", 0, 10));
		boutonRotation.setText("rotation image (+90¡)");
		boutonRotation.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton1ActionPerformed(evt);
			}
		});
		
		getContentPane().add(boutonRotation);
		boutonRotation.setBounds(360, 250, 150, 40);
		
		choixUrlPanel.setBorder(new javax.swing.border.TitledBorder("Source de l'image ˆ travailler :"));
		rbUrl1.setSelected(true);
		rbUrl1.setText("Url 1");
		monGroupBoutons.add(rbUrl1);
		rbUrl1.setActionCommand("1");
		rbUrl1.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				chgtRBUrl(evt);
			}
		});
		
		choixUrlPanel.add(rbUrl1);
		
		rbUrl2.setText("Url 2");
		monGroupBoutons.add(rbUrl2);
		rbUrl2.setActionCommand("2");
		rbUrl2.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				chgtRBUrl(evt);
			}
		});
		
		choixUrlPanel.add(rbUrl2);
		
		rbFic.setText("Fichier");
		monGroupBoutons.add(rbFic);
		rbFic.setActionCommand("3");
		rbFic.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				chgtRBUrl(evt);
			}
		});
		
		choixUrlPanel.add(rbFic);
		
		urlActuelle.setToolTipText("adresse URL de l'image actuellement visualis�e");
		urlActuelle.setPreferredSize(new java.awt.Dimension(300, 20));
		urlActuelle.setMinimumSize(new java.awt.Dimension(200, 20));
		urlActuelle.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				changeURL(evt);
			}
		});
		
		choixUrlPanel.add(urlActuelle);
		
		bOuvreFic.setText(" ... ");
		bOuvreFic.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.RAISED));
		bOuvreFic.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				choixFic(evt);
			}
		});
		
		choixUrlPanel.add(bOuvreFic);
		
		getContentPane().add(choixUrlPanel);
		choixUrlPanel.setBounds(10, 470, 520, 60);
	}

}
