package memory.chants;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingWorker;
import memory.lecteur.LecteurEvent;
import memory.lecteur.LecteurException;
import memory.lecteur.LecteurListener;
import memory.lecteur.LecteurMP3;
/**
* @author patrice
* Une fenêtre de dialogue pour afficher tous les oiseaux. Un clic sur l'un d'eux fait entendre son chant.
*/
public class JDialogGalerie extends JDialog implements LecteurListener
{
//la galerie d'oiseau est un JPanel
private JPanel galerie;
//les oiseaux
private GestionDonnees gd;
//le lecteur pour le chant
private LecteurMP3 lecteur = new LecteurMP3();
/**
* constructeur de la JDialog
* @param fenetre la fenêtre parent
* @param titre le titre de la fenêtre dans la langue choisie
*/
public JDialogGalerie(Fenetre fenetre, GestionDonnees gd2)
{
//construction du JDialog modal
super(fenetre,gd2.getTxt("titreGalerie",0),true);
//on ajoute la fenêtre comme listener du lecteur
this.getLecteur().addLecteurListener(this);
//quand on ferme la fenêtre il faut que la lecture s'arrête
this.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
getLecteur().stop();
dispose();
}
});
//les oiseaux
setGd (gd2);
//maximiser la JDialog
Toolkit kit = Toolkit.getDefaultToolkit();
//récupération de la taille de l'écran et des rebords
Insets insets = kit.getScreenInsets(this.getGraphicsConfiguration());
Dimension screen = kit.getScreenSize();
//calcul des longueurs nécessaires et de la position
int w = (int)(screen.getWidth()-insets.left-insets.right) -20;
int h = (int)(screen.getHeight()-insets.top-insets.bottom) -20;
int x = insets.left;
int y = insets.top;
Dimension dimension = new Dimension(w,h);
//placement et redimension
this.setSize(dimension);
this.setLocation(x,y);
//la galerie d'oiseaux avec un FlowOut particulier adapté à un JScrollPane
this.setGalerie (new JPanel(new ModifiedFlowLayout()));
//son JScrollPane
getContentPane().add (new JScrollPane(getGalerie(),
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
//ajouter les oiseaux
creerGalerie();
//rendre la fenêtre visible
this.setVisible(true);
}
private void creerGalerie()
{
SwingWorker sw = new SwingWorker<Void,Oiseau>()
{
@Override
protected Void doInBackground () throws Exception
{
for (int i = 0 ; i < getGd().getNbDonnees (); i++)
{
publish(gd.getOiseau(i));
}
return null ;
}
public void process(List<Oiseau> oiseaux)
{
for (final Oiseau oiseau : oiseaux)
{
JLabel lblImage = new JLabel(oiseau.getImage());
BordureDouble bordure = new BordureDouble(oiseau.getNom(), oiseau.getNomLatin());
//le panneau pour contenir l'image
final JPanel panImage = new JPanel();
//sa bordure
panImage.setBorder (bordure);
// on ajoute l'image
panImage.add(lblImage);
//on ajoute un écouteur de clic
panImage.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
try
{
//arrêter le lecteur
getLecteur().stop();
//ouvrir le fichier son
getLecteur().open(new File(oiseau.getChant()));
//jouer le son
getLecteur().play();
//le fond du panneau rouge devient gris
for(Component p : getGalerie().getComponents())
{
if (p.getBackground() == Color.RED) p.setBackground(Color.LIGHT_GRAY);
}
//le panneau sur lequel on a cliqué devient rouge
panImage.setBackground(Color.RED);
}
catch (LecteurException e1)
{
e1.printStackTrace();
}
}
});
getGalerie().add (panImage);
panImage.validate ();
getGalerie().revalidate ();
int x = 0, y = getGalerie().getHeight ()-300, w = getGalerie().getWidth (), h = 300;
Rectangle r = new Rectangle(x,y,w,h);
getGalerie().scrollRectToVisible (r);
}
}
};
sw.execute ();
}
//les procédures liées à LecteurListener
@Override
public void opened (Long duree){}
@Override
public void progress (Long microseconds){}
@Override
public void stateUpdated (LecteurEvent event)
{
if (event.getCode () == LecteurEvent.EOM)
{
try
{
this.getLecteur().play();
}
catch (LecteurException e)
{
e.printStackTrace();
}
}
else if (event.getCode () == LecteurEvent.STOPPED)
{
for(Component p : getGalerie().getComponents())
{
if (p.getBackground() == Color.RED) p.setBackground(Color.LIGHT_GRAY);
}
}
}
public void setGd (GestionDonnees gd)
{
this.gd = gd;
}
public GestionDonnees getGd ()
{
return gd;
}
public void setLecteur (LecteurMP3 lecteur)
{
this.lecteur = lecteur;
}
public LecteurMP3 getLecteur ()
{
return lecteur;
}
public void setGalerie (JPanel galerie)
{
this.galerie = galerie;
}
public JPanel getGalerie ()
{
return galerie;
}
}