/**
   * Rafraichir la liste des statuts
   *
   * @param reconstruireListe forcer la reconstruction de la liste
   */
  private void refreshStatuts(boolean reconstruireListe) {
    if (ContestOrg.get().is(ContestOrg.STATE_OPEN)) {
      // Ne plus écouter les évenements sur la liste des statuts
      this.jcb_statut.removeItemListener(this);

      // Déterminer s'il faut inclure ou non le statut "homologué"
      boolean isStatutHomologueActive =
          ContestOrg.get().getCtrlParticipants().isStatutHomologueActive();
      if (this.jtable.getSelectedRow() != -1) {
        // Récupérer le statut du participant sélectionné
        InfosModelParticipant.Statut statut =
            (InfosModelParticipant.Statut)
                this.jtable
                    .getModel()
                    .getValueAt(
                        this.jtable
                            .getRowSorter()
                            .convertRowIndexToModel(this.jtable.getSelectedRow()),
                        this.jtable.getModel().getColumnCount() - 1);

        // Reconstruire la liste des statuts ?
        if (statut == InfosModelParticipant.Statut.HOMOLOGUE) {
          if (this.index_homologue == -1) {
            reconstruireListe = true;
            isStatutHomologueActive = true;
          }
        } else if (this.index_homologue != -1
            && !ContestOrg.get().getCtrlParticipants().isStatutHomologueActive()) {
          reconstruireListe = true;
          isStatutHomologueActive = false;
        }
      }

      // Recontruire la liste des statuts
      if (reconstruireListe) {
        this.jcb_statut.removeAllItems();
        boolean typeParticipantEquipe =
            ContestOrg.get().getCtrlParticipants().getTypeParticipants()
                == InfosModelConcours.PARTICIPANTS_EQUIPES;
        if (isStatutHomologueActive) {
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.ABSENT.getNomEquipe()
                  : InfosModelParticipant.Statut.ABSENT.getNomJoueur());
          this.index_absent = 0;
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.PRESENT.getNomEquipe()
                  : InfosModelParticipant.Statut.PRESENT.getNomJoueur());
          this.index_present = 1;
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.HOMOLOGUE.getNomEquipe()
                  : InfosModelParticipant.Statut.HOMOLOGUE.getNomJoueur());
          this.index_homologue = 2;
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.FORFAIT.getNomEquipe()
                  : InfosModelParticipant.Statut.FORFAIT.getNomJoueur());
          this.index_forfait = 3;
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.DISQUALIFIE.getNomEquipe()
                  : InfosModelParticipant.Statut.DISQUALIFIE.getNomJoueur());
          this.index_disqualifie = 4;
        } else {
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.ABSENT.getNomEquipe()
                  : InfosModelParticipant.Statut.ABSENT.getNomJoueur());
          this.index_absent = 0;
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.PRESENT.getNomEquipe()
                  : InfosModelParticipant.Statut.PRESENT.getNomJoueur());
          this.index_present = 1;
          this.index_homologue = -1;
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.FORFAIT.getNomEquipe()
                  : InfosModelParticipant.Statut.FORFAIT.getNomJoueur());
          this.index_forfait = 2;
          this.jcb_statut.addItem(
              typeParticipantEquipe
                  ? InfosModelParticipant.Statut.DISQUALIFIE.getNomEquipe()
                  : InfosModelParticipant.Statut.DISQUALIFIE.getNomJoueur());
          this.index_disqualifie = 3;
        }
      }

      // Sélectionné le statut correspondant au participant sélectionné dans le tableau
      if (this.jtable.getSelectedRow() != -1) {
        // Récupérer le statut du participant sélectionné
        InfosModelParticipant.Statut statut =
            (InfosModelParticipant.Statut)
                this.jtable
                    .getModel()
                    .getValueAt(
                        this.jtable
                            .getRowSorter()
                            .convertRowIndexToModel(this.jtable.getSelectedRow()),
                        this.jtable.getModel().getColumnCount() - 1);

        // Sélectionner le statut du participant dans la liste des statut
        if (statut == InfosModelParticipant.Statut.ABSENT) {
          this.jcb_statut.setSelectedIndex(this.index_absent);
        } else if (statut == InfosModelParticipant.Statut.PRESENT) {
          this.jcb_statut.setSelectedIndex(this.index_present);
        } else if (statut == InfosModelParticipant.Statut.HOMOLOGUE) {
          this.jcb_statut.setSelectedIndex(this.index_homologue);
        } else if (statut == InfosModelParticipant.Statut.FORFAIT) {
          this.jcb_statut.setSelectedIndex(this.index_forfait);
        } else {
          this.jcb_statut.setSelectedIndex(this.index_disqualifie);
        }
      } else {
        this.jcb_statut.setSelectedIndex(this.index_absent);
      }

      // Ecouter à nouveau les évenemtns sur la liste des statuts
      this.jcb_statut.addItemListener(this);
    }
  }
  /**
   * Constructeur
   *
   * @param w_parent fenêtre parent
   */
  public JPPrincipalParticipants(Window w_parent) {
    // Appeller le constructeur du parent
    super(w_parent);

    // Ecouter le controleur principal
    ContestOrg.get().addListener(this);

    // Panneau du haut
    this.jb_categories = new JButton("Catégories", new ImageIcon("img/farm/16x16/folders.png"));
    this.jb_poules = new JButton("Poules", new ImageIcon("img/farm/16x16/table_multiple.png"));
    this.jb_nouveau = new JButton("Nouvelle équipe", new ImageIcon("img/farm/16x16/add.png"));
    this.jb_importer =
        new JButton("Importer équipes", new ImageIcon("img/farm/16x16/application_get.png"));
    this.jb_exporter = new JButton("Exporter", new ImageIcon("img/farm/16x16/application_go.png"));

    this.jb_categories.setEnabled(false);
    this.jb_poules.setEnabled(false);
    this.jb_nouveau.setEnabled(false);
    this.jb_importer.setEnabled(false);
    this.jb_exporter.setEnabled(false);

    this.jb_categories.setToolTipText("Configurer les catégories");
    this.jb_poules.setToolTipText("Configurer les poules");
    this.jb_nouveau.setToolTipText("Ajouter une équipe");
    this.jb_importer.setToolTipText("Importer une liste d'équipes");
    this.jb_exporter.setToolTipText("Exporter des informations sur les équipes");

    this.jp_haut.add(this.jb_categories);
    this.jp_haut.add(this.jb_poules);
    this.jp_haut.add(this.jb_nouveau);
    this.jp_haut.add(this.jb_importer);
    this.jp_haut.add(this.jb_exporter);

    // Panneau de contenu
    this.jtree = new JTree(ContestOrg.get().getCtrlParticipants().getTreeModelPoules());
    this.jtree.setCellRenderer(new TreeCellRendererParticipants());
    this.jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    this.jtree.addTreeSelectionListener(this);
    this.jtree.setBorder(new LineBorder(new Color(254, 254, 254), 4));
    this.jtree.setToggleClickCount(-1);

    this.jtable = new JTable(ContestOrg.get().getCtrlParticipants().getTableModelParticipants());
    this.jtable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    this.jtable.getSelectionModel().addListSelectionListener(this);

    this.jtable
        .getColumnModel()
        .getColumn(4 - 9 + this.jtable.getColumnCount())
        .setCellRenderer(new TableCellRenderers.Rang());
    this.jtable
        .getColumnModel()
        .getColumn(5 - 9 + this.jtable.getColumnCount())
        .setCellRenderer(new TableCellRenderers.NbPoints());
    this.jtable
        .getColumnModel()
        .getColumn(6 - 9 + this.jtable.getColumnCount())
        .setCellRenderer(new TableCellRenderers.NbVictoires());
    this.jtable
        .getColumnModel()
        .getColumn(8 - 9 + this.jtable.getColumnCount())
        .setCellRenderer(new TableCellRenderers.Statut());

    TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(this.jtable.getModel());
    sorter.setStringConverter(new TableStringConverterParticipants());
    this.jtable.setRowSorter(sorter);

    this.jtable.addMouseListener(this);

    JScrollPane jsp = new JScrollPane(this.jtree);
    jsp.setPreferredSize(new Dimension(180, jsp.getPreferredSize().height));
    this.jp_contenu.add(
        new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jsp, new JScrollPane(this.jtable)));

    // Panneau du bas
    this.jcb_statut = new JComboBox();
    this.jcb_statut.addItem(InfosModelParticipant.Statut.ABSENT.getNomEquipe());
    this.index_absent = 0;
    this.jcb_statut.addItem(InfosModelParticipant.Statut.PRESENT.getNomEquipe());
    this.index_present = 1;
    this.jcb_statut.addItem(InfosModelParticipant.Statut.HOMOLOGUE.getNomEquipe());
    this.index_homologue = 2;
    this.jcb_statut.addItem(InfosModelParticipant.Statut.FORFAIT.getNomEquipe());
    this.index_forfait = 3;
    this.jcb_statut.addItem(InfosModelParticipant.Statut.DISQUALIFIE.getNomEquipe());
    this.index_disqualifie = 4;
    this.jb_editer = new JButton("Editer équipe", new ImageIcon("img/farm/16x16/pencil.png"));
    this.jb_supprimer =
        new JButton("Supprimer équipes", new ImageIcon("img/farm/16x16/delete.png"));

    this.jcb_statut.setEnabled(false);
    this.jb_editer.setEnabled(false);
    this.jb_supprimer.setEnabled(false);

    this.jcb_statut.setToolTipText("Modifier le statut des équipes séléctionnées");
    this.jb_editer.setToolTipText("Editer l'équipe séléctionnée");
    this.jb_supprimer.setToolTipText("Supprimer les équipes séléctionnées");

    this.jp_bas.add(this.jcb_statut);
    this.jp_bas.add(this.jb_editer);
    this.jp_bas.add(this.jb_supprimer);

    // Ecouter les boutons
    this.jb_categories.addActionListener(this);
    this.jb_poules.addActionListener(this);
    this.jb_nouveau.addActionListener(this);
    this.jb_importer.addActionListener(this);
    this.jb_exporter.addActionListener(this);
    this.jb_editer.addActionListener(this);
    this.jb_supprimer.addActionListener(this);

    // Ecouter la liste des statuts
    this.jcb_statut.addItemListener(this);
  }