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