diff --git a/Implementation/src/ChatApp.java b/Implementation/src/ChatApp.java
index 0d6cda1..47caf1c 100644
--- a/Implementation/src/ChatApp.java
+++ b/Implementation/src/ChatApp.java
@@ -64,13 +64,14 @@ public class ChatApp {
* Envoie en broadcast ses informations utilisateurs et son nouveau pseudo
*
* @param nouveau correspond au nouveau pseudo
+ * @return False si modiferPseudo a echoue, True sinon
*/
- public void modifierPseudo(String nouveau) throws IOException {
+ public Boolean modifierPseudo(String nouveau) throws IOException {
// Message que l'on envoie à tous les utilisateurs actifs
String broadcastMessage = "Demande Modification Pseudo\n" + this.getMe().toString() + "\n" + nouveau + "\n";
UDPEchange.EnvoiBroadcast(broadcastMessage);
try {
- Thread.sleep(1000);
+ Thread.sleep(2000);
/* L'utilisateur doit attendre la reponse de tous les utilisateurs connectes
* pour savoir si son pseudo est accepte
*/
@@ -87,11 +88,12 @@ public class ChatApp {
this.getMe().setPseudo(nouveau);
System.out.println("Changement pseudo accepte, nouvelle liste des utilisateurs actifs:");
this.getActifUsers().afficherListeUtilisateurs();
+ return true;
}
else
{
- System.out.println("Connexion echoue");
- System.exit(1) ; // A MODIFIER NORMALEMENT ON LUI DEMANDE DE CHOISIR UN NV MDP
+ System.out.println("Echec Modification pseudo");
+ return false;
}
}
@@ -99,24 +101,26 @@ public class ChatApp {
/**
* Methode appelee lors de la connexion d'un nouvel utilisateur.
* Il va prevenir les utilisateurs du reseau de son arrivee.
- *
+ * @return False si Connexion a echoue, True sinon
*/
- public void connexion() throws IOException {
+ public Boolean connexion() throws IOException {
// Message que l'on envoie à tous les utilisateurs actifs
String broadcastMessage = "Connexion\n" + this.getMe().toString() ;
UDPEchange.EnvoiBroadcast(broadcastMessage);
try {
- Thread.sleep(1000); // L'utilisateur doit attendre la reponse de tous les utilisateurs connectes
+ Thread.sleep(2000); // L'utilisateur doit attendre la reponse de tous les utilisateurs connectes
} catch (InterruptedException e) {
e.printStackTrace();
}
if (UDPEchange.getConnecte()) {
System.out.println("Connexion reussie");
+ return true;
}
else
{
System.out.println("Connexion echoue");
- System.exit(1) ; // A MODIFIER NORMALEMENT ON LUI DEMANDE DE CHOISIR UN NV MDP
+ UDPEchange.setConnecte(true);
+ return false ;
}
}
diff --git a/Implementation/src/ListUtilisateurs.java b/Implementation/src/ListUtilisateurs.java
index d3fc8db..bdd8efa 100644
--- a/Implementation/src/ListUtilisateurs.java
+++ b/Implementation/src/ListUtilisateurs.java
@@ -99,11 +99,14 @@ public class ListUtilisateurs {
* Méthode affichant la liste des utilisateurs actifs
*
*/
- public void afficherListeUtilisateurs() {
+ public String afficherListeUtilisateurs() {
System.out.println ("Liste des utilisateurs actifs : ");
+ String Utilisateur = "" ;
for(Utilisateur elem: this.actifUsers)
{
System.out.println (elem.toString());
+ Utilisateur += (elem + "\n");
}
+ return Utilisateur;
}
}
diff --git a/Implementation/src/Modification_Pseudo.java b/Implementation/src/Modification_Pseudo.java
new file mode 100644
index 0000000..0ebc13e
--- /dev/null
+++ b/Implementation/src/Modification_Pseudo.java
@@ -0,0 +1,49 @@
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+
+public class Modification_Pseudo extends JPanel{
+ ChatApp app;
+ public Modification_Pseudo(String name, ChatApp app) {
+ this.app = app ;
+ JLabel Text = new JLabel("Entrez un nouveau nom d'utilisateur!", SwingConstants.CENTER);
+ JTextField pseudofield = new JTextField(2); // Zone d'insertion de texte
+ JButton home = new JButton(new ImageIcon("/Users/auriane/Desktop/ChatApp-AL-NM/Implementation/src/images/Home.png"));
+ //Ajout d'un bouton Valider
+ JButton Valider = new JButton("Valider");
+ this.getRootPane().setDefaultButton(Valider);
+ //Listen to events from the Valider button.
+ Valider.addActionListener(new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ String nouveau = pseudofield.getText();
+ try {
+ Boolean resultat = app.modifierPseudo(nouveau);
+ if(resultat) {
+
+ }
+ else {
+ //JOptionPane.showMessageDialog(this, "Echec de modification de pseudo, " + nouveau +" deja pris", JOptionPane.WARNING_MESSAGE);
+
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ this.add(home);
+ this.add(Text);
+ this.add(BorderLayout.CENTER,pseudofield);
+ this.add(BorderLayout.SOUTH,Valider);
+
+}
+}
diff --git a/Implementation/src/View_Accueil.java b/Implementation/src/View_Accueil.java
index 612785a..bc5e066 100644
--- a/Implementation/src/View_Accueil.java
+++ b/Implementation/src/View_Accueil.java
@@ -79,14 +79,20 @@ public class View_Accueil implements ActionListener{
ChatApp app = new ChatApp(pseudo, 3000) ;
ExecutorService execUDP = Executors.newFixedThreadPool(1000);
execUDP.submit(new RunnerEcouteUDP(app));
+ Boolean connexion = false ;
try {
- app.connexion();
+ connexion = app.connexion();
} catch (IOException e) {
e.printStackTrace();
}
- //JOptionPane.showMessageDialog(frame, "Bonjour " + pseudo);
- frame.dispose();
- View_Courante fenetreCourante= new View_Courante(app);
+ if(connexion) {
+ JOptionPane.showMessageDialog(frame, "Bonjour " + pseudo) ;
+ frame.dispose();
+ View_Courante fenetreCourante= new View_Courante(app);
+ }
+ else {
+ JOptionPane.showMessageDialog(frame, "Echec de Connexion , ce pseudo est deja pris !");
+ }
}
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
diff --git a/Implementation/src/View_Clavardage.java b/Implementation/src/View_Clavardage.java
new file mode 100644
index 0000000..e81aaad
--- /dev/null
+++ b/Implementation/src/View_Clavardage.java
@@ -0,0 +1,53 @@
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.IOException;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+public class View_Clavardage {
+ JFrame frame ;
+ ChatApp app;
+ Utilisateur destination ;
+ Utilisateur source;
+ WindowAdapter wa ;
+ JPanel panel ;
+ public View_Clavardage(ChatApp app, String User2) {
+ this.app = app ;
+ this.frame = new JFrame("ChatApp-AL-NM");
+ this.destination = this.app.getMe();
+ this.source = Utilisateur.stringToUtilisateur(User2);
+ this.frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // FERME TOUTE LES FENETRES ATTENTION
+ // fixer les dimensions de la fenetre
+ this.frame.setSize(new Dimension(394, 344));
+ wa = new WindowAdapter(){
+ public void windowClosing(WindowEvent e){
+ int reponse = View_Courante.showConfirmDialog();
+ if (reponse==0){
+ try {
+ app.deconnexion();
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ frame.dispose();
+ }
+ }};
+ panel = new JPanel();
+ frame.addWindowListener( wa ) ;
+ //Add the widgets.
+ this.addWidgets();
+
+ //Add the panel to the window.
+ frame.getContentPane().add(this.panel, BorderLayout.CENTER);
+
+ //Display the window.
+ //frame.pack();
+ frame.setVisible(true);
+ }
+ private void addWidgets() {}
+
+
+}
diff --git a/Implementation/src/View_Courante.java b/Implementation/src/View_Courante.java
index c9fbb7a..f082544 100644
--- a/Implementation/src/View_Courante.java
+++ b/Implementation/src/View_Courante.java
@@ -9,6 +9,7 @@ import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
+import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -17,6 +18,7 @@ import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
+import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
@@ -29,6 +31,8 @@ import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
+
+
import java.awt.Font;
import java.awt.Color;
import java.awt.SystemColor;
@@ -63,10 +67,11 @@ public class View_Courante {
}
}};
frame.addWindowListener( wa ) ;
-
+ menu = new JMenuBar();
+
//Create and set up the panel.
- panel = new JPanel(new GridLayout(3,1));
- panel.setForeground(SystemColor.menuText);
+ panel = new JPanel(new GridLayout(3,1));
+ panel.setForeground(SystemColor.menuText);
//Add the widgets.
this.addWidgets();
@@ -91,67 +96,146 @@ public class View_Courante {
*/
private void addWidgets() {
jlabel = new JLabel(new ImageIcon("/Users/auriane/Desktop/ChatApp-AL-NM/Implementation/src/images/Logo.png"), JLabel.CENTER);
- menu = new JMenuBar();
- JMenu Actions = new JMenu("Actions");
- Actions.setForeground(Color.WHITE);
- Actions.setHorizontalAlignment(SwingConstants.CENTER);
- // Définir le sous-menu pour Actions
- JMenuItem actifs = new JMenuItem("Utilisateurs actifs");
- JMenuItem session = new JMenuItem("Session de Clavardage");
- JMenuItem pseudo = new JMenuItem("Modifier Pseudo");
- JMenuItem deconnexion = new JMenuItem("Deconnexion");
-
- actifs.addActionListener( new ActionListener(){
- public void actionPerformed(ActionEvent event) {
-
- } });
- session.addActionListener( new ActionListener(){
- public void actionPerformed(ActionEvent event) {
-
- } });
- pseudo.addActionListener( new ActionListener(){
- public void actionPerformed(ActionEvent event) {
- panel.remove(jlabel);
- panel.remove(Txt);
- JLabel Text = new JLabel("Entrez un nouveau nom d'utilisateur!", SwingConstants.CENTER);
- JTextField pseudofield = new JTextField(2); // Zone d'insertion de texte
- panel.add(pseudofield);
- panel.add(Text);
- frame.getContentPane().add(panel, BorderLayout.CENTER);
- frame.setVisible(true);
- String pseudo = pseudofield.getText();
- try {
- app.modifierPseudo(pseudo);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // IL FAUT RAJOUTER UN BOUTON ENTRRE
- // IL FAUT MODIFIER "MODIFIER PSEUDO" pour que ca renvoit un boolean
- //Selon le boolean on affiche un pop up ou on renvient au menu principal en faisant new view courante
- }
- });
- deconnexion.addActionListener( new ActionListener(){
- public void actionPerformed(ActionEvent event) {
- frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
- } });
-
- Actions.add(actifs);
- Actions.add(session);
- Actions.add(pseudo);
- Actions.add(deconnexion);
-
-
- menu.add(Actions);
-
+
Txt = new JLabel("Menu principal de " + app.getMe().getPseudo());
Txt.setFont(new Font("Tamil MN", Font.PLAIN, 30));
Txt.setHorizontalAlignment(SwingConstants.CENTER);
- panel.add(BorderLayout.NORTH , menu);
- panel.add(BorderLayout.CENTER, jlabel);
- panel.add(BorderLayout.SOUTH , Txt );
+ JMenu Actions = new JMenu("Actions");
+ Actions.setForeground(Color.WHITE);
+ Actions.setHorizontalAlignment(SwingConstants.CENTER);
+ // Définir le sous-menu pour Actions
+ JMenuItem actifs = new JMenuItem("Utilisateurs actifs");
+ JMenuItem session = new JMenuItem("Session de Clavardage");
+ JMenuItem pseudo = new JMenuItem("Modifier Pseudo");
+ JMenuItem deconnexion = new JMenuItem("Deconnexion");
+ Actions.add(actifs);
+ Actions.add(session);
+ Actions.add(pseudo);
+ Actions.add(deconnexion);
+
+ menu.add(Actions);
+
+ panel.add(BorderLayout.NORTH , menu);
+ panel.add(BorderLayout.CENTER, jlabel);
+ panel.add(BorderLayout.SOUTH , Txt );
+
+ //******************************************************************************************************************
+ //**************************************** Actions lorsque l'on clique sur actifs **********************************
+ //******************************************************************************************************************
+ actifs.addActionListener( new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ JPanel panel1 = new JPanel();
+ JButton home = new JButton(new ImageIcon("/Users/auriane/Desktop/ChatApp-AL-NM/Implementation/src/images/Home.png"));
+ panel1.add(BorderLayout.NORTH , home);
+
+ JLabel Text = new JLabel(" Liste Utilisateurs Actifs
");
+ panel1.add(Text);
+
+ String utilisateurs = app.getActifUsers().afficherListeUtilisateurs();
+ for(String elem : utilisateurs.split("\n")) {
+ JLabel Text1 = new JLabel("" + elem + "
");
+ panel1.add(Text1);
+ }
+
+ home.addActionListener(new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ frame.dispose();
+ new View_Courante(app);
+ } });
+
+ frame.getContentPane().removeAll();
+ frame.getContentPane().add(panel1);
+ frame.setVisible(true);
+ }});
+
+ //******************************************************************************************************************
+ //**************************************** Actions lorsque l'on clique sur Session *********************************
+ //******************************************************************************************************************
+ session.addActionListener( new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ JButton home = new JButton(new ImageIcon("/Users/auriane/Desktop/ChatApp-AL-NM/Implementation/src/images/Home.png"));
+ home.addActionListener(new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ frame.dispose();
+ new View_Courante(app);
+ } });
+ String utilisateurs = app.getActifUsers().afficherListeUtilisateurs();
+ Vector vector = new Vector();
+ for(String elem : utilisateurs.split("\n")) {
+ vector.add(elem);
+ }
+ // Créer une liste déroulante
+ JComboBox cb = new JComboBox(vector);
+ cb.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent event) {
+ Object selected = cb.getSelectedItem();
+ new View_Clavardage(app, selected.toString());
+
+ }
+ });
+ JPanel panel1 = new JPanel(new GridLayout(2,1));
+ panel1.add(home);
+ panel1.add(cb);
+ frame.getContentPane().removeAll();
+ frame.getContentPane().add(panel1,BorderLayout.CENTER);
+ frame.setVisible(true);
+ } });
+
+ //******************************************************************************************************************
+ //**************************************** Actions lorsque l'on clique sur Pseudo **********************************
+ //******************************************************************************************************************
+ pseudo.addActionListener( new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ JLabel Text = new JLabel("Entrez un nouveau nom d'utilisateur!", SwingConstants.CENTER);
+ JTextField pseudofield = new JTextField(2); // Zone d'insertion de texte
+ JButton home = new JButton(new ImageIcon("/Users/auriane/Desktop/ChatApp-AL-NM/Implementation/src/images/Home.png"));
+ home.addActionListener(new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ frame.dispose();
+ new View_Courante(app);
+ } });
+ //Ajout d'un bouton Valider
+ JButton Valider = new JButton("Valider");
+ frame.getRootPane().setDefaultButton(Valider);
+ //Listen to events from the Valider button.
+ Valider.addActionListener(new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ String nouveau = pseudofield.getText();
+ try {
+ Boolean resultat = app.modifierPseudo(nouveau);
+ if(resultat) {
+ JOptionPane.showMessageDialog(frame, "Modification pseudo Reussi");
+ frame.dispose();
+ new View_Courante(app);
+ }
+ else {
+ JOptionPane.showMessageDialog(frame, "Echec Modification pseudo ");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ JPanel panel1 = new JPanel(new GridLayout(4,1));
+ panel1.add(home);
+ panel1.add(Text);
+ panel1.add(pseudofield);
+ panel1.add(Valider);
+ frame.getContentPane().removeAll();
+ frame.getContentPane().add(panel1,BorderLayout.CENTER);
+ frame.setVisible(true);
+ }});
+ //******************************************************************************************************************
+ //**************************************** Actions lorsque l'on clique sur Deconnexion *****************************
+ //******************************************************************************************************************
+ deconnexion.addActionListener( new ActionListener(){
+ public void actionPerformed(ActionEvent event) {
+ frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
+ } });
+
}
}
diff --git a/Implementation/src/images/Home.png b/Implementation/src/images/Home.png
new file mode 100644
index 0000000..b0c3484
Binary files /dev/null and b/Implementation/src/images/Home.png differ