package client.gui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.prefs.Preferences;
import javax.swing.JFrame;
import javax.swing.ToolTipManager;
import client.JxoClient;
import client.gui.dialogs.ConnexionDialog;
import client.gui.misc.GU;
import client.gui.panels.GrillePanel;
import com.jgoodies.looks.plastic.theme.ExperienceBlue;
import common.Conteneur;
import common.Point;
import common.TypeConteneur;
/**
*
* Classe graphique principale du projet.
* La classe contenant le point d'entrée
* (méthode main)
*
* @author Ait Elhaj Brahim
*
*/
public class JXoFrame extends JFrame{
/** La version du software */
public final static String VERSION = "1.0";
public final static int DIMENSION = 3;
protected static Preferences pref = Preferences.userRoot();
/** Dialogue de Connexion */
private ConnexionDialog cx;
/** Le panel central, principal */
private GrillePanel main = null;
private StatusBarGUI barreStatus;
/** Nom/adresse du serveur */
private String hostName = "";
/** Nom de joueur */
private String userName = "";
/**
* Instance de client de jeu
* initialisee a la creation du gui lors de la confirmation du
* dialogue de connexion.
*/
private JxoClient leClient;
// type de symbole qu'on joue.
private String symbole;
/** action de connexion a entreprendre
* 1 = connexion */
private int CONNECT_ACTION = 1;
/**
* Crée les objets graphiques et lance l'interface principale du projet.
*
*/
public JXoFrame(){
super("jXo - Morpion 2007");
//On change le skin
GU.changeUiSkin(new ExperienceBlue(),this);
Container cp = getContentPane();
// Préférences
ToolTipManager.sharedInstance().setEnabled(
pref.getBoolean("tooltips", true));
ToolTipManager.sharedInstance().setInitialDelay(1500);
ToolTipManager.sharedInstance().setReshowDelay(1500);
/* ajout du menu principal
* en haut de la fenetre
*/
this.setJMenuBar(new MenuBarGUI(this));
// this.setMain(getDefaultView());
// La vue principale (panel avec la grille de jeu)
this.main = getDefaultView();
// bloquer tous les boutons au demarrage.
// debloques des qu'une partie commence
this.main.blockAllButtons();
// Un border pour toolbar (en haut), statusbar (en bas), main (central)
cp.setLayout(new BorderLayout());
cp.add(main, BorderLayout.CENTER);
this.barreStatus = new StatusBarGUI(this);
cp.add(this.barreStatus, BorderLayout.SOUTH);
// Une taille raisonnable au départ (dans un fichier de config après
// sans doute) Mode maximisé ?
setSize(new Dimension(480, 480));
GU.center(this);
// action par defaut lors de la fermeture.
setDefaultCloseOperation(this.shutdown());
setVisible(true);
/*
* Affichage du dialogue de connexion au demarrage de
* l'appli
*/
this.cx = new ConnexionDialog(this, true);
this.cx.setVisible(true);
}
/**
* Créer et renvoie le panel principal de l'inteface du projet.
* @return Le panel principal contenant la grille de jeu.
*/
private GrillePanel getDefaultView() {
/* Creation d'un panel grille de jeu */
GrillePanel defaultView = new GrillePanel(this, this.DIMENSION);
return defaultView;
}
/**
* Créer et renvoie le panel principal de l'inteface du projet.
* @param size Taille de la grille a creer
* @return Le panel principal contenant la grille de jeu.
*/
// private JPanel getDefaultView(int size) {
// /* Creation d'un panel grille de jeu */
// JPanel defaultView = new GrillePanel(this, size);
// return defaultView;
// }
public void resetMainPanel() {
this.main.resetGrille();
}
public void enableMainPanel(){
this.main.enableAllButtons();
}
public void setStatusBarText(String s){
this.barreStatus.setStatusBarText(s);
}
public void setDefaultStatusBarText(){
this.barreStatus.setDefaultLabel();
}
/**
* Actions a declencher lors de la fermeture de la fenetre graphique.
* @return
*/
private int shutdown(){
// fermer le socket client !!!
// this.leClient.disconnect();
return JFrame.EXIT_ON_CLOSE;
}
// public void setGridSize(int size){
// this.main = this.getDefaultView(size);
// // redraw
// this.displayScreen(this.main);
// }
/**
* Affiche un composant particulier à la place de l'actuel.
* @param c Le composant à afficher
*/
// public void displayScreen(Component c) {
// this.getContentPane().removeAll();
// this.getContentPane().add(c);
// this.pack();
//
//// this.getOwner().repaint();
//// this.validate();
// }
/* Methodes concernant le client jXo */
/**
* Recuperation du nom d'hote ou on se connecte.
* @return the hostName
*/
public String getHostName() {
return this.hostName;
}
/**
* Renseignement du nom d'hote ou on se connecte
* @param hostName the hostName to set
*/
public void setHostName(String hostName) {
this.hostName = hostName;
}
/**
* Recuperation Nom d'utilisateur local
* @return the userName
*/
public String getUserName() {
return this.userName;
}
/**
* Renseignement du nom d'utilisateur local.
* @param userName the userName to set
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
* Renseignement du client de jeu
* @param jc Instance de Client de Jeu associee au programme en execution.
*/
public synchronized void setJxoClient(JxoClient jc){
this.leClient = jc;
}
/**
* Envoyer un point au serveur, pour dire qu'on a joue un
* tour.
* @param i Abscisse du point a envoyer
* @param j Ordonnee du point a envoyer
* @throws IOException Si quelque chose tourne mal.
*/
public void envoyerPoint(int i, int j) throws IOException{
Point p = new Point(i,j, this.symbole);
Conteneur c1 = new Conteneur(TypeConteneur.POINT, p);
c1.setPseudo(this.userName);
this.leClient.envoyerConteneur(c1);
}
/**
* Renseignement du symbole (x,o) que va jouer le joueur
* @param type
*/
public void setTypeSymbole2Gui(String type){
this.symbole = type;
this.main.unblockAllButtons();
}
/**
* Recuperation du type de symbole que joue le joueur
* @return String symbole joue par le joueur.
*/
public String getTypeSymbole(){
return this.symbole;
}
/**
* Reaffichage du dialogue de connexion
*
*/
public void reshowConnexionDialog(){
this.cx.setModal(true);
this.cx.setVisible(true);
}
/**
* Affichage d'un point venant de l'adversaire.
* @param p Point joue par l'adversaire.
*/
public void showPointAdversaire(Point p) {
this.main.showPointAdversaire(p);
}
/**
* Affichage d'un dialogue de confirmation
* Informations
* @param s
*/
public void info(String s){
GU.info(s);
}
/**
* Affichage d'un dialogue d'avertissement.
* @param s
*/
public void warning(String s){
GU.warn(s);
}
/**
* Desactivation des boutons de la grille:
* * en cas de fin de partie
* * en cas de coupure de connexion
*/
public void desactiverTousChamps(){
// bloquage de tous les boutons
this.main.blockAllButtons();
// reactivation (degrisage)
// this.main.enableAllButtons();
}
/**
* Dialogue de demande : Rejouer une partie ou pas
*/
public boolean rejouer(){
return GU.confirm("Souhaitez-vous rejouer une nouvelle partie ?");
}
/**
* @return the cONNECT_ACTION
*/
public int getCONNECT_ACTION() {
return this.CONNECT_ACTION;
}
/**
* @param connect_action the cONNECT_ACTION to set
*/
public void setCONNECT_ACTION(int connect_action) {
this.CONNECT_ACTION = connect_action;
}
/**
* @param hostN
* @param userN
* @throws IOException
* @throws UnknownHostException
*/
public void reconnect()
throws UnknownHostException, IOException {
// TODO Auto-generated method stub
this.leClient.reconnect();
}
/**
* Deconnexion du client du serveur.
*/
public void disconnect(){
this.leClient.disconnect();
this.CONNECT_ACTION = ConnexionDialog.RECONNECT;
this.setStatusBarText("Deconnecte...");
}
}