diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000000000000000000000000000000000000..bc443b6a686b5d32024c6eb95c40f81c81593dc4
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
index 2f7896d1d1365eafb0da03d9fe456fac81408487..ffff5ffb7e5df2e1228c5023b75da7b407eee8d5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
target/
+/bin/
diff --git a/.project b/.project
new file mode 100644
index 0000000000000000000000000000000000000000..a3caeb582fdb5f241d31f62043d9baef516bbabe
--- /dev/null
+++ b/.project
@@ -0,0 +1,23 @@
+
+
+ tp8ihm
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..e9441bb123ec3e1ab029c7eac896bc45681d9a71
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding/=UTF-8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..2f5cc74c3a8577df9faafd82992b0c62e56352be
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/src/main/java/edu/mermet/tp8/Application.java b/src/main/java/edu/mermet/tp8/Application.java
index 847fa3ddb179764b4c6a417645ed147cc006b817..a54bbd855d70863fbb8f782439ae4dbba2e46a32 100644
--- a/src/main/java/edu/mermet/tp8/Application.java
+++ b/src/main/java/edu/mermet/tp8/Application.java
@@ -1,31 +1,25 @@
package edu.mermet.tp8;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JDesktopPane;
-import javax.swing.JFrame;
-import javax.swing.JInternalFrame;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-
-import edu.mermet.tp8.fenetres.FenetreBoutons;
-import edu.mermet.tp8.fenetres.FenetreConversion;
-import edu.mermet.tp8.fenetres.FenetreDiaporama;
-import edu.mermet.tp8.fenetres.FenetreTexte;
+import java.awt.event.*;
+import java.io.*;
+import java.nio.file.*;
+import java.util.*;
+import javax.swing.*;
+
+import edu.mermet.tp8.fenetres.*;
+import utilisateur.InfoUtilisateur;
/**
*
* @author brunomermet
*/
public class Application extends JFrame {
+ private static final String[] NOM_SUGGESTIONS = new String[] {"quitter", "diaporama", "conversion", "texte", "boutons"};
+ private static final String[] NOM_BOUTONS = new String[] {"Conversion Celsius/Farenheit", "Saisie de texte", "Diaporama", "Boutons"};
+
+ private static InfoUtilisateur info;
+
private JInternalFrame conversion;
private JInternalFrame texte;
private JInternalFrame diaporama;
@@ -34,12 +28,25 @@ public class Application extends JFrame {
private Action actionAfficherTexte;
private Action actionAfficherDiaporama;
private Action actionAfficherBoutons;
+ private Action actionAfficherCommentFaire;
+ private Action actionAfficherConfiguration;
+ private JMenu menuApplication;
+ private JMenuItem itemConversion;
+ private JMenuItem itemTexte;
+ private JMenuItem itemDiaporama;
+ private JMenuItem itemBoutons;
+ private JDialog frameAide;
+ private JDialog frameConfiguration;
+
public Application() {
super("multi-fenêtres");
this.setContentPane(new JDesktopPane());
+ initialiserInfoUtilisateur();
+
// ****** Barre de menu ******
JMenuBar barre = new JMenuBar();
+
// ------ menu Fichier ------
JMenu menuFichier = new JMenu("Fichier");
menuFichier.setMnemonic(KeyEvent.VK_F);
@@ -47,6 +54,8 @@ public class Application extends JFrame {
quitter.addActionListener (new ActionListener() {
@Override
public void actionPerformed(ActionEvent aev) {
+ info.augmenterNiveau(1.0);
+ majApplicationsAffichees();
System.exit(0);
}
});
@@ -54,27 +63,38 @@ public class Application extends JFrame {
menuFichier.add(quitter);
barre.add(menuFichier);
this.setJMenuBar(barre);
+
// ------ menu Applications ------
- JMenu menuApplication = new JMenu("Applications");
+ this.menuApplication = new JMenu("Applications");
menuApplication.setMnemonic(KeyEvent.VK_A);
actionAfficherConversion = new ActionAfficherConversion();
- JMenuItem itemConversion = new JMenuItem(actionAfficherConversion);
- menuApplication.add(itemConversion);
+ this.itemConversion = new JMenuItem(actionAfficherConversion);
actionAfficherTexte = new ActionAfficherTexte();
- JMenuItem itemTexte = new JMenuItem(actionAfficherTexte);
- menuApplication.add(itemTexte);
+ this.itemTexte = new JMenuItem(actionAfficherTexte);
actionAfficherDiaporama = new ActionAfficherDiaporama();
- JMenuItem itemDiaporama = new JMenuItem(actionAfficherDiaporama);
- menuApplication.add(itemDiaporama);
+ this.itemDiaporama = new JMenuItem(actionAfficherDiaporama);
actionAfficherBoutons = new ActionAfficherBoutons();
- JMenuItem itemBoutons = new JMenuItem(actionAfficherBoutons);
- menuApplication.add(itemBoutons);
+ this.itemBoutons = new JMenuItem(actionAfficherBoutons);
+ majApplicationsAffichees();
barre.add(menuApplication);
+
+ // ------ menu Aide ------
+ JMenu menuAide = new JMenu("Aide");
+ menuAide.setMnemonic(KeyEvent.VK_A);
+ actionAfficherCommentFaire = new ActionAfficherCommentFaire();
+ JMenuItem itemCommentFaire = new JMenuItem(actionAfficherCommentFaire);
+ menuAide.add(itemCommentFaire);
+
+ actionAfficherConfiguration = new ActionAfficherConfiguration();
+ JMenuItem itemConfiguration = new JMenuItem(actionAfficherConfiguration);
+ menuAide.add(itemConfiguration);
+ barre.add(menuAide);
+
// ****** Fin barre de menu ******
// ****** Création des fenêtres ******
// ------ fenêtre conversion ------
- conversion = new FenetreConversion(actionAfficherConversion);
+ conversion = new FenetreConversion(this,actionAfficherConversion);
this.add(conversion);
// ------ fenêtre texte ------
texte = new FenetreTexte(actionAfficherTexte);
@@ -85,11 +105,86 @@ public class Application extends JFrame {
// ------ fenêtre boutons ------
boutons = new FenetreBoutons(this,actionAfficherBoutons);
this.add(boutons);
+ // ------ frame aide ------
+ frameAide = new FrameAide(actionAfficherCommentFaire, this);
+ // ------ frame configuration ------
+ frameConfiguration = new FrameConfiguration(actionAfficherConfiguration, this);
+
// ****** Fin création fenêtres ******
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600,300);
this.setLocationRelativeTo(null);
setVisible(true);
+
+ // ------ affichage de la suggestion du jour si nécessaire ------
+ if (!toutesSuggestionsExclues())
+ new FenetreSuggestion(this);
+ }
+
+ public int getNbSuggestion()
+ {
+ double niveau = Double.parseDouble(info.getDonnee("niveau"));
+
+ int nbSuggestions = 1;
+
+ if (niveau >= 2.0) nbSuggestions += 1;
+ if (niveau >= 4.0) nbSuggestions += 2;
+ if (niveau >= 8.0) nbSuggestions += 1;
+
+ return nbSuggestions;
+ }
+
+ public void initialiserInfoUtilisateur()
+ {
+ info = InfoUtilisateur.getInstance();
+
+ for (int i=0; i= niveauRequis)
+ menuApplication.add(item);
+ else
+ menuApplication.remove(item);
+ }
}
private class ActionAfficherBoutons extends AbstractAction {
@@ -101,8 +196,10 @@ public class Application extends JFrame {
@Override
public void actionPerformed(ActionEvent ae) {
+ info.augmenterNiveau(4.0);
boutons.setVisible(true);
enableBoutons(false);
+ majApplicationsAffichees();
}
}
@@ -115,8 +212,10 @@ public class Application extends JFrame {
@Override
public void actionPerformed(ActionEvent ae) {
+ info.augmenterNiveau(2.0);
diaporama.setVisible(true);
enableDiaporama(false);
+ majApplicationsAffichees();
}
}
@@ -129,8 +228,10 @@ public class Application extends JFrame {
@Override
public void actionPerformed(ActionEvent ae) {
+ info.augmenterNiveau(3.0);
texte.setVisible(true);
enableTexte(false);
+ majApplicationsAffichees();
}
}
@@ -143,8 +244,38 @@ public class Application extends JFrame {
@Override
public void actionPerformed(ActionEvent ae) {
+ info.augmenterNiveau(3.0);
conversion.setVisible(true);
enableConversion(false);
+ majApplicationsAffichees();
+ }
+ }
+
+ public class ActionAfficherCommentFaire extends AbstractAction {
+ public ActionAfficherCommentFaire() {
+ super("Comment faire ?");
+ putValue(Action.ACCELERATOR_KEY,KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_DOWN_MASK));
+ putValue(Action.MNEMONIC_KEY,KeyEvent.VK_F);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent ae) {
+ frameAide.setVisible(true);
+ enableCommentFaire(false);
+ }
+ }
+
+ public class ActionAfficherConfiguration extends AbstractAction {
+ public ActionAfficherConfiguration() {
+ super("Configuration des menus");
+ putValue(Action.ACCELERATOR_KEY,KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_DOWN_MASK));
+ putValue(Action.MNEMONIC_KEY,KeyEvent.VK_G);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent ae) {
+ frameConfiguration.setVisible(true);
+ enableConfiguration(false);
}
}
@@ -164,6 +295,14 @@ public class Application extends JFrame {
actionAfficherBoutons.setEnabled(b);
}
+ public void enableCommentFaire(boolean b) {
+ actionAfficherCommentFaire.setEnabled(b);
+ }
+
+ public void enableConfiguration(boolean b) {
+ actionAfficherConfiguration.setEnabled(b);
+ }
+
public Action getActionAfficherConversion() {
return actionAfficherConversion;
}
diff --git a/src/main/java/edu/mermet/tp8/fenetres/AbstractFenetre.java b/src/main/java/edu/mermet/tp8/fenetres/AbstractFenetre.java
new file mode 100644
index 0000000000000000000000000000000000000000..7518a24984d33304e86f7903392d0d9d9078f440
--- /dev/null
+++ b/src/main/java/edu/mermet/tp8/fenetres/AbstractFenetre.java
@@ -0,0 +1,26 @@
+package edu.mermet.tp8.fenetres;
+
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+
+/**
+ *
+ * @author brunomermet
+ */
+public abstract class AbstractFenetre extends JDialog {
+ private Action action;
+ public AbstractFenetre(JFrame frame, Action monAction, String nom) {
+ super(frame, nom, false);
+ action = monAction;
+ this.setDefaultCloseOperation(HIDE_ON_CLOSE);
+ this.addWindowListener(new EcouteurFenetre());
+ }
+
+ private class EcouteurFenetre extends WindowAdapter {
+ @Override
+ public void windowClosing(WindowEvent we) {
+ action.setEnabled(true);
+ }
+ }
+}
diff --git a/src/main/java/edu/mermet/tp8/fenetres/FenetreBoutons.java b/src/main/java/edu/mermet/tp8/fenetres/FenetreBoutons.java
index 13694b1808e542acb51ee01070bcbdf6fb95469f..16e24b9da0b31e73a72192b7070a73d6833f71de 100644
--- a/src/main/java/edu/mermet/tp8/fenetres/FenetreBoutons.java
+++ b/src/main/java/edu/mermet/tp8/fenetres/FenetreBoutons.java
@@ -15,7 +15,8 @@ import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
-import edu.mermet.tp8.Application;
+
+import edu.mermet.tp8.*;
/**
*
diff --git a/src/main/java/edu/mermet/tp8/fenetres/FenetreConversion.java b/src/main/java/edu/mermet/tp8/fenetres/FenetreConversion.java
index 2c134f4584194e6f5e3e038f09b040722121f4e3..8a0447647ccd1c006aabe6e5bc6877b2ddc15ef6 100644
--- a/src/main/java/edu/mermet/tp8/fenetres/FenetreConversion.java
+++ b/src/main/java/edu/mermet/tp8/fenetres/FenetreConversion.java
@@ -1,21 +1,10 @@
package edu.mermet.tp8.fenetres;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JButton;
-import javax.swing.JInternalFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import javax.swing.event.InternalFrameAdapter;
-import javax.swing.event.InternalFrameEvent;
-import edu.mermet.tp8.Application;
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import edu.mermet.tp8.*;
/**
*
@@ -27,27 +16,44 @@ public class FenetreConversion extends AbstractFenetreInterne {
private JButton boutonConvertir;
private Action actionConvertir;
private boolean celsiusAFocus;
- public FenetreConversion(Action action) {
+ private JPopupMenu popupMenuC;
+ private JPopupMenu popupMenuF;
+ public FenetreConversion(JFrame frame, Action action) {
super(action,"Conversion celsius/Farenheit");
this.setSize(new Dimension(100,50));
this.setLayout(new GridLayout(3,1));
+ creerPopupMenu();
JPanel ligneCelsius = new JPanel();
ligneCelsius.setLayout(new FlowLayout(FlowLayout.TRAILING));
JLabel labCelsius = new JLabel("Celsius :");
champCelsius = new JTextField(15);
labCelsius.setLabelFor(champCelsius);
+ JLabel iconeAideCelsius = new JLabel(new ImageIcon(this.getClass().getResource("/images/interrogation.png")));
+ iconeAideCelsius.addMouseListener(new MouseAdapterAide(this, "Valeur en degré Celsius"));
ligneCelsius.add(labCelsius);
ligneCelsius.add(champCelsius);
+ ligneCelsius.add(iconeAideCelsius);
this.add(ligneCelsius);
celsiusAFocus = true;
champCelsius.addFocusListener(new EcouteurFocus(true));
+ champCelsius.setToolTipText("Valeur en degrés Celsius");
+ champCelsius.addMouseListener(new MouseAdapterContextuel("Valeur en degrés Celsius", popupMenuC));
+ champCelsius.add(popupMenuC);
+ champCelsius.setComponentPopupMenu(popupMenuC);
JPanel ligneFarenheit = new JPanel();
ligneFarenheit.setLayout(new FlowLayout(FlowLayout.TRAILING));
JLabel labFarenheit = new JLabel("Farenheit :");
champFarenheit = new JTextField(15);
+ champFarenheit.setToolTipText("Valeur en degrés Farenheit");
+ champFarenheit.addMouseListener(new MouseAdapterContextuel("Valeur en degrés Farenheit", popupMenuF));
+ champFarenheit.add(popupMenuF);
+ champFarenheit.setComponentPopupMenu(popupMenuF);
labFarenheit.setLabelFor(champFarenheit);
+ JLabel iconeAideFarenheit = new JLabel(new ImageIcon(this.getClass().getResource("/images/interrogation.png")));
+ iconeAideFarenheit.addMouseListener(new MouseAdapterAide(this, "Valeur en degré Farenheit"));
ligneFarenheit.add(labFarenheit);
ligneFarenheit.add(champFarenheit);
+ ligneFarenheit.add(iconeAideFarenheit);
this.add(ligneFarenheit);
champFarenheit.addFocusListener(new EcouteurFocus(false));
JPanel ligneValider = new JPanel();
@@ -56,11 +62,32 @@ public class FenetreConversion extends AbstractFenetreInterne {
boutonConvertir = new JButton(actionConvertir);
ligneValider.add(boutonConvertir);
this.add(ligneValider);
-
+
pack();
getRootPane().setDefaultButton(boutonConvertir);
}
+ public void creerPopupMenu()
+ {
+ popupMenuC = new JPopupMenu();
+ JMenuItem menuAideC = new JMenuItem("Aide");
+ menuAideC.setMnemonic('A');
+ menuAideC.addMouseListener(new MouseAdapterAide(this, "Valeur en degré Celsius"));
+ popupMenuC.add(menuAideC);
+
+ popupMenuF = new JPopupMenu();
+ JMenuItem menuAideF = new JMenuItem("Aide");
+ menuAideF.setMnemonic('A');
+ menuAideF.addMouseListener(new MouseAdapterAide(this, "Valeur en degré Farenheit"));
+ popupMenuF.add(menuAideF);
+ }
+
+ public void afficherDialog(String aide)
+ {
+ JOptionPane d = new JOptionPane();
+ d.showMessageDialog(this, aide, "Aide", JOptionPane.INFORMATION_MESSAGE);
+ }
+
private class EcouteurFocus implements FocusListener {
private boolean aStocker;
@@ -112,5 +139,38 @@ public class FenetreConversion extends AbstractFenetreInterne {
}
}
}
+
+ private class MouseAdapterAide extends MouseAdapter {
+ FenetreConversion fenetre;
+ String aide;
+
+ public MouseAdapterAide(FenetreConversion fenetre, String aide) {
+ this.fenetre = fenetre;
+ this.aide = aide;
+ }
+
+ @Override
+ public void mousePressed(MouseEvent me) {
+ fenetre.afficherDialog(aide);
+ }
+ }
+
+ private class MouseAdapterContextuel extends MouseAdapter {
+ String aide;
+ JPopupMenu popupMenu;
+
+ public MouseAdapterContextuel(String aide, JPopupMenu popupMenu)
+ {
+ this.aide = aide;
+ this.popupMenu = popupMenu;
+ }
+
+ @Override
+ public void mousePressed( MouseEvent event ) {
+ if ( event.isPopupTrigger() ) {
+ popupMenu.show( event.getComponent(), event.getX(), event.getY() );
+ }
+ }
+ }
}
diff --git a/src/main/java/edu/mermet/tp8/fenetres/FenetreSuggestion.java b/src/main/java/edu/mermet/tp8/fenetres/FenetreSuggestion.java
new file mode 100644
index 0000000000000000000000000000000000000000..a2b5b1aba5f33f166132440a9a392928752d4975
--- /dev/null
+++ b/src/main/java/edu/mermet/tp8/fenetres/FenetreSuggestion.java
@@ -0,0 +1,94 @@
+package edu.mermet.tp8.fenetres;
+
+import edu.mermet.tp8.*;
+import utilisateur.InfoUtilisateur;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import javax.swing.*;
+
+/**
+ *
+ * @author Paul LEVRAGUE
+ */
+public class FenetreSuggestion extends JDialog {
+ private static final String[] NOM_SUGGESTIONS = new String[] {"quitter", "diaporama", "conversion", "texte", "boutons"};
+
+ private static InfoUtilisateur info = InfoUtilisateur.getInstance();
+
+ private String suggestion;
+ private JButton btnFermer;
+ private JButton btnNePlusAfficher;
+
+ public FenetreSuggestion(Application app) {
+ super(app, "Suggestion du jour", true);
+ setLayout(new BorderLayout());
+ setUndecorated(true);
+ getRootPane().setBorder(BorderFactory.createLineBorder(Color.BLACK));
+
+ JEditorPane editorPane = new JEditorPane("text/html", getSuggestionAlea(app.getNbSuggestion()));
+
+ JPanel pnlBtn = new JPanel(new FlowLayout());
+
+ btnFermer = new JButton("Fermer");
+ btnNePlusAfficher = new JButton("Ne plus afficher");
+
+ btnFermer.addActionListener(new ActionFermer());
+ btnNePlusAfficher.addActionListener(new ActionNePlusAfficher());
+
+ pnlBtn.add(btnFermer);
+ pnlBtn.add(btnNePlusAfficher);
+
+ add(editorPane);
+ add(pnlBtn, BorderLayout.SOUTH);
+
+ pack();
+ this.setLocationRelativeTo(null);
+ setVisible(true);
+ }
+
+ public String getSuggestionAlea(int nbSuggestions)
+ {
+ do
+ {
+ int alea = (int)(Math.random()*nbSuggestions);
+
+ suggestion = NOM_SUGGESTIONS[alea] + getTypeAlea();
+ } while (suggestionExclue(suggestion));
+
+ ResourceBundle res = ResourceBundle.getBundle("suggestion.suggestions");
+ String txtSuggestion = (String)res.getObject(suggestion);
+
+ return txtSuggestion;
+ }
+
+ //Les suggestions sont soit une suggestion de raccourci soit de description
+ public char getTypeAlea()
+ {
+ int alea = (int)(Math.random()*2);
+
+ return (alea==0) ? 'R' : 'D';
+ }
+
+ public boolean suggestionExclue(String txt)
+ {
+ return info.getDonnee(txt) != null;
+ }
+
+ class ActionFermer implements ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent ae) {
+ dispose();
+ }
+ }
+
+ class ActionNePlusAfficher implements ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent ae) {
+ info.sauvegarde(suggestion, "exclue");
+ dispose();
+ }
+ }
+
+}
diff --git a/src/main/java/edu/mermet/tp8/fenetres/FenetreTexte.java b/src/main/java/edu/mermet/tp8/fenetres/FenetreTexte.java
index 6d1914590bff5efc2cfd1d13b61aea50f62274ec..b67504e166b99cdf49d73781bef3d303a2411f22 100644
--- a/src/main/java/edu/mermet/tp8/fenetres/FenetreTexte.java
+++ b/src/main/java/edu/mermet/tp8/fenetres/FenetreTexte.java
@@ -23,7 +23,7 @@ import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
-import edu.mermet.tp8.Application;
+import edu.mermet.tp8.*;
/**
*
diff --git a/src/main/java/edu/mermet/tp8/fenetres/FrameAide.java b/src/main/java/edu/mermet/tp8/fenetres/FrameAide.java
new file mode 100644
index 0000000000000000000000000000000000000000..aef94298cb7dfa49c41a4743891aff12335c78e8
--- /dev/null
+++ b/src/main/java/edu/mermet/tp8/fenetres/FrameAide.java
@@ -0,0 +1,66 @@
+package edu.mermet.tp8.fenetres;
+
+import edu.mermet.tp8.*;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.event.*;
+
+/**
+ *
+ * @author Paul LEVRAGUE
+ */
+public class FrameAide extends AbstractFenetre
+{
+ private static final String[] keyTitres = new String[] {"conversion_1", "conversion_2", "gras", "couleur"};
+
+ private JEditorPane editorPane;
+ private JList list;
+
+ public FrameAide(Action monAction, JFrame frame)
+ {
+ super(frame, monAction, "Comment faire ?");
+ setLayout(new BorderLayout());
+
+ this.list = new JList<>(chargerTitres());
+ list.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
+ list.addListSelectionListener(new ListSelectionAide());
+
+ this.editorPane = new JEditorPane();
+ editorPane.setContentType("text/html");
+ editorPane.setEditable(false);
+
+ list.setSelectedIndex(0);
+ JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, list, editorPane);
+ split.setResizeWeight(0.5);
+ split.setContinuousLayout(true);
+ add(split);
+
+ this.setLocationRelativeTo(null);
+ pack();
+ }
+
+ public String[] chargerTitres()
+ {
+ ResourceBundle res = ResourceBundle.getBundle("HowTo.titres");
+ String[] titres = new String[keyTitres.length];
+
+ for (int i=0; i InfoUtilisateur.LVL_MAX_UTILISATEUR)
+ niveauUtilisateur = InfoUtilisateur.LVL_MAX_UTILISATEUR;
+
+ sauvegarde("niveau", "" + Math.round(niveauUtilisateur));
+ }
+
+ public static synchronized InfoUtilisateur getInstance()
+ {
+ if (INSTANCE == null)
+ { INSTANCE = new InfoUtilisateur();
+ }
+ return INSTANCE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/ressources/HowTo/textes.properties b/src/main/ressources/HowTo/textes.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c86ea8befe6234acb5f3a849191d59a622a4b4fe
--- /dev/null
+++ b/src/main/ressources/HowTo/textes.properties
@@ -0,0 +1,4 @@
+conversion_1=Saisir une valeur en °C pour la convertir en °F
+conversion_2=Saisir une valeur en °F pour la convertir en °C
+gras=Appuyer sur le bouton gras
+couleur=Appuyer sur le bouton rouge
\ No newline at end of file
diff --git a/src/main/ressources/HowTo/titres.properties b/src/main/ressources/HowTo/titres.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1eaca14676abad474eb4d1db1da9febc08eb94f2
--- /dev/null
+++ b/src/main/ressources/HowTo/titres.properties
@@ -0,0 +1,4 @@
+conversion_1=conversion Celsius --> Farenheit
+conversion_2=conversion Farenheit --> Celsius
+gras=Texte en gras sur saisie de texte
+couleur=Texte en couleur sur saisie de texte
diff --git a/src/main/ressources/images/interrogation.png b/src/main/ressources/images/interrogation.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d9288687e5d7654a113e391dd21f57db870ee17
Binary files /dev/null and b/src/main/ressources/images/interrogation.png differ
diff --git a/src/main/ressources/suggestion/suggestions.properties b/src/main/ressources/suggestion/suggestions.properties
new file mode 100644
index 0000000000000000000000000000000000000000..3a40c3cc324f66f876ffa9c6cea78016ccae676d
--- /dev/null
+++ b/src/main/ressources/suggestion/suggestions.properties
@@ -0,0 +1,10 @@
+quitterR=Appuyez sur CTRL et Q en même temps pour fermer l'application.
+quitterD=L'option Quitter vous permet de quitter l'application.
+diaporamaR=Appuyez sur CTRL et D en même temps pour ouvrir le diaporama.
+diaporamaD=L'option Diaporama permet d'afficher un diaporama du Cotentin.
+conversionR=Appuyez sur CTRL et C en même temps pour ouvrir le menu des conversions.
+conversionD=La conversion Celsius-Farenheit convertit ces deux unités de température dans les deux sens.
+texteR=Appuyez sur CTRL et T en même temps pour ouvrir le menu de saisie de texte.
+texteD=La saisie de texte permet d'écrire du texte et de modifier sa forme.
+boutonsR=Appuyez sur CTRL et B en même temps pour ouvrir le menu des boutons.
+boutonsD=La fonctionnalité boutons permet d'ouvrir les autres applications avec des boutons.
\ No newline at end of file