package com.ahuntsic.tp2;

/**
 * Compagnie.java
 * construit une interface graphique qui permet de saisir les données
 * d'un employé à l'écran, de sauvegarder les données dans un fichier,
 * de charger les données, de lister, de chercher et d'effacer des employés
 * Date: 07/10/2005
 * Pour: Mr. Mohammed Salah Bendelloul
 * Projet: Travail pratique #2
 *
 * @author Hassen Ben Tanfous
 */

//imports
import java.util.*;
import com.ahuntsic.outils.*;
import com.ahuntsic.es.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;

public class Compagnie implements ActionListener {

    /** Nombre d'employés par défaut */
    public static final int NB_EMPLOYES = 200;

    private Vector employes;

    private JFrame
            frameCompagnie,
            frameEmploye; //Menu: Fichier/Nouveau employé

    private Container
            containerCompagnie,
            containerEmploye; //Menu: Fichier/Nouveau employé

    private JPanel
            paneEmploye, //Menu: Fichier/Nouveau employé
            paneFonction, //Menu: Fichier/Nouveau employé/Fonction
            paneSalaire, //Menu: Fichier/Nouveau employé/Salaire
            paneConfirmer; //Menu: Fichier/Nouveau employé boutonOk, boutonAnnuler

    private JTabbedPane tabPane; //Menu: Fichier/Nouveau employé

    private JMenuBar barreMenu;

    private JMenu
            menuFichier, //Menu: Fichier
            menuOptions, //Menu: Options
            menuAffichage, //Menu: Affichage
            menuEmployes, //Menu: Affichage/Employes
            menuFonctions; //Menu: Affichage/Employes/Fonction

    private JMenuItem
            itemNouveauEmploye, //Menu: Fichier/Nouveau employé Ctrl + N
            itemOuvrir, //Menu: Fichier/Ouvrir Ctrl + O
            itemSauvegarder, //Menu: Fichier/Sauvegarder Ctrl + S
            itemQuitter, //Menu: Fichier/Quitter Ctrl + Q
            itemRechercherEmploye, //Menu: Options
            itemEffacerEmploye, //Menu: Options
            itemFonctionDateTitre, //Menu: Affichage/Employes/Fonctions
            itemParFonction; //Menu: Affichage/Employes/Fonctions

    private JTextField
            txtEmployeNumAssuranceSociale, //Menu: Fichier/Nouveau employé/paneEmploye
            txtEmployeNom, //Menu: Fichier/Nouveau employé/paneEmploye
            txtEmployePrenom, //Menu: Fichier/Nouveau employé/paneEmploye
            txtEmployeSexe, //Menu: Fichier/Nouveau employé/paneEmploye
            txtAdresse, //Menu: Fichier/Nouveau employé/paneEmploye
            txtDateNaissance, //Menu: Fichier/Nouveau employé/paneEmploye
            txtFonctionDate, //Menu: Fichier/Nouveau employé/paneFonction
            txtFonctionTitre, //Menu: Fichier/Nouveau employé/paneFonction
            txtFonctionNumDpt, //Menu: Fichier/Nouveau employé/paneFonction
            txtSalaireDate, //Menu: Fichier/Nouveau employé/paneSalaire
            txtSalaireMontant; //Menu: Fichier/Nouveau employé/paneSalaire

    private JLabel
            lblEmployeNumAssuranceSociale, //Menu: Fichier/Nouveau employé/paneEmploye
            lblEmployeNom, //Menu: Fichier/Nouveau employé/paneEmploye
            lblEmployePrenom, //Menu: Fichier/Nouveau employé/paneEmploye
            lblEmployeSexe, //Menu: Fichier/Nouveau employé/paneEmploye
            lblAdresse, //Menu: Fichier/Nouveau employé/paneEmploye
            lblDateNaissance, //Menu: Fichier/Nouveau employé/paneEmploye
            lblCurrentFonction, //Menu: Fichier/Nouveau employé/paneFonction
            lblFonctionDate, //Menu: Fichier/Nouveau employé/paneFonction
            lblFonctionTitre, //Menu: Fichier/Nouveau employé/paneFonction
            lblFonctionNumDpt, //Menu: Fichier/Nouveau employé/paneFonction
            lblFonctionNiveau, //Menu: Fichier/Nouveau employé/paneFonction
            lblCurrentSalaire, //Menu: Fichier/Nouveau employé/paneSalaire
            lblSalaireDate, //Menu: Fichier/Nouveau employé/paneSalaire
            lblSalaireSalaire, //Menu: Fichier/Nouveau employé/paneSalaire
            lblSalaireRaison; //Menu: Fichier/Nouveau employé/paneSalaire

    private JComboBox
            comboFonctionNiveaux, //Menu: Fichier/Nouveau employé/paneFonction
            comboFonctionTitres, //Menu: Fichier/Nouveau employé/paneFonction
            comboSalaireRaisons; //Menu: Fichier/Nouveau employé/paneSalaire

    private JButton
            boutonOk, //Menu: Fichier/Nouveau Employé
            boutonAnnuler, //Menu: Fichier/Nouveau Employé
            boutonFonctionAjouter, //Menu: Fichier/Nouveau Employé/paneFonction
            boutonSalaireAjouter; //Menu: Fichier/Nouveau employé/paneSalaire

    private JFileChooser
            jfcOuvrir; //Menu: Fichier/item ouvrir

    private JEditorPane affichageEmployes;
    private JScrollPane scrollAffichageEmployes;

    private String nomCompagnie;

    //stocke les fonctions lors de l'ajout d'un employé
    private Fonction[] tabFonctions;
    private int nbFonctions; //le nombre de fonctions
    //stocke les salaires lors de l'ajout d'un employé
    private Salaire[] tabSalaires;
    private int nbSalaires; //le nombre de salaires

    private EcritureEmployes ecrire;
    private LectureEmployes lire;
    private DecimalFormat formateSalaire;

    public Compagnie(String nom) {
        formateSalaire = new DecimalFormat("#, ##0.00$");
        nomCompagnie = nom;
        tabFonctions = new Fonction[Employe.HISTORIQUE_FONCTIONS_TAILLE];
        tabSalaires = new Salaire[Employe.HISTORIQUE_SALAIRES_TAILLE];
        nbFonctions = 0;
        nbSalaires = 0;
        employes = new Vector(NB_EMPLOYES);
        instancierComposants();
        configurerComposants();
    }

    /**
     * instancie les composants
     */
    private void instancierComposants() {
        //JFrame
        frameCompagnie = new JFrame(nomCompagnie);
        frameEmploye = new JFrame("Nouveau employé");

        //Container
        containerCompagnie = frameCompagnie.getContentPane();
        containerEmploye = frameEmploye.getContentPane();

        //JMenuBar
        barreMenu = new JMenuBar();

        //JMenu
        menuFichier = new JMenu("Fichier");
        menuOptions = new JMenu("Options");
        menuAffichage = new JMenu("Affichage");
        menuFonctions = new JMenu("Fonctions");
        menuEmployes = new JMenu("Employes");

        //JMenuItem
        //Menu fichier
        itemNouveauEmploye = new JMenuItem("Nouveau employé");
        itemOuvrir = new JMenuItem("Ouvrir");
        itemSauvegarder = new JMenuItem("Sauvegarder");
        itemQuitter = new JMenuItem("Quitter");

        //Menu options
        itemRechercherEmploye = new JMenuItem("Rechercher employe");
        itemEffacerEmploye = new JMenuItem("Effacer employe");

        //Menu Affichage/Employes/Fonction
        itemFonctionDateTitre = new JMenuItem("Par date et titre");
        itemParFonction = new JMenuItem("Par fonction");

        //JPanel
        paneEmploye = new JPanel();
        paneFonction = new JPanel();
        paneSalaire = new JPanel();
        paneConfirmer = new JPanel();

        //JTabbedPane
        tabPane = new JTabbedPane();

        //JTextField
        //Menu Fichier/Nouveau employe/paneEmploye
        txtEmployeNumAssuranceSociale = new JTextField();
        txtEmployeNom = new JTextField();
        txtEmployePrenom = new JTextField();
        txtEmployeSexe = new JTextField();
        txtAdresse = new JTextField();
        txtDateNaissance = new JTextField();

        //Menu: Fichier/Nouveau employe/paneFonction
        txtFonctionDate = new JTextField();
        txtFonctionTitre = new JTextField();
        txtFonctionNumDpt = new JTextField();

        //Menu: Fichier/Nouveau employe/paneSalaire
        txtSalaireDate = new JTextField();
        txtSalaireMontant = new JTextField();

        //JLabel
        //Menu: Fichier/Nouveau employe/paneEmploye
        lblEmployeNumAssuranceSociale = new JLabel("Numéro assurance sociale:");
        lblEmployeNom = new JLabel("Nom:");
        lblEmployePrenom = new JLabel("Prenom:");
        lblEmployeSexe = new JLabel("Sexe (M ou F):");
        lblAdresse = new JLabel("Adresse:");
        lblDateNaissance = new JLabel("date naissance:");

        //Menu: Fichier/Nouveau employe/paneFonction
        lblCurrentFonction = new JLabel();
        lblFonctionDate = new JLabel("Date début:");
        lblFonctionTitre = new JLabel("Titre:");
        lblFonctionNumDpt = new JLabel("Num département:");
        lblFonctionNiveau = new JLabel("Niveau:");

        //Menu: Fichier/Nouveau employé/paneSalaire
        lblCurrentSalaire = new JLabel();
        lblSalaireDate = new JLabel("Date début:");
        lblSalaireSalaire = new JLabel("Salaire:");
        lblSalaireRaison = new JLabel("Raison:");

        //JComboBox
        comboFonctionNiveaux = new JComboBox();
        comboSalaireRaisons = new JComboBox();
        comboFonctionTitres = new JComboBox();

        //JButton
        boutonOk = new JButton("OK");
        boutonAnnuler = new JButton("Annuler");

        boutonFonctionAjouter = new JButton("Ajouter");
        boutonSalaireAjouter = new JButton("Ajouter");

        //JFileChooser
        jfcOuvrir = new JFileChooser(".");

        //JEditorPane
        affichageEmployes = new JEditorPane();

        //JScrollPane scrollAffichageEmployes
        scrollAffichageEmployes = new JScrollPane(affichageEmployes);
    }

    /**
     * configure les composants
     */
    private void configurerComposants() {
        //JFrame
        frameCompagnie.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameCompagnie.setSize(new Dimension(600, 500));
        frameCompagnie.setLocation(new Point(150, 150));

        frameEmploye.setSize(new Dimension(550, 300));
        frameEmploye.setLocation(new Point(200, 200));

        //permet de fermer la fenêtre frameEmploye
        //quand on presse la touche Escape
        AbstractAction fermerFenetre = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                frameEmploye.setVisible(false);
                reinitialiserChamps();
            }
        };

        frameEmploye.getRootPane().getActionMap().put("fermer", fermerFenetre);
        int stdMask = Toolkit.getDefaultToolkit().
                      getMenuShortcutKeyMask();
        InputMap im =
                frameEmploye.getRootPane().getInputMap(JComponent.
                WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "fermer");

        //***************************************************************

         //menu fichier raccourcis et emplacements
         itemNouveauEmploye.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
                 KeyEvent.CTRL_MASK));
        itemNouveauEmploye.addActionListener(new EcouteursMenuFichier());
        menuFichier.add(itemNouveauEmploye);
        menuFichier.addSeparator();

        itemOuvrir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
                KeyEvent.CTRL_MASK));
        itemOuvrir.addActionListener(new EcouteursMenuFichier());
        menuFichier.add(itemOuvrir);

        itemSauvegarder.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
                KeyEvent.CTRL_MASK));
        itemSauvegarder.addActionListener(new EcouteursMenuFichier());
        menuFichier.add(itemSauvegarder);

        menuFichier.addSeparator();
        itemQuitter.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
                KeyEvent.CTRL_MASK));
        itemQuitter.addActionListener(new EcouteursMenuFichier());
        menuFichier.add(itemQuitter);

        //menu Options
        itemRechercherEmploye.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.
                VK_F,
                KeyEvent.CTRL_MASK));
        itemRechercherEmploye.addActionListener(new EcouteursMenuOptions());
        menuOptions.add(itemRechercherEmploye);
        itemEffacerEmploye.addActionListener(new EcouteursMenuOptions());
        menuOptions.add(itemEffacerEmploye);

        //menu Affichage/Employes/Fonctions
        itemFonctionDateTitre.addActionListener(new EcouteursMenuAffichage());
        menuFonctions.add(itemFonctionDateTitre);
        menuFonctions.addSeparator();

        itemParFonction.addActionListener(new EcouteursMenuAffichage());
        menuFonctions.add(itemParFonction);

        //menu Affichage/Employes
        menuEmployes.add(menuFonctions);
        //menu Affichage
        menuAffichage.add(menuEmployes);

        //barre menu
        barreMenu.add(menuFichier);
        barreMenu.add(menuOptions);
        barreMenu.add(menuAffichage);

        containerCompagnie.setLayout(null);
        ajouter(containerCompagnie, barreMenu, 2, 2, 400, 15);

        //**************************************************************

         paneEmploye.setLayout(null);
        paneFonction.setLayout(null);
        paneSalaire.setLayout(null);

        //paneEmploye
        lblAdresse.setToolTipText("numéro, rue, ville, code postal");
        txtAdresse.setToolTipText(lblAdresse.getToolTipText());
        lblDateNaissance.setToolTipText("aaaa/jj/mm");
        txtDateNaissance.setToolTipText(lblDateNaissance.getToolTipText());

        ajouter(paneEmploye, lblEmployeNumAssuranceSociale, 10, 0, 200, 20);
        ajouter(paneEmploye, txtEmployeNumAssuranceSociale, 200, 2, 50, 20);
        ajouter(paneEmploye, lblEmployeNom, 10, 20, 100, 20);
        ajouter(paneEmploye, txtEmployeNom, 200, 22, 145, 20);
        ajouter(paneEmploye, lblEmployePrenom, 10, 40, 100, 20);
        ajouter(paneEmploye, txtEmployePrenom, 200, 42, 145, 20);
        ajouter(paneEmploye, lblEmployeSexe, 10, 60, 100, 20);
        ajouter(paneEmploye, txtEmployeSexe, 200, 62, 15, 20);
        ajouter(paneEmploye, lblDateNaissance, 10, 80, 100, 20);
        ajouter(paneEmploye, txtDateNaissance, 200, 82, 65, 20);
        ajouter(paneEmploye, lblAdresse, 10, 100, 200, 20);
        ajouter(paneEmploye, txtAdresse, 200, 102, 200, 20);

        //paneFonction
        boutonFonctionAjouter.addActionListener(new EcouteursPaneFonction());
        lblFonctionDate.setToolTipText(lblDateNaissance.getToolTipText());
        txtFonctionDate.setToolTipText(lblDateNaissance.getToolTipText());
        txtFonctionTitre.setEnabled(false);

        comboFonctionTitres.addItem("Bureau");
        comboFonctionTitres.addItem("Cadre");
        comboFonctionTitres.addItem("Professionnel");
        comboFonctionTitres.addItem("Autres");
        comboFonctionTitres.addActionListener(new EcouteursPaneFonction());
        comboFonctionNiveaux = new JComboBox(
                new Object[] {"1", "2", "3", "4", "5", "6", "7", "8"});

        lblCurrentFonction.setText("Historique des fonctions: 1 de " +
                                   Employe.HISTORIQUE_FONCTIONS_TAILLE);
        ajouter(paneFonction, lblCurrentFonction, 2, 2, 200, 20);
        ajouter(paneFonction, boutonFonctionAjouter, 400, 2, 100, 20);
        ajouter(paneFonction, lblFonctionDate, 20, 20, 100, 20);
        ajouter(paneFonction, txtFonctionDate, 200, 22, 100, 20);
        ajouter(paneFonction, lblFonctionTitre, 20, 40, 100, 20);
        ajouter(paneFonction, comboFonctionTitres, 200, 42, 100, 20);
        ajouter(paneFonction, txtFonctionTitre, 300, 42, 100, 20);
        ajouter(paneFonction, lblFonctionNumDpt, 20, 60, 200, 20);
        ajouter(paneFonction, txtFonctionNumDpt, 200, 62, 50, 20);
        ajouter(paneFonction, lblFonctionNiveau, 20, 80, 100, 20);
        ajouter(paneFonction, comboFonctionNiveaux, 200, 82, 50, 20);

        //paneSalaire
        boutonSalaireAjouter.addActionListener(new EcouteursPaneSalaire());

        lblCurrentSalaire.setText("Historique des salaires: 1 de " +
                                  Employe.HISTORIQUE_SALAIRES_TAILLE);
        lblSalaireDate.setToolTipText(lblDateNaissance.getToolTipText());
        txtSalaireDate.setToolTipText(lblDateNaissance.getToolTipText());
        comboSalaireRaisons = new JComboBox(new Object[] {"Engagement",
                                            "Transfert", "Promotion", "Départ"});

        ajouter(paneSalaire, lblCurrentSalaire, 2, 2, 200, 20);
        ajouter(paneSalaire, boutonSalaireAjouter, 400, 2, 100, 20);
        ajouter(paneSalaire, lblSalaireDate, 20, 20, 100, 20);
        ajouter(paneSalaire, txtSalaireDate, 200, 22, 100, 20);
        ajouter(paneSalaire, lblSalaireSalaire, 20, 40, 100, 20);
        ajouter(paneSalaire, txtSalaireMontant, 200, 42, 100, 20);
        ajouter(paneSalaire, lblSalaireRaison, 20, 60, 100, 20);
        ajouter(paneSalaire, comboSalaireRaisons, 200, 62, 100, 20);

        tabPane.addTab("Employe", paneEmploye);
        tabPane.addTab("Fonction", paneFonction);
        tabPane.addTab("Salaire", paneSalaire);

        //paneConfirmer boutonOk et boutonAnnuler
        boutonOk.addActionListener(this);
        boutonAnnuler.addActionListener(this);

        ajouter(tabPane, boutonOk, 250, 130, 100, 20);
        paneConfirmer.setLayout(new FlowLayout());
        paneConfirmer.add(boutonOk);
        paneConfirmer.add(boutonAnnuler);

        containerEmploye.setLayout(null);
        ajouter(containerEmploye, tabPane, 0, 0, 550, 200);
        ajouter(containerEmploye, paneConfirmer, 0, 210, 550, 100);

        //JFileChooser jfcOuvrir //Menu: Fichier/Ouvrir
        jfcOuvrir.setApproveButtonText("Ouvrir");
        jfcOuvrir.setDialogTitle("Sélectionner un employé");

        //JEditor
        affichageEmployes.setEditable(false);
        ajouter(containerCompagnie, scrollAffichageEmployes, 2, 100, 400, 300);
    }


    /**
     * ajoute le composant au container d'après les positions établis
     * @param c Container
     * @param o JComponent
     * @param x int
     * @param y int
     * @param x2 int largeur
     * @param y2 int longueur
     */
    private void ajouter(Container c, Component comp, int x, int y,
                         int x2, int y2) {
        comp.setBounds(x, y, x2, y2);
        c.add(comp);
    }

    /**
     * démarre la compagnie, affiche l'interface graphique
     */
    public void demarrer() {
        frameCompagnie.setVisible(true);
    }

    public String getNomCompagnie() {
        return nomCompagnie;
    }

    /**
     * traite le OK et Annuler dans le menu: Nouveau employe
     * @param e ActionEvent
     */
    public void actionPerformed(ActionEvent e) {
        int sexe = Employe.MASCULIN;
        Employe employe;
        if (e.getSource() == boutonOk) {
            frameEmploye.setVisible(false);
            if (txtEmployeSexe.getText().toUpperCase().charAt(0) == 'F') {
                sexe = Employe.FEMININ;
            }

            employe = new Employe(txtEmployeNumAssuranceSociale.getText(),
                                  txtEmployeNom.getText(),
                                  txtEmployePrenom.getText()
                                  , sexe, new MaDate(txtDateNaissance.getText()),
                                  new Adresse(txtAdresse.getText()));
            for (int i = 0; i < Employe.HISTORIQUE_FONCTIONS_TAILLE; i++) {
                if (tabFonctions[i] != null) {
                    employe.ajouterFonction(tabFonctions[i]);
                }
            }
            for (int i = 0; i < Employe.HISTORIQUE_SALAIRES_TAILLE; i++) {
                if (tabSalaires[i] != null) {
                    employe.ajouterSalaire(tabSalaires[i]);
                }
            }

            //ajout de l'employé
            employes.add(employe);
            reinitialiserChamps();
        } else if (e.getSource() == boutonAnnuler) {
            frameEmploye.setVisible(false);
            reinitialiserChamps();
        }
    }

    /**
     * réinitialise tout les champs pour permettre à l'adminitrateur d'entrer
     * de nouveaux employés
     */
    private void reinitialiserChamps() {
        txtEmployeNumAssuranceSociale.setText("");
        txtEmployeNom.setText("");
        txtEmployePrenom.setText("");
        txtDateNaissance.setText("");
        txtEmployeSexe.setText("");
        txtAdresse.setText("");

        tabFonctions = new Fonction[Employe.HISTORIQUE_FONCTIONS_TAILLE];
        nbFonctions = 0;
        tabSalaires = new Salaire[Employe.HISTORIQUE_SALAIRES_TAILLE];
        nbSalaires = 0;
        lblCurrentFonction.setText("Historique des fonctions: 1 de " +
                                   Employe.HISTORIQUE_FONCTIONS_TAILLE);
        lblCurrentSalaire.setText("Historique des salaires: 1 de " +
                                  Employe.HISTORIQUE_SALAIRES_TAILLE);
    }

    /**
     * affiche un message
     * @param message String contenu du message
     * @param titre String titre du message
     * @param type int type de message
     */
    private void msg(String message, String titre, int type) {
        JOptionPane.showMessageDialog(null, message, titre, type);
    }

    /**
     * EcouteursPaneFonction
     * permet d'écouter les évènements dans le panneau Fonction
     * du menu: Fichier/Nouveau employé/Fonction
     * si de nouvelles fonctionnalités sont ajoutés au panneau, il faut
     * utiliser cet écouteur pour le traitemement
     */
    class EcouteursPaneFonction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int
                    numDpt, //numéro du département
                    niveau; //niveau de la fonction
            String titreFonction;

            if (e.getSource() == boutonFonctionAjouter) {
                if (nbFonctions < Employe.HISTORIQUE_FONCTIONS_TAILLE) {
                    titreFonction = comboFonctionTitres.getSelectedItem().
                                    toString();
                    if (txtFonctionTitre.isEnabled()) {
                        titreFonction = txtFonctionTitre.getText();
                    }
                    numDpt = Integer.parseInt(txtFonctionNumDpt.getText().
                                              toString());
                    niveau = Integer.parseInt(comboFonctionNiveaux.
                                              getSelectedItem().toString());

                    //création de la fonction
                    tabFonctions[nbFonctions] = new Fonction(new MaDate(
                            txtFonctionDate.getText()), titreFonction, numDpt,
                            niveau);
                    nbFonctions++;

                    if (nbFonctions == Employe.HISTORIQUE_FONCTIONS_TAILLE) {
                        boutonFonctionAjouter.setEnabled(false);
                    } else {
                        //mise à jour permettant d'informer l'utilisateur
                        lblCurrentFonction.setText("Historique des fonctions: " +
                                (nbFonctions + 1) + " de " +
                                Employe.HISTORIQUE_FONCTIONS_TAILLE);
                        //réinitialisation des champs
                        txtFonctionDate.setText("");
                        comboFonctionTitres.setSelectedIndex(0);
                        txtFonctionTitre.setEnabled(false);
                        txtFonctionTitre.setText("");
                        txtFonctionNumDpt.setText("");
                        comboFonctionNiveaux.setSelectedIndex(0);
                    }
                }
            } else if (e.getSource() == comboFonctionTitres) {
                if (comboFonctionTitres.getSelectedIndex() ==
                    comboFonctionTitres.getItemCount() - 1) {
                    txtFonctionTitre.setEnabled(true);
                }
            }
        }
    }


    /**
     * EcouteursPaneSalaire
     * permet d'écouter les évènements dans le panneau Salaire
     * du menu: Fichier/Nouveau employé/Salaire
     * si de nouvelles fonctionnalités sont ajoutés au panneau, il faut
     * utiliser cet écouteur pour le traitemement
     */
    class EcouteursPaneSalaire implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            double dsalaire;
            int raison; //@see Employe constantes

            if (e.getSource() == boutonSalaireAjouter) {
                if (nbSalaires <= Employe.HISTORIQUE_SALAIRES_TAILLE) {
                    dsalaire = Double.parseDouble(txtSalaireMontant.getText());
                    raison = comboSalaireRaisons.getSelectedIndex();

                    //création du salaire
                    tabSalaires[nbSalaires] = new Salaire(new MaDate(
                            txtSalaireDate.getText()), dsalaire, raison);
                    nbSalaires++;

                    if (nbSalaires == Employe.HISTORIQUE_SALAIRES_TAILLE) {
                        boutonSalaireAjouter.setEnabled(false);
                    } else {
                        //mise à jour permettant d'informer l'utilisateur
                        lblCurrentSalaire.setText("Historique des salaires: " +
                                                  (nbSalaires + 1) + " de " +
                                                  Employe.
                                                  HISTORIQUE_SALAIRES_TAILLE);
                        //réinitialisation des champs
                        txtSalaireDate.setText("");
                        txtSalaireMontant.setText("");
                        comboSalaireRaisons.setSelectedIndex(0);
                    }
                }
            }
        }
    }


    /**
     * EcouteursMenuFichier
     * permet d'écouter les évènements sur le menu Fichier
     * si de nouveaux items sont ajoutés au menu, il faut
     * utiliser cet écouteur pour le traitemement
     */
    class EcouteursMenuFichier implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == itemNouveauEmploye) {
                frameEmploye.setVisible(true);
            } else if (e.getSource() == itemQuitter) {
                int choix = JOptionPane.showConfirmDialog(null,
                        "Êtes-vous sur de vouloir quitter?", getNomCompagnie(),
                        JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
                if (choix == JOptionPane.YES_OPTION) {
                    System.exit(0);
                }
            } else if (e.getSource() == itemSauvegarder) {
                Employe employe = null;
                String nomEmploye,
                        nomFichier;
                //demande le nom de l'employé à sauvegarder
                nomEmploye = JOptionPane.showInputDialog(
                        "Entrez le nom de l'employé à sauvegarder");

                //vérifie que l'employé existe dans liste d'employé entrée
                if (nomEmploye != null) {
                    for (int i = 0; i < employes.size(); i++) {
                        if (((Employe) employes.get(i)).getNom().equals(
                                nomEmploye)) {
                            employe = (Employe) employes.get(i);
                            break;
                        }
                    }
                }

                //si l'employé existe, demande à l'utilisateur le nom du répertoire
                //et le nom du fichier, enfin sauvegarde de l'employe
                if (employe != null) {
                    nomFichier = JOptionPane.showInputDialog("Entrez le nom du répertoire et du fichier de sauvegarde\n«ex: rep/sous-rep/fichier»");
                    ecrire = new EcritureEmployes(nomFichier);
                    ecrire.ecrireEmploye(employe);
                    ecrire.fermerFlux();
                    msg("employe " + nomEmploye + " sauvegardé avec succès",
                        getNomCompagnie(), JOptionPane.INFORMATION_MESSAGE);
                } else {
                    msg("employe " + nomEmploye + " inexistant",
                        getNomCompagnie(), JOptionPane.ERROR_MESSAGE);
                }
            } else if (e.getSource() == itemOuvrir) {
                int choix;
                choix = jfcOuvrir.showOpenDialog(null);

                if (choix == JFileChooser.APPROVE_OPTION) {
                    lire = new LectureEmployes(jfcOuvrir.getSelectedFile());
                    Employe employe = lire.lireEmploye();
                    employes.add(employe);
                    lire.fermerFlux();
                    msg("Employe " + employe.getNom() +
                        " ajouté avec succès", getNomCompagnie(),
                        JOptionPane.INFORMATION_MESSAGE);
                }
            }
        }
    } //Fin de la classe EcouteursMenuFichier


    /**
     * EcouteursMenuOptions
     * permet d'écouter les évènements sur le menu Options
     * si de nouveaux items sont ajoutés au menu, il faut
     * utiliser cet écouteur pour le traitemement
     */
    class EcouteursMenuOptions implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == itemRechercherEmploye) {
                //recherche par numéro d'assurance sociale
                boolean trouveEmploye = false;
                String num = JOptionPane.showInputDialog(
                        "Entrez le numéro d'assurance-sociale de l'employé à rechercher");
                for (int i = 0; i < employes.size(); i++) {
                    if (((Employe) employes.get(i)).getAssuranceSociale().
                        equals(num)) {
                        trouveEmploye = true;
                        affichageEmployes.setText(
                                "numéro d'assurance-sociale:\t" +
                                ((Employe) employes.get(i)).getAssuranceSociale() +
                                "\nnom:\t\t" +
                                ((Employe) employes.get(i)).getNom() +
                                "\nPrénom:\t\t" +
                                ((Employe) employes.get(i)).getPrenom());
//                        System.out.println (((Employe) employes.get(i)).getDateNaissance().toString());
                        break;
                    }
                }
                if (!trouveEmploye) {
                    msg("numéro d'assurance-sociale " + num + " invalide",
                        getNomCompagnie(), JOptionPane.ERROR_MESSAGE);
                }
            } else if (e.getSource() == itemEffacerEmploye) {
                boolean trouveEmploye = false;
                String num = JOptionPane.showInputDialog(
                        "Entrez le numéro d'assurance-sociale de l'employé à effacer");
                for (int i = 0; i < employes.size(); i++) {
                    if (((Employe) employes.get(i)).getAssuranceSociale().
                        equals(num)) {
                        trouveEmploye = true;
                        employes.removeElementAt(i);
                        msg("Employé supprimé", getNomCompagnie(),
                            JOptionPane.INFORMATION_MESSAGE);
                        break;
                    }
                }
                if (!trouveEmploye) {
                    msg("numéro d'assurance-sociale " + num + " invalide",
                        getNomCompagnie(), JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    } //Fin de la classe EcouteursMenuOptions


    /**
     * EcouteursMenuAffichage
     * permet d'écouter les évènements sur le menu Options
     * si de nouveaux items sont ajoutés au menu, il faut
     * utiliser cet écouteur pour le traitemement
     */
    class EcouteursMenuAffichage implements ActionListener {
        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == itemFonctionDateTitre) {
                affichageEmployes.setText("");
                for (int i = 0; i < employes.size(); i++) {
                    Employe employe = (Employe) employes.get(i);
                    affichageEmployes.setText(affichageEmployes.getText() +
                                              "\n\nNom:\t" + employe.getNom() +
                                              ", " + employe.getPrenom());
                    for (int k = 0; k < employe.getNbFonctions(); k++) {
                        affichageEmployes.setText(affichageEmployes.getText() +
                                                  "\nFonction " + (k + 1) +
                                                  ":\nTitre:\t" +
                                                  employe.getFonction(k + 1).
                                                  getTitre() + "\nDate:\t" +
                                                  employe.getFonction(k + 1).
                                                  getDateDebut().toString());
                    }
                }
            } else if (e.getSource() == itemParFonction) {
                String titreFonction = JOptionPane.showInputDialog(
                        "Entrez le titre de la fonction ");
                if (titreFonction != null) {
                    boolean trouveFonction = false;
                    for (int i = 0; i < employes.size(); i++) {
                        Employe employe = (Employe) employes.get(i);
                        for (int k = 0; k < employe.getNbFonctions(); k++) {
                            if (employe.getFonction(k +
                                    1).getTitre().equals(titreFonction)) {
                                trouveFonction = true;
                                affichageEmployes.setText(affichageEmployes.
                                        getText() + "\nNom:\t" + employe.getNom());

                                for (int j = 0; j < employe.getNbSalaires(); j++) {
                                    affichageEmployes.setText(affichageEmployes.
                                            getText() + "\n\nSalaire: " +
                                            (j + 1) +
                                            "\nsalaire:\t" +
                                            formateSalaire.
                                            format(employe.getSalaire(j + 1).
                                            getSalaire()));
                                }
                            }
                        }
                    }
                    if (!trouveFonction) {
                        msg("Fonction " + titreFonction + " introuvable",
                            getNomCompagnie(), JOptionPane.ERROR_MESSAGE);
                    }
                } else {
                    msg("Titre de fonction " + titreFonction + " inexistant",
                        getNomCompagnie(), JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    } //Fin de la classe EcouteursMenuAffichage
} //Fin de la classe Compagnie
