diff --git a/Implementation/.classpath b/Implementation/.classpath index fb50116..9b5db30 100644 --- a/Implementation/.classpath +++ b/Implementation/.classpath @@ -1,6 +1,15 @@ +<<<<<<< HEAD +======= + + + + + + +>>>>>>> View diff --git a/Implementation/jgoodies-forms-1.8.0-sources.jar b/Implementation/jgoodies-forms-1.8.0-sources.jar new file mode 100644 index 0000000..b680434 Binary files /dev/null and b/Implementation/jgoodies-forms-1.8.0-sources.jar differ diff --git a/Implementation/jgoodies-forms-1.8.0.jar b/Implementation/jgoodies-forms-1.8.0.jar new file mode 100644 index 0000000..5e4585f Binary files /dev/null and b/Implementation/jgoodies-forms-1.8.0.jar differ diff --git a/Implementation/src/ChatApp.java b/Implementation/src/ChatApp.java index 30a63c3..12df0e3 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 ; } } @@ -129,6 +133,7 @@ public class ChatApp { // Message que l'on envoie à tous les utilisateurs actifs String broadcastMessage = "Deconnexion\n" + this.getMe().toString() ; UDPEchange.EnvoiBroadcast(broadcastMessage); + System.exit(1); } /** 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.java b/Implementation/src/View.java deleted file mode 100644 index 7a807a0..0000000 --- a/Implementation/src/View.java +++ /dev/null @@ -1,84 +0,0 @@ -import java.awt.GridLayout; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; - -public class View extends JFrame { - - public View() { - //créer une instance JFrame - super("ChatApp-AL-NM"); - - // creation d'un label qui contiendra un txt au centre - JLabel label = new JLabel("Bonjour, Entrez un nom d'utilisateur!", JLabel.CENTER); - - // Définissez le panel (conteneur de différents composants) - JPanel panel = new JPanel(); - // Définir le bouton - JButton btn1 = new JButton("Connexion"); - // Ajouter le bouton au frame - panel.add(btn1); - - - - /*****************************/ - //L'en-têtes du JTable - String[] column = {"Pseudo", "port", "IP", "ID"}; - - //Les lignes du JTable - String[][] data = { - {"Auriane", "3000", "MBP-de-Auriane/192.168.1.43 ", "MBP-de-Auriane"}, - {"Nabil", "4000", "LAPTOP-1JO2SHBG/192.168.1.72", "LAPTOP-1JO2SHBG"} - }; - // Créer le JTable - JTable table = new JTable(data, column); - JScrollPane scroll = new JScrollPane(table); - // Ajout de la JTable - this.add(scroll); - - - - // Définir le menu principal - JMenuBar menu = new JMenuBar(); - JMenu pseudo= new JMenu("Modifier Pseudo"); - JMenu clavardage = new JMenu("Clavardage"); - JMenu deconnexion = new JMenu("Deconnexion"); - // Définir le sous-menu pour Clavardage - JMenuItem actifs = new JMenuItem("Connaitre utilisateur actifs"); - JMenuItem session = new JMenuItem("Demarrer session"); - - clavardage.add(actifs); - clavardage.add(session); - - menu.add(pseudo); - menu.add(clavardage); - menu.add(deconnexion); - - - // Ajouter label, menu et panel au frame - this.setLayout(new GridLayout(8, 1)); - this.add(menu); - this.add(label); - this.add(panel); - - // fixer les dimensions de la fenêtre - this.pack(); - this.setSize(500, 500); - //sortir quand l’utilisateur ferme le frame - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // rendre la fenêtre visible : - this.setVisible(true); - } - - public static void main (String[] args) { - JFrame frame = new View(); - } - -} diff --git a/Implementation/src/View_Accueil.java b/Implementation/src/View_Accueil.java new file mode 100644 index 0000000..eb921ae --- /dev/null +++ b/Implementation/src/View_Accueil.java @@ -0,0 +1,127 @@ +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.IOException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.swing.BorderFactory; +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; + +/* + * Classe represenyant la fenetre d'accueil pour la connexion d'un utilisateur. + */ +public class View_Accueil implements ActionListener{ + JFrame frame; + JPanel panel; + JTextField pseudofield; + JLabel Text; + JButton Connexion; + + /* + * Constructeur d'une fenetre d'affichage pour la connexion d'un utilisateur. + * Cette fenetre sera munie d'un bouton de connexion et d'une zone de saisie de pseudo. + */ + public View_Accueil () { + //creer une instance JFrame + frame = new JFrame("ChatApp-AL-NM"); + //sortir quand l’utilisateur ferme le frame + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // fixer les dimensions de la fenetre + frame.setSize(new Dimension(120, 40)); + //Creer le JPanel + panel = new JPanel(new GridLayout(3,1)); + //Ajouter les elements + this.addWidgets(); + //Set the default button. + frame.getRootPane().setDefaultButton(Connexion); + //Ajouter le panel a la window + frame.getContentPane().add(panel, BorderLayout.CENTER); + //L'utilisateur ne pourra pas aggrandir la fenetre + this.frame.setResizable(false); + //Afficher la fenetre + frame.pack(); + frame.setVisible(true); + } + + /** + * Creer et ajouter les outils de la fenetre + */ + private void addWidgets() { + // Créer Zone d'insertion de texte pour le pseudo + this.pseudofield = new JTextField(2); + // creation d'un label qui contiendra un txt au centre + this.Text = new JLabel("Bonjour, Entrez un nom d'utilisateur!", SwingConstants.CENTER); + //Ajout d'un bouton Connexion + this.Connexion = new JButton("Connexion"); + //On associe au bouton Connexion des actions a realiser + this.Connexion.addActionListener(this); + // On ajouter les differents elements au panel + panel.add(pseudofield); + panel.add(Text); + panel.add(Connexion); + //ajouter un effet de bord transparent au composant Jlabel + Text.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); + } + + /* + * Definir des traitements en réponse à un clic sur le bouton connexion + * @param event Un clic sur le bouton connexion + */ + public void actionPerformed(ActionEvent event) { + // on recupere le texte entree dans la zone de saisie + String pseudo = pseudofield.getText(); + // On crée un objet de type ChatApp + ChatApp app = new ChatApp(pseudo, 3000) ; + // on crée un thread qui va ecouter les connexions entrantes + ExecutorService execUDP = Executors.newFixedThreadPool(1000); + execUDP.submit(new RunnerEcouteUDP(app)); + Boolean connexion = false ; + try { + // on tente une connexion avec ce pseudo + connexion = app.connexion(); + } catch (IOException e) { + e.printStackTrace(); + } + // Dans les deux cas de figures (reussite ou echec) on affiche un pop-up pour expliquer la situation + if(connexion) { + // La connexion a reussi + JOptionPane.showMessageDialog(frame, "Bonjour " + pseudo) ; + frame.dispose(); + // on lance une nouvelle fenetre de type View_Menu + View_Menu fenetreCourante= new View_Menu(app); + } + else { + // La connexion a echoue, il est possible de rentrer un nouveau pseudo + JOptionPane.showMessageDialog(frame, "Echec de Connexion , ce pseudo est deja pris !"); + } + } + + private static void createAndShowGUI() { + // Etre certain d'avoir une joli fenetre + JFrame.setDefaultLookAndFeelDecorated(true); + // On crée une fentre d'acceuil + View_Accueil fenetre = new View_Accueil(); + } + + public static void main(String[] args) { + //Schedule a job for the event-dispatching thread: + //creating and showing this application's GUI. + javax.swing.SwingUtilities.invokeLater(new Runnable() { + public void run() { + createAndShowGUI(); + } + }); + } + +} diff --git a/Implementation/src/View_Clavardage.java b/Implementation/src/View_Clavardage.java new file mode 100644 index 0000000..da81a6d --- /dev/null +++ b/Implementation/src/View_Clavardage.java @@ -0,0 +1,165 @@ +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.IOException; + +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingConstants; +import com.jgoodies.forms.layout.FormLayout; +import com.jgoodies.forms.layout.ColumnSpec; +import com.jgoodies.forms.layout.RowSpec; +import java.awt.GridBagLayout; +import java.awt.Font; +import java.awt.Color; +import java.awt.GridBagConstraints; +import java.awt.Insets; + +/* + * Classe representant la fenetre pour chaque session de clavardage. + */ +public class View_Clavardage { + JFrame frame ; + ChatApp app; + Utilisateur destination ; // Celui avec qui on va discuter + Utilisateur source; //Nous + WindowAdapter wa ; + JPanel panel ; + JTextArea textAreaAffichage ; + + /* + * Constructeur d'une fenetre de session de clavardage. + * @param app Un objet de type ChatApp pour posseder toutes les informations de l'utilisateur + * @param User2 L'utilisateur avec qui l'on souhaite discuter et passer en parametre sous forme de String + */ + public View_Clavardage(ChatApp app, String User2) { + this.app = app ; + this.frame = new JFrame("ChatApp-AL-NM"); + this.source = this.app.getMe(); + this.destination = Utilisateur.stringToUtilisateur(User2); + this.frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + // fixer les dimensions de la fenetre + this.frame.setSize(new Dimension(394, 344)); + this.frame.setResizable(false); + wa = new WindowAdapter(){ + public void windowClosing(WindowEvent e){ + int reponse = View_Menu.showConfirmDialog(); + if (reponse==0){ + frame.dispose(); + } + }}; + addWidgets(); + frame.addWindowListener( wa ) ; + frame.setVisible(true); + } + + /** + * Creer et ajouter les outils de la fenetre + */ + private void addWidgets() { + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{394, 0}; + gridBagLayout.rowHeights = new int[]{16, 220, 74, 0}; + gridBagLayout.columnWeights = new double[]{0.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE}; + this.frame.getContentPane().setLayout(gridBagLayout); + this.panel = new JPanel(); + // Zone pour ecrire de nouveau message + JTextArea textAreaSaisie = new JTextArea(5,3); + textAreaSaisie.setLineWrap(true); + textAreaSaisie.setForeground(Color.LIGHT_GRAY); + textAreaSaisie.setFont(new Font("Lucida Grande", Font.ITALIC, 11)); + textAreaSaisie.setText("Entrer du texte ici !!!"); + JScrollPane scrollPane = new JScrollPane(textAreaSaisie); + // Creation d'un bouton envoye + JButton send = new JButton("Envoye"); + frame.getRootPane().setDefaultButton(send); + send.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) { + //UTILISER TCPENVOI + String AEnvoyer = textAreaSaisie.getText(); + textAreaAffichage.append(AEnvoyer); + textAreaSaisie.setText(""); + }}); + // Creation d'un bouton vider la zone de saisie de texte + JButton reset = new JButton("Vider"); + reset.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) { + textAreaSaisie.setText(""); + }}); + JLabel titre = new JLabel("Chat avec "+ this.destination.getPseudo(),SwingConstants.CENTER); + GridBagConstraints gbc_titre = new GridBagConstraints(); + gbc_titre.anchor = GridBagConstraints.NORTH; + gbc_titre.fill = GridBagConstraints.HORIZONTAL; + gbc_titre.insets = new Insets(0, 0, 5, 0); + gbc_titre.gridx = 0; + gbc_titre.gridy = 0; + frame.getContentPane().add(titre, gbc_titre); + // Zone d'affichage de l'historique + this.textAreaAffichage = new JTextArea(10,5); + textAreaAffichage.setLineWrap(true); + this.textAreaAffichage.setText(""); + JScrollPane scrollPaneAffichage = new JScrollPane(this.textAreaAffichage); + this.textAreaAffichage.setEditable(false); // il sert juste a afficher + GridBagConstraints gbc_textAreaAffichage = new GridBagConstraints(); + gbc_textAreaAffichage.fill = GridBagConstraints.BOTH; + gbc_textAreaAffichage.insets = new Insets(0, 0, 5, 0); + gbc_textAreaAffichage.gridx = 0; + gbc_textAreaAffichage.gridy = 1; + frame.getContentPane().add(scrollPaneAffichage, gbc_textAreaAffichage); + panel.add(BorderLayout.CENTER, scrollPane); + panel.add(BorderLayout.SOUTH,send); + panel.add(BorderLayout.SOUTH,reset); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + //Add the panel to the window. + GridBagConstraints gbc_panel = new GridBagConstraints(); + gbc_panel.anchor = GridBagConstraints.NORTH; + gbc_panel.fill = GridBagConstraints.HORIZONTAL; + gbc_panel.gridx = 0; + gbc_panel.gridy = 2; + frame.getContentPane().add(panel, gbc_panel); + /* + * + *JTextArea textAreaAffichage = new JTextArea(10,5); + textAreaAffichage.setEditable(false); + JTextArea textAreaSaisie = new JTextArea(10,5); + textAreaSaisie.setForeground(Color.LIGHT_GRAY); + textAreaSaisie.setFont(new Font("Lucida Grande", Font.ITALIC, 11)); + textAreaSaisie.setText("Entrer du texte ici !!!"); + JScrollPane scrollPane = new JScrollPane(textAreaSaisie); + JButton send = new JButton("Envoye"); + frame.getRootPane().setDefaultButton(send); + send.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) { + //UTILISER TCPENVOI + textAreaSaisie.setText(""); + }}); + JButton reset = new JButton("Vider"); + reset.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) { + textAreaSaisie.setText(""); + }}); + JLabel titre = new JLabel("Chat avec "+ this.destination.getPseudo(),SwingConstants.CENTER); + panel.add(BorderLayout.CENTER, scrollPane); + //panel.add(scrollPane); + panel.add(BorderLayout.SOUTH,send); + panel.add(BorderLayout.SOUTH,reset); + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); + //Add the panel to the window. + frame.getContentPane().add(BorderLayout.SOUTH, panel); + frame.getContentPane().add(BorderLayout.CENTER, textAreaAffichage); + frame.getContentPane().add(BorderLayout.NORTH, titre); + */ + } + + +} diff --git a/Implementation/src/View_Menu.java b/Implementation/src/View_Menu.java new file mode 100644 index 0000000..c946d76 --- /dev/null +++ b/Implementation/src/View_Menu.java @@ -0,0 +1,253 @@ +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +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; + +import javax.imageio.ImageIO; +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; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +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.ComponentOrientation; +import java.awt.SystemColor; + +/* + * Classe representant la fenetre de menu. Lance apres la connexion d'un utilisateur + */ +public class View_Menu { + JFrame frame; + JPanel panel; + JMenuBar menu; + ChatApp app; + JLabel jlabel; + JLabel Txt; + WindowAdapter wa ; + + /* + * Constructeur d'une fenetre de menu apres la connexion d'un utilisateur. + * @param app Un objet de type ChatApp pour posseder toutes les informations de l'utilisateur + */ + public View_Menu(ChatApp app) { + this.app = app ; + //creer une instance JFrame + frame = new JFrame("ChatApp-AL-NM"); + frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + // fixer les dimensions de la fenetre + frame.setSize(new Dimension(394, 344)); + // Lorsque l'utilisateur souhaite quitter la fenetre on affiche un pop-up pour verifier son choix + wa = new WindowAdapter(){ + public void windowClosing(WindowEvent e){ + int reponse = showConfirmDialog(); + if (reponse==0){ + try { + // on deconnecte l'app avant de quitter + // Tout les utilisateurs sont donc prevenus du depart + app.deconnexion(); + } catch (IOException e1) { + e1.printStackTrace(); + } + frame.dispose(); + } + }}; + frame.addWindowListener( wa ) ; + // Menu pour les differentes actions réalisables + menu = new JMenuBar(); + //Creation d'un JPanel + panel = new JPanel(new GridLayout(3,1)); + panel.setForeground(SystemColor.menuText); + // Ajouter tout les elements a la fenetre + this.addWidgets(); + // ajouter le panel a la fenetre + frame.getContentPane().add(panel, BorderLayout.CENTER); + // Afficher la fenetre + frame.pack(); + frame.setVisible(true); + } + + /** + * Methode static creant un pop-up demandant a l'utilisateur si il souhaite vraiment quitter. + */ + static int showConfirmDialog(){ + return JOptionPane.showConfirmDialog( + null, + "Voulez-vous vraiment quitter?", + "Quitter", + JOptionPane.YES_NO_OPTION); + } + /** + * Creer et ajouter les outils de la fenetre + */ + private void addWidgets() { + // On ajoute une jolie icone + jlabel = new JLabel(new ImageIcon("/Users/auriane/Desktop/ChatApp-AL-NM/Implementation/src/images/Logo.png"), JLabel.CENTER); + + Txt = new JLabel("Menu principal de " + app.getMe().getPseudo()); + Txt.setFont(new Font("Tamil MN", Font.PLAIN, 30)); + Txt.setHorizontalAlignment(SwingConstants.CENTER); + + //On cree une item Actions que l'on ajoutera a la bar de menu + 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"); + // Ajouter les sous items a actions + Actions.add(actifs); + Actions.add(session); + Actions.add(pseudo); + Actions.add(deconnexion); + // On ajoute l'item Action dans la bar de menu + menu.add(Actions); + // On ajouter les differents elements au panel + 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")); + + JTextArea textArea = new JTextArea(20,20); + textArea.insert("Liste Utilisateurs Actifs \n",0); + JScrollPane scrollPane = new JScrollPane(textArea); + + String utilisateurs = app.getActifUsers().afficherListeUtilisateurs(); + for(String elem : utilisateurs.split("\n")) { + textArea.append( " - " +Utilisateur.stringToUtilisateur(elem).getPseudo() + '\n'); + } + panel1.add(textArea); + home.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent event) { + frame.dispose(); + new View_Menu(app); + } }); + textArea.setEditable(false); + frame.getContentPane().removeAll(); + frame.getContentPane().add(BorderLayout.CENTER, panel1); + frame.getContentPane().add(BorderLayout.NORTH , home); + 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_Menu(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_Menu(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_Menu(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 diff --git a/Implementation/src/images/Logo.png b/Implementation/src/images/Logo.png new file mode 100644 index 0000000..4c03097 Binary files /dev/null and b/Implementation/src/images/Logo.png differ