/*
Copyright (C) 2010 Aurelien Da Campo
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package vues.reseau;
import i18n.Langue;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import exceptions.MessageChatInvalide;
import reseau.CanalException;
import reseau.jeu.client.EcouteurDeClientJeu;
import reseau.jeu.serveur.ServeurJeu;
import vues.Fenetre_MenuPrincipal;
import vues.GestionnaireDesPolices;
import vues.LookInterface;
import vues.Panel_MenuPrincipal;
import vues.commun.Panel_EmplacementsTerrain;
import vues.commun.Panel_GridBag;
import models.animations.Animation;
import models.creatures.Creature;
import models.creatures.VagueDeCreatures;
import models.jeu.*;
import models.joueurs.*;
import models.outils.GestionnaireSons;
import models.outils.Outils;
import models.tours.Tour;
/**
* Formulaire d'attente de joueurs
*
* @author Aurelien Da Campo
* @version 1.0 | mai 2010
*/
public class Panel_AttendreJoueurs extends JPanel implements
ActionListener, EcouteurDeJeu, EcouteurDeClientJeu
{
private static final long serialVersionUID = 1L;
private final int MARGES_PANEL = 40;
private final boolean ADMIN;
private JFrame parent;
private JButton bDemarrerMaintenant = new JButton(Langue.getTexte(Langue.ID_TXT_BTN_DEMARRER));
private JLabel lblEtat = new JLabel();
private JButton bDeconnecter = new JButton(Langue.getTexte(Langue.ID_TXT_BTN_SE_DECONNECTER));
private Jeu_Serveur jeuServeur;
private Jeu_Client jeuClient;
private Panel_EmplacementsTerrain pEmplacementsTerrain;
private JLabel lEtat = new JLabel();
private JPanel pTmp;
private Panel_GridBag pJoueurs;
private Console console;
private JTextField tfSaisieMsg = new JTextField();
private static final ImageIcon I_ENVOYER_MSG = new ImageIcon("img/icones/msg_go.png");
private JButton bEnvoyerMsg = new JButton(I_ENVOYER_MSG);
/**
* Constructeur de créateur de partie
*
* @param parent la fenetre parent
* @param jeu le jeu
* @param joueur le joueur
*/
public Panel_AttendreJoueurs(JFrame parent, Jeu_Serveur jeuServeur, Jeu_Client jeuClient)
{
this.parent = parent;
this.ADMIN = true;
this.jeuServeur = jeuServeur;
this.jeuClient = jeuClient;
jeuClient.setEcouteurDeClientJeu(this);
initialiserForm();
}
/**
* Constructeur du joueur qui rejoint
*
* @param parent la fenetre parent
* @param jeu le jeu du client
* @param joueur le joueur
*/
public Panel_AttendreJoueurs(JFrame parent, Jeu_Client jeu)
{
this.parent = parent;
this.ADMIN = false;
this.jeuClient = jeu;
jeuClient.setEcouteurDeClientJeu(this);
initialiserForm();
}
/**
* Permet d'initialiser le formulaire
*/
private void initialiserForm()
{
jeuClient.setEcouteurDeJeu(this);
// initialisation
setLayout(new BorderLayout());
parent.setTitle(Langue.getTexte(Langue.ID_TITRE_ATTENTE_DE_JOUEURS));
setBorder(new EmptyBorder(new Insets(MARGES_PANEL, MARGES_PANEL,
MARGES_PANEL, MARGES_PANEL)));
setBackground(LookInterface.COULEUR_DE_FOND_PRI);
// ---------
// -- TOP --
// ---------
JPanel pTop = new JPanel(new BorderLayout());
pTop.setOpaque(false);
JLabel lblTitre = new JLabel(Langue.getTexte(Langue.ID_TITRE_ATTENTE_DE_JOUEURS));
lblTitre.setForeground(LookInterface.COULEUR_TEXTE_PRI);
lblTitre.setFont(GestionnaireDesPolices.POLICE_TITRE);
pTop.add(lblTitre, BorderLayout.NORTH);
add(pTop, BorderLayout.NORTH);
// ------------
// -- CENTER --
// ------------
pJoueurs = contruirePanelEmplacementsJoueur();
JPanel pCenter = new JPanel(new BorderLayout());
pCenter.setOpaque(false);
pEmplacementsTerrain = new Panel_EmplacementsTerrain(jeuClient.getTerrain(),300,300);
JScrollPane spEmplacement = new JScrollPane(pEmplacementsTerrain);
spEmplacement.setOpaque(false);
spEmplacement.setBorder(null);
//spEmplacement.setPreferredSize(new Dimension(350, 350));
pCenter.add(spEmplacement, BorderLayout.EAST);
JPanel pJoueursEtat = new JPanel(new BorderLayout());
pJoueursEtat.setOpaque(false);
pJoueursEtat.add(lEtat, BorderLayout.CENTER);
pTmp = new JPanel(new BorderLayout());
pTmp.setOpaque(false);
JScrollPane js = new JScrollPane(pJoueurs);
js.setOpaque(false);
js.setBorder(null);
pTmp.add(js, BorderLayout.NORTH);
//pTmp.add(bTmpJConn, BorderLayout.SOUTH);
//bTmpJConn.addActionListener(this);
pJoueursEtat.add(pTmp, BorderLayout.NORTH);
pCenter.add(pJoueursEtat, BorderLayout.WEST);
add(pCenter, BorderLayout.CENTER);
// ------------
// -- BOTTOM --
// ------------
JPanel pBottom = new JPanel(new BorderLayout());
pBottom.setOpaque(false);
// CONSOLE
console = new Console(0,80);
console.setOpaque(false);
JPanel pChat = new JPanel(new BorderLayout());
pChat.setOpaque(false);
pChat.add(console,BorderLayout.NORTH);
bEnvoyerMsg.addActionListener(this);
parent.getRootPane().setDefaultButton(bEnvoyerMsg); // bouton par def.
JPanel pSaisieMsgEtBEnvoyer = new JPanel(new BorderLayout());
pSaisieMsgEtBEnvoyer.setOpaque(false);
pSaisieMsgEtBEnvoyer.add(tfSaisieMsg,BorderLayout.CENTER);
pSaisieMsgEtBEnvoyer.add(bEnvoyerMsg,BorderLayout.EAST);
pChat.add(pSaisieMsgEtBEnvoyer,BorderLayout.SOUTH);
pBottom.add(pChat,BorderLayout.CENTER);
// bouton démarrer
if (ADMIN)
{
bDemarrerMaintenant.setPreferredSize(new Dimension(150, 50));
GestionnaireDesPolices.setStyle(bDemarrerMaintenant);
JPanel pSud = new JPanel(new BorderLayout());
pSud.setOpaque(false);
pSud.add(bDemarrerMaintenant,BorderLayout.SOUTH);
pBottom.add(pSud, BorderLayout.EAST);
bDemarrerMaintenant.addActionListener(this);
try
{
String s = Langue.getTexte(Langue.ID_TXT_VOS_ADRESSES_IP)+" : ";
for (NetworkInterface netint : Collections.list(NetworkInterface.getNetworkInterfaces())) {
for (InetAddress inetAddress : Collections.list(netint.getInetAddresses())) {
if (!inetAddress.toString().contains(":") && !inetAddress.toString().contains("127.0.0.1"))
{
s += "[ <b>"+inetAddress.toString().substring(1) + "</b> ] ";
}
}
}
console.ajouterTexteHTMLDansConsole(s+"<br />");
}
catch (SocketException e)
{
e.printStackTrace();
}
}
else
{
console.ajouterTexteHTMLDansConsole(Langue.getTexte(Langue.ID_TXT_DESCR_CONSOLE_CHAT));
}
bDeconnecter.addActionListener(this);
bDeconnecter.setPreferredSize(new Dimension(120, 50));
GestionnaireDesPolices.setStyle(bDeconnecter);
JPanel pSud = new JPanel(new BorderLayout());
pSud.setOpaque(false);
pSud.add(bDeconnecter,BorderLayout.SOUTH);
pBottom.add(pSud, BorderLayout.WEST);
if (ADMIN)
if (jeuServeur.estEnregisterSurSE())
{
lblEtat.setForeground(LookInterface.COULEUR_SUCCES);
lblEtat.setText(Langue.getTexte(Langue.ID_TXT_CON_SRV_CENTRAL_ETABLIE));
}
else
{
lblEtat.setForeground(LookInterface.COULEUR_ERREUR);
lblEtat.setText(Langue.getTexte(Langue.ID_ERREUR_ENREGISTREMENT_AU_SRV_CENTRAL_ECHOUE));
}
pBottom.add(lblEtat, BorderLayout.SOUTH);
add(pBottom, BorderLayout.SOUTH);
}
/**
* Permte de remplir la combobox
*
* @param cbEmplacements la combobox
* @param joueur pour pré-sélection
*/
private void remplirCombo(JComboBox cbEmplacements, Joueur joueur)
{
synchronized(cbEmplacements)
{
// vidage
cbEmplacements.removeAllItems();
// Emplacements de l'equipe
Equipe equipe = joueur.getEquipe();
for (int j = 0; j < equipe.getEmplacementsJoueur().size(); j++)
{
EmplacementJoueur ej = equipe.getEmplacementsJoueur().get(j);
cbEmplacements.addItem(ej.toString());
if (joueur.getEmplacement() == ej)
cbEmplacements.setSelectedIndex(j);
}
// si seulement 1 zone, on efface le combobox
cbEmplacements.setVisible(cbEmplacements.getItemCount() > 1);
}
}
@Override
public void actionPerformed(ActionEvent e)
{
Object src = e.getSource();
if (src == bDemarrerMaintenant)
{
if (ADMIN)
{
jeuServeur.desenregistrerSurSE();
// reférence différente entre client et serveur
jeuServeur.initialiser();
jeuServeur.demarrer();
}
}
else if (src == bDeconnecter)
{
if (ADMIN)
{
jeuServeur.desenregistrerSurSE();
jeuServeur.stopperServeurDeJeu();
}
else
{
try {
jeuClient.annoncerDeconnexion();
}
catch (CanalException e1){
// on peut rien faire...
}
}
// retour
parent.getContentPane().removeAll();
parent.getContentPane().add(new Panel_MenuPrincipal(parent),
BorderLayout.CENTER);
parent.getContentPane().validate();
}
else if(src == bEnvoyerMsg)
{
try{
// on envoie pas de chaines vides
if(!tfSaisieMsg.getText().trim().equals(""))
{
try
{
jeuClient.envoyerMsgChat(tfSaisieMsg.getText(), ServeurJeu.A_TOUS);
tfSaisieMsg.setText("");
tfSaisieMsg.requestFocus();
}
catch (MessageChatInvalide e1)
{
console.ajouterTexteHTMLDansConsole("<font color='red'>"+Langue.getTexte(Langue.ID_TXT_HTML_INTERDIT)+"</font> <br/>");
}
}
}
catch (CanalException e1)
{
e1.printStackTrace();
}
}
}
private void ajouterJoueur(final Joueur joueur, Panel_GridBag pJoueurs, int pos)
{
final JComboBox cbEmplacements = new JComboBox();
final JComboBox cbEquipes = new JComboBox();
// styles
GestionnaireDesPolices.setStyle(cbEmplacements);
GestionnaireDesPolices.setStyle(cbEquipes);
final JLabel lPseudo = new JLabel(joueur.getPseudo());
lPseudo.setFont(GestionnaireDesPolices.POLICE_SOUS_TITRE);
pJoueurs.add(lPseudo, 1, pos, 1);
lPseudo.setForeground(joueur.getEquipe().getCouleur());
ArrayList<Equipe> equipes = jeuClient.getEquipes();
if(ADMIN || jeuClient.getJoueurPrincipal() == joueur)
{
// Liste des équipes
// Remplissage
for (int j = 0; j < equipes.size(); j++)
{
Equipe tmpEquipe = equipes.get(j);
// ajout de l'equipe
cbEquipes.addItem(tmpEquipe);
if (joueur.getEquipe() == tmpEquipe)
cbEquipes.setSelectedIndex(j);
}
// Action de la liste des équipes
cbEquipes.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
lEtat.setText("");
Equipe equipe = (Equipe) cbEquipes
.getSelectedItem();
jeuClient.changerEquipe(joueur, equipe);
// mise a jour de la liste des emplacements
remplirCombo(cbEmplacements,joueur);
lPseudo.setForeground(joueur.getEquipe().getCouleur());
}
catch (Exception iae)
{
// on reselectionne l'ancienne sélection
cbEquipes.setSelectedItem(joueur.getEquipe());
lEtat.setForeground(LookInterface.COULEUR_ERREUR);
lEtat.setText(iae.getMessage());
}
pEmplacementsTerrain.repaint();
}
});
pJoueurs.add(cbEquipes, 2, pos, 1);
// remplissage de la combobox
remplirCombo(cbEmplacements,joueur);
// Action de la liste des emplacements
cbEmplacements.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
lEtat.setText("");
if(cbEmplacements.getSelectedIndex() != -1)
{
EmplacementJoueur ej = joueur.getEquipe().getEmplacementsJoueur().get(cbEmplacements.getSelectedIndex());
joueur.setEmplacementJoueur(ej);
pEmplacementsTerrain.repaint();
}
}
catch (IllegalArgumentException iae)
{
// on reselectionne l'ancienne sélection
for(int i=0;i<cbEmplacements.getItemCount();i++)
if(joueur.getEmplacement().toString().equals(cbEmplacements.getItemAt(i)))
cbEmplacements.setSelectedIndex(i);
lEtat.setForeground(LookInterface.COULEUR_ERREUR);
lEtat.setText(iae.getMessage());
}
}
});
// ajout de l'emplacement
pJoueurs.add(cbEmplacements, 3, pos, 1);
}
}
public Panel_GridBag contruirePanelEmplacementsJoueur()
{
ArrayList<Joueur> joueurs = jeuClient.getJoueurs();
int maxJoueurs = jeuClient.getTerrain().getNbJoueursMax();
Panel_GridBag pJoueurs = new Panel_GridBag(new Insets(2, 2, 2, 2));
pJoueurs.setBackground(LookInterface.COULEUR_DE_FOND_PRI);
pJoueurs.setPreferredSize(new Dimension(350, 150));
for (int i = 0; i < maxJoueurs; i++)
{
/*
JLabel lNo = new JLabel((i + 1) + ". ");
lNo.setFont(GestionnaireDesPolices.POLICE_SOUS_TITRE);
pJoueurs.add(lNo, 0, i, 1);
*/
// joueur trouvé
if (i < joueurs.size())
ajouterJoueur(joueurs.get(i), pJoueurs, i);
// inconnu
else
{
JLabel lInconnu = new JLabel("???");
lInconnu.setFont(GestionnaireDesPolices.POLICE_SOUS_TITRE);
pJoueurs.add(lInconnu, 1, i, 1);
}
}
return pJoueurs;
}
@Override
public void animationAjoutee(Animation animation){}
@Override
public void animationTerminee(Animation animation){}
@Override
public void creatureAjoutee(Creature creature){}
@Override
public void creatureArriveeEnZoneArrivee(Creature creature){}
@Override
public void creatureBlessee(Creature creature){}
@Override
public void creatureTuee(Creature creature,Joueur tueur){}
@Override
public void etoileGagnee(){}
@Override
public void joueurAjoute(Joueur joueur){}
@Override
public void joueurMisAJour(Joueur joueur){}
@Override
public void partieDemarree(){}
@Override
public void partieInitialisee()
{
switch(jeuClient.getTerrain().getMode())
{
case ModeDeJeu.MODE_VERSUS :
new Fenetre_JeuVersus(jeuClient);
break;
/*
TODO implémenter le mode de jeu coopératif
case ModeDeJeu.MODE_COOP :
new Fenetre_JeuCoop(jeuClient);
break;
*/
}
GestionnaireSons.arreterTousLesSons(Fenetre_MenuPrincipal.FICHIER_MUSIQUE_MENU);
parent.dispose();
}
@Override
public void partieTerminee(ResultatJeu resultatJeu){}
@Override
public void tourAmelioree(Tour tour){}
@Override
public void tourPosee(Tour tour){}
@Override
public void tourVendue(Tour tour){}
@Override
public void vagueEntierementLancee(VagueDeCreatures vague){}
@Override
public void joueurInitialise()
{
initialiserForm();
}
@Override
public void joueursMisAJour()
{
pTmp.removeAll();
pJoueurs = contruirePanelEmplacementsJoueur();
JScrollPane js = new JScrollPane(pJoueurs);
js.setOpaque(false);
js.setBorder(null);
pTmp.add(js, BorderLayout.NORTH);
pTmp.revalidate();
pEmplacementsTerrain.repaint();
// mise a jour de la partie sur le serveur d'enregistrement
if(ADMIN)
jeuServeur.miseAJourSE();
}
@Override
public void messageRecu(String message, Joueur auteur)
{
String couleurHexa = Outils.ColorToHexa(auteur.getEquipe().getCouleur());
console.ajouterTexteHTMLDansConsole(String.format(Langue.getTexte(Langue.ID_TXT_PSEUDO_DIT_MESSAGE), "<b><font color='#"+couleurHexa+"'>"+auteur.getPseudo()+"</font></b>",message)+"<br />");
}
@Override
public void joueurDeconnecte(Joueur joueur)
{
console.ajouterTexteHTMLDansConsole("<font color='#FF0000'>"+String.format(Langue.getTexte(Langue.ID_TXT_PSEUDO_EST_PARTI), joueur.getPseudo())+"</font><br />");
}
@Override
public void receptionEquipeAPerdue(Equipe equipe){}
@Override
public void equipeAPerdue(Equipe equipe)
{
}
@Override
public void coeffVitesseModifie(double coeffVitesse)
{
// NOP
}
}