copie SAE papillon
This commit is contained in:
		
							
								
								
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # ---> Java | ||||
| # Compiled class file | ||||
| *.class | ||||
|  | ||||
| # Log file | ||||
| *.log | ||||
|  | ||||
| # BlueJ files | ||||
| *.ctxt | ||||
|  | ||||
| # Mobile Tools for Java (J2ME) | ||||
| .mtj.tmp/ | ||||
|  | ||||
| # Package Files # | ||||
| *.jar | ||||
| *.war | ||||
| *.nar | ||||
| *.ear | ||||
| *.zip | ||||
| *.tar.gz | ||||
| *.rar | ||||
|  | ||||
| # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml | ||||
| hs_err_pid* | ||||
| replay_pid* | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								Documentations/Diagrammes/Diagramme_de_cas_dutilisation.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Documentations/Diagrammes/Diagramme_de_cas_dutilisation.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Documentations/Diagrammes/Diagramme_de_classe_BD.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Documentations/Diagrammes/Diagramme_de_classe_BD.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Documentations/Diagrammes/diagramme de classe_java.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Documentations/Diagrammes/diagramme de classe_java.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										33080
									
								
								Documentations/Rapports.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33080
									
								
								Documentations/Rapports.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										71
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| # === Global variables === | ||||
| MAIN_CLASS = fr.iutfbleau.papillon.Start | ||||
| BUILD_DIR = build | ||||
| SRC_DIR = src/fr/iutfbleau/papillon | ||||
| SRC_BUILD = fr\iutfbleau\papillon | ||||
| LIB_DIR := lib | ||||
| LIB := $(LIB_DIR)/mariadb | ||||
| JAR_NAME = papillon.jar | ||||
| DOC_DIR = doc | ||||
|  | ||||
| # === OS detection === | ||||
| ifeq ($(OS),Windows_NT) | ||||
| 	SEP = ; | ||||
| 	RM = del /Q | ||||
| 	RMDIR = rmdir /S /Q | ||||
| else | ||||
| 	SEP = : | ||||
| 	RM = rm -f | ||||
| 	RMDIR = rm -rf | ||||
| endif | ||||
|  | ||||
| # === Compilation === | ||||
| compile: | ||||
| 	@echo === Compilation du projet === | ||||
| 	javac -encoding UTF-8 -cp "$(LIB_DIR)$(SEP)$(LIB_DIR)/org/mariadb/jdbc" -d $(BUILD_DIR) $(SRC_DIR)/*.java | ||||
| 	@echo Compilation terminee | ||||
|  | ||||
| # === Run the program === | ||||
| run: | ||||
| 	@echo === Execution du programme === | ||||
| ifeq ($(OS),Windows_NT) | ||||
| 	java -cp "$(BUILD_DIR);$(LIB_DIR);$(LIB_DIR)/mariadb;$(LIB_DIR)/mariadb/org/mariadb/jdbc" $(MAIN_CLASS) | ||||
| else | ||||
| 	java -cp "$(BUILD_DIR):$(LIB_DIR):$(LIB_DIR)/mariadb:$(LIB_DIR)/mariadb/org/mariadb/jdbc" $(MAIN_CLASS) | ||||
| endif | ||||
|  | ||||
| # === Create JAR === | ||||
| jar: compile | ||||
| 	@echo === Creation du JAR autonome === | ||||
| 	echo Main-Class: $(MAIN_CLASS) > manifest.txt | ||||
| 	jar cfm $(JAR_NAME) manifest.txt -C $(BUILD_DIR) . | ||||
| 	@$(RM) manifest.txt 2>nul || true | ||||
| 	@echo JAR cree avec succes: $(JAR_NAME) | ||||
|  | ||||
| # === Run from JAR === | ||||
| run-jar: | ||||
| 	@echo === Execution du JAR === | ||||
| ifeq ($(OS),Windows_NT) | ||||
| 	java -cp "$(JAR_NAME);$(LIB_DIR);$(LIB_DIR)/mariadb;$(LIB_DIR)/mariadb/org/mariadb/jdbc" $(MAIN_CLASS) | ||||
| else | ||||
| 	java -cp "$(JAR_NAME):$(LIB_DIR):$(LIB_DIR)/mariadb:$(LIB_DIR)/mariadb/org/mariadb/jdbc" $(MAIN_CLASS) | ||||
| endif | ||||
|  | ||||
| # === Generate documentation === | ||||
| doc: | ||||
| 	@echo === Generation de la documentation Javadoc === | ||||
| 	javadoc -d $(DOC_DIR) -encoding UTF-8 -cp "$(LIB_DIR)$(SEP)$(LIB_DIR)/org/mariadb/jdbc" $(SRC_DIR)/*.java | ||||
| 	@echo Documentation generee dans le dossier doc/ | ||||
|  | ||||
| # === Clean build and docs === | ||||
| clean: | ||||
| 	@echo === Nettoyage des fichiers compiles === | ||||
| ifeq ($(OS),Windows_NT) | ||||
| 	$(RM) $(BUILD_DIR)\$(SRC_BUILD)\*.class 2>nul || true | ||||
| 	for /d %%i in ($(DOC_DIR)\*) do rmdir /S /Q "%%i" 2>nul || true | ||||
| 	$(RM) $(DOC_DIR)\* 2>nul || true | ||||
| else | ||||
| 	$(RM) $(BUILD_DIR)/fr/iutfbleau/papillon/*.class | ||||
| 	find $(DOC_DIR) -mindepth 1 -delete 2>/dev/null || true | ||||
| endif | ||||
| 	@echo Nettoyage termine | ||||
							
								
								
									
										137
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,137 @@ | ||||
| # Papillon 🦋 | ||||
|  | ||||
| Bienvenue sur notre projet **"PAPILLON"**, un logiciel qui reste en permanence au premier plan, comme un papillon collé sur le moniteur. Ce projet a été réalisé dans le cadre de la [SAÉ 3.1](https://iut-fbleau.fr/sitebp/sae3/31_2025/Y8R8E4MV9Y7T33O8.php) de l'IUT Sénart-Fontainebleau. | ||||
|  | ||||
| ## Table des matières | ||||
| - [Présentation](#présentation) | ||||
| - [Organisation du projet](#organisation-du-projet) | ||||
| - [Compilation et lancement](#Compilation-et-lancement) | ||||
| - [Création de la documentation](#création-de-la-documentation) | ||||
| - [Nettoyage des fichiers temporaires](#Nettoyage-des-fichiers-temporaires) | ||||
| - [Rapport d'avancement](#Rapport-d-avancement) | ||||
| - [Crédits](#crédits) | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## Présentation | ||||
|  | ||||
| Papillon, est une application de gestion de rappels qui permet à l'utilisateur : | ||||
| - D'ajouter des rappels (titre, contenu, thème, rang). | ||||
| - De modifier ou supprimer un rappel existant. | ||||
| - De consulter la liste de tous ses rappels. | ||||
| - Et d'avoir la fenêtre visible (comme un papillon posé sur l'écran). | ||||
|  | ||||
| Ce projet a été développé en **Java** en suivant les consignes de l’IUT afin d’assurer une structure claire et un code facile à maintenir. | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## Organisation du projet | ||||
|  | ||||
| L’organisation du projet suit une structure claire permettant de séparer le code source, les composants externes et les fichiers de configuration. Voici l'aborescence : | ||||
|  | ||||
| ``` | ||||
| SAE31_2025/ | ||||
| ├── Documentations/ | ||||
| │   ├── Diagrammes/ | ||||
| │   └── Rapports.pdf | ||||
| ├── lib/ # Bibliothèques externes MariaDB | ||||
| ├── src/ # Code source du projet | ||||
| │ └── fr/iutbleau/papillon/ # Package principal contenant toutes les classes Java | ||||
| │       ├── BaseDeDonnees.java | ||||
| │       ├── BtnAjouter.java | ||||
| │       ├── BtnModifier.java | ||||
| │       ├── BtnSupprimer.java | ||||
| │       ├── ChoixRang.java | ||||
| │       ├── ColorIcon.java | ||||
| │       ├── CouleurList.java | ||||
| │       ├── Crud.java | ||||
| │       ├── FenetreAjout.java | ||||
| │       ├── FenetreModif.java | ||||
| │       ├── FenetreRappel.java | ||||
| │       ├── GestionAjout.java | ||||
| │       ├── GestionModif.java | ||||
| │       ├── GestionRappel.java | ||||
| │       ├── LimiteContenu.java | ||||
| │       ├── Main.java | ||||
| │       ├── PanelRappel.java | ||||
| │       ├── Rappel.java | ||||
| │       ├── RappelBD.java | ||||
| │       ├── Start.java | ||||
| │       ├── UserKey.java | ||||
| │       ├── Utilisateur.java | ||||
| │       └── UtilisateurBD.java | ||||
| ├── .gitignore # Permet d’ignorer les fichiers .class générés lors de la compilation | ||||
| ├── Makefile # Automatisation pour la compilation et l’exécution | ||||
| ├── README.md # Fichier actuelle | ||||
| └── logo.png #Logo de la fenêtre | ||||
| ``` | ||||
| --- | ||||
|  | ||||
| ## Compilation et lancement | ||||
|  | ||||
| # Pré-requis | ||||
| - **MariaDB client** (inclus dans le répertoire `libs`) | ||||
|  | ||||
| --- | ||||
|  | ||||
| Pour avoir accès au projet faire les commandes suivantes: | ||||
|  | ||||
| ```bash | ||||
| # Cloner le dépôt | ||||
| git clone https://grond.iut-fbleau.fr/yolou/SAE31_2025/ | ||||
| cd SAE31_2025 | ||||
| ``` | ||||
| Pour compile et exécuter | ||||
| ```bash | ||||
| # Compiler et exécuter le projet | ||||
| make compile | ||||
| make run | ||||
| ``` | ||||
|  | ||||
| ou  | ||||
|  | ||||
| ### Création du fichier `.jar` | ||||
| Vous pouvez générer une archive exécutable : | ||||
| ```bash | ||||
| make jar | ||||
| ``` | ||||
|  | ||||
| Avec l'archive .jar on exécute : | ||||
| ```bash | ||||
| make run-jar | ||||
| ``` | ||||
|  | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## Création de la documentation | ||||
|  | ||||
| La documentation du code source est générée via **Javadoc**. Utilisez : | ||||
| ```bash | ||||
| make doc | ||||
| ``` | ||||
| --- | ||||
|  | ||||
| ## Nettoyage des fichiers temporaires  | ||||
|  | ||||
| Pour supprimer les fichiers intermédiaires on fait : | ||||
| ```bash | ||||
| make clean | ||||
| ``` | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## Rapport d'avancement  | ||||
|  | ||||
| Le rapport du projet est disponible dans le dossier `Documentation`. Accédez-y directement ici : [Documentations/Rapport.pdf](./Documentations/Rapports.pdf). | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## Crédits | ||||
|  | ||||
| Ce projet a été réalisé par : | ||||
| - [Jenson VAL](https://grond.iut-fbleau.fr/val) | ||||
| - [Aylane SEHL](https://grond.iut-fbleau.fr/sehl) | ||||
| - [Séri-Khane YOLOU](https://grond.iut-fbleau.fr/yolou) | ||||
|  | ||||
| Professeur : **Luc Hernandez**. | ||||
							
								
								
									
										40
									
								
								src/fr/iutfbleau/papillon/BaseDeDonnees.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/fr/iutfbleau/papillon/BaseDeDonnees.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.sql.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>BaseDeDonnees</code> fournit les paramètres et méthodes | ||||
|  * nécessaires à l’établissement d’une connexion à la base MariaDB. | ||||
|  * | ||||
|  * <p>Elle centralise les informations de connexion (URL, utilisateur et mot de passe) | ||||
|  * et renvoie un objet {@link java.sql.Connection} pour exécuter les requêtes SQL.</p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane Yolou, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class BaseDeDonnees { | ||||
|  | ||||
|     /** URL de connexion à la base de données MariaDB. */ | ||||
|     private static final String URL  = "jdbc:mariadb://dwarves.iut-fbleau.fr/yolou"; | ||||
|  | ||||
|     /** Nom d’utilisateur pour la base de données. */ | ||||
|     private static final String USER = "yolou"; | ||||
|  | ||||
|     /** Mot de passe associé à l’utilisateur. */ | ||||
|     private static final String PASS = "serikhaneyolou"; | ||||
|  | ||||
|     /** | ||||
|      * Établit une connexion avec la base de données MariaDB. | ||||
|      * | ||||
|      * @return un objet {@link java.sql.Connection} actif vers la base | ||||
|      * @throws SQLException si une erreur survient lors de la connexion | ||||
|      */ | ||||
|     public static java.sql.Connection getConnexion() throws SQLException { | ||||
|         try { | ||||
|             Class.forName("org.mariadb.jdbc.Driver"); | ||||
|         } catch (ClassNotFoundException e) { | ||||
|             System.out.println("Erreur : pilote MariaDB non trouvé !"); | ||||
|         } | ||||
|         return DriverManager.getConnection(URL, USER, PASS); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										66
									
								
								src/fr/iutfbleau/papillon/BtnAjouter.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/fr/iutfbleau/papillon/BtnAjouter.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
| import java.awt.event.*; | ||||
| import java.awt.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>BtnAjouter</code> représente un bouton permettant | ||||
|  * d’ouvrir la fenêtre d’ajout d’un nouveau rappel dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Lorsqu’un utilisateur clique sur ce bouton, une instance de la fenêtre | ||||
|  * <code>FenetreAjout</code> est affichée, tandis que la fenêtre principale est masquée. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */  | ||||
| public class BtnAjouter extends JButton implements ActionListener{ | ||||
|  | ||||
|     /** | ||||
|      * Référence vers la fenêtre principale de l’application. | ||||
|      * Elle permet de gérer la visibilité des fenêtres lors de l’ajout d’un rappel. | ||||
|      */ | ||||
|     private Main main; | ||||
|  | ||||
|     /** | ||||
|      * Construit un bouton "Ajouter" associé à la fenêtre principale. | ||||
|      * <p> | ||||
|      * Ce bouton est configuré avec une taille fixe et un écouteur d’action | ||||
|      * pour réagir aux clics de l’utilisateur. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param main la fenêtre principale de l’application <b>Papillon</b> | ||||
|      */ | ||||
|     public BtnAjouter(Main main){ | ||||
|         super("Ajouter"); | ||||
|         this.main = main; | ||||
|         setPreferredSize(new Dimension(120,25)); | ||||
|          | ||||
|         setFocusPainted(false); | ||||
|         addActionListener(this); | ||||
|          | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Méthode appelée lorsqu’un clic est détecté sur le bouton. | ||||
|      * <p> | ||||
|      * Ouvre une nouvelle fenêtre d’ajout (<code>FenetreAjout</code>), | ||||
|      * positionnée au même endroit que la fenêtre principale, puis | ||||
|      * masque cette dernière. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement d’action généré par le clic sur le bouton | ||||
|      */ | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent e){ | ||||
|         if(e.getSource()==this){ | ||||
|             FenetreAjout f = new FenetreAjout(main); | ||||
|             f.setLocation(main.getLocation()); | ||||
|             f.setVisible(true); | ||||
|             main.setVisible(false); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										93
									
								
								src/fr/iutfbleau/papillon/BtnModifier.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/fr/iutfbleau/papillon/BtnModifier.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import javax.swing.*; | ||||
| import java.awt.event.*; | ||||
| import java.awt.*; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>BtnModifier</code> représente un bouton permettant | ||||
|  * de modifier un rappel existant dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Lorsqu’un utilisateur clique sur ce bouton, il vérifie qu’un seul rappel | ||||
|  * est sélectionné. Si c’est le cas, la fenêtre de modification | ||||
|  * (<code>FenetreModif</code>) s’ouvre pour permettre à l’utilisateur | ||||
|  * de modifier les informations du rappel choisi. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class BtnModifier extends JButton implements ActionListener { | ||||
|  | ||||
|     /** | ||||
|      * Référence vers le rappel actuellement sélectionné. | ||||
|      */ | ||||
|     private Rappel rappel; | ||||
|      | ||||
|     /** | ||||
|      * Référence vers la fenêtre principale de l’application. | ||||
|      * Elle permet de gérer la visibilité des fenêtres lors de la modification d’un rappel. | ||||
|      */ | ||||
|     private final Main main; | ||||
|  | ||||
|     /** | ||||
|      * Construit un bouton "Modifier" associé à la fenêtre principale. | ||||
|      * <p> | ||||
|      * Ce bouton est configuré avec une taille fixe et un écouteur d’action | ||||
|      * pour réagir aux clics de l’utilisateur. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param main la fenêtre principale de l’application <b>Papillon</b> | ||||
|      */ | ||||
|     public BtnModifier(Main main) { | ||||
|         super("Modifier"); | ||||
|         this.main = main; | ||||
|         setPreferredSize(new Dimension(120, 25)); | ||||
|         addActionListener(this); | ||||
|  | ||||
|         setFocusPainted(false); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent e){ | ||||
|  | ||||
|         if (e.getSource() == this) {             | ||||
|              | ||||
|             int count = 0; | ||||
|             List<PanelRappel> listRpl = new ArrayList<>(); | ||||
|             PanelRappel pr; | ||||
|  | ||||
|             listRpl = main.getPanelRpl(); | ||||
|             for(int i = 0; i<listRpl.size();i++){ | ||||
|                 pr = listRpl.get(i); | ||||
|                 if(pr.getSelection()==true){ | ||||
|                     count++; | ||||
|                     rappel=pr.getRappel(); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             if(count==0){ | ||||
|                 JOptionPane.showMessageDialog(main, "Sélectionnez 1 rappel à modifier"); | ||||
|                 return; | ||||
|             } | ||||
|             if(count==1){ | ||||
|                 FenetreModif f = new FenetreModif(main,rappel); | ||||
|                 f.setVisible(true); | ||||
|                 main.dispose(); | ||||
|             } | ||||
|  | ||||
|             if(count>1){ | ||||
|                 JOptionPane.showMessageDialog(main, "Sélectionnez seulement 1 rappel à modifier"); | ||||
|                 return; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										109
									
								
								src/fr/iutfbleau/papillon/BtnSupprimer.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								src/fr/iutfbleau/papillon/BtnSupprimer.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,109 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
| import java.awt.event.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>BtnSupprimer</code> représente un bouton permettant | ||||
|  * de supprimer un ou plusieurs rappels dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Lorsqu’un utilisateur clique sur ce bouton, une boîte de confirmation | ||||
|  * s’affiche afin de valider la suppression. Si l’utilisateur confirme, | ||||
|  * les rappels sélectionnés sont supprimés de la liste. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class BtnSupprimer extends JButton implements ActionListener{ | ||||
|      | ||||
|     /** | ||||
|      * Gestionnaire des rappels permettant d’effectuer la suppression. | ||||
|      */ | ||||
|     private GestionRappel ges; | ||||
|  | ||||
|     /** | ||||
|      * Référence vers la fenêtre principale de l’application. | ||||
|      * Elle permet de gérer la visibilité des fenêtres lors de la suppression d’un rappel. | ||||
|      */ | ||||
|     private Main main; | ||||
|  | ||||
|     /** | ||||
|      * Construit un bouton "Supprimer" associé à la fenêtre principale. | ||||
|      * <p> | ||||
|      * Ce bouton est configuré avec une taille fixe et un écouteur d’action | ||||
|      * pour réagir aux clics de l’utilisateur. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param main la fenêtre principale de l’application <b>Papillon</b> | ||||
|      */ | ||||
|     public BtnSupprimer(Main main){ | ||||
|         super("Supprimer"); | ||||
|         this.main = main; | ||||
|         setPreferredSize(new Dimension(120,25)); | ||||
|         addActionListener(this); | ||||
|          | ||||
|         setFocusPainted(false); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gère l’action effectuée lors d’un clic sur le bouton. | ||||
|      * <p> | ||||
|      * Si aucun rappel n’est sélectionné, un message d’avertissement est affiché. | ||||
|      * Sinon, une boîte de dialogue de confirmation s’ouvre avant de procéder | ||||
|      * à la suppression des rappels choisis. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement d’action déclenché par un clic | ||||
|      */ | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent e){ | ||||
|     | ||||
|     if(e.getSource()==this){ | ||||
|              | ||||
|             ges = new GestionRappel(); | ||||
|             int count = 0; | ||||
|             List<PanelRappel> listRpl = new ArrayList<>(); | ||||
|             PanelRappel pr; | ||||
|  | ||||
|             listRpl = main.getPanelRpl(); | ||||
|             for(int i = 0; i<listRpl.size();i++){ | ||||
|                 pr = listRpl.get(i); | ||||
|                 if(pr.getSelection()==true){ | ||||
|                     count++; | ||||
|                 } | ||||
|             } | ||||
|             if(count==0){ | ||||
|                 JOptionPane.showMessageDialog(main, "Sélectionnez les rappels que vous souhaiter supprimer !"); | ||||
|             }else{ | ||||
|                           int choix = JOptionPane.showConfirmDialog( | ||||
|     main, | ||||
|     "Êtes-vous sûr de vouloir supprimer ce(s) rappel(s) ?", | ||||
|     "Confirmation", | ||||
|     JOptionPane.YES_NO_OPTION, | ||||
|     JOptionPane.WARNING_MESSAGE | ||||
| );       | ||||
|  | ||||
|             if (choix == JOptionPane.YES_OPTION) { | ||||
|                 for(int i = 0; i<listRpl.size();i++){ | ||||
|                 pr = listRpl.get(i); | ||||
|                 if(pr.getSelection()==true){ | ||||
|                     try{ | ||||
|                     ges.supprimerParId(pr.getId()); | ||||
|                     } catch (Exception ex) { | ||||
|                         ex.printStackTrace(); // affiche l'erreur dans le terminal | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|                     JOptionPane.showMessageDialog(main, "Les rappels on bien étaient supprimé."); | ||||
|                     new Main().setVisible(true); | ||||
|                     main.dispose(); | ||||
|         } | ||||
|                 | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										44
									
								
								src/fr/iutfbleau/papillon/ChoixRang.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/fr/iutfbleau/papillon/ChoixRang.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>ChoixRang</code> représente une liste déroulante | ||||
|  * permettant de filtrer les rappels selon leur niveau de priorité (rang) | ||||
|  * dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * L’utilisateur peut sélectionner un rang spécifique ou choisir “Tout” | ||||
|  * pour afficher tous les rappels. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class ChoixRang extends JComboBox<String> { | ||||
|  | ||||
|     /** | ||||
|      * Constructeur qui initialise la liste déroulante des rangs. | ||||
|      * <p> | ||||
|      * Par défaut, l’élément sélectionné est “Tout”. | ||||
|      * </p> | ||||
|      */ | ||||
|     public ChoixRang(){ | ||||
|         super(new String[]{"Tout", "Rang 1", "Rang 2", "Rang 3","Rang 4", "Rang 5"}); | ||||
|         this.setSelectedItem("Tout"); | ||||
|         this.addActionListener(this);  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Met à jour l’affichage des rappels en fonction du rang sélectionné. | ||||
|      * | ||||
|      * @param main la fenêtre principale de l’application <b>Papillon</b> | ||||
|      */ | ||||
|     public void tirage(Main main){ | ||||
|  | ||||
|     main.setTrie(this.getSelectedIndex()); | ||||
|     main.maj(); | ||||
|      | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										78
									
								
								src/fr/iutfbleau/papillon/ColorIcon.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/fr/iutfbleau/papillon/ColorIcon.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.Icon; | ||||
| import java.awt.Color; | ||||
| import java.awt.Component; | ||||
| import java.awt.Graphics; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>ColorIcon</code> permet d’afficher un petit carré coloré | ||||
|  * servant d’icône dans l’interface de l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle est utilisée notamment pour représenter visuellement un thème de couleur | ||||
|  * associé à un rappel ou un élément d’interface. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class ColorIcon implements Icon { | ||||
|  | ||||
|     /** Couleur à afficher dans l’icône. */ | ||||
|     private final Color couleur; | ||||
|  | ||||
|     /** Largeur de l’icône. */ | ||||
|     private final int largeur; | ||||
|  | ||||
|     /** Hauteur de l’icône. */ | ||||
|     private final int hauteur; | ||||
|  | ||||
|     /** | ||||
|      * Constructeur de l’icône colorée. | ||||
|      * | ||||
|      * @param couleur la couleur de l’icône | ||||
|      * @param largeur la largeur de l’icône | ||||
|      * @param hauteur la hauteur de l’icône | ||||
|      */ | ||||
|     public ColorIcon(Color couleur, int largeur, int hauteur) { | ||||
|         this.couleur = couleur; | ||||
|         this.largeur = largeur; | ||||
|         this.hauteur = hauteur; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Renvoie la largeur de l’icône. | ||||
|      * | ||||
|      * @return la largeur de l’icône | ||||
|      */ | ||||
|     @Override | ||||
|     public int getIconWidth() { | ||||
|         return largeur; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Renvoie la hauteur de l’icône. | ||||
|      * | ||||
|      * @return la hauteur de l’icône | ||||
|      */ | ||||
|     @Override | ||||
|     public int getIconHeight() { | ||||
|         return hauteur; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Dessine l’icône sur le composant spécifié. | ||||
|      * | ||||
|      * @param c le composant sur lequel l’icône est dessinée | ||||
|      * @param g le contexte graphique utilisé pour le dessin | ||||
|      * @param x la position horizontale du coin supérieur gauche | ||||
|      * @param y la position verticale du coin supérieur gauche | ||||
|      */ | ||||
|     @Override | ||||
|     public void paintIcon(Component c, Graphics g, int x, int y) { | ||||
|         g.setColor(couleur); | ||||
|         g.fillRect(x, y, largeur, hauteur); | ||||
|         g.setColor(Color.DARK_GRAY); | ||||
|         g.drawRect(x, y, largeur - 1, hauteur - 1); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										60
									
								
								src/fr/iutfbleau/papillon/CouleurList.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/fr/iutfbleau/papillon/CouleurList.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>CouleurList</code> permet d’afficher des couleurs | ||||
|  * associées à des thèmes dans les listes déroulantes de l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle agit comme un <b>renderer</b> personnalisé, affichant un petit carré coloré | ||||
|  * à côté du nom du thème. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class CouleurList extends DefaultListCellRenderer { | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Renvoie la couleur correspondant au nom affiché dans le menu déroulant. | ||||
|      * | ||||
|      * @param nom le nom du thème (ex. : "Bleu", "Rouge", "Vert", etc.) | ||||
|      * @return la couleur associée au thème, ou blanc par défaut | ||||
|      */ | ||||
|     public Color couleurDe(String nom) { | ||||
|         switch (nom) { | ||||
|             case "Bleu":  return Color.CYAN;       | ||||
|             case "Rouge": return Color.RED; | ||||
|             case "Vert":  return Color.GREEN; | ||||
|             case "Jaune": return Color.YELLOW; | ||||
|             case "Rose":  return Color.PINK; | ||||
|             default:      return Color.WHITE; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Personnalise l’affichage des éléments dans la liste déroulante. | ||||
|      * | ||||
|      * @param list la liste affichant les éléments | ||||
|      * @param value l’élément à afficher | ||||
|      * @param index l’indice de l’élément dans la liste | ||||
|      * @param isSelected indique si l’élément est sélectionné | ||||
|      * @param cellHasFocus indique si l’élément a le focus | ||||
|      * @return le composant personnalisé pour l’affichage de l’élément | ||||
|      */ | ||||
|     @Override | ||||
|     public JLabel getListCellRendererComponent(JList list, Object value, int index,boolean isSelected, boolean cellHasFocus) { | ||||
|  | ||||
|         JLabel lbl = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); | ||||
|  | ||||
|         if (value != null) { | ||||
|             String nom = value.toString(); | ||||
|             lbl.setIcon(new ColorIcon(couleurDe(nom), 14, 14)); | ||||
|             lbl.setIconTextGap(8); // petit espace entre le carré et le texte | ||||
|         } | ||||
|  | ||||
|         return lbl; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										48
									
								
								src/fr/iutfbleau/papillon/Crud.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/fr/iutfbleau/papillon/Crud.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import javax.swing.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>Crud</code> regroupe les trois boutons principaux | ||||
|  * de gestion des rappels dans l’application <b>Papillon</b> : | ||||
|  * <ul> | ||||
|  *   <li><b>Ajouter</b> — pour créer un nouveau rappel,</li> | ||||
|  *   <li><b>Supprimer</b> — pour supprimer un ou plusieurs rappels,</li> | ||||
|  *   <li><b>Modifier</b> — pour éditer un rappel existant.</li> | ||||
|  * </ul> | ||||
|  * <p> | ||||
|  * Cette classe centralise leur création et leur ajout à l’interface. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class Crud extends ArrayList<JButton>{ | ||||
|  | ||||
|     /** Bouton d’ajout de rappel. */ | ||||
|     private BtnAjouter btnAjt; | ||||
|  | ||||
|     /** Bouton de suppression de rappel. */ | ||||
|     private BtnSupprimer btnSpr; | ||||
|  | ||||
|     /** Bouton de modification de rappel. */ | ||||
|     private BtnModifier btnMdf; | ||||
|  | ||||
|     /** | ||||
|      * Constructeur de la barre d’actions CRUD. | ||||
|      * | ||||
|      * @param main la fenêtre principale de l’application <b>Papillon</b> | ||||
|      */ | ||||
|     public Crud(Main main){ | ||||
|          | ||||
| btnAjt = new BtnAjouter(main); | ||||
| btnSpr = new BtnSupprimer(main); | ||||
| btnMdf = new BtnModifier(main); | ||||
| add(btnAjt); | ||||
| add(btnSpr); | ||||
| add(btnMdf); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										135
									
								
								src/fr/iutfbleau/papillon/FenetreAjout.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								src/fr/iutfbleau/papillon/FenetreAjout.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * La classe <code>FenetreAjout</code> permet d’afficher une fenêtre | ||||
|  * dédiée à l’ajout d’un nouveau rappel dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle contient les champs nécessaires à la saisie du titre, du contenu, | ||||
|  * de la priorité et du thème du rappel. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class FenetreAjout extends JFrame { | ||||
|  | ||||
|     /** Champ de saisie pour le titre du rappel. */ | ||||
|     private final JTextField champTitre; | ||||
|  | ||||
|     /** Champ de saisie pour le contenu du rappel. */ | ||||
|     private final JTextArea champContenu; | ||||
|  | ||||
|     /** Liste de niveaux de priorité disponibles. */ | ||||
|     private Integer[] nombres = {1, 2, 3, 4, 5}; | ||||
|  | ||||
|     /** Sélecteur du niveau de priorité. */ | ||||
|     private JComboBox<Integer> rang = new JComboBox<>(nombres); | ||||
|  | ||||
|     /** Liste des noms de thèmes disponibles. */ | ||||
|     private final String[] nomsCouleurs = {"Bleu", "Rouge", "Vert", "Jaune", "Rose"}; | ||||
|      | ||||
|     /** Sélecteur du thème du rappel. */ | ||||
|     private final JComboBox<String> comboTheme = new JComboBox<>(nomsCouleurs); | ||||
|  | ||||
|     /** Gestionnaire des boutons d'ajout. */ | ||||
|     private GestionAjout listBtnAjout; | ||||
|  | ||||
|     /** | ||||
|      * Constructeur de la fenêtre d’ajout. | ||||
|      * | ||||
|      * @param parent la fenêtre principale de l’application <b>Papillon</b> | ||||
|      */ | ||||
|     public FenetreAjout(Main parent) { | ||||
|         super("Ajouter un rappel"); | ||||
|         ImageIcon logo = new ImageIcon("logo.png"); | ||||
|         setIconImage(logo.getImage()); | ||||
|  | ||||
|         setSize(350, 250); | ||||
|         setAlwaysOnTop(true); | ||||
|         setResizable(false); | ||||
|         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
|  | ||||
|         // Layout principal | ||||
|         setLayout(new BorderLayout(10, 10)); | ||||
|         JPanel centre = new JPanel(new GridBagLayout()); | ||||
|         GridBagConstraints c = new GridBagConstraints(); | ||||
|         c.insets = new Insets(4, 4, 4, 4); | ||||
|         c.fill = GridBagConstraints.HORIZONTAL; | ||||
|         add(centre, BorderLayout.CENTER); | ||||
|  | ||||
|         // Titre | ||||
|         JLabel lblTitre = new JLabel("Titre :"); | ||||
|         champTitre = new JTextField(50); | ||||
|         champTitre.setDocument(new LimiteContenu(50)); | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 1;  | ||||
|         c.weightx = 0; | ||||
|         centre.add(lblTitre, c); | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 1;  | ||||
|         c.weightx = 1; | ||||
|         centre.add(champTitre, c); | ||||
|  | ||||
|         // Contenu | ||||
|         JLabel lblContenu = new JLabel("Contenu :"); | ||||
|         champContenu = new JTextArea(4, 20); | ||||
|         champContenu.setDocument(new LimiteContenu(200)); | ||||
|         champContenu.setLineWrap(true); // active le retour à la ligne | ||||
|         champContenu.setWrapStyleWord(true); // évite de couper un mot en plein milieu | ||||
|         JScrollPane scroll = new JScrollPane(champContenu, | ||||
|         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, | ||||
|         JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); | ||||
|  | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 2; | ||||
|         c.weightx = 0; | ||||
|         c.fill = GridBagConstraints.BOTH; | ||||
|         centre.add(lblContenu, c); | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 2;  | ||||
|         c.weightx = 1.0;  | ||||
|         c.weighty = 1.0;   | ||||
|         centre.add(scroll, c); | ||||
|  | ||||
|         // Rang | ||||
|         JLabel lblrang = new JLabel("Rang :"); | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 3;  | ||||
|         c.weightx = 0;  | ||||
|         c.weighty = 0.0; | ||||
|         centre.add(lblrang, c); | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 3;  | ||||
|         c.weightx = 1; | ||||
|         centre.add(rang, c);  | ||||
|  | ||||
|         // Theme | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 4;  | ||||
|         c.weightx = 0; | ||||
|         centre.add(new JLabel("Theme :"), c); | ||||
|  | ||||
|         // liste déroulante de couleurs | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 4;  | ||||
|         c.weightx = 1; | ||||
|         comboTheme.setRenderer(new CouleurList()); | ||||
|         comboTheme.setSelectedItem("Bleu"); // valeur par défaut | ||||
|         centre.add(comboTheme, c); | ||||
|  | ||||
|  | ||||
|         // Bas : boutons | ||||
|         JPanel bas = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 10)); | ||||
|  | ||||
|         listBtnAjout = new GestionAjout(this,parent,champTitre,champContenu,rang,comboTheme); | ||||
|         bas.add(listBtnAjout.get(0)); | ||||
|         bas.add(listBtnAjout.get(1)); | ||||
|         add(bas, BorderLayout.SOUTH); | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										141
									
								
								src/fr/iutfbleau/papillon/FenetreModif.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								src/fr/iutfbleau/papillon/FenetreModif.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>FenetreModif</code> permet d’afficher une fenêtre | ||||
|  * dédiée à la modification d’un rappel existant dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle reprend les informations du rappel sélectionné et permet à l’utilisateur | ||||
|  * de les modifier avant de valider les changements. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class FenetreModif extends JFrame { | ||||
|  | ||||
|     /** Gestionnaire des boutons de modification. */ | ||||
|     private GestionModif listBtnModif; | ||||
|  | ||||
|     /** Champ de saisie pour le titre du rappel. */ | ||||
|     private final JTextField champTitre; | ||||
|  | ||||
|     /** Champ de saisie pour le contenu du rappel. */ | ||||
|     private final JTextArea champContenu; | ||||
|  | ||||
|     /** Liste de niveaux de priorité disponibles. */ | ||||
|     private Integer[] nombres = {1, 2, 3, 4, 5}; | ||||
|  | ||||
|     /** Sélecteur du niveau de priorité. */ | ||||
|     private JComboBox<Integer> rang = new JComboBox<>(nombres); | ||||
|  | ||||
|     /** Liste des noms de thèmes disponibles. */ | ||||
|     private final String[] nomsCouleurs = {"Bleu", "Rouge", "Vert", "Jaune", "Rose"}; | ||||
|  | ||||
|     /** Sélecteur du thème du rappel. */ | ||||
|     private final JComboBox<String> comboTheme = new JComboBox<>(nomsCouleurs);  | ||||
|  | ||||
|     /** | ||||
|      * Constructeur de la fenêtre de modification. | ||||
|      * | ||||
|      * @param parent la fenêtre principale de l’application <b>Papillon</b> | ||||
|      * @param rappel le rappel à modifier | ||||
|      */ | ||||
|     public FenetreModif(Main parent, Rappel rappel) { | ||||
|         super("Modifier un rappel"); | ||||
|         ImageIcon logo = new ImageIcon("logo.png"); | ||||
|         setIconImage(logo.getImage()); | ||||
|  | ||||
|         setSize(350, 250); | ||||
|         setResizable(false); | ||||
|         setAlwaysOnTop(true); | ||||
|         setLocation(parent.getLocation()); // même position que Main | ||||
|         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
|  | ||||
|         // Layout principal | ||||
|         setLayout(new BorderLayout(10, 10)); | ||||
|         JPanel centre = new JPanel(new GridBagLayout()); | ||||
|         GridBagConstraints c = new GridBagConstraints(); | ||||
|         c.insets = new Insets(4, 4, 4, 4); | ||||
|         c.fill   = GridBagConstraints.HORIZONTAL; | ||||
|         add(centre, BorderLayout.CENTER); | ||||
|         // Titre | ||||
|         JLabel lblTitre = new JLabel("Titre :"); | ||||
|         champTitre = new JTextField(20); | ||||
|         champTitre.setDocument(new LimiteContenu(50)); | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 1;  | ||||
|         c.weightx = 0; | ||||
|         centre.add(lblTitre, c); | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 1;  | ||||
|         c.weightx = 1;  | ||||
|         centre.add(champTitre, c); | ||||
|  | ||||
|         // Contenu | ||||
|         JLabel lblContenu = new JLabel("Contenu :"); | ||||
|         champContenu = new JTextArea(4, 20); | ||||
|         champContenu.setDocument(new LimiteContenu(200)); | ||||
|         champContenu.setLineWrap(true); // active le retour à la ligne | ||||
|         champContenu.setWrapStyleWord(true); // évite de couper un mot en plein milieu | ||||
|         JScrollPane scroll = new JScrollPane(champContenu, | ||||
|         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, | ||||
|         JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); | ||||
|  | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 2;  | ||||
|         c.weightx = 0;  | ||||
|         c.fill = GridBagConstraints.BOTH; | ||||
|         centre.add(lblContenu, c); | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 2;  | ||||
|         c.weightx = 1.0;  | ||||
|         c.weighty = 1.0; | ||||
|         centre.add(scroll, c); | ||||
|  | ||||
|         // rang | ||||
|          | ||||
|         rang.setSelectedIndex(rappel.getRang()-1); | ||||
|         JLabel lblRang = new JLabel("Rang :"); | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 3;  | ||||
|         c.weightx = 0;  | ||||
|         c.weighty = 0.0; | ||||
|         centre.add(lblRang, c); | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 3;  | ||||
|         c.weightx = 1; | ||||
|         centre.add(rang, c); | ||||
|  | ||||
|         // theme | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 4;  | ||||
|         c.weightx = 0; | ||||
|         centre.add(new JLabel("Theme :"), c); | ||||
|  | ||||
|         // liste déroulante de couleurs | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 4;  | ||||
|         c.weightx = 1; | ||||
|         comboTheme.setRenderer(new CouleurList()); | ||||
|         comboTheme.setSelectedItem(rappel.getTheme()); // valeur par défaut | ||||
|         centre.add(comboTheme, c); | ||||
|  | ||||
|         // add(centre, BorderLayout.CENTER); | ||||
|  | ||||
|         // Bas : boutons | ||||
|         JPanel bas = new JPanel(new FlowLayout(FlowLayout.RIGHT)); | ||||
|  | ||||
|         listBtnModif = new GestionModif(this,parent,champTitre,champContenu,rang,comboTheme,rappel); | ||||
|         bas.add(listBtnModif.get(0)); | ||||
|         bas.add(listBtnModif.get(1)); | ||||
|         add(bas, BorderLayout.SOUTH); | ||||
|  | ||||
|             champTitre.setText(rappel.getTitre());        | ||||
|             champContenu.setText(rappel.getContenu());    | ||||
|          | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										126
									
								
								src/fr/iutfbleau/papillon/FenetreRappel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								src/fr/iutfbleau/papillon/FenetreRappel.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.awt.event.*; | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>FenetreRappel</code> représente la fenêtre d’affichage | ||||
|  * détaillée d’un rappel dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle affiche les informations complètes du rappel sélectionné | ||||
|  * (titre, contenu, thème, et priorité) et permet à l’utilisateur | ||||
|  * de le modifier ou de fermer la fenêtre. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class FenetreRappel extends JFrame implements ActionListener{ | ||||
|  | ||||
|      /** Bouton permettant de fermer la fenêtre. */ | ||||
|     private final JButton btnFermer = new JButton("Fermer"); | ||||
|  | ||||
|     /** Bouton permettant d’ouvrir la fenêtre de modification du rappel. */ | ||||
|     private final JButton btnModifier = new JButton("Modifier"); | ||||
|  | ||||
|     /** Référence vers la fenêtre principale de l’application. */ | ||||
|     private final Main main; | ||||
|  | ||||
|     /** Référence vers le rappel à afficher. */ | ||||
|     private Rappel rappel; | ||||
|  | ||||
|     /** | ||||
|      * Constructeur de la fenêtre d’affichage d’un rappel. | ||||
|      * | ||||
|      * @param r le rappel à afficher | ||||
|      * @param main la fenêtre principale | ||||
|      */ | ||||
|     public FenetreRappel(Rappel r, Main main) { | ||||
|         super("Rappel : " + r.getTitre()); | ||||
|         ImageIcon logo = new ImageIcon("logo.png"); | ||||
|         setIconImage(logo.getImage()); | ||||
|  | ||||
|         this.main = main; | ||||
|         this.rappel = r; | ||||
|  | ||||
|         setSize(350, 250); | ||||
|         setLocationRelativeTo(null); | ||||
|         setResizable(false); | ||||
|         setAlwaysOnTop(true); | ||||
|         setLocation(main.getLocation()); | ||||
|         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
|  | ||||
|         JPanel panel = new JPanel(new GridBagLayout()); | ||||
|         panel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); | ||||
|  | ||||
|         JLabel titre = new JLabel("<html><h2>" + r.getTitre() + "</h2></html>"); | ||||
|         JTextArea contenu = new JTextArea(r.getContenu()); | ||||
|         contenu.setLineWrap(true); | ||||
|         contenu.setWrapStyleWord(true); | ||||
|         contenu.setEditable(false); | ||||
|  | ||||
|         JLabel infos = new JLabel("<html><i>Thème : " + r.getTheme() + " <br>Rang : " + r.getRang() + "</i></html>"); | ||||
|  | ||||
|         GridBagConstraints c = new GridBagConstraints(); | ||||
|         c.insets = new Insets(4, 4, 4, 4); | ||||
|         c.fill = GridBagConstraints.HORIZONTAL; | ||||
|  | ||||
|         panel.add(titre, c); | ||||
|         c.gridy = 1;  | ||||
|         c.weightx = 1.0;  | ||||
|         c.weighty = 1.0;  | ||||
|         c.gridwidth = 2; | ||||
|         c.fill = GridBagConstraints.BOTH; | ||||
|         panel.add(new JScrollPane(contenu), c); | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 2;  | ||||
|         c.weightx = 0;  | ||||
|         c.weighty = 0; | ||||
|         c.fill = GridBagConstraints.NONE; | ||||
|         c.anchor = GridBagConstraints.WEST; | ||||
|         panel.add(infos, c); | ||||
|         btnModifier.addActionListener(this); | ||||
|         btnFermer.addActionListener(this); | ||||
|         JPanel btnPanel = new JPanel(); | ||||
|  | ||||
|         c.gridx = 1;  | ||||
|         c.gridy = 2;  | ||||
|         c.weightx = 0;  | ||||
|         c.weighty = 0; | ||||
|         c.anchor = GridBagConstraints.EAST; | ||||
|  | ||||
|          | ||||
|         btnPanel.add(btnModifier); | ||||
|         btnPanel.add(btnFermer); | ||||
|         panel.add(btnPanel, c); | ||||
|  | ||||
|         setContentPane(panel); | ||||
|         setVisible(true); | ||||
|         main.dispose(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gère les actions effectuées sur les boutons de la fenêtre. | ||||
|      * <ul> | ||||
|      *     <li><b>Fermer</b> : ferme la fenêtre actuelle.</li> | ||||
|      *     <li><b>Modifier</b> : ouvre la fenêtre de modification du rappel.</li> | ||||
|      * </ul> | ||||
|      * | ||||
|      * @param e l’événement d’action déclenché | ||||
|      */ | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent e) { | ||||
|         if (e.getSource() == btnFermer) { | ||||
|             Main reParent = new Main(); | ||||
|             reParent.setLocation(this.getLocation()); | ||||
|             reParent.setVisible(true); | ||||
|             this.dispose(); | ||||
|         } | ||||
|         else if (e.getSource() == btnModifier) { | ||||
|             FenetreModif f = new FenetreModif(main,rappel); | ||||
|                 f.setVisible(true); | ||||
|                 this.dispose(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										127
									
								
								src/fr/iutfbleau/papillon/GestionAjout.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								src/fr/iutfbleau/papillon/GestionAjout.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
| import java.awt.event.*; | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>GestionAjout</code> gère les boutons de la fenêtre | ||||
|  * d’ajout d’un rappel dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle contient les boutons <b>Valider</b> et <b>Annuler</b>, et définit | ||||
|  * le comportement associé à chacun d’eux. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class GestionAjout extends ArrayList<JButton> implements ActionListener{ | ||||
|  | ||||
|     /** Bouton de validation. */ | ||||
|     private final JButton boutonValider; | ||||
|  | ||||
|     /** Bouton d'annulation. */ | ||||
|     private final JButton boutonAnnuler; | ||||
|  | ||||
|     /** Champ de saisie pour le titre du rappel. */ | ||||
|     private final JTextField champTitre; | ||||
|  | ||||
|     /** Champ de saisie pour le contenu du rappel. */ | ||||
|     private final JTextArea champContenu; | ||||
|  | ||||
|     /** Sélecteur du niveau de priorité. */ | ||||
|     private JComboBox<Integer> rang; | ||||
|  | ||||
|     /** Sélecteur du thème du rappel. */ | ||||
|     private final JComboBox<String> comboTheme; | ||||
|  | ||||
|     /** Référence à la fenêtre principale. */ | ||||
|     private final Main parent; | ||||
|  | ||||
|     /** Référence à la fenêtre d'ajout. */ | ||||
|     private final JFrame f; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Constructeur du gestionnaire de boutons pour la fenêtre d’ajout. | ||||
|      * | ||||
|      * @param f la fenêtre d’ajout | ||||
|      * @param parent la fenêtre principale | ||||
|      * @param champTitre le champ de texte pour le titre | ||||
|      * @param champContenu la zone de texte pour le contenu | ||||
|      * @param rang la liste déroulante de priorité | ||||
|      * @param comboTheme la liste déroulante du thème | ||||
|      */ | ||||
|     public GestionAjout(JFrame f, Main parent, JTextField champTitre, JTextArea champContenu, JComboBox<Integer> rang, JComboBox<String> comboTheme){ | ||||
|  | ||||
|         this.f = f; | ||||
|         this.parent = parent; | ||||
|         this.champTitre = champTitre; | ||||
|         this.champContenu = champContenu; | ||||
|         this.rang = rang; | ||||
|         this.comboTheme = comboTheme; | ||||
|  | ||||
|         boutonValider = new JButton("Valider"); | ||||
|         boutonAnnuler = new JButton("Annuler"); | ||||
|         this.add(boutonValider); | ||||
|         this.add(boutonAnnuler); | ||||
|         boutonValider.addActionListener(this); | ||||
|         boutonAnnuler.addActionListener(this); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gère les actions effectuées sur les boutons de la fenêtre. | ||||
|      * <p> | ||||
|      * Si l’utilisateur clique sur <b>Annuler</b>, la fenêtre d’ajout est fermée | ||||
|      * et la fenêtre principale est réaffichée.   | ||||
|      * Si l’utilisateur clique sur <b>Valider</b>, un nouveau rappel est créé | ||||
|      * et ajouté à la liste principale. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement d’action déclenché par un clic sur un bouton | ||||
|      */ | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent e) { | ||||
|         Object src = e.getSource(); | ||||
|  | ||||
|         if (src == boutonAnnuler) { | ||||
|             // revenir à la fenêtre principale | ||||
|             Point pos = f.getLocation(); | ||||
|  | ||||
|             parent.setLocation(pos); | ||||
|             parent.setVisible(true); | ||||
|             f.dispose(); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (src == boutonValider) { | ||||
|             String titre = champTitre.getText().trim(); | ||||
|             String contenu = champContenu.getText().trim(); | ||||
|             int Nrang = (Integer) rang.getSelectedItem(); | ||||
|             String cTheme = (String)comboTheme.getSelectedItem(); | ||||
|  | ||||
|  | ||||
|             GestionRappel g = new GestionRappel(); | ||||
|  | ||||
|             if (titre.isEmpty()) { | ||||
|                 JOptionPane.showMessageDialog(f, "Veuillez remplir tout le titre.", "Champs manquants", JOptionPane.WARNING_MESSAGE); | ||||
|                 return; | ||||
|             }else{ | ||||
|  | ||||
|             try{ | ||||
|                 g.ajouter(titre, contenu, cTheme, Nrang); | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); // affiche l'erreur dans le terminal | ||||
|             } | ||||
|  | ||||
|         } | ||||
|              | ||||
|             Main reParent = new Main(); | ||||
|             reParent.setLocation(f.getLocation()); | ||||
|             reParent.setVisible(true); | ||||
|             f.dispose(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										133
									
								
								src/fr/iutfbleau/papillon/GestionModif.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								src/fr/iutfbleau/papillon/GestionModif.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import javax.swing.*; | ||||
| import java.awt.event.*; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * La classe <code>GestionModif</code> gère les boutons de la fenêtre | ||||
|  * de modification d’un rappel dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle permet à l’utilisateur de valider ou d’annuler les changements | ||||
|  * effectués sur un rappel existant. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class GestionModif extends ArrayList<JButton> implements ActionListener{ | ||||
|  | ||||
|  | ||||
|     /** Bouton de validation. */ | ||||
|     private final JButton boutonValider; | ||||
|  | ||||
|     /** Bouton d'annulation. */ | ||||
|     private final JButton boutonAnnuler; | ||||
|  | ||||
|     /** Champ de saisie pour le titre du rappel. */ | ||||
|     private final JTextField champTitre; | ||||
|  | ||||
|     /** Champ de saisie pour le contenu du rappel. */ | ||||
|     private final JTextArea champContenu; | ||||
|  | ||||
|     /** Sélecteur du niveau de priorité. */ | ||||
|     private JComboBox<Integer> rang; | ||||
|  | ||||
|     /** Sélecteur du thème du rappel. */ | ||||
|     private final JComboBox<String> comboTheme; | ||||
|  | ||||
|     /** Référence au rappel à modifier. */ | ||||
|     private Rappel rappel; | ||||
|  | ||||
|     /** Gestionnaire des commandes agissant sur les rappels. */ | ||||
|     private final GestionRappel ges = new GestionRappel(); | ||||
|  | ||||
|     /** Référence à la fenêtre principale. */ | ||||
|     private final Main parent; | ||||
|  | ||||
|     /** Référence à la fenêtre de modification. */ | ||||
|     private final JFrame f;     | ||||
|  | ||||
|     /** | ||||
|      * Constructeur du gestionnaire de boutons pour la fenêtre de modification. | ||||
|      * | ||||
|      * @param f la fenêtre de modification | ||||
|      * @param parent la fenêtre principale | ||||
|      * @param champTitre le champ de texte pour le titre | ||||
|      * @param champContenu la zone de texte pour le contenu | ||||
|      * @param rang la liste déroulante de priorité | ||||
|      * @param comboTheme la liste déroulante du thème | ||||
|      * @param r le rappel à modifier | ||||
|      */ | ||||
|     public GestionModif(JFrame f, Main parent, JTextField champTitre, JTextArea champContenu, JComboBox<Integer> rang, JComboBox<String> comboTheme, Rappel r){ | ||||
|  | ||||
|         this.f = f; | ||||
|         this.parent = parent; | ||||
|         this.champTitre = champTitre; | ||||
|         this.champContenu = champContenu; | ||||
|         this.rang = rang; | ||||
|         this.comboTheme = comboTheme; | ||||
|         this.rappel = r; | ||||
|  | ||||
|         boutonValider = new JButton("Valider"); | ||||
|         boutonAnnuler = new JButton("Annuler"); | ||||
|         this.add(boutonValider); | ||||
|         this.add(boutonAnnuler); | ||||
|         boutonValider.addActionListener(this); | ||||
|         boutonAnnuler.addActionListener(this); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gère les actions effectuées sur les boutons de la fenêtre. | ||||
|      * <p> | ||||
|      * Si l’utilisateur clique sur <b>Annuler</b>, la fenêtre principale est réaffichée.   | ||||
|      * Si l’utilisateur clique sur <b>Valider</b>, les changements sont enregistrés. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement d’action déclenché par un bouton | ||||
|      */ | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent e) { | ||||
|         Object src = e.getSource(); | ||||
|  | ||||
|         if (src == boutonAnnuler) { | ||||
|  | ||||
|             parent.setLocation(f.getLocation()); | ||||
|             parent.setVisible(true); | ||||
|             f.dispose(); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (src == boutonValider) { | ||||
|             String t = champTitre.getText().trim(); | ||||
|             String c = champContenu.getText().trim(); | ||||
|             int r = (Integer) rang.getSelectedItem(); | ||||
|             String th = (String) comboTheme.getSelectedItem(); | ||||
|  | ||||
|             if (t.isEmpty()) { | ||||
|                 JOptionPane.showMessageDialog(f, "Veuillez remplir le titre.", "Champs manquants", JOptionPane.WARNING_MESSAGE); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             //  MAJ directe du rappel | ||||
|              | ||||
|                 rappel.setTitre(t);      | ||||
|                 rappel.setContenu(c);  | ||||
|                 rappel.setRang(r); | ||||
|                 rappel.setTheme(th);    | ||||
|                 try{ | ||||
|                 ges.modifierParId(rappel.getId(), rappel); | ||||
|                 } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|                 } | ||||
|              | ||||
|  | ||||
|             Main reParent = new Main(); | ||||
|             reParent.setLocation(f.getLocation()); | ||||
|             reParent.setVisible(true); | ||||
|             f.dispose(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										110
									
								
								src/fr/iutfbleau/papillon/GestionRappel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								src/fr/iutfbleau/papillon/GestionRappel.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.sql.SQLException; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>GestionRappel</code> gère les opérations CRUD | ||||
|  * (création, lecture, modification, suppression) sur les rappels | ||||
|  * associés à l’utilisateur courant. | ||||
|  * <p> | ||||
|  * Elle s’appuie sur les classes <code>Rappel</code>, <code>RappelBD</code>, | ||||
|  * <code>UserKey</code> et <code>UtilisateurBD</code> pour interagir | ||||
|  * avec la base de données. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class GestionRappel { | ||||
|  | ||||
|     /** Identifiant de l'utilisateur courant. */ | ||||
|     private final int utilisateurId; | ||||
|  | ||||
|     /** | ||||
|      * Constructeur de la classe <code>GestionRappel</code>. | ||||
|      * <p> | ||||
|      * Initialise l’identifiant utilisateur en se basant sur la clé locale. | ||||
|      * Si aucun utilisateur n’existe encore, il est automatiquement créé | ||||
|      * dans la base de données. | ||||
|      * </p> | ||||
|      */ | ||||
|     public GestionRappel() { | ||||
|         int uid = -1; | ||||
|         try { | ||||
|             String cle = UserKey.lireOuCreerCle();  // clé locale | ||||
|             uid = UtilisateurBD.getOrCreateIdByKey(cle); // crée ou récupère utilisateur | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         this.utilisateurId = uid; | ||||
|         System.out.println("Utilisateur courant id=" + this.utilisateurId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Ajoute un nouveau rappel pour l’utilisateur courant. | ||||
|      * | ||||
|      * @param titre le titre du rappel | ||||
|      * @param contenu le contenu textuel du rappel | ||||
|      * @param theme le thème associé au rappel | ||||
|      * @param rang la priorité du rappel | ||||
|      * @return le nombre de lignes affectées ou l’ID du rappel ajouté | ||||
|      * @throws SQLException si une erreur survient lors de l’ajout | ||||
|      */ | ||||
|     public int ajouter(String titre, String contenu, String theme, int rang) throws SQLException { | ||||
|         Rappel r = new Rappel(titre, contenu, theme, rang); | ||||
|         return RappelBD.ajouter(r, this.utilisateurId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Liste tous les rappels appartenant à l’utilisateur courant. | ||||
|      * | ||||
|      * @return la liste des rappels de l’utilisateur | ||||
|      * @throws SQLException si une erreur de communication avec la base survient | ||||
|      */ | ||||
|     public List<Rappel> lister() throws SQLException { | ||||
|         return RappelBD.listerParUtilisateur(this.utilisateurId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Modifie un rappel existant à partir de son identifiant. | ||||
|      * | ||||
|      * @param id l’identifiant du rappel à modifier | ||||
|      * @param r l’objet <code>Rappel</code> contenant les nouvelles valeurs | ||||
|      * @return le nombre de lignes modifiées | ||||
|      * @throws SQLException si une erreur survient lors de la mise à jour | ||||
|      */ | ||||
|     public int modifierParId(int id, Rappel r) throws SQLException { | ||||
|         return RappelBD.modifier(id, r, this.utilisateurId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Supprime un rappel de la base de données selon son identifiant. | ||||
|      * | ||||
|      * @param id l’identifiant du rappel à supprimer | ||||
|      * @return le nombre de lignes supprimées | ||||
|      * @throws SQLException si une erreur survient lors de la suppression | ||||
|      */ | ||||
|     public int supprimerParId(int id) throws SQLException { | ||||
|         return RappelBD.supprimer(id, this.utilisateurId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Supprime tous les rappels appartenant à l’utilisateur courant. | ||||
|      * | ||||
|      * @return le nombre de rappels supprimés | ||||
|      * @throws SQLException si une erreur survient lors de la suppression | ||||
|      */ | ||||
|     public int viderTousMesRappels() throws SQLException { | ||||
|         return RappelBD.supprimerToutPourUtilisateur(this.utilisateurId); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Renvoie l’identifiant de l’utilisateur courant. | ||||
|      * | ||||
|      * @return l’ID utilisateur | ||||
|      */ | ||||
|     public int getUtilisateurId() { | ||||
|         return this.utilisateurId; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										48
									
								
								src/fr/iutfbleau/papillon/LimiteContenu.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/fr/iutfbleau/papillon/LimiteContenu.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.text.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>LimiteContenu</code> permet de limiter le nombre | ||||
|  * de caractères pouvant être saisis dans un champ de texte Swing. | ||||
|  * <p> | ||||
|  * Elle hérite de <code>PlainDocument</code> et empêche toute insertion | ||||
|  * dépassant la limite définie. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class LimiteContenu extends PlainDocument { | ||||
|  | ||||
|     /** Limite de caractères autorisés. */ | ||||
|     private int limite; | ||||
|  | ||||
|     /** | ||||
|      * Constructeur qui définit la limite de caractères. | ||||
|      * | ||||
|      * @param limite le nombre maximum de caractères autorisés | ||||
|      */ | ||||
|     public LimiteContenu(int limite) { | ||||
|         this.limite = limite; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Insère une chaîne dans le document si elle ne dépasse pas la limite autorisée. | ||||
|      * | ||||
|      * @param offset la position d’insertion | ||||
|      * @param str la chaîne à insérer | ||||
|      * @param attr les attributs du texte | ||||
|      * @throws BadLocationException si la position est invalide | ||||
|      */ | ||||
|     @Override | ||||
|     public void insertString(int offset, String str, AttributeSet attr) | ||||
|             throws BadLocationException { | ||||
|         if (str == null){  | ||||
|             return; | ||||
|         } | ||||
|         if ((getLength() + str.length()) <= limite) { | ||||
|             super.insertString(offset, str, attr); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										203
									
								
								src/fr/iutfbleau/papillon/Main.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								src/fr/iutfbleau/papillon/Main.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,203 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
| import java.awt.event.*; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * La classe <code>Main</code> représente la fenêtre principale | ||||
|  * de l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle gère l’affichage des rappels, leur tri, ainsi que les | ||||
|  * interactions avec les boutons d’ajout, de suppression et de modification. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class Main extends JFrame implements ActionListener{ | ||||
|  | ||||
|     /** Liste des panneaux représentant les rappels. */ | ||||
|     private List<PanelRappel> listRpl = new ArrayList<>(); | ||||
|  | ||||
|     /** Panneau contenant la liste des rappels. */ | ||||
|     private JPanel liste = new JPanel(); | ||||
|  | ||||
|     /** Menu déroulant permettant de trier les rappels par priorité. */ | ||||
|     private ChoixRang trier = new ChoixRang(); | ||||
|  | ||||
|     /** Conteneur racine de la fenêtre principale. */ | ||||
|     private JPanel root = new JPanel(new BorderLayout()); | ||||
|  | ||||
|     /** | ||||
|      * Constructeur de la fenêtre principale de l’application. | ||||
|      * <p> | ||||
|      * Initialise les composants graphiques, configure la disposition et | ||||
|      * charge la liste des rappels au démarrage. | ||||
|      * </p> | ||||
|      */ | ||||
|     public Main(){ | ||||
|     super("Papillon"); | ||||
|     ImageIcon logo = new ImageIcon("logo.png"); | ||||
|     setIconImage(logo.getImage()); | ||||
|  | ||||
|     trier = new ChoixRang(); | ||||
|     trier.addActionListener(this); | ||||
| //  Taille fixe  | ||||
|     setSize(350, 250); | ||||
|     setResizable(false); | ||||
|     setAlwaysOnTop(true); | ||||
|     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
|  | ||||
|     //  Titre en haut   | ||||
|     JLabel titre = new JLabel("Rappel : Papillon", SwingConstants.CENTER); | ||||
|     titre.setBorder(BorderFactory.createEmptyBorder(6,10,6,10));  | ||||
|     // titre.setBackground(Color.CYAN); | ||||
|      | ||||
|     // ----- Grille centrale ----- | ||||
|     JPanel body = new JPanel(new GridBagLayout()); | ||||
|     GridBagConstraints c = new GridBagConstraints(); | ||||
|      | ||||
|     Crud crud = new Crud(this); | ||||
|  | ||||
|     // Colonne 0 : boutons | ||||
|     c.fill = GridBagConstraints.HORIZONTAL; | ||||
|     c.anchor = GridBagConstraints.NORTHWEST; | ||||
|     c.insets = new Insets(4, 4, 4, 4); | ||||
|     for(int i = 0; i< crud.size() ;i++){ | ||||
|     c.gridx = i;  | ||||
|     c.gridy = 4; | ||||
|     c.weighty = 0;  | ||||
|     c.weightx = 1;  | ||||
|     body.add(crud.get(i), c); | ||||
|     } | ||||
|  | ||||
|     // Colonne 1 : liste verticale de Rappel dans un JScrollPane | ||||
|     liste = new JPanel(); | ||||
|      | ||||
|     //Rappels | ||||
|     this.setTrie(trier.getSelectedIndex()); | ||||
|     liste=this.getRPanel(); | ||||
|  | ||||
| liste.setLayout(new BoxLayout(liste, BoxLayout.Y_AXIS));  | ||||
|     JScrollPane scroll = new JScrollPane( | ||||
|         liste, | ||||
|         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, | ||||
|         JScrollPane.HORIZONTAL_SCROLLBAR_NEVER | ||||
|     ); | ||||
|     scroll.getVerticalScrollBar().setUnitIncrement(16); // molette fluide | ||||
|  | ||||
|     // place le scrollpane a droite, sur la hauteur des 2 lignes | ||||
|     c.gridx = 0; c.gridy = 1; c.gridwidth = 3; | ||||
|     c.fill = GridBagConstraints.BOTH; | ||||
|     c.insets = new Insets(0, 0, 0, 0); | ||||
|     c.weightx = 1.0;  // prend la largeur dispo | ||||
|     c.weighty = 1.0;  // prend la hauteur dispo | ||||
|     body.add(scroll, c); | ||||
|  | ||||
|     c.gridx=0; c.gridy=0; | ||||
|     c.weightx = 0.0; c.weighty = 0.0; | ||||
|     c.fill = GridBagConstraints.NONE; | ||||
|     c.anchor = GridBagConstraints.SOUTHEAST; | ||||
|     c.insets = new Insets(1, 1, 1, 1); | ||||
|     body.add(trier,c); | ||||
|  | ||||
|     // Conteneur racine | ||||
|      | ||||
|     root.add(titre, BorderLayout.NORTH); | ||||
|     root.add(body, BorderLayout.CENTER); | ||||
|     setContentPane(root); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Renvoie la liste des panneaux de rappels actuellement affichés. | ||||
|      * | ||||
|      * @return une liste de <code>PanelRappel</code> | ||||
|      */ | ||||
| public List<PanelRappel> getPanelRpl(){ | ||||
|     return listRpl; | ||||
| } | ||||
|  | ||||
|     /** | ||||
|      * Met à jour la fenêtre principale après une modification | ||||
|      * (ajout, suppression ou édition d’un rappel). | ||||
|      * <p> | ||||
|      * Cette méthode recharge le panneau des rappels | ||||
|      * et force le recalcul de l’affichage. | ||||
|      * </p> | ||||
|      */ | ||||
| public void maj(){ | ||||
|  | ||||
|     liste = this.getRPanel(); | ||||
|     liste.revalidate(); // recalcul du layout | ||||
|     liste.repaint();  | ||||
|      | ||||
|     this.revalidate(); | ||||
|     this.repaint(); | ||||
| } | ||||
|  | ||||
|     /** | ||||
|      * Applique un tri des rappels selon leur rang de priorité. | ||||
|      * | ||||
|      * @param rang le niveau de priorité sélectionné dans le menu | ||||
|      */ | ||||
| public void setTrie(int rang){ | ||||
|     listRpl = new ArrayList<>(); | ||||
|  | ||||
|             GestionRappel g = new GestionRappel(); | ||||
|             List<Rappel> listBd = new ArrayList<>(); | ||||
|  | ||||
|             try { | ||||
|                 listBd = g.lister(); | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace();  | ||||
|             } | ||||
|  | ||||
| if(rang>0){ | ||||
| for(int i=0;i<listBd.size();i++){ | ||||
|     PanelRappel rappel = new PanelRappel(listBd.get(i), this); | ||||
|     if(listBd.get(i).getRang()==rang){ | ||||
|         liste.add(rappel); | ||||
|         listRpl.add(rappel); | ||||
|     } | ||||
| } | ||||
| }else{ | ||||
|    for (int i = 0; i < listBd.size() ; i++) { | ||||
|         PanelRappel r = new PanelRappel(listBd.get(i), this);  | ||||
|         liste.add(r);  | ||||
|         listRpl.add(r); | ||||
|     }  | ||||
| } | ||||
|  | ||||
| } | ||||
|  | ||||
|     /** | ||||
|      * Renvoie le panneau contenant les rappels. | ||||
|      * | ||||
|      * @return le panneau de type <code>JPanel</code> affichant les rappels | ||||
|      */ | ||||
| public JPanel getRPanel(){ | ||||
|     return liste; | ||||
| } | ||||
|  | ||||
|     /** | ||||
|      * Gère les actions utilisateur sur le menu déroulant de tri. | ||||
|      * <p> | ||||
|      * Réinitialise la liste et applique le tri sélectionné. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param ea l’événement d’action déclenché | ||||
|      */ | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent ea) { | ||||
|  | ||||
|         liste.removeAll(); | ||||
|         trier.tirage(this); | ||||
|      | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										255
									
								
								src/fr/iutfbleau/papillon/PanelRappel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								src/fr/iutfbleau/papillon/PanelRappel.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,255 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import javax.swing.*; | ||||
| import java.awt.*; | ||||
| import java.awt.event.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>PanelRappel</code> représente l’affichage graphique | ||||
|  * d’un rappel dans l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Chaque panneau contient le titre, un aperçu du contenu, ainsi qu’une | ||||
|  * couleur correspondant au thème du rappel.   | ||||
|  * L’utilisateur peut interagir avec ce panneau (sélection, clic droit, etc.). | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class PanelRappel extends JPanel implements ActionListener, MouseListener { | ||||
|      | ||||
|     /** Indique si le rappel est actuellement sélectionné. */ | ||||
|     private boolean estSelectionne = false; | ||||
|  | ||||
|     /** Label affichant le titre du rappel. */ | ||||
|     private  JLabel lbtitre; | ||||
|  | ||||
|     /** Label affichant un aperçu du contenu du rappel. */ | ||||
|     private  JLabel lbcontenu; | ||||
|  | ||||
|     /** Référence vers le rappel associé à ce panneau. */ | ||||
|     private  Rappel r; | ||||
|  | ||||
|     /** Menu contextuel (clic droit). */ | ||||
|     private  JPopupMenu menu; | ||||
|  | ||||
|     /** Élément du menu permettant d’ouvrir le rappel. */ | ||||
|     private  JMenuItem itemOuvrir; | ||||
|  | ||||
|     /** Référence à la fenêtre principale. */ | ||||
|     private Main main; | ||||
|  | ||||
|     /** Liste des couleurs disponibles pour les thèmes. */ | ||||
|     private static CouleurList couleur = new CouleurList(); | ||||
|  | ||||
|     /** | ||||
|      * Constructeur du panneau associé à un rappel et à la fenêtre principale. | ||||
|      * | ||||
|      * @param r le rappel à afficher | ||||
|      * @param main la fenêtre principale | ||||
|      */ | ||||
|     public PanelRappel(Rappel r, Main main) { | ||||
|         super(new BorderLayout(2, 0)); | ||||
|         this.main = main; | ||||
|         createPanel(r); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Constructeur du panneau associé à un rappel sans référence à la fenêtre principale. | ||||
|      * | ||||
|      * @param r le rappel à afficher | ||||
|      */ | ||||
|     public PanelRappel(Rappel r) { | ||||
|         super(new BorderLayout(2, 0)); | ||||
|         createPanel(r); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Initialise et configure le panneau pour afficher les informations du rappel. | ||||
|      * | ||||
|      * @param r le rappel à afficher | ||||
|      */ | ||||
|     public void createPanel(Rappel r){ | ||||
|         this.r = r; | ||||
|  | ||||
|         //  Titre et contenu raccourci  | ||||
|         lbtitre = new JLabel("[" + r.getRang() + "] " + r.getTitre()); | ||||
|         lbcontenu = new JLabel( | ||||
|             "<html>" + (r.getContenu().length() > 40 ? r.getContenu().substring(0, 40) + "..." : r.getContenu()) + "</html>" | ||||
|         ); | ||||
|  | ||||
|         // - Apparence de base  | ||||
|         this.setPreferredSize(new Dimension(70, 50)); | ||||
|         this.setBackground(couleur.couleurDe(r.getTheme())); | ||||
|         this.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 2)); | ||||
|  | ||||
|         setLayout(new GridBagLayout()); | ||||
|         GridBagConstraints c = new GridBagConstraints(); | ||||
|         c.anchor = GridBagConstraints.NORTHWEST; | ||||
|  | ||||
|         // - Position du titre  | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 0;  | ||||
|         c.weightx = 1; | ||||
|         c.fill = GridBagConstraints.NONE; | ||||
|         add(lbtitre, c); | ||||
|  | ||||
|         // -Position du contenu  | ||||
|         c.gridx = 0;  | ||||
|         c.gridy = 1;  | ||||
|         c.weightx = 1; | ||||
|         c.fill = GridBagConstraints.NONE; | ||||
|         add(lbcontenu, c); | ||||
|  | ||||
|         // - Menu contextuel (clic droit)  | ||||
|         menu = new JPopupMenu(); | ||||
|         itemOuvrir = new JMenuItem("Ouvrir"); | ||||
|         itemOuvrir.addActionListener(this); | ||||
|         menu.add(itemOuvrir); | ||||
|  | ||||
|         // - Activation des clics  | ||||
|         addMouseListener(this); | ||||
|     } | ||||
|  | ||||
|     // GETTERS | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Indique si le panneau est actuellement sélectionné. | ||||
|      * | ||||
|      * @return true si le panneau est sélectionné, false sinon | ||||
|      */ | ||||
|     public boolean getSelection() { | ||||
|         return estSelectionne; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Renvoie l’identifiant du rappel affiché. | ||||
|      * | ||||
|      * @return l’identifiant unique du rappel | ||||
|      */ | ||||
|     public int getId() { | ||||
|         return r.getId(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Renvoie le rappel associé à ce panneau. | ||||
|      * | ||||
|      * @return le rappel affiché dans ce panneau | ||||
|      */ | ||||
|     public Rappel getRappel() { | ||||
|         return r; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Gère les actions déclenchées par les éléments du menu contextuel. | ||||
|      * <p> | ||||
|      * Si l’utilisateur clique sur "Ouvrir", la fenêtre détaillée du rappel est affichée. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement d’action déclenché | ||||
|      */ | ||||
|     @Override | ||||
|     public void actionPerformed(ActionEvent e) { | ||||
|         Object src = e.getSource(); | ||||
|  | ||||
|         if (src == itemOuvrir) { | ||||
|             // ouverture complète depuis le menu clic droit | ||||
|             new FenetreRappel(r, main); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Gère les clics de souris sur le panneau. | ||||
|      * <p> | ||||
|      * Un clic gauche sélectionne/désélectionne le panneau,   | ||||
|      * tandis qu’un clic droit affiche le menu contextuel. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement de souris détecté | ||||
|      */ | ||||
|     @Override | ||||
|     public void mousePressed(MouseEvent e) { | ||||
|         if (e.isPopupTrigger()) { | ||||
|             menu.show(e.getComponent(), e.getX(), e.getY()); | ||||
|         } else { | ||||
|             // clic gauche = sélection / désélection | ||||
|             estSelectionne = !estSelectionne; | ||||
|             majApparence(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Gère la libération du clic de souris. | ||||
|      * <p> | ||||
|      * Si le clic est un clic droit, le menu contextuel s’affiche. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement de souris | ||||
|      */ | ||||
|     @Override | ||||
|     public void mouseReleased(MouseEvent e) { | ||||
|         if (e.isPopupTrigger()) { | ||||
|             menu.show(e.getComponent(), e.getX(), e.getY()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Gère les clics simples ou doubles sur le panneau. | ||||
|      * <p> | ||||
|      * Un double clic gauche ouvre la fenêtre de rappel complète. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param e l’événement de souris | ||||
|      */ | ||||
|     @Override | ||||
|     public void mouseClicked(MouseEvent e) { | ||||
|         // === Double clic pour ouvrir la vue complète === | ||||
|         if (e.getClickCount() == 2 && SwingUtilities.isLeftMouseButton(e)) { | ||||
|             new FenetreRappel(r, main); | ||||
|  | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Change l’apparence du panneau lorsque la souris entre dans sa zone. | ||||
|      * | ||||
|      * @param e l’événement de souris | ||||
|      */ | ||||
|     @Override | ||||
|     public void mouseEntered(MouseEvent e) { | ||||
|         setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Restaure la bordure du panneau lorsque la souris quitte sa zone. | ||||
|      * | ||||
|      * @param e l’événement de souris | ||||
|      */ | ||||
|     @Override | ||||
|     public void mouseExited(MouseEvent e) { | ||||
|         setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1)); | ||||
|          | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Met à jour l’apparence du panneau en fonction de son état de sélection. | ||||
|      * <p> | ||||
|      * Si le panneau est sélectionné, son fond devient gris clair | ||||
|      * et une bordure noire est appliquée.   | ||||
|      * Sinon, la couleur de fond correspond au thème du rappel. | ||||
|      * </p> | ||||
|      */ | ||||
|     private void majApparence() { | ||||
|         if (estSelectionne) { | ||||
|             setBackground(Color.LIGHT_GRAY); | ||||
|             setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); | ||||
|         } else { | ||||
|             setBackground(couleur.couleurDe(r.getTheme())); | ||||
|         } | ||||
|          | ||||
|     } | ||||
| } | ||||
							
								
								
									
										79
									
								
								src/fr/iutfbleau/papillon/Rappel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/fr/iutfbleau/papillon/Rappel.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>Rappel</code> représente un rappel utilisateur, | ||||
|  * avec un titre, un contenu, un thème et un rang de priorité. | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class Rappel { | ||||
|  | ||||
|     private int id; | ||||
|     private String titre; | ||||
|     private String contenu; | ||||
|     private String theme; | ||||
|     private int rang; | ||||
|  | ||||
|     /** Constructeur vide (utilisé notamment pour la lecture SQL). */ | ||||
|     public Rappel() {} | ||||
|  | ||||
|     /** | ||||
|      * Constructeur d’un nouveau rappel sans identifiant. | ||||
|      * | ||||
|      * @param titre le titre du rappel | ||||
|      * @param contenu le contenu ou la description | ||||
|      * @param theme la catégorie ou le thème du rappel | ||||
|      * @param rang la priorité ou l’ordre d’affichage | ||||
|      */ | ||||
|     public Rappel(String titre, String contenu, String theme, int rang) { | ||||
|         this(0, titre, contenu, theme, rang); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Constructeur complet avec identifiant. | ||||
|      * | ||||
|      * @param id l’identifiant du rappel | ||||
|      * @param titre le titre du rappel | ||||
|      * @param contenu le contenu | ||||
|      * @param theme le thème | ||||
|      * @param rang le rang de priorité | ||||
|      */ | ||||
|     public Rappel(int id, String titre, String contenu, String theme, int rang) { | ||||
|         this.id = id; | ||||
|         this.titre = titre; | ||||
|         this.contenu = contenu; | ||||
|         this.theme = theme; | ||||
|         this.rang = rang; | ||||
|     } | ||||
|  | ||||
|     /** @return l’identifiant du rappel */ | ||||
|     public int getId() { return id; } | ||||
|  | ||||
|     /** @param id définit l’identifiant du rappel */ | ||||
|     public void setId(int id) { this.id = id; } | ||||
|  | ||||
|     /** @return le titre du rappel */ | ||||
|     public String getTitre() { return titre; } | ||||
|  | ||||
|     /** @param titre définit le titre du rappel */ | ||||
|     public void setTitre(String titre) { this.titre = titre; } | ||||
|  | ||||
|     /** @return le contenu du rappel */ | ||||
|     public String getContenu() { return contenu; } | ||||
|  | ||||
|     /** @param contenu définit le contenu du rappel */ | ||||
|     public void setContenu(String contenu) { this.contenu = contenu; } | ||||
|  | ||||
|     /** @return le thème du rappel */ | ||||
|     public String getTheme() { return theme; } | ||||
|  | ||||
|     /** @param theme définit le thème du rappel */ | ||||
|     public void setTheme(String theme) { this.theme = theme; } | ||||
|  | ||||
|     /** @return le rang de priorité du rappel */ | ||||
|     public int getRang() { return rang; } | ||||
|  | ||||
|     /** @param rang définit le rang de priorité du rappel */ | ||||
|     public void setRang(int rang) { this.rang = rang; } | ||||
| } | ||||
							
								
								
									
										156
									
								
								src/fr/iutfbleau/papillon/RappelBD.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								src/fr/iutfbleau/papillon/RappelBD.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.sql.*; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>RappelBD</code> gère les interactions entre le programme | ||||
|  * et la table <b>rappel</b> dans la base de données.   | ||||
|  * <p> | ||||
|  * Elle permet d'ajouter, de modifier, de supprimer et de lister les rappels | ||||
|  * associés à un utilisateur spécifique à travers son identifiant (<code>utilisateur_id</code>). | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class RappelBD { | ||||
|  | ||||
|     /** | ||||
|      * Ajoute un nouveau rappel dans la base de données pour un utilisateur donné. | ||||
|      * | ||||
|      * @param r l'objet {@link Rappel} à insérer dans la base | ||||
|      * @param utilisateurId l'identifiant de l'utilisateur propriétaire du rappel | ||||
|      * @return l'identifiant du rappel nouvellement inséré, ou -1 en cas d'erreur | ||||
|      * @throws SQLException si une erreur survient lors de la communication avec la base | ||||
|      */ | ||||
|     protected static int ajouter(Rappel r, int utilisateurId) throws SQLException { | ||||
|         Connection cnx = BaseDeDonnees.getConnexion(); | ||||
|         String sql = "INSERT INTO rappel (utilisateur_id, titre, contenu, theme, rang) VALUES (?, ?, ?, ?, ?)"; | ||||
|  | ||||
|         PreparedStatement pst = cnx.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); | ||||
|         pst.setInt(1, utilisateurId); | ||||
|         pst.setString(2, r.getTitre()); | ||||
|         pst.setString(3, r.getContenu()); | ||||
|         pst.setString(4, r.getTheme()); | ||||
|         pst.setInt(5, r.getRang()); | ||||
|         pst.executeUpdate(); | ||||
|  | ||||
|         ResultSet rs = pst.getGeneratedKeys(); | ||||
|         int id = -1; | ||||
|         if (rs.next()) { | ||||
|             id = rs.getInt(1); | ||||
|         } | ||||
|  | ||||
|         rs.close(); | ||||
|         pst.close(); | ||||
|         cnx.close(); | ||||
|  | ||||
|         return id; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Récupère la liste complète des rappels appartenant à un utilisateur. | ||||
|      * | ||||
|      * @param utilisateurId l'identifiant de l'utilisateur | ||||
|      * @return une liste d'objets {@link Rappel} appartenant à cet utilisateur | ||||
|      * @throws SQLException si une erreur SQL survient lors de l'exécution | ||||
|      */ | ||||
|     protected static List<Rappel> listerParUtilisateur(int utilisateurId) throws SQLException { | ||||
|         String sql = "SELECT id, titre, contenu, theme, rang FROM rappel WHERE utilisateur_id = ? ORDER BY rang ASC, id ASC"; | ||||
|         List<Rappel> res = new ArrayList<>(); | ||||
|  | ||||
|         Connection cnx = BaseDeDonnees.getConnexion(); | ||||
|         PreparedStatement pst = cnx.prepareStatement(sql); | ||||
|         pst.setInt(1, utilisateurId); | ||||
|         ResultSet rs = pst.executeQuery(); | ||||
|  | ||||
|         while (rs.next()) { | ||||
|             Rappel r = new Rappel( | ||||
|                 rs.getInt("id"), | ||||
|                 rs.getString("titre"), | ||||
|                 rs.getString("contenu"), | ||||
|                 rs.getString("theme"), | ||||
|                 rs.getInt("rang") | ||||
|             ); | ||||
|             res.add(r); | ||||
|         } | ||||
|  | ||||
|         rs.close(); | ||||
|         pst.close(); | ||||
|         cnx.close(); | ||||
|  | ||||
|         return res; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Modifie un rappel existant dans la base de données. | ||||
|      * | ||||
|      * @param id l'identifiant du rappel à modifier | ||||
|      * @param r l'objet {@link Rappel} contenant les nouvelles données | ||||
|      * @param utilisateurId l'identifiant de l'utilisateur propriétaire du rappel | ||||
|      * @return le nombre de lignes modifiées (0 si aucun rappel n'a été trouvé) | ||||
|      * @throws SQLException si une erreur SQL survient | ||||
|      */ | ||||
|     protected static int modifier(int id, Rappel r, int utilisateurId) throws SQLException { | ||||
|         Connection cnx = BaseDeDonnees.getConnexion(); | ||||
|         String sql = "UPDATE rappel SET titre = ?, contenu = ?, theme = ?, rang = ? WHERE id = ? AND utilisateur_id = ?"; | ||||
|         PreparedStatement pst = cnx.prepareStatement(sql); | ||||
|         pst.setString(1, r.getTitre()); | ||||
|         pst.setString(2, r.getContenu()); | ||||
|         pst.setString(3, r.getTheme()); | ||||
|         pst.setInt(4, r.getRang()); | ||||
|         pst.setInt(5, id); | ||||
|         pst.setInt(6, utilisateurId); | ||||
|  | ||||
|         int res = pst.executeUpdate(); | ||||
|  | ||||
|         pst.close(); | ||||
|         cnx.close(); | ||||
|  | ||||
|         return res; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Supprime un rappel spécifique appartenant à un utilisateur. | ||||
|      * | ||||
|      * @param id l'identifiant du rappel à supprimer | ||||
|      * @param utilisateurId l'identifiant de l'utilisateur propriétaire | ||||
|      * @return le nombre de lignes supprimées (0 si aucun rappel correspondant) | ||||
|      * @throws SQLException si une erreur SQL survient | ||||
|      */ | ||||
|     protected static int supprimer(int id, int utilisateurId) throws SQLException { | ||||
|         Connection cnx = BaseDeDonnees.getConnexion(); | ||||
|         String sql = "DELETE FROM rappel WHERE id = ? AND utilisateur_id = ?"; | ||||
|         PreparedStatement pst = cnx.prepareStatement(sql); | ||||
|         pst.setInt(1, id); | ||||
|         pst.setInt(2, utilisateurId); | ||||
|  | ||||
|         int res = pst.executeUpdate(); | ||||
|  | ||||
|         pst.close(); | ||||
|         cnx.close(); | ||||
|  | ||||
|         return res; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Supprime tous les rappels appartenant à un utilisateur spécifique. | ||||
|      * | ||||
|      * @param utilisateurId l'identifiant de l'utilisateur dont les rappels doivent être supprimés | ||||
|      * @return le nombre total de lignes supprimées | ||||
|      * @throws SQLException si une erreur SQL survient | ||||
|      */ | ||||
|     protected static int supprimerToutPourUtilisateur(int utilisateurId) throws SQLException { | ||||
|         Connection cnx = BaseDeDonnees.getConnexion(); | ||||
|         String sql = "DELETE FROM rappel WHERE utilisateur_id = ?"; | ||||
|         PreparedStatement pst = cnx.prepareStatement(sql); | ||||
|         pst.setInt(1, utilisateurId); | ||||
|         int lignes = pst.executeUpdate(); | ||||
|  | ||||
|         pst.close(); | ||||
|         cnx.close(); | ||||
|         return lignes; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								src/fr/iutfbleau/papillon/Start.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/fr/iutfbleau/papillon/Start.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>Start</code> constitue le point d’entrée principal | ||||
|  * de l’application <b>Papillon</b>. | ||||
|  * <p> | ||||
|  * Elle initialise la fenêtre principale et lance l’interface graphique | ||||
|  * de l’application. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class Start{ | ||||
|      | ||||
|     /** | ||||
|      * Méthode principale exécutée au démarrage du programme. | ||||
|      * <p> | ||||
|      * Crée une instance de la fenêtre principale (<code>Main</code>) | ||||
|      * et l’affiche à l’écran. | ||||
|      * </p> | ||||
|      * | ||||
|      * @param args les arguments passés en ligne de commande (non utilisés) | ||||
|      */ | ||||
|     public static void main(String[] args) { | ||||
|         Main f = new Main(); | ||||
|         f.setVisible(true); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										104
									
								
								src/fr/iutfbleau/papillon/UserKey.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								src/fr/iutfbleau/papillon/UserKey.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.util.UUID; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>UserKey</code> permet de gérer une clé d'identification locale | ||||
|  * unique pour un utilisateur du logiciel <b>Papillon</b>. | ||||
|  * | ||||
|  * <p> | ||||
|  * Cette clé est stockée dans un fichier caché nommé <code>.papillon_id</code> | ||||
|  * dans le répertoire personnel de l'utilisateur.   | ||||
|  * Elle sert à identifier l'utilisateur sans avoir besoin de système de connexion | ||||
|  * ou d'authentification centralisée. | ||||
|  * </p> | ||||
|  * | ||||
|  * <p> | ||||
|  * Lors du premier lancement du programme, si le fichier n’existe pas ou est vide, | ||||
|  * une clé unique (UUID) est automatiquement générée, enregistrée dans ce fichier | ||||
|  * et réutilisée pour les prochaines exécutions. | ||||
|  * </p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class UserKey { | ||||
|  | ||||
|     /** | ||||
|      * Lit la clé stockée dans le fichier <code>~/.papillon_id</code> | ||||
|      * ou en génère une nouvelle si le fichier n'existe pas ou est vide. | ||||
|      * | ||||
|      * <p>Cette méthode est utilisée par {@link GestionRappel} pour associer | ||||
|      * chaque utilisateur à ses données locales.</p> | ||||
|      * | ||||
|      * @return une chaîne de caractères représentant la clé unique de l'utilisateur | ||||
|      */ | ||||
|     protected static String lireOuCreerCle() { | ||||
|         // Récupère le dossier personnel de l’utilisateur | ||||
|         String home = System.getProperty("user.home"); | ||||
|         File fichier = new File(home, ".papillon_id"); | ||||
|         String cle = ""; | ||||
|  | ||||
|         try { | ||||
|             // Si le fichier existe déjà on lit son contenu | ||||
|             if (fichier.exists()) { | ||||
|                 if (fichier.length() == 0) { | ||||
|                     cle = genererCle(); // Génère une clé unique | ||||
|                     ecrireCle(fichier, cle); | ||||
|                     System.out.println("Le fichier de clé est vide. Génération d'une nouvelle clé."); | ||||
|                 } | ||||
|  | ||||
|                 FileReader fr = new FileReader(fichier); | ||||
|                 BufferedReader br = new BufferedReader(fr); | ||||
|                 cle = br.readLine();  // lit la première ligne (la clé) | ||||
|                 br.close(); | ||||
|                 fr.close(); | ||||
|  | ||||
|                 System.out.println("Clé existante trouvée : " + cle); | ||||
|             } | ||||
|             // Sinon, on génère une nouvelle clé et on l’écrit dans le fichier | ||||
|             else { | ||||
|                 cle = genererCle(); | ||||
|                 ecrireCle(fichier, cle); | ||||
|                 System.out.println("Nouvelle clé générée et enregistrée : " + cle); | ||||
|             } | ||||
|  | ||||
|         } catch (IOException e) { | ||||
|             System.err.println("Erreur lors de la lecture/écriture du fichier de clé : " + e.getMessage()); | ||||
|         } | ||||
|  | ||||
|         return cle; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Génère une nouvelle clé unique sous la forme d'un identifiant universel (UUID). | ||||
|      * | ||||
|      * <p>Cette méthode utilise la classe {@link java.util.UUID} pour générer | ||||
|      * une chaîne aléatoire unique et pratiquement impossible à deviner.</p> | ||||
|      * | ||||
|      * @return une chaîne aléatoire unique représentant une clé utilisateur | ||||
|      */ | ||||
|     private static String genererCle() { | ||||
|         return UUID.randomUUID().toString(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Écrit une clé donnée dans un fichier texte. | ||||
|      * | ||||
|      * <p>Cette méthode crée le fichier s’il n’existe pas, puis enregistre | ||||
|      * la clé passée en paramètre sur la première ligne du fichier.</p> | ||||
|      * | ||||
|      * @param fichier le fichier dans lequel écrire la clé | ||||
|      * @param cle la clé à sauvegarder dans le fichier | ||||
|      * @throws IOException si une erreur survient lors de l’écriture | ||||
|      */ | ||||
|     private static void ecrireCle(File fichier, String cle) throws IOException { | ||||
|         FileWriter fw = new FileWriter(fichier); | ||||
|         BufferedWriter bw = new BufferedWriter(fw); | ||||
|         bw.write(cle); | ||||
|         bw.newLine(); | ||||
|         bw.close(); | ||||
|         fw.close(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										52
									
								
								src/fr/iutfbleau/papillon/Utilisateur.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/fr/iutfbleau/papillon/Utilisateur.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>Utilisateur</code> représente un utilisateur unique | ||||
|  * du logiciel Papillon, identifié par une clé locale. | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane Yolou, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class Utilisateur { | ||||
|  | ||||
|     private int id; | ||||
|     private String cle; | ||||
|  | ||||
|     /** | ||||
|      * Constructeur complet d’un utilisateur. | ||||
|      * | ||||
|      * @param id l’identifiant de l’utilisateur | ||||
|      * @param cle la clé unique d’identification | ||||
|      */ | ||||
|     public Utilisateur(int id, String cle) { | ||||
|         this.id = id; | ||||
|         this.cle = cle; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Constructeur d’un utilisateur à partir de sa clé uniquement. | ||||
|      * | ||||
|      * @param cle la clé unique d’identification | ||||
|      */ | ||||
|     public Utilisateur(String cle) { | ||||
|         this.cle = cle; | ||||
|     } | ||||
|  | ||||
|     /** @return l’identifiant de l’utilisateur */ | ||||
|     public int getId() { return id; } | ||||
|  | ||||
|     /** @param id définit l’identifiant de l’utilisateur */ | ||||
|     public void setId(int id) { this.id = id; } | ||||
|  | ||||
|     /** @return la clé unique de l’utilisateur */ | ||||
|     public String getCle() { return cle; } | ||||
|  | ||||
|     /** @param cle définit la clé unique de l’utilisateur */ | ||||
|     public void setCle(String cle) { this.cle = cle; } | ||||
|  | ||||
|     /** @return une représentation textuelle de l’utilisateur */ | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "Utilisateur [id=" + id + ", cle=" + cle + "]"; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										84
									
								
								src/fr/iutfbleau/papillon/UtilisateurBD.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/fr/iutfbleau/papillon/UtilisateurBD.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| package fr.iutfbleau.papillon; | ||||
|  | ||||
| import java.sql.*; | ||||
|  | ||||
| /** | ||||
|  * La classe <code>UtilisateurBD</code> gère la table <b>utilisateur</b> | ||||
|  * de la base de données.   | ||||
|  * <p>Elle permet de créer ou de récupérer un utilisateur à partir d’une clé locale, | ||||
|  * et de lire un utilisateur complet via sa clé.</p> | ||||
|  * | ||||
|  * @version 1.0 | ||||
|  * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL | ||||
|  */ | ||||
| public class UtilisateurBD { | ||||
|  | ||||
|     /** Identifiant interne de l’utilisateur. */ | ||||
|     private static int id; | ||||
|  | ||||
|     /** | ||||
|      * Récupère ou crée un utilisateur en fonction de sa clé unique. | ||||
|      * | ||||
|      * @param cle la clé unique associée à l’utilisateur | ||||
|      * @return l’identifiant de l’utilisateur correspondant | ||||
|      * @throws SQLException si une erreur SQL survient | ||||
|      */ | ||||
|     public static int getOrCreateIdByKey(String cle) throws SQLException { | ||||
|         Connection cnx = BaseDeDonnees.getConnexion(); | ||||
|  | ||||
|         // Vérifie si un utilisateur existe déjà avec cette clé | ||||
|         String sqlSelect = "SELECT id FROM utilisateur WHERE cle = ?"; | ||||
|         PreparedStatement pstSelect = cnx.prepareStatement(sqlSelect); | ||||
|         pstSelect.setString(1, cle); | ||||
|         ResultSet rs = pstSelect.executeQuery(); | ||||
|  | ||||
|         if (rs.next()) { | ||||
|             id = rs.getInt("id"); | ||||
|         } else { | ||||
|             // Sinon on en crée un nouveau | ||||
|             String sqlInsert = "INSERT INTO utilisateur (cle) VALUES (?)"; | ||||
|             PreparedStatement pstInsert = cnx.prepareStatement(sqlInsert, Statement.RETURN_GENERATED_KEYS); | ||||
|             pstInsert.setString(1, cle); | ||||
|             pstInsert.executeUpdate(); | ||||
|  | ||||
|             ResultSet keys = pstInsert.getGeneratedKeys(); | ||||
|             if (keys.next()) { | ||||
|                 id = keys.getInt(1); | ||||
|             } | ||||
|  | ||||
|             keys.close(); | ||||
|             pstInsert.close(); | ||||
|         } | ||||
|  | ||||
|         rs.close(); | ||||
|         pstSelect.close(); | ||||
|         cnx.close(); | ||||
|  | ||||
|         return id; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Récupère un utilisateur complet à partir de sa clé. | ||||
|      * | ||||
|      * @param cle la clé unique de l’utilisateur | ||||
|      * @return un objet {@link Utilisateur} si trouvé, sinon <code>null</code> | ||||
|      * @throws SQLException si une erreur SQL survient | ||||
|      */ | ||||
|     public static Utilisateur findByKey(String cle) throws SQLException { | ||||
|         Connection cnx = BaseDeDonnees.getConnexion(); | ||||
|         String sql = "SELECT id, cle FROM utilisateur WHERE cle = ?"; | ||||
|         PreparedStatement pst = cnx.prepareStatement(sql); | ||||
|         pst.setString(1, cle); | ||||
|         ResultSet rs = pst.executeQuery(); | ||||
|  | ||||
|         Utilisateur u = null; | ||||
|         if (rs.next()) { | ||||
|             u = new Utilisateur(rs.getInt("id"), rs.getString("cle")); | ||||
|         } | ||||
|  | ||||
|         rs.close(); | ||||
|         pst.close(); | ||||
|         cnx.close(); | ||||
|         return u; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user