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