diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f327c55 --- /dev/null +++ b/Makefile @@ -0,0 +1,373 @@ +# COMMANDES # +JAVAC = javac +# note $$ to get a single shell $ +JAVAC_OPTIONS = -implicit:none -d build -classpath "res/mariadb-client.jar:build" -sourcepath src +JAVA = java +JAR = jar +EXEC_JAR = ${JAVA} -jar + +# CHEMINS RELATIFS +SRC = src/fr/iutfbleau/projetIHM2022FI2 +BUILD = build/fr/iutfbleau/projetIHM2022FI2 +DOC = doc/fr/iutfbleau/projetIHM2022FI2 + +# CHOIX NOMS +JAR_MNP = IHM.jar + +# BUTS FACTICES # +.PHONY : run clean doc + +# BUT PAR DEFAUT # +run : build\ + ${JAR_MNP} + ${EXEC_JAR} ${JAR_MNP} + +# AUTRE BUTS +doc : + javadoc -d doc src/fr/iutfbleau/projetIHM2022FI2/API/*.java src/fr/iutfbleau/projetIHM2022FI2/MP/*.java src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/*.java src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/*.java src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/Controller/*.java src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/*.java src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/Model/*.java src/fr/iutfbleau/projetIHM2022FI2/ROOT/Model/*.java src/fr/iutfbleau/projetIHM2022FI2/PROF/Model/*.java src/fr/iutfbleau/projetIHM2022FI2/PROF/View/*.java src/fr/iutfbleau/projetIHM2022FI2/PROF/Controller/*.java + javadoc -d doc src/fr/iutfbleau/projetIHM2022FI2/API/*.java src/fr/iutfbleau/projetIHM2022FI2/MNP/*.java src/fr/iutfbleau/projetIHM2022FI2/MNP/ROOT/Controller/*.java src/fr/iutfbleau/projetIHM2022FI2/MNP/ROOT/View/*.java src/fr/iutfbleau/projetIHM2022FI2/MNP/ETU/Controller/*.java src/fr/iutfbleau/projetIHM2022FI2/MNP/ETU/View/*.java src/fr/iutfbleau/projetIHM2022FI2/MNP/ETU/Model/*.java src/fr/iutfbleau/projetIHM2022FI2/ROOT/Model/*.java src/fr/iutfbleau/projetIHM2022FI2/PROF/Model/*.java src/fr/iutfbleau/projetIHM2022FI2/PROF/View/*.java src/fr/iutfbleau/projetIHM2022FI2/PROF/Controller/*.java +clean : + rm -rf ${BUILD}/* *.jar + + +# REGLES DE DEPENDANCE # +## Dossier ## +build : + mkdir build +## API ## +${BUILD}/API/Model.class : ${SRC}/API/Model.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Model.java + +${BUILD}/API/MonPrint.class : ${SRC}/API/MonPrint.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/MonPrint.java + +${BUILD}/API/TypeGroupe.class : ${SRC}/API/TypeGroupe.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/TypeGroupe.java + +${BUILD}/API/Groupe.class : ${SRC}/API/Groupe.java \ + ${BUILD}/API/TypeGroupe.class\ + ${BUILD}/API/MonPrint.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Groupe.java + +${BUILD}/API/Etudiant.class : ${SRC}/API/Etudiant.java \ + ${BUILD}/API/MonPrint.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Etudiant.java + +${BUILD}/API/Changement.class : ${SRC}/API/Changement.java \ + ${BUILD}/API/Etudiant.class \ + ${BUILD}/API/Groupe.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/Changement.java + +${BUILD}/API/AbstractGroupeFactory.class : ${SRC}/API/AbstractGroupeFactory.java \ + ${BUILD}/API/Groupe.class \ + ${BUILD}/API/Etudiant.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/AbstractGroupeFactory.java + +${BUILD}/API/AbstractChangementFactory.class : ${SRC}/API/AbstractChangementFactory.java \ + ${BUILD}/API/AbstractGroupeFactory.class \ + ${BUILD}/API/Changement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/API/AbstractChangementFactory.java + +## MP ## + +${BUILD}/MP/EtudiantNP.class : ${SRC}/MP/EtudiantNP.java \ + ${BUILD}/API/Etudiant.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/EtudiantNP.java + + +${BUILD}/MP/GroupeNP.class : ${SRC}/MP/GroupeNP.java \ + ${BUILD}/API/Groupe.class \ + ${BUILD}/API/TypeGroupe.class \ + ${BUILD}/API/Etudiant.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/GroupeNP.java + + +${BUILD}/MP/ChangementNP.class : ${BUILD}/API/Changement.class \ + ${SRC}/MP/ChangementNP.java \ + ${BUILD}/API/Groupe.class \ + ${BUILD}/API/Etudiant.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ChangementNP.java + +${BUILD}/MP/AbstractGroupeFactoryNP.class : ${SRC}/MP/AbstractGroupeFactoryNP.java \ + ${BUILD}/API/AbstractGroupeFactory.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/AbstractGroupeFactoryNP.java + +${BUILD}/MP/AbstractChangementFactoryNP.class : ${SRC}/MP/AbstractChangementFactoryNP.java \ + ${BUILD}/API/AbstractChangementFactory.class \ + ${BUILD}/API/Changement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/AbstractChangementFactoryNP.java + + + +## ROOT ## + + +## View ## + +${BUILD}/MP/ROOT/View/FindBarFenetre.class : ${SRC}/MP/ROOT/View/FindBarFenetre.java\ + ${BUILD}/MP/ROOT/Controller/ListenerFindBar.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/View/FindBarFenetre.java + + +${BUILD}/MP/ROOT/View/FenetreChangement.class : ${SRC}/MP/ROOT/View/FenetreChangement.java \ + ${BUILD}/MP/ROOT/Controller/ActionChangement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/View/FenetreChangement.java + +${BUILD}/MP/ROOT/View/FenetreGroupe.class : ${SRC}/MP/ROOT/View/FenetreGroupe.java \ + ${BUILD}/Permanent/Controller/ObservateurFenetre.class \ + ${BUILD}/Permanent/Controller/ObservateurChangeGroupe.class \ + ${BUILD}/MP/ROOT/Controller/ObservateurModifGroupe.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/View/FenetreGroupe.java + +${BUILD}/MP/ROOT/View/FenetreEtudiant.class :${SRC}/MP/ROOT/View/FenetreEtudiant.java \ + ${BUILD}/Permanent/Controller/ObservateurFenetre.class \ + ${BUILD}/Permanent/Controller/ObservateurChangeGroupe.class \ + ${BUILD}/MP/ROOT/View/PanelEtudiant.class \ + ${BUILD}/Permanent/Controller/ActionListenerChangeEtu.class \ + ${BUILD}/MP/ROOT/Controller/ActionListChange.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/View/FenetreEtudiant.java + +${BUILD}/MP/ROOT/View/PanelEtudiant.class : ${SRC}/MP/ROOT/View/PanelEtudiant.java \ + ${BUILD}/MP/ROOT/Controller/ActionListenerSuprEtu.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/View/PanelEtudiant.java + + +${BUILD}/MP/ROOT/View/FenetreSelectionEtu.class : ${SRC}/MP/ROOT/View/FenetreSelectionEtu.java \ + ${BUILD}/MP/ROOT/Controller/SelecteurEtudiant.class \ + ${BUILD}/MP/ROOT/Controller/ActionListenerNouveauEtu.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/View/FenetreSelectionEtu.java + + +## Controller ## +${BUILD}/MP/ROOT/Controller/ListenerFindBar.class : ${SRC}/MP/ROOT/Controller/ListenerFindBar.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Controller/ListenerFindBar.java + + +${BUILD}/MP/ROOT/Controller/ActionListenerSuprEtu.class : ${SRC}/MP/ROOT/Controller/ActionListenerSuprEtu.java \ + ${BUILD}/API/Etudiant.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Controller/ActionListenerSuprEtu.java + +${BUILD}/MP/ROOT/Controller/ActionChangement.class : ${SRC}/MP/ROOT/Controller/ActionChangement.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Controller/ActionChangement.java + +${BUILD}/MP/ROOT/Controller/ObservateurModifGroupe.class : ${SRC}/MP/ROOT/Controller/ObservateurModifGroupe.java \ + ${BUILD}/MP/ROOT/View/FenetreSelectionEtu.class \ + ${BUILD}/MP/ROOT/Controller/SelecteurEtudiant.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Controller/ObservateurModifGroupe.java + +${BUILD}/MP/ROOT/Controller/SelecteurEtudiant.class : ${SRC}/MP/ROOT/Controller/SelecteurEtudiant.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Controller/SelecteurEtudiant.java + +${BUILD}/MP/ROOT/Controller/ActionListenerNouveauEtu.class : ${SRC}/MP/ROOT/Controller/ActionListenerNouveauEtu.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Controller/ActionListenerNouveauEtu.java + +${BUILD}/MP/ROOT/Controller/ActionListChange.class : ${SRC}/MP/ROOT/Controller/ActionListChange.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Controller/ActionListChange.java + +##.... + + +##  Model ### + +${BUILD}/MP/ROOT/Model/ModelRoot.class : ${SRC}/MP/ROOT/Model/ModelRoot.java \ + ${BUILD}/API/Model.class \ + ${BUILD}/MP/ROOT/View/FenetreGroupe.class \ + ${BUILD}/MP/ROOT/View/FenetreEtudiant.class \ + ${BUILD}/Permanent/View/Chargement.class \ + ${BUILD}/MP/ROOT/View/FenetreChangement.class \ + ${BUILD}/MP/ROOT/View/FindBarFenetre.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ROOT/Model/ModelRoot.java + + + + + + +## ETU ## + + +## View ## + +${BUILD}/MP/ETU/View/FenetreGroupe.class : ${SRC}/MP/ETU/View/FenetreGroupe.java \ + ${BUILD}/Permanent/Controller/ObservateurFenetre.class \ + ${BUILD}/Permanent/Controller/ObservateurChangeGroupe.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ETU/View/FenetreGroupe.java + +${BUILD}/MP/ETU/View/FenetreEtudiant.class :${SRC}/MP/ETU/View/FenetreEtudiant.java \ + ${BUILD}/Permanent/Controller/ObservateurFenetre.class \ + ${BUILD}/Permanent/Controller/ObservateurChangeGroupe.class \ + ${BUILD}/MP/ETU/View/PanelEtudiant.class \ + ${BUILD}/Permanent/Controller/ActionListenerChangeEtu.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ETU/View/FenetreEtudiant.java + +${BUILD}/MP/ETU/View/PanelEtudiant.class : ${SRC}/MP/ETU/View/PanelEtudiant.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ETU/View/PanelEtudiant.java + + + +## Controller ## + + + +##.... + + +##  Model ### + +${BUILD}/MP/ETU/Model/ModelEtu.class : ${SRC}/MP/ETU/Model/ModelEtu.java \ + ${BUILD}/API/Model.class \ + ${BUILD}/MP/ETU/View/FenetreGroupe.class \ + ${BUILD}/MP/ETU/View/FenetreEtudiant.class \ + ${BUILD}/Permanent/View/Chargement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/ETU/Model/ModelEtu.java + + +## PROF ## + + +## View ## + +${BUILD}/MP/PROF/View/FenetreGroupe.class : ${SRC}/MP/PROF/View/FenetreGroupe.java \ + ${BUILD}/Permanent/Controller/ObservateurFenetre.class \ + ${BUILD}/Permanent/Controller/ObservateurChangeGroupe.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/PROF/View/FenetreGroupe.java + +${BUILD}/MP/PROF/View/FenetreEtudiant.class :${SRC}/MP/PROF/View/FenetreEtudiant.java \ + ${BUILD}/Permanent/Controller/ObservateurChangeGroupe.class \ + ${BUILD}/MP/PROF/View/PanelEtudiant.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/PROF/View/FenetreEtudiant.java + +${BUILD}/MP/PROF/View/PanelEtudiant.class : ${SRC}/MP/PROF/View/PanelEtudiant.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/PROF/View/PanelEtudiant.java + + + +## Controller ## + + + +##.... + + +##  Model ### + +${BUILD}/MP/PROF/Model/ModelProf.class : ${SRC}/MP/PROF/Model/ModelProf.java \ + ${BUILD}/API/Model.class \ + ${BUILD}/MP/PROF/View/FenetreGroupe.class \ + ${BUILD}/MP/PROF/View/FenetreEtudiant.class \ + ${BUILD}/Permanent/View/Chargement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MP/PROF/Model/ModelProf.java + + + +## MNP ## + +${BUILD}/MNP/AbstractGroupeFactoryNP.class : ${SRC}/MNP/AbstractGroupeFactoryNP.java \ + ${BUILD}/API/AbstractGroupeFactory.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MNP/AbstractGroupeFactoryNP.java + +${BUILD}/MNP/AbstractChangementFactoryNP.class : ${SRC}/MNP/AbstractChangementFactoryNP.java \ + ${BUILD}/API/AbstractChangementFactory.class \ + ${BUILD}/API/Changement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MNP/AbstractChangementFactoryNP.java + + +## ROOT ## + + +##  Model ### + +${BUILD}/MNP/ROOT/Model/ModelRoot.class : ${SRC}/MNP/ROOT/Model/ModelRoot.java \ + ${BUILD}/API/Model.class \ + ${BUILD}/MP/ROOT/View/FenetreGroupe.class \ + ${BUILD}/MP/ROOT/View/FenetreEtudiant.class \ + ${BUILD}/Permanent/View/Chargement.class \ + ${BUILD}/MP/ROOT/View/FenetreChangement.class \ + ${BUILD}/MP/ROOT/View/FindBarFenetre.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MNP/ROOT/Model/ModelRoot.java + + +## ETU ## + + + +##  Model ### + +${BUILD}/MNP/ETU/Model/ModelEtu.class : ${SRC}/MNP/ETU/Model/ModelEtu.java \ + ${BUILD}/API/Model.class \ + ${BUILD}/MP/ETU/View/FenetreGroupe.class \ + ${BUILD}/MP/ETU/View/FenetreEtudiant.class \ + ${BUILD}/Permanent/View/Chargement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MNP/ETU/Model/ModelEtu.java + + +## PROF ## + + + +##  Model ### + +${BUILD}/MNP/PROF/Model/ModelProf.class : ${SRC}/MNP/PROF/Model/ModelProf.java \ + ${BUILD}/API/Model.class \ + ${BUILD}/MP/PROF/View/FenetreGroupe.class \ + ${BUILD}/MP/PROF/View/FenetreEtudiant.class \ + ${BUILD}/Permanent/View/Chargement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/MNP/PROF/Model/ModelProf.java + + +##... FIN MNP ## + +## Permanent ## + + ${BUILD}/Permanent/Connexion.class : ${SRC}/Permanent/Connexion.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/View/Connexion.java + + ${BUILD}/Permanent/IHM.class : ${SRC}/Permanent/IHM.java \ + ${BUILD}/MP/EtudiantNP.class \ + ${BUILD}/MP/GroupeNP.class \ + ${BUILD}/MP/ChangementNP.class \ + ${BUILD}/MP/AbstractGroupeFactoryNP.class \ + ${BUILD}/MP/AbstractChangementFactoryNP.class \ + ${BUILD}/MP/ROOT/Model/ModelRoot.class \ + ${BUILD}/MP/ETU/Model/ModelEtu.class \ + ${BUILD}/MP/PROF/Model/ModelProf.class \ + ${BUILD}/MNP/AbstractGroupeFactoryNP.class \ + ${BUILD}/MNP/AbstractChangementFactoryNP.class \ + ${BUILD}/MNP/ROOT/Model/ModelRoot.class \ + ${BUILD}/MNP/ETU/Model/ModelEtu.class \ + ${BUILD}/MNP/PROF/Model/ModelProf.class \ + ${BUILD}/Permanent/View/Connexion.class \ + ${BUILD}/Permanent/Util/User.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/IHM.java +## View ## + +${BUILD}/Permanent/View/Chargement.class : ${SRC}/Permanent/View/Chargement.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent//View/Chargement.java + +${BUILD}/Permanent/View/Connexion.class : ${SRC}/Permanent/View/Connexion.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/View/Connexion.java + +## Util  ## + +${BUILD}/Permanent/Util/User.class : ${SRC}/Permanent/Util/User.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/Util/User.java + +## Controller ## + +${BUILD}/Permanent/Controller/ObservateurFenetre.class : ${SRC}/Permanent/Controller/ObservateurFenetre.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/Controller/ObservateurFenetre.java + +${BUILD}/Permanent/Controller/ObservateurChangeGroupe.class : ${SRC}/Permanent/Controller/ObservateurChangeGroupe.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/Controller/ObservateurChangeGroupe.java + +${BUILD}/Permanent/Controller/ActionListenerChangeEtu.class : ${SRC}/Permanent/Controller/ActionListenerChangeEtu.java \ + ${BUILD}/Permanent/Controller/ControllerGroupeBChangement.class + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/Controller/ActionListenerChangeEtu.java + +${BUILD}/Permanent/Controller/ControllerGroupeBChangement.class : ${SRC}/Permanent/Controller/ControllerGroupeBChangement.java + ${JAVAC} ${JAVAC_OPTIONS} ${SRC}/Permanent/Controller/ControllerGroupeBChangement.java + +# ## JARS ## + + ${JAR_MNP} : ${BUILD}/Permanent/IHM.class + ${JAR} cfme ${JAR_MNP} Manifest.txt fr/iutfbleau/projetIHM2022FI2/Permanent/IHM res/ -C build fr diff --git a/Manifest.txt b/Manifest.txt new file mode 100644 index 0000000..b9f8abb --- /dev/null +++ b/Manifest.txt @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: res/mariadb-client.jar +Created-By: 1.7.0_06 (Oracle Corporation) \ No newline at end of file diff --git a/doc/allclasses-frame.html b/doc/allclasses-frame.html new file mode 100644 index 0000000..6ad2b37 --- /dev/null +++ b/doc/allclasses-frame.html @@ -0,0 +1,30 @@ + + + + + +All Classes + + + + + +

All Classes

+
+ +
+ + diff --git a/doc/allclasses-noframe.html b/doc/allclasses-noframe.html new file mode 100644 index 0000000..e8ae56d --- /dev/null +++ b/doc/allclasses-noframe.html @@ -0,0 +1,30 @@ + + + + + +All Classes + + + + + +

All Classes

+
+ +
+ + diff --git a/doc/constant-values.html b/doc/constant-values.html new file mode 100644 index 0000000..508445c --- /dev/null +++ b/doc/constant-values.html @@ -0,0 +1,122 @@ + + + + + +Constant Field Values + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Constant Field Values

+

Contents

+
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/deprecated-list.html b/doc/deprecated-list.html new file mode 100644 index 0000000..6c07c71 --- /dev/null +++ b/doc/deprecated-list.html @@ -0,0 +1,122 @@ + + + + + +Deprecated List + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Deprecated API

+

Contents

+
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.html new file mode 100644 index 0000000..03176c4 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.html @@ -0,0 +1,325 @@ + + + + + +AbstractChangementFactory + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.API
+

Interface AbstractChangementFactory

+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.html new file mode 100644 index 0000000..403c756 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.html @@ -0,0 +1,446 @@ + + + + + +AbstractGroupeFactory + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.API
+

Interface AbstractGroupeFactory

+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/Changement.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/Changement.html new file mode 100644 index 0000000..b8bb4b7 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/Changement.html @@ -0,0 +1,324 @@ + + + + + +Changement + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.API
+

Interface Changement

+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.html new file mode 100644 index 0000000..a040547 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.html @@ -0,0 +1,300 @@ + + + + + +Etudiant + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.API
+

Interface Etudiant

+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/Groupe.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/Groupe.html new file mode 100644 index 0000000..7c82028 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/Groupe.html @@ -0,0 +1,506 @@ + + + + + +Groupe + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.API
+

Interface Groupe

+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.html new file mode 100644 index 0000000..3863bf0 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.html @@ -0,0 +1,232 @@ + + + + + +MonPrint + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.API
+

Interface MonPrint

+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.html new file mode 100644 index 0000000..37e6eb8 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.html @@ -0,0 +1,351 @@ + + + + + +TypeGroupe + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.API
+

Enum TypeGroupe

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/package-frame.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/package-frame.html new file mode 100644 index 0000000..4b2cd52 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/package-frame.html @@ -0,0 +1,29 @@ + + + + + +fr.iutfbleau.projetIHM2022FI2.API + + + + + +

fr.iutfbleau.projetIHM2022FI2.API

+
+

Interfaces

+ +

Enums

+ +
+ + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/package-summary.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/package-summary.html new file mode 100644 index 0000000..cd0bce6 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/package-summary.html @@ -0,0 +1,188 @@ + + + + + +fr.iutfbleau.projetIHM2022FI2.API + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Package fr.iutfbleau.projetIHM2022FI2.API

+
+
+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/API/package-tree.html b/doc/fr/iutfbleau/projetIHM2022FI2/API/package-tree.html new file mode 100644 index 0000000..91e99c4 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/API/package-tree.html @@ -0,0 +1,151 @@ + + + + + +fr.iutfbleau.projetIHM2022FI2.API Class Hierarchy + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Hierarchy For Package fr.iutfbleau.projetIHM2022FI2.API

+Package Hierarchies: + +
+
+

Interface Hierarchy

+ +

Enum Hierarchy

+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractChangementFactoryNP.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractChangementFactoryNP.html new file mode 100644 index 0000000..7f9d87b --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractChangementFactoryNP.html @@ -0,0 +1,384 @@ + + + + + +AbstractChangementFactoryNP + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.MNP
+

Class AbstractChangementFactoryNP

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractGroupeFactoryNP.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractGroupeFactoryNP.html new file mode 100644 index 0000000..b9d5a80 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractGroupeFactoryNP.html @@ -0,0 +1,523 @@ + + + + + +AbstractGroupeFactoryNP + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.MNP
+

Class AbstractGroupeFactoryNP

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/ChangementNP.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/ChangementNP.html new file mode 100644 index 0000000..f02a0c9 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/ChangementNP.html @@ -0,0 +1,364 @@ + + + + + +ChangementNP + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.MNP
+

Class ChangementNP

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/EtudiantNP.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/EtudiantNP.html new file mode 100644 index 0000000..8bc63ee --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/EtudiantNP.html @@ -0,0 +1,340 @@ + + + + + +EtudiantNP + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.MNP
+

Class EtudiantNP

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/GroupeNP.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/GroupeNP.html new file mode 100644 index 0000000..8df93d9 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/GroupeNP.html @@ -0,0 +1,605 @@ + + + + + +GroupeNP + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+
fr.iutfbleau.projetIHM2022FI2.MNP
+

Class GroupeNP

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-frame.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-frame.html new file mode 100644 index 0000000..87bb233 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-frame.html @@ -0,0 +1,24 @@ + + + + + +fr.iutfbleau.projetIHM2022FI2.MNP + + + + + +

fr.iutfbleau.projetIHM2022FI2.MNP

+
+

Classes

+ +
+ + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-summary.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-summary.html new file mode 100644 index 0000000..3602d32 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-summary.html @@ -0,0 +1,167 @@ + + + + + +fr.iutfbleau.projetIHM2022FI2.MNP + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Package fr.iutfbleau.projetIHM2022FI2.MNP

+
+
+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-tree.html b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-tree.html new file mode 100644 index 0000000..3b39409 --- /dev/null +++ b/doc/fr/iutfbleau/projetIHM2022FI2/MNP/package-tree.html @@ -0,0 +1,139 @@ + + + + + +fr.iutfbleau.projetIHM2022FI2.MNP Class Hierarchy + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Hierarchy For Package fr.iutfbleau.projetIHM2022FI2.MNP

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/help-doc.html b/doc/help-doc.html new file mode 100644 index 0000000..701ee6c --- /dev/null +++ b/doc/help-doc.html @@ -0,0 +1,223 @@ + + + + + +API Help + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

How This API Document Is Organized

+
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
+
+
+ +This help file applies to API documentation generated using the standard doclet.
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/index-all.html b/doc/index-all.html new file mode 100644 index 0000000..1e53f59 --- /dev/null +++ b/doc/index-all.html @@ -0,0 +1,556 @@ + + + + + +Index + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
A C D E F G K M R T V  + + +

A

+
+
AbstractChangementFactory - Interface in fr.iutfbleau.projetIHM2022FI2.API
+
+
Usine abstraite gérant l'ensemble des changements.
+
+
AbstractChangementFactoryNP - Class in fr.iutfbleau.projetIHM2022FI2.MNP
+
+
Usine abstraite gérant l'ensemble des changements.
+
+
AbstractChangementFactoryNP(AbstractGroupeFactory) - Constructor for class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP
+
 
+
AbstractGroupeFactory - Interface in fr.iutfbleau.projetIHM2022FI2.API
+
+
Usine abstraite gérant l'ensemble des groupes.
+
+
AbstractGroupeFactoryNP - Class in fr.iutfbleau.projetIHM2022FI2.MNP
+
+
Usine abstraite gérant l'ensemble des groupes.
+
+
AbstractGroupeFactoryNP(String, int, int) - Constructor for class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
Le constructeur fabrique le groupe promotion vide.
+
+
addEtudiant(Etudiant) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
Ajoute un étudiant.
+
+
addEtudiant(Etudiant) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Ajoute un étudiant.
+
+
addSousGroupe(Groupe) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
Ajoute un sous-groupe.
+
+
addSousGroupe(Groupe) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Ajoute un sous-groupe.
+
+
addToGroupe(Groupe, Etudiant) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet d'ajouter un étudiant à un groupe.
+
+
addToGroupe(Groupe, Etudiant) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet d'ajouter un étudiant à un groupe.
+
+
applyChangement(Changement) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory
+
+
permet de mettre en oeuvre un changement connu de l'usine abstraite.
+
+
applyChangement(Changement) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP
+
+
permet de mettre en oeuvre un changement connu de l'usine abstraite.
+
+
+ + + +

C

+
+
Changement - Interface in fr.iutfbleau.projetIHM2022FI2.API
+
+
Une demande de changement de groupe + concerne un étudiant, qui est dans un groupe A et veut aller dans un groupe B.
+
+
ChangementNP - Class in fr.iutfbleau.projetIHM2022FI2.MNP
+
+
Une demande de changement de groupe + concerne un étudiant, qui est dans un groupe A et veut aller dans un groupe B.
+
+
ChangementNP(Groupe, Etudiant, Groupe) - Constructor for class fr.iutfbleau.projetIHM2022FI2.MNP.ChangementNP
+
 
+
createChangement(Groupe, Etudiant, Groupe) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory
+
+
permet d'ajouter un nouveau changement.
+
+
createChangement(Groupe, Etudiant, Groupe) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP
+
+
permet d'ajouter un nouveau changement.
+
+
createGroupe(Groupe, String, int, int) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet d'ajouter un groupe vide de type FREE comme sous-groupe d'un groupe donné.
+
+
createGroupe(Groupe, String, int, int) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet d'ajouter un groupe vide de type FREE comme sous-groupe d'un groupe donné.
+
+
createPartition(Groupe, String, int) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet de créer une partition automatiquement sous un groupe donné.
+
+
createPartition(Groupe, String, int) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet de créer une partition automatiquement sous un groupe donné.
+
+
+ + + +

D

+
+
deleteChangement(Changement) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory
+
+
permet de supprimer un changement connu de l'usine abstraite.
+
+
deleteChangement(Changement) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP
+
+
permet de supprimer un changement connu de l'usine abstraite.
+
+
deleteGroupe(Groupe) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet de supprimer un groupe connu de l'usine abstraite qui ne contient pas de groupes.
+
+
deleteGroupe(Groupe) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet de supprimer un groupe connu de l'usine abstraite qui ne contient pas de groupes.
+
+
dropFromGroupe(Groupe, Etudiant) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet d'enlever un étudiant d'un groupe.
+
+
dropFromGroupe(Groupe, Etudiant) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet d'enlever un étudiant d'un groupe.
+
+
+ + + +

E

+
+
Etudiant - Interface in fr.iutfbleau.projetIHM2022FI2.API
+
+
Un étudiant
+
+
EtudiantNP - Class in fr.iutfbleau.projetIHM2022FI2.MNP
+
+
Un étudiant
+
+
EtudiantNP(String, String) - Constructor for class fr.iutfbleau.projetIHM2022FI2.MNP.EtudiantNP
+
+
Constructeur.
+
+
+ + + +

F

+
+
fr.iutfbleau.projetIHM2022FI2.API - package fr.iutfbleau.projetIHM2022FI2.API
+
 
+
fr.iutfbleau.projetIHM2022FI2.MNP - package fr.iutfbleau.projetIHM2022FI2.MNP
+
 
+
+ + + +

G

+
+
getA() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Changement
+
+
permet de récupérer le groupe de depart
+
+
getA() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.ChangementNP
+
+
permet de récupérer le groupe de depart
+
+
getAllChangements() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory
+
+
permet de récupérer les changements
+
+
getAllChangements() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP
+
+
permet de récupérer les changements
+
+
getB() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Changement
+
+
permet de récupérer le groupe d'arrivée
+
+
getB() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.ChangementNP
+
+
permet de récupérer le groupe d'arrivée
+
+
getEtu() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Changement
+
+
permet de récupérer l'étudiant demandant le changement
+
+
getEtu() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.ChangementNP
+
+
permet de récupérer l'étudiant demandant le changement
+
+
getEtudiants(String) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet de retrouver un étudiant à partir d'un String.
+
+
getEtudiants() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
Potentiellement "vide"
+
+
getEtudiants(String) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet de retrouver un étudiant à partir d'un String.
+
+
getEtudiants() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Potentiellement "vide" + Attention nous renvoyons l'ensemble sans le copier
+
+
getGroupeFactory() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory
+
+
permet de récupérer une usine abstraite pour les groupes qui fonctionne en tandem avec cette usine abstraite
+
+
getGroupeFactory() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP
+
+
permet de récupérer l'usine abstraite pour les groupes qui fonctionne en tandem avec cette usine abstraite
+
+
getGroupesOfEtudiant(Etudiant) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet de retrouver les groupes d'un étudiant.
+
+
getGroupesOfEtudiant(Etudiant) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet de retrouver les groupes d'un étudiant.
+
+
getId() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Changement
+
+
permet de récupérer l'identifiant du changement (référence interne sans intérêt irl).
+
+
getId() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Etudiant
+
+
permet de récupérer l'identifiant de l'étudiant.
+
+
getId() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
permet de récupérer l'identifiant d'un groupe (référence interne sans intérêt irl).
+
+
getId() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.ChangementNP
+
+
permet de récupérer l'identifiant du changement (référence interne sans intérêt irl).
+
+
getId() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.EtudiantNP
+
+
permet de récupérer l'identifiant de l'étudiant.
+
+
getId() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
permet de récupérer l'identifiant d'un groupe (référence interne sans intérêt irl).
+
+
getMax() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
permet de récupérer le nombre maximum d'étudiants souhaités dans un groupe.
+
+
getMax() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
permet de récupérer le nombre maximum d'étudiants souhaités dans un groupe.
+
+
getMin() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
permet de récupérer le nombre minimum d'étudiants souhaités dans le groupe.
+
+
getMin() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
permet de récupérer le nombre minimum d'étudiants souhaités dans le groupe.
+
+
getName() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
permet de récupérer le nom d'un groupe (utile irl).
+
+
getName() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
permet de récupérer le nom d'un groupe (utile irl).
+
+
getNom() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Etudiant
+
+
permet de récupérer
+
+
getNom() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.EtudiantNP
+
+
permet de récupérer
+
+
getPointPoint() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
permet de récupérer le groupe père + un groupe racine devrait retourner lui-même
+
+
getPointPoint() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
permet de récupérer le groupe père + un groupe racine devrait retourner lui-même
+
+
getPrenom() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Etudiant
+
+
permet de récupérer
+
+
getPrenom() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.EtudiantNP
+
+
permet de récupérer
+
+
getPromotion() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
permet de récupérer le Groupe qui contient les étudiants de toute la promotion
+
+
getPromotion() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
permet de récupérer le Groupe qui contient les étudiants de toute la promotion
+
+
getSize() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
permet de récupérer le nombre d'étudiants dans ce groupe.
+
+
getSize() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
permet de récupérer le nombre d'étudiants dans ce groupe.
+
+
getSousGroupes() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
Potentiellement "vide"
+
+
getSousGroupes() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Potentiellement "vide" + Attention nous renvoyons l'ensemble sans le copier
+
+
getType() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
permet de récupérer la nature du groupe
+
+
getType() - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
permet de récupérer la nature du groupe
+
+
Groupe - Interface in fr.iutfbleau.projetIHM2022FI2.API
+
+
Un groupe
+
+
GroupeNP - Class in fr.iutfbleau.projetIHM2022FI2.MNP
+
+
Un groupe
+
+
GroupeNP(String, int, int) - Constructor for class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Nouveau groupe vide de type ROOT sans étudiants, sans sous-Groupe
+
+
GroupeNP(Groupe, String, int, int) - Constructor for class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Nouveau groupe vide de type FREE sans étudiants, sans sous-Groupe
+
+
GroupeNP(Groupe) - Constructor for class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Nouveau groupe de type PARTITION dupliquant le groupe passé en paramètre (pour servir de racine à une partition de ce groupe de type FREE passé en paramètre).
+
+
+ + + +

K

+
+
knows(Groupe) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory
+
+
Test si le groupe g est connu de l'usine (connu maintenant).
+
+
knows(Groupe) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP
+
+
Test plutôt optimiste.
+
+
+ + + +

M

+
+
monPrint() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Changement
+
 
+
monPrint() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Etudiant
+
 
+
monPrint() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
 
+
MonPrint - Interface in fr.iutfbleau.projetIHM2022FI2.API
+
+
Toutes nos interfaces vont étendre cette interface.
+
+
monPrint() - Method in interface fr.iutfbleau.projetIHM2022FI2.API.MonPrint
+
+
Fonctionne comme ToPrint() sauf car une interface n'a pas le droit de faire un override sur ToPrint().
+
+
+ + + +

R

+
+
removeEtudiant(Etudiant) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
Enlève un étudiant.
+
+
removeEtudiant(Etudiant) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Enlève un étudiant.
+
+
removeSousGroupe(Groupe) - Method in interface fr.iutfbleau.projetIHM2022FI2.API.Groupe
+
+
Enlève un groupe.
+
+
removeSousGroupe(Groupe) - Method in class fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP
+
+
Enlève un groupe.
+
+
+ + + +

T

+
+
TypeGroupe - Enum in fr.iutfbleau.projetIHM2022FI2.API
+
 
+
+ + + +

V

+
+
valueOf(String) - Static method in enum fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe
+
+
Returns the enum constant of this type with the specified name.
+
+
values() - Static method in enum fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe
+
+
Returns an array containing the constants of this enum type, in +the order they are declared.
+
+
+A C D E F G K M R T V 
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..fb53118 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,75 @@ + + + + + +Generated Documentation (Untitled) + + + + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> + + + diff --git a/doc/overview-frame.html b/doc/overview-frame.html new file mode 100644 index 0000000..ef3a28b --- /dev/null +++ b/doc/overview-frame.html @@ -0,0 +1,22 @@ + + + + + +Overview List + + + + + +
All Classes
+
+

Packages

+ +
+

 

+ + diff --git a/doc/overview-summary.html b/doc/overview-summary.html new file mode 100644 index 0000000..b6e5d88 --- /dev/null +++ b/doc/overview-summary.html @@ -0,0 +1,137 @@ + + + + + +Overview + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+ + + + + + + + + + + + + + + + +
Packages 
PackageDescription
fr.iutfbleau.projetIHM2022FI2.API 
fr.iutfbleau.projetIHM2022FI2.MNP 
+
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/overview-tree.html b/doc/overview-tree.html new file mode 100644 index 0000000..1eda006 --- /dev/null +++ b/doc/overview-tree.html @@ -0,0 +1,164 @@ + + + + + +Class Hierarchy + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Hierarchy For All Packages

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +

Interface Hierarchy

+ +

Enum Hierarchy

+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/package-list b/doc/package-list new file mode 100644 index 0000000..8fcbc66 --- /dev/null +++ b/doc/package-list @@ -0,0 +1,2 @@ +fr.iutfbleau.projetIHM2022FI2.API +fr.iutfbleau.projetIHM2022FI2.MNP diff --git a/doc/script.js b/doc/script.js new file mode 100644 index 0000000..b346356 --- /dev/null +++ b/doc/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/doc/stylesheet.css b/doc/stylesheet.css new file mode 100644 index 0000000..98055b2 --- /dev/null +++ b/doc/stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.java b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.java new file mode 100644 index 0000000..134c43e --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.java @@ -0,0 +1,69 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +import java.util.*; +/** + * Usine abstraite gérant l'ensemble des changements. + * + * + */ + +public interface AbstractChangementFactory { + + /** + * permet de récupérer une usine abstraite pour les groupes qui fonctionne en tandem avec cette usine abstraite + * @return cette usine abstraite pour les groupes + */ + public AbstractGroupeFactory getGroupeFactory(); + + /** + * permet de récupérer les changements + * @return l'ensemble de tous les changements en attente + * + * NB. Attention. C'était Iterator dans la version beta. + */ + public Set getAllChangements(); + + /** + * permet de mettre en oeuvre un changement connu de l'usine abstraite. + * En cas de succès, le changement est oublié (détruit). + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite + */ + public void applyChangement(Changement c); + + /** + * permet de supprimer un changement connu de l'usine abstraite. + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite + */ + public void deleteChangement(Changement c); + + /** + * permet d'ajouter un nouveau changement. + * + * @param A groupe actuel + * @param B groupe demandé + * @param e étudiant concerné par le changement + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si les groupes ou l'étudiant ne sont pas connus de la factory partenaire, ou e n'appartient pas à A ou A et B ne sont pas frères dans l'arbre des groupes. + * + */ + public void createChangement(Groupe A, Etudiant e, Groupe B); + + + /** + * permet d'ajouter un nouveau changement de type 2 + * + * @param A groupe actuel + * @param B groupe demandé + * @param e étudiant concerné par le changement + *@param raison la raison du changement de type 2 + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si les groupes ou l'étudiant ne sont pas connus de la factory partenaire, ou e n'appartient pas à A ou A et B ne sont pas frères dans l'arbre des groupes. + * + */ + public void createChangement(Groupe A, Etudiant e, Groupe B, String raison); + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.java~ b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.java~ new file mode 100644 index 0000000..c0849de --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractChangementFactory.java~ @@ -0,0 +1,93 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +import java.util.*; +/** + * Usine abstraite gérant l'ensemble des groupes. + * + */ + +public interface AbstractGroupeFactory { + + /** + * permet de récupérer le Groupe qui contient les étudiants de toute la promotion + * @return la promo. + */ + public Groupe getPromotion(); + + /** + * permet de supprimer un groupe connu de l'usine abstraite qui ne contient pas de groupes. + * Pour détruire un groupe connu qui en contient d'autres il faut le faire récursivement. + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException si le groupe contient des groupes + * @throws java.lang.IllegalArgumentException si le groupe n'est pas connu de l'usine abstraite ou bien si le groupe est celui de toute la promotion (renvoyé par getPromotion) + */ + public void deleteGroupe(Groupe g); + + /** + * permet d'ajouter un groupe vide de type FREE comme sous-groupe d'un groupe donné. + * @param pere le groupe père du groupe à créer + * @param name le nom du groupe à créer + * @param min,max bornes indicatives sur la taille du groupe à créer + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou si il n'y a pas 0 < min <= max + */ + public void createGroupe(Groupe pere, String name, int min, int max); + + /** + * permet de créer une partition automatiquement sous un groupe donné. + * + * @param pere le groupe père du groupe à partitionner + * @param name le nom des groupe à créer (on ajoutera à la suite un numéro ou une lettre pour distinguer chaque groupe) + * @param n le nombre de partitions + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou n négatif ou nul + * + * NB. doit créer une "copie" de pere + * sous pere de type Partition et ajouter sous ce groupe, n groupes de type "FREE". + * les valeurs min et max de ces n groupes sont + * min = 0 et + * max = partie entière de N/n plus 1, où N est le nombre max du groupe pere. + */ + public void createPartition(Groupe pere, String name, int n); + + /** + * permet d'ajouter un étudiant à un groupe. + * + * @param g le groupe dans lequel il faut ajouter l'étudiant + * @param e l'étudiant à ajouter + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException la factory ne connaît pas g + * @throws java.lang.IllegalStateException le père de g ne contient pas e + */ + public void addToGroupe(Groupe g, Etudiant e); + + /** + * permet d'enlever un étudiant d'un groupe. + * + * @param g le groupe dans lequel il faut enlever l'étudiant + * @param e l'étudiant à enlever + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException g ne contient pas e + * @throws java.lang.IllegalArgumentException la factory ne connaît pas g + */ + public void dropFromGroupe(Groupe g, Etudiant e); + + /** + * permet de retrouver un étudiant à partir de son identifiant + * + * @param id l'identifiant de l'étudiant + * @return Etudiant l'étudiant connu de la factory ayant cet identifiant + * + * @throws java.lang.IllegalStateException la factory ne connaît pas l'étudiant. + */ + public Etudiant getEtudiantFromId(int idEtu); + + + + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.java b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.java new file mode 100644 index 0000000..37959ee --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.java @@ -0,0 +1,129 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +import java.util.*; +/** + * Usine abstraite gérant l'ensemble des groupes. + * + */ + +public interface AbstractGroupeFactory { + + /** + * permet de récupérer le Groupe qui contient les étudiants de toute la promotion + * @return la promo. + */ + public Groupe getPromotion(); + + + /** + * Test si le groupe g est connu de l'usine (connu maintenant). + * Si la réponse est true, les méthodes avec ce groupe en paramètre devraient bien fonctionner. + * Si la réponse est false, le comportement n'est pas garanti. + */ + public Boolean knows(Groupe g); + + + /** + * permet de supprimer un groupe connu de l'usine abstraite qui ne contient pas de groupes. + * Pour détruire un groupe connu qui en contient d'autres il faut le faire récursivement. + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException si le groupe contient des groupes + * @throws java.lang.IllegalArgumentException si le groupe n'est pas connu de l'usine abstraite ou bien si le groupe est celui de toute la promotion (renvoyé par getPromotion) + */ + public void deleteGroupe(Groupe g); + + /** + * permet d'ajouter un groupe vide de type FREE comme sous-groupe d'un groupe donné. + * @param pere le groupe père du groupe à créer + * @param name le nom du groupe à créer + * @param min,max bornes indicatives sur la taille du groupe à créer + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou si il n'y a pas 0 < min <= max + */ + public void createGroupe(Groupe pere, String name, int min, int max); + + /** + * permet de créer une partition automatiquement sous un groupe donné. + * + * @param pere le groupe père du groupe à partitionner + * @param name le nom des groupe à créer (on ajoutera à la suite un numéro ou une lettre pour distinguer chaque groupe) + * @param n le nombre de partitions + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou n négatif ou nul + * + * NB. doit créer une "copie" de pere + * sous pere de type Partition et ajouter sous ce groupe, n groupes de type "FREE". + * les valeurs min et max de ces n groupes sont + * min = 0 et + * max = partie entière de N/n plus 1, où N est le nombre max du groupe pere. + */ + public void createPartition(Groupe pere, String name, int n); + + /** + * permet d'ajouter un étudiant à un groupe. + * + * @param g le groupe dans lequel il faut ajouter l'étudiant + * @param e l'étudiant à ajouter + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException la factory ne connaît pas g + * @throws java.lang.IllegalStateException le père de g ne contient pas e + */ + public void addToGroupe(Groupe g, Etudiant e); + + /** + * permet d'enlever un étudiant d'un groupe. + * + * @param g le groupe dans lequel il faut enlever l'étudiant + * @param e l'étudiant à enlever + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException g ne contient pas e + * @throws java.lang.IllegalArgumentException la factory ne connaît pas g + */ + public void dropFromGroupe(Groupe g, Etudiant e); + + /** + * permet de retrouver un étudiant à partir d'un String. + * + * NB. dans une version simple il doit s'agir du nom exact. + * dans une version un peu plus complexe, il s'agit des premières lettres du nom + * dans une version avancée, on peut autoriser une expression régulière plus ou moins complexe qui est générée si la première recherche n'a pas renvoyé de candidat. + * + * @param String nomEtu le nom approximmatif de l'étudiant + * @return Set l'ensemble des étudiants connus de la factory ayant un nom "proche" de ce string au sens de la remarque ci-dessus. + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getEtudiants(String nomEtu); + + /** + * permet de retrouver les groupes d'un étudiant. + * + * @param Etu un étudiant + * @return Etudiant l'étudiant connu de la factory ayant cet identifiant + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getGroupesOfEtudiant(Etudiant etu); + + + /** + * Ajout a l'API pour changer facilement de nom de groupe + * + * @param g le groupe + * @param name le nom + * @return true si possible + */ + public boolean changeNameGroupe(Groupe g, String name); + + /** + * refresh le Groupe ainsi que ses etudiants + * @param g le groupe + * @return le groupe refresh/un parent si il a été refresh + */ + public Groupe refreshALL(Groupe g); +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.java~ b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.java~ new file mode 100644 index 0000000..f1dbec9 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/AbstractGroupeFactory.java~ @@ -0,0 +1,106 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +import java.util.*; +/** + * Usine abstraite gérant l'ensemble des groupes. + * + */ + +public interface AbstractGroupeFactory { + + /** + * permet de récupérer le Groupe qui contient les étudiants de toute la promotion + * @return la promo. + */ + public Groupe getPromotion(); + + /** + * permet de supprimer un groupe connu de l'usine abstraite qui ne contient pas de groupes. + * Pour détruire un groupe connu qui en contient d'autres il faut le faire récursivement. + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException si le groupe contient des groupes + * @throws java.lang.IllegalArgumentException si le groupe n'est pas connu de l'usine abstraite ou bien si le groupe est celui de toute la promotion (renvoyé par getPromotion) + */ + public void deleteGroupe(Groupe g); + + /** + * permet d'ajouter un groupe vide de type FREE comme sous-groupe d'un groupe donné. + * @param pere le groupe père du groupe à créer + * @param name le nom du groupe à créer + * @param min,max bornes indicatives sur la taille du groupe à créer + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou si il n'y a pas 0 < min <= max + */ + public void createGroupe(Groupe pere, String name, int min, int max); + + /** + * permet de créer une partition automatiquement sous un groupe donné. + * + * @param pere le groupe père du groupe à partitionner + * @param name le nom des groupe à créer (on ajoutera à la suite un numéro ou une lettre pour distinguer chaque groupe) + * @param n le nombre de partitions + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou n négatif ou nul + * + * NB. doit créer une "copie" de pere + * sous pere de type Partition et ajouter sous ce groupe, n groupes de type "FREE". + * les valeurs min et max de ces n groupes sont + * min = 0 et + * max = partie entière de N/n plus 1, où N est le nombre max du groupe pere. + */ + public void createPartition(Groupe pere, String name, int n); + + /** + * permet d'ajouter un étudiant à un groupe. + * + * @param g le groupe dans lequel il faut ajouter l'étudiant + * @param e l'étudiant à ajouter + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException la factory ne connaît pas g + * @throws java.lang.IllegalStateException le père de g ne contient pas e + */ + public void addToGroupe(Groupe g, Etudiant e); + + /** + * permet d'enlever un étudiant d'un groupe. + * + * @param g le groupe dans lequel il faut enlever l'étudiant + * @param e l'étudiant à enlever + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException g ne contient pas e + * @throws java.lang.IllegalArgumentException la factory ne connaît pas g + */ + public void dropFromGroupe(Groupe g, Etudiant e); + + /** + * permet de retrouver un étudiant à partir d'un String. + * + * NB. dans une version simple il doit s'agir du nom exact. + * dans une version un peu plus complexe, il s'agit des premières lettres du nom + * dans une version avancée, on peut autoriser une expression régulière plus ou moins complexe qui est générée si la première recherche n'a pas renvoyé de candidat. + * + * @param String nomEtu le nom approximmatif de l'étudiant + * @return Set l'ensemble des étudiants connus de la factory ayant un nom "proche" de ce string au sens de la remarque ci-dessus. + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getEtudiantFromId(String nomEtu); + + /** + * permet de retrouver les groupes d'un étudiant. + * + * @param Etu un étudiant + * @return Etudiant l'étudiant connu de la factory ayant cet identifiant + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getGroupesOfEtudiant(Etudiant etu); + + + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/Changement.java b/src/fr/iutfbleau/projetIHM2022FI2/API/Changement.java new file mode 100644 index 0000000..f8a1997 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/Changement.java @@ -0,0 +1,53 @@ +package fr.iutfbleau.projetIHM2022FI2.API; + +/** + * Une demande de changement de groupe + * concerne un étudiant, qui est dans un groupe A et veut aller dans un groupe B. + * + */ + +public interface Changement extends MonPrint { + + /** + * permet de récupérer l'identifiant du changement (référence interne sans intérêt irl). + * @return l'identifiant. + */ + public int getId(); + + /** + * permet de récupérer le groupe de depart + * @return ce groupe. + */ + public Groupe getA(); + + /** + * permet de récupérer le groupe d'arrivée + * @return ce groupe. + */ + public Groupe getB(); + + /** + * permet de récupérer l'étudiant demandant le changement + * @return cet étudiant + */ + public Etudiant getEtu(); + + + /** + * + */ + public String getRaison(); + /** + * @see MonPrint + * NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici. + * + * NB2. On ne peut pas utiliser le toString de Objects + * https://stackoverflow.com/questions/24016962/java8-why-is-it-forbidden-to-define-a-default-method-for-a-method-from-java-lan + */ + public default String monPrint() { + StringBuilder sb = new StringBuilder(); + sb.append("Changement de " + this.getEtu().monPrint() + " depuis le groupe " + this.getA().getName() + " vers le groupe " + this.getB().getName()); + return sb.toString(); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/Changement.java~ b/src/fr/iutfbleau/projetIHM2022FI2/API/Changement.java~ new file mode 100644 index 0000000..f345ad0 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/Changement.java~ @@ -0,0 +1,85 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +import java.util.*; +/** + * Un groupe + */ + +public interface Groupe extends MonPrint { + + /** + * permet de récupérer l'identifiant d'un groupe (référence interne sans intérêt irl). + * @return l'identifiant. + */ + public int getId(); + + /** + * permet de récupérer le nom d'un groupe (utile irl). + * @return le nom. + */ + public String getName(); + + /** + * permet de récupérer le nombre minimum d'étudiants souhaités dans le groupe. + * @return le minimum souhaité + */ + public int getMin(); + + /** + * permet de récupérer le nombre maximum d'étudiants souhaités dans un groupe. + * @return le maximum souhaité + */ + public int getMax(); + + /** + * permet de récupérer le nombre d'étudiants dans ce groupe. + * @return le nombre de places prises (pas forcément limité entre Min et Max, mais c'est le but) + */ + public int getSize(); + + /** + * permet de récupérer la nature du groupe + * @return le type du groupe + */ + public TypeGroupe getType(); + + /** + * permet de récupérer le groupe père + * un groupe racine devrait retourner lui-même + * + * @return le père + */ + public Groupe getPointPoint(); + + /** + * Potentiellement "vide" + * @return un itérateur sur sous-groupes. + */ + public Iterator getSousGroupes(); + + /** + * Potentiellement "vide" + * @return un itérateur sur les étudiants. + */ + public Iterator getEtudiants(); + + /** + * @see MonPrint + * NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici. + * + * NB2. On ne peut pas utiliser le toString de Objects + * https://stackoverflow.com/questions/24016962/java8-why-is-it-forbidden-to-define-a-default-method-for-a-method-from-java-lan + */ + public default String monPrint() { + StringBuilder sb = new StringBuilder(); + sb.append("Groupe " + getName() + " (" getType() +", capacité " + getMin() + " à " + getMax() +", id " + getId()+")"); + Iterator i = getEtudiants(); + sb.append("%n"); + while (i.hasNext()){ + Etudiant s = i.next(); + sb.append(s.toString()); + sb.append("%n"); + } + return sb.toString(); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.java b/src/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.java new file mode 100644 index 0000000..a31828b --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.java @@ -0,0 +1,33 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +/** + * Un étudiant + */ + +public interface Etudiant extends MonPrint{ + + /** + * permet de récupérer l'identifiant de l'étudiant. + * @return l'identifiant. + */ + public int getId(); + + /** + * permet de récupérer + * @return le nom de l'étudiant. + */ + public String getNom(); + + /** + * permet de récupérer + * @return le prénom de l'étudiant + */ + public String getPrenom(); + + /** + * @see MonPrint + * NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici. + */ + public default String monPrint() { + return String.format("Nom " + getNom() + " Prenom " + getPrenom() + " (id="+getId()+")"); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.java~ b/src/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.java~ new file mode 100644 index 0000000..e7334a6 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/Etudiant.java~ @@ -0,0 +1,33 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +/** + * Un étudiant + */ + +public interface Etudiant extends MonPrint{ + + /** + * permet de récupérer l'identifiant de l'étudiant (qu'on suppose être le même pour les différents systèmes, internes et externes à l'hôtel). + * @return l'identifiant. + */ + public int getId(); + + /** + * permet de récupérer + * @return le nom de l'étudiant. + */ + public String getNom(); + + /** + * permet de récupérer + * @return le prénom de l'étudiant + */ + public String getPrenom(); + + /** + * @see MonPrint + * NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici. + */ + public default String monPrint() { + return String.format("Nom " + getNom() + " Prenom " + getPrenom() + " (id="+getId()+")"); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/Groupe.java b/src/fr/iutfbleau/projetIHM2022FI2/API/Groupe.java new file mode 100644 index 0000000..1ae036e --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/Groupe.java @@ -0,0 +1,129 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +import java.util.*; +/** + * Un groupe + */ + +public interface Groupe extends MonPrint { + /** + * Ajoute un étudiant. Se comporte comme add de l'interface Set. + * + * @return true iff e est ajouté + */ + public boolean addEtudiant(Etudiant e); + + /** + * Enlève un étudiant. Se comporte comme remove de l'interface Set. + * + * @return true iff e est enlevé + */ + boolean removeEtudiant(Etudiant e); + + /** + * Ajoute un sous-groupe. Se comporte comme add de l'interface Set. + * vérifie que le groupe passé en argument a bien renseigné this comme son père. + * + * @return true iff g est ajouté + */ + public boolean addSousGroupe(Groupe g); + + /** + * Enlève un groupe. Se comporte comme remove de l'interface Set. + * + * @return true iff e est enlevé + */ + public boolean removeSousGroupe(Groupe g); + + /** + * permet de récupérer l'identifiant d'un groupe (référence interne sans intérêt irl). + * @return l'identifiant. + */ + public int getId(); + + /** + * permet de récupérer le nom d'un groupe (utile irl). + * @return le nom. + */ + public String getName(); + + /** + * permet de récupérer le nombre minimum d'étudiants souhaités dans le groupe. + * @return le minimum souhaité + */ + public int getMin(); + + /** + * permet de récupérer le nombre maximum d'étudiants souhaités dans un groupe. + * @return le maximum souhaité + */ + public int getMax(); + + /** + * permet de récupérer le nombre d'étudiants dans ce groupe. + * @return le nombre de places prises (pas forcément limité entre Min et Max, mais c'est le but) + */ + public int getSize(); + + /** + * permet de récupérer la nature du groupe + * @return le type du groupe + */ + public TypeGroupe getType(); + + /** + * permet de récupérer le groupe père + * un groupe racine devrait retourner lui-même + * + * @return le père + */ + public Groupe getPointPoint(); + + /** + * Potentiellement "vide" + * @return l'ensemble des sous-groupes. + */ + public Set getSousGroupes(); + + /** + * Potentiellement "vide" + * @return l'ensemble des étudiants. + */ + public Set getEtudiants(); + + /** + * Change le nom du groupe + * @param s le nouveau nom + */ + public void setName(String s); + + /** + * @see MonPrint + * NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici. + * + * NB2. On ne peut pas utiliser le toString de Objects + * https://stackoverflow.com/questions/24016962/java8-why-is-it-forbidden-to-define-a-default-method-for-a-method-from-java-lan + */ + public default String monPrint() { + StringBuilder sb = new StringBuilder(); + sb.append("Groupe " + getName() + " (" + getType() + ", capacité " + getMin() + " à " + getMax() +", id " + getId()+")"); + sb.append("\n"); + // NB. getEtudiants() retourne un Set qui étend Iterable + // On peut utiliser les mécanismes de boucle "moderne" de puis la version 8 + // pour se faciliter la vie quand le traitement est assez simple + // voir https://docs.oracle.com/javase/8/docs/technotes/guides/language/foreach.html + sb.append(" ** Étudiants **\n"); + for (Etudiant s: getEtudiants()){ + sb.append("\t _ "+ s.monPrint()); + sb.append("\n"); + } + sb.append(" ** Sous Groupes **\n"); + for (Groupe g: getSousGroupes()){ + sb.append("\t _ "+ g.getName() + " (" + g.getType() + ", capacité " + g.getMin() + " à " + g.getMax() +", id " + g.getId()+")"); + sb.append("\n"); + } + sb.append(" ** Groupe Pere **\n"); + sb.append(getPointPoint().getName()+"\n"); + return sb.toString(); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/Groupe.java~ b/src/fr/iutfbleau/projetIHM2022FI2/API/Groupe.java~ new file mode 100644 index 0000000..417c779 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/Groupe.java~ @@ -0,0 +1,115 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +import java.util.*; +/** + * Un groupe + */ + +public interface Groupe extends MonPrint { + /** + * Ajoute un étudiant. Se comporte comme add de l'interface Set. + * + * @return true iff e est ajouté + */ + public boolean addEtudiant(Etudiant e); + + /** + * Enlève un étudiant. Se comporte comme remove de l'interface Set. + * + * @return true iff e est enlevé + */ + boolean removeEtudiant(Etudiant e); + + /** + * Ajoute un sous-groupe. Se comporte comme add de l'interface Set. + * vérifie que le groupe passé en argument a bien renseigné this comme son père. + * + * @return true iff g est ajouté + */ + public boolean addSousGroupe(Groupe g); + + /** + * Enlève un groupe. Se comporte comme remove de l'interface Set. + * + * @return true iff e est enlevé + */ + public boolean removeSousGroupe(Groupe g); + + /** + * permet de récupérer l'identifiant d'un groupe (référence interne sans intérêt irl). + * @return l'identifiant. + */ + public int getId(); + + /** + * permet de récupérer le nom d'un groupe (utile irl). + * @return le nom. + */ + public String getName(); + + /** + * permet de récupérer le nombre minimum d'étudiants souhaités dans le groupe. + * @return le minimum souhaité + */ + public int getMin(); + + /** + * permet de récupérer le nombre maximum d'étudiants souhaités dans un groupe. + * @return le maximum souhaité + */ + public int getMax(); + + /** + * permet de récupérer le nombre d'étudiants dans ce groupe. + * @return le nombre de places prises (pas forcément limité entre Min et Max, mais c'est le but) + */ + public int getSize(); + + /** + * permet de récupérer la nature du groupe + * @return le type du groupe + */ + public TypeGroupe getType(); + + /** + * permet de récupérer le groupe père + * un groupe racine devrait retourner lui-même + * + * @return le père + */ + public Groupe getPointPoint(); + + /** + * Potentiellement "vide" + * @return l'ensemble des sous-groupes. + */ + public Set getSousGroupes(); + + /** + * Potentiellement "vide" + * @return l'ensemble des étudiants. + */ + public Set getEtudiants(); + + /** + * @see MonPrint + * NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici. + * + * NB2. On ne peut pas utiliser le toString de Objects + * https://stackoverflow.com/questions/24016962/java8-why-is-it-forbidden-to-define-a-default-method-for-a-method-from-java-lan + */ + public default String monPrint() { + StringBuilder sb = new StringBuilder(); + sb.append("Groupe " + getName() + " (" + getType() + ", capacité " + getMin() + " à " + getMax() +", id " + getId()+")"); + sb.append("\n"); + // NB. getEtudiants() retourne un Set qui étend Iterable + // On peut utiliser les mécanismes de boucle "moderne" de puis la version 8 + // pour se faciliter la vie quand le traitement est assez simple + // voir https://docs.oracle.com/javase/8/docs/technotes/guides/language/foreach.html + for (Etudiant s: getEtudiants()){ + sb.append("\t"+ s.monPrint()); + sb.append("\n"); + } + return sb.toString(); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/Model.java b/src/fr/iutfbleau/projetIHM2022FI2/API/Model.java new file mode 100644 index 0000000..a83a356 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/Model.java @@ -0,0 +1,168 @@ +package fr.iutfbleau.projetIHM2022FI2.API; + +import java.util.Set; +import javax.swing.JFrame; +/** + * Le Model de L'IHM + */ +public interface Model { +/** + * Fonction pour refresh/changer de groupe d'affichage + * @param g le groupe a afficher + */ +public void showGroupe(Groupe g); + /** + * getteur de la fenetre + * @return JFrame la fenetre + */ + public JFrame getFenetre(); + /** + * permet d'obtenir l'ensemble des etudiants + * @return + */ + public Set getEtudiant(); + + // *********************** + // FONCTION POUR SUPRIMER UN ETUDIANT + // *********************** +/** + * Fonction pour supprimer un etudiant. + * @param e l'etudiant a supprimer + * @return boolean true si l'etudiant a ete supprimer, false sinon + */ + public boolean deleteEtu(Etudiant e); + + + // *********************** + // FONCTION POUR Ajouter UN ETUDIANT + // *********************** + + /** + * Fonction pour ajouter un étudiant au groupe + * @param g + * @param e + * @return boolean pour savoir si il a pus être ajouter + */ + public boolean addEtudiant(Groupe g, Etudiant e); + + + + // *********************** + // FONCTION POUR SUPRIMER UN GROUPE + // *********************** + + /** + * Fonction pour supprimer un groupe + * @param g le groupe a supprimer + */ + public void delete(Groupe g); + + // *********************** + // FONCTION POUR RENOMER UN GROUPE + // *********************** + + /** + * Fonction pour renomer un groupe + * @param name + * @param g + */ + public void rename(String name, Groupe g); + + + // ********************** + // FONCTION POUR CREER UN GROUPE + // ********************** + + + /** + * Fonction permetant de créer une partition d'un groupe + * @param g le groupe a partitionner + * @param n le nombre de partition + * @param name le nom des partition + */ + public void partition(Groupe g, int n, String name); + + /** + * Fonction permettant de créer un sous-groupe d'un groupe + * @param g le groupe parent + * @param name le nom du sous-groupe + * @param min le nombre min d'etudiant + * @param max le nombre max d'etudiant + * @param ajout la liste des étudiants a ajouter au groupe + */ + public void free(Groupe g, String name, int min, int max, Set ajout); + + /** + * ajoute une nouvelle promotion + * @param min le nombre min + * @param max le nombre max + * @param name le nom + * @param ajout les etudiant a ajouter a la promo + */ + public void addPromo(int min, int max, String name, Set ajout); + + // ************************** + // FONCTION POUR LES CHANGEMENTS + // ****************************** + + /** + * Créer un changement depuis le groupe courant + * @param e l'etudiant + * @param b le groupe a changer + */ + public void changeGroupe(Etudiant e, Groupe b); + + /** + * Retourn les groupe auquel on peut demander a changer depuis le groupe courant + * + * @return la liste des groupes + */ + public Set getGroupePartition(); + + /** + * Fonction pour afficher une fenetre listnatn les changements + * + */ + public void listChange(); + + + /** + * Fonction pour effectuer un changement + * @param Changement le changement a effecteur + */ + public void change(Changement change); + + /** + * Fonction supprimant un changement + * + * @param to_delete la changement a delete + */ + public void deleteChange(Changement to_delete); + + + /** + * Fonction affichant les raison d'un changement + * + * @param change le changement + */ + public void showRaisonChange(Changement change); + + + /** + * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée + */ + public void findEtu(); + + /** + * Fonction pour recuperer les etudiant avec ce nom + * @param name le nom de(s) etudiants + * @return la liste + */ + public Set getEtu(String name); + + /** + *affiche les groupe d'un etudiant + * @param e l'etudiant + */ + public void showGroupOfEtudiant(Etudiant e); +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.java b/src/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.java new file mode 100644 index 0000000..7f8d663 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.java @@ -0,0 +1,12 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +/** + * Toutes nos interfaces vont étendre cette interface. + */ +public interface MonPrint { + + /** + * Fonctionne comme ToPrint() sauf car une interface n'a pas le droit de faire un override sur ToPrint(). + * Toutes nos interfaces vont étendre cette interface. + */ + public String monPrint(); +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.java~ b/src/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.java~ new file mode 100644 index 0000000..e5fafae --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/MonPrint.java~ @@ -0,0 +1,7 @@ +public interface MonPrint{ + + /** + * Fonctionne comme ToPrint() sauf car une interface n'a pas le droit de faire un override sur ToPrint(); + */ + public String monPrint(); +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.java b/src/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.java new file mode 100644 index 0000000..e7e3119 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.java @@ -0,0 +1,22 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +public enum TypeGroupe { + ROOT ("Tous les étudiants"), PARTITION ("partition"), FREE ("libre") ; + + private final String name; + + private TypeGroupe(String s) { + name = s; + } + public static TypeGroupe getType(String s){ + switch(s){ + case("Tous les étudiants"): + return TypeGroupe.ROOT; + case("partition"): + return TypeGroupe.PARTITION; + case("libre"): + return TypeGroupe.FREE; + default: return null; + } + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.java~ b/src/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.java~ new file mode 100644 index 0000000..902843e --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/API/TypeGroupe.java~ @@ -0,0 +1,10 @@ +package fr.iutfbleau.projetIHM2022FI2.API; +public enum TypeGroupe { + ROOT ("Tous les étudiants"), PARTITION ("partitionable"), FREE ("libre") ; + + private final String name; + + private TypeGroupe(String s) { + name = s; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractChangementFactoryNP.java b/src/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractChangementFactoryNP.java new file mode 100644 index 0000000..0425714 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractChangementFactoryNP.java @@ -0,0 +1,136 @@ +package fr.iutfbleau.projetIHM2022FI2.MNP; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import java.util.*; +import fr.iutfbleau.projetIHM2022FI2.MP.*; +/** + * Usine abstraite gérant l'ensemble des changements. + * + */ + +public class AbstractChangementFactoryNP implements AbstractChangementFactory { + + // l'usine à groupe travaillant en tandem avec cette usine. + private AbstractGroupeFactory agf; + + // On utilise une table de hachage pour retrouver facilement un changement (à partir de son id). + // Si il y a beaucoup de changements c'est plus rapide que de parcourir toute une liste. + private HashMap brain; + + /** + * Constructeur de l'usine à changement. + * @param agf l'usine à groupe travaillant en tandem avec cette usine. + */ + public AbstractChangementFactoryNP(AbstractGroupeFactory agf){ + Objects.requireNonNull(agf,"On ne peut pas créer une usine à changement dont l'usine à groupe parternaire est null"); + this.agf=agf; + this.brain=new HashMap(); + } + + + /** + * permet de récupérer l'usine abstraite pour les groupes qui fonctionne en tandem avec cette usine abstraite + * @return cette usine abstraite pour les groupes + */ + public AbstractGroupeFactory getGroupeFactory(){ + return this.agf; + } + + /** + * permet de récupérer les changements + * @return l'ensemble de tous les changements en attente + */ + public Set getAllChangements(){ + // la méthode value() d'un hashmap retourne la collection des valeurs. + // Il faut transformer la collection en Set. + // Un constructeur de HashSet permet de faire cette opération. + Set out = new HashSet(this.brain.values()); + return out; + } + + /** + * permet de mettre en oeuvre un changement connu de l'usine abstraite. + * + * @param c le changement à mettre en oeuvre. + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException si le changement n'a pas de sens en l'état actuel (e.g. étudiant pas dans le groupe de départ a, groupe b inconnu, groupe a inconnu, etc). + * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite + */ + public void applyChangement(Changement c){ + Objects.requireNonNull(c,"On ne peut pas appliquer un changement qui est null"); + Etudiant e = c.getEtu(); + Groupe a = c.getA(); + Groupe b = c.getB(); + + if (!agf.knows(a)) throw new IllegalStateException("Le groupe de départ du changement est inconnu. Impossible à mettre en oeuvre."); + + if (!agf.knows(b)) throw new IllegalStateException("Le groupe d'arrivée du changement est inconnu. Impossible à mettre en oeuvre."); + // pas encore implanté. + // if(!agf.getGroupesOfEtudiant(e).contains(a)) throw new IllegalStateException("Le groupe de départ ne contient pas l'étudiant. Impossible à mettre en oeuvre."); + + agf.dropFromGroupe(a,e); + agf.addToGroupe(b,e); + // En cas de succès, on enlève le changement du cerveau + this.brain.remove(Integer.valueOf(c.getId())); + } + + + /** + * permet de supprimer un changement connu de l'usine abstraite. + * + * @param c le changement à supprimer. + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite + */ + public void deleteChangement(Changement c){ + Objects.requireNonNull(c,"On ne peut pas demander la suppression d'un changement qui est null"); + + this.brain.remove(Integer.valueOf(c.getId())); + + } + + /** + * permet d'ajouter un nouveau changement. + * + * @param A groupe actuel + * @param B groupe demandé + * @param e étudiant concerné par le changement + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si les groupes ou l'étudiant ne sont pas connus de la factory partenaire, ou e n'appartient pas à A ou A et B ne sont pas frères dans l'arbre des groupes. + * + */ + public void createChangement(Groupe A, Etudiant e, Groupe B){ + Objects.requireNonNull(A,"Le groupe d'origine ne peut pas être null"); + Objects.requireNonNull(B,"Le groupe d'arrivée ne peut pas être null"); + Objects.requireNonNull(e,"L'étudiant ne peut pas être null"); + + Changement c = new ChangementNP(A,e,B); + this.brain.put(Integer.valueOf(c.getId()),c); + } + + /** + * permet d'ajouter un nouveau changement. + * + * @param A groupe actuel + * @param B groupe demandé + * @param e étudiant concerné par le changement + * @param raison la raison du changement + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si les groupes ou l'étudiant ne sont pas connus de la factory partenaire, ou e n'appartient pas à A ou A et B ne sont pas frères dans l'arbre des groupes. + * + */ + @Override + public void createChangement(Groupe A, Etudiant e, Groupe B, String raison) { + Objects.requireNonNull(A,"Le groupe d'origine ne peut pas être null"); + Objects.requireNonNull(B,"Le groupe d'arrivée ne peut pas être null"); + Objects.requireNonNull(e,"L'étudiant ne peut pas être null"); + Objects.requireNonNull(raison,"La raison ne peut pas être null"); + + Changement c = new ChangementNP(A,e,B, raison); + this.brain.put(Integer.valueOf(c.getId()),c); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractGroupeFactoryNP.java b/src/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractGroupeFactoryNP.java new file mode 100644 index 0000000..c53e63a --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MNP/AbstractGroupeFactoryNP.java @@ -0,0 +1,274 @@ +package fr.iutfbleau.projetIHM2022FI2.MNP; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import fr.iutfbleau.projetIHM2022FI2.MP.*; +import java.util.*; +/** + * Usine abstraite gérant l'ensemble des groupes. + * + */ + +public class AbstractGroupeFactoryNP implements AbstractGroupeFactory { + + // la racine (promotion) + private Groupe promo; + + // On utilise une table de hachage pour retrouver facilement un groupe (à partir de son id). + // Si il y a beaucoup de groupes c'est plus rapide que de parcourir toute une liste. + private HashMap brain; + + + + + /** + * Le constructeur fabrique le groupe promotion vide. + * Il faut ensuite y ajouter les étudiants. + * + * @param name le nom de la promotion + * @param min le nombre minimum d'étudiants dans la promotion + * @param max le nombre maximum d'étudiants dans la promotion + * + */ + public AbstractGroupeFactoryNP(String name, int min, int max){ + Objects.requireNonNull(name,"On ne peut pas créer une promotion dont le nom est null"); + this.promo=new GroupeNP(name,min,max); + this.brain=new HashMap(); + this.brain.put(Integer.valueOf(this.promo.getId()),this.promo); + } + + /** + * Test plutôt optimiste. Si la clé est identique alors on fait comme si c'était le bon groupe. + * @param g le groupe à tester + * @return true si le groupe est connu de l'usine abstraite + * + */ + public Boolean knows(Groupe g){ + return this.brain.containsKey(Integer.valueOf(g.getId())); + } + + + + /** + * permet de récupérer le Groupe qui contient les étudiants de toute la promotion + * @return la promo. + */ + public Groupe getPromotion(){ + return this.promo; + } + + /** + * permet de supprimer un groupe connu de l'usine abstraite qui ne contient pas de groupes. + * Pour détruire un groupe connu qui en contient d'autres il faut le faire récursivement. + * + * @param g le groupe à supprimer + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe n'est pas connu de l'usine abstraite ou bien si le groupe est celui de toute la promotion (renvoyé par getPromotion) + */ + public void deleteGroupe(Groupe g){ + Objects.requireNonNull(g,"On ne peut pas enlever un groupe null car null n'est pas un groupe autorisé"); + if (!this.knows(g)){ + throw new IllegalArgumentException("Impossible d'enlever un groupe inconnu"); + } + g.getPointPoint().removeSousGroupe(g); + this.deleteRecursif(g); + } + + private void deleteRecursif(Groupe g){ + this.brain.remove(g.getId()); + for(Groupe sous: g.getSousGroupes()){ + this.deleteRecursif(sous); + } + } + + /** + * permet d'ajouter un groupe vide de type FREE comme sous-groupe d'un groupe donné. + * @param pere le groupe père du groupe à créer + * @param name le nom du groupe à créer + * @param min,max bornes indicatives sur la taille du groupe à créer + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou si il n'y a pas 0 < min <= max + */ + public void createGroupe(Groupe pere, String name, int min, int max){ + Objects.requireNonNull(pere,"Le groupe pere ne peut pas être null"); + Objects.requireNonNull(name,"Le nouveau groupe ne peut pas avoir null comme nom"); + if (!this.knows(pere)){ + throw new IllegalArgumentException("Interdit d'ajouter un fils à un groupe inconnu"); + } + if (pere.getType().equals(TypeGroupe.PARTITION)){ + throw new IllegalArgumentException("Impossible d'ajouter un groupe à une parition. Il faut utiliser createPartition pour créer une partition"); + } + if ( min <= 0 || max < min){ + throw new IllegalArgumentException("Il faut que 0 < min <= max"); + } + Groupe g = new GroupeNP(pere,name,min,max); + pere.addSousGroupe(g); + this.brain.put(Integer.valueOf(g.getId()),g); + } + + /** + * permet de créer une partition automatiquement sous un groupe donné. + * + * @param pere le groupe père du groupe à partitionner + * @param name le nom des groupe à créer (on ajoute à la suite un numéro de 1 à n pour distinguer chaque groupe formant la partition) + * @param n le nombre de partitions + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou n négatif ou nul + * + * NB. doit créer une "copie" de pere + * sous pere de type Partition et ajouter sous ce groupe, n groupes de type "FREE". + * les valeurs min et max de ces n groupes sont + * min = 0 et + * max = partie entière de N/n plus 1, où N est le nombre max du groupe pere. + */ + public void createPartition(Groupe pere, String name, int n){ + Objects.requireNonNull(pere,"Le groupe pere ne peut pas être null"); + Objects.requireNonNull(name,"Le nouveau groupe ne peut pas avoir null comme nom"); + if (!this.knows(pere)){ + throw new IllegalArgumentException("Impossible de partitionner ce groupe inconnu"); + } + if (pere.getType().equals(TypeGroupe.PARTITION)){ + throw new IllegalArgumentException("Impossible de créer une partition à ce niveau. Il faut soit repartitionner le groupe au dessus, soit partitionner une partition en dessous."); + } + if ( n <= 0){ + throw new IllegalArgumentException("Le nombre de partitions doit être strictement positif"); + } + //Création de la racine de la partition. + Groupe copiePereRacinePartition = new GroupeNP(pere); + pere.addSousGroupe(copiePereRacinePartition); + this.brain.put(Integer.valueOf(copiePereRacinePartition.getId()),copiePereRacinePartition); + // création des sous-groupes + int min = 0; + int max = ((int) Math.floor(pere.getSize()/n))+1; + List groupes = new ArrayList(n); + for(int i = 0; i l'ensemble des étudiants connus de la factory ayant un nom "proche" de ce string au sens de la remarque ci-dessus. + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getEtudiants(String nomEtu){ + if(nomEtu==null){ + return this.getPromotion().getEtudiants(); + } + // on cherche bêtement dans la promo. + Set out = new LinkedHashSet(); + for (Etudiant e : getPromotion().getEtudiants()){ + if (e.getNom().contains(nomEtu)){ + out.add(e); + } + } + return out; + } + + /** + * permet de retrouver les groupes d'un étudiant. + * + * @param Etu un étudiant + * @return Etudiant l'étudiant connu de la factory ayant cet identifiant + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getGroupesOfEtudiant(Etudiant etu){ + Set liste=new HashSet<>(); + for(Groupe g:this.brain.values()){ + boolean condit=false; + for(Etudiant e:g.getEtudiants()){ + if(e.getId()==etu.getId()){ + liste.add(g); + condit=true; + break; + } + if(condit==true) + break; + } + } + return liste; + } + + /** + * Ajout a l'API pour changer facilement de nom de groupe + * + * @param g le groupe + * @param name le nom + * @return true si possible + */ + @Override + public boolean changeNameGroupe(Groupe g, String name) { + g.setName(name); + return true; + } + + /** + * refresh le Groupe ainsi que ses etudiants + * @param g le groupe + * @return le groupe refresh/un parent si il a été refresh + */ + @Override + public Groupe refreshALL(Groupe g) { + return g; + } + + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MNP/ETU/Model/ModelEtu.java b/src/fr/iutfbleau/projetIHM2022FI2/MNP/ETU/Model/ModelEtu.java new file mode 100644 index 0000000..ea8c5bb --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MNP/ETU/Model/ModelEtu.java @@ -0,0 +1,360 @@ +package fr.iutfbleau.projetIHM2022FI2.MNP.ETU.Model; +import javax.swing.*; +import java.awt.*; +import java.util.Set; +import java.util.HashSet; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory; +import fr.iutfbleau.projetIHM2022FI2.API.Changement; +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurFenetre; +import fr.iutfbleau.projetIHM2022FI2.Permanent.View.Chargement; +import fr.iutfbleau.projetIHM2022FI2.MP.ETU.View.FenetreEtudiant; +import fr.iutfbleau.projetIHM2022FI2.MP.ETU.View.FenetreGroupe; + +/** + * Le Model de L'IHM + */ +public class ModelEtu implements Model{ + // le panel qui contient la fenetre de groupe + private JPanel panGroupe; + // la fenetre de groupe + private FenetreGroupe fenGr; + //la fenetre d'etudiant + private FenetreEtudiant fenEtu; + // le groupe courant + private AbstractGroupeFactory promo; + // le changement courant + private AbstractChangementFactory changement; + // la fenetre principale + private JFrame fenetre; + // l'etudiant courant + private Etudiant Selected; + + /** + * Constructeur du Model + * @param facto le groupe courant + * @param change le changement courant + */ + public ModelEtu(AbstractGroupeFactory facto, AbstractChangementFactory change){ + this.fenetre=new JFrame(); + this.fenetre.setSize(1200, 720); + this.fenetre.setLocation(100,100); + this.fenetre.addWindowListener(new ObservateurFenetre()); + this.fenetre.setLayout(new GridLayout(1,2)); + this.fenetre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + this.fenetre.setMinimumSize(this.fenetre.getSize()); + Chargement ch=new Chargement(this.fenetre); + this.promo=facto; + this.changement=change; + if(this.promo.getPromotion()==null){ + this.promo=null; + } + ch.dispose(); + this.fenetre.setVisible(true); + this.initEtu(null); + if(this.promo==null){ + this.fenGr=new FenetreGroupe(null, this, null); + this.fenEtu=new FenetreEtudiant(null, this.Selected, this); + }else{ + this.fenGr=new FenetreGroupe(this.promo.getPromotion(), this,this.promo.getGroupesOfEtudiant(this.Selected)); + this.fenEtu=new FenetreEtudiant(this.promo.getPromotion(), this.Selected, this); + } + this.panGroupe=new JPanel(new GridLayout(1,1)); + if(this.promo!=null){ + this.showGroupe(this.promo.getPromotion()); + }else{ + this.showGroupe(null); + } + } + + + @Override + /** + * Fonction pour refresh/changer de groupe d'affichage + * @param g le groupe a afficher + */ + public void showGroupe(Groupe g){ + if(g!=null) + g=this.promo .refreshALL(g); + this.panGroupe.removeAll(); + this.fenGr=new FenetreGroupe(g, this, this.promo.getGroupesOfEtudiant(this.Selected)); + this.fenEtu=new FenetreEtudiant(g, this.Selected, this); + this.fenetre.getContentPane().removeAll(); + this.panGroupe.add(this.fenGr.getPan()); + this.panGroupe.revalidate(); + this.fenetre.add(this.panGroupe); + JScrollPane scroll=new JScrollPane(this.fenEtu.getPan()); + scroll.getVerticalScrollBar().setUnitIncrement(15); + this.fenetre.add(scroll); + this.fenetre.revalidate(); + } + @Override + /** + * getteur de la fenetre + * @return JFrame la fenetre + */ + public JFrame getFenetre() { + return fenetre; + } + + /** + * Permet d'obtenir les étudiants du groupe courant. + * @return les étudiants du groupe courant + */ + + @Override + public Set getEtudiant(){ + return this.promo.getPromotion().getEtudiants(); + } + + private void initEtu(String err){ + Set liste=this.promo.getPromotion().getEtudiants(); + JPanel panel = new JPanel(); + JPanel myPanel = new JPanel(); + JTextField idd = new JTextField(15); + myPanel.add(new JLabel("Id:")); + myPanel.add(idd); + if(err!=null){ + myPanel.add(new JLabel(err, SwingConstants.RIGHT)); + } + panel.add(myPanel); + + if(JOptionPane.showConfirmDialog(this.fenetre, panel, "login", JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION){ + this.fenetre.dispose(); + System.exit(0); + }else{ + try{ + int id=Integer.parseInt(idd.getText()); + for(Etudiant et:liste){ + if(et.getId()==id){ + this.Selected=et; + return; + } + } + }catch(NumberFormatException e){ + this.initEtu("Id incomprhéhensible"); + } + } + this.initEtu("Etudiant introuvable"); + } + + // ************************** + // FONCTION POUR LES CHANGEMENTS + // ****************************** + /** + * Permet de changer de groupe. + * @param e l'étudiant qui change de groupe + * @param g le groupe dans lequel l'étudiant va + */ + @Override + public void changeGroupe(Etudiant e, Groupe b){ + if(b==null) + return; + b=this.promo.refreshALL(b); + if(b.getEtudiants()!=null && b.getMax()>b.getEtudiants().size()+1){ + if(b.getEtudiants().size()>this.fenGr.getG().getEtudiants().size()){ + JPanel myPanel= new JPanel(new GridLayout(2,1)); + JTextField xField = new JTextField(100); + xField.setMinimumSize(new Dimension(100, 100)); + xField.setPreferredSize(new Dimension(100,100)); + myPanel.add(new JLabel("Ce Groupe est plus grand que le votre raison du changement:")); + myPanel.add(xField); + if(JOptionPane.showConfirmDialog(this.fenetre, myPanel, "Changer dans quel Groupe ?", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ + //IL faut que l'etudiant detaile un minimun la raison + if(xField.getText().length()>5){ + this.changement.createChangement(this.fenGr.getG(), e, b, xField.getText()); + }else{ + JOptionPane.showMessageDialog(this.fenetre, "veuillez detailler votre raison", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + }else{ + this.changement.createChangement(this.fenGr.getG(), e, b); + } + }else{ + JOptionPane.showMessageDialog(this.fenetre, "impossible trop d'etudiant dans l'autre Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(this.fenGr.getG()); + } +/** + * pemet d'obtenir les sous groupes du groupe courant. + * @return les sous groupes du groupe courant + */ + @Override + public Set getGroupePartition(){ + this.promo.refreshALL(this.fenGr.getG().getPointPoint()); + Set retour=new HashSet<>(); + if(this.fenGr.getG().getPointPoint().getType()!=TypeGroupe.PARTITION) + throw new IllegalStateException("impossible de changer un étudiant d'un groupe ne provenant pas d'une partition"); + for(Groupe sous:this.fenGr.getG().getPointPoint().getSousGroupes()){ + if(sous.getId()!=this.fenGr.getG().getId()){ + retour.add(sous); + } + } + return retour; + } + /** + * ajoute un étudiant dans un groupe. + * @param e l'étudiant à ajouter + * @param g le groupe dans lequel l'étudiant va + * @return true si l'ajout a réussi, false sinon + */ + @Override + public boolean addEtudiant(Groupe g, Etudiant e) { + // TODO Auto-generated method stub + return false; + } + + /** + * supprime un groupe. + * @param g le groupe à supprimer + */ + @Override + public void delete(Groupe g) { + // TODO Auto-generated method stub + + } + + /** + * rennome un groupe. + * @param g le groupe à renommer + * @param nom le nouveau nom du groupe + * + */ + @Override + public void rename(String name, Groupe g) { + // TODO Auto-generated method stub + + } + + /** + * Fonction permetant de créer une partition d'un groupe + * @param g le groupe a partitionner + * @param n le nombre de partition + * @param name le nom des partition + */ + @Override + public void partition(Groupe g, int n, String name) { + // TODO Auto-generated method stub + + } + + /** + * Fonction permettant de créer un sous-groupe d'un groupe + * @param g le groupe parent + * @param name le nom du sous-groupe + * @param min le nombre min d'etudiant + * @param max le nombre max d'etudiant + * @param ajout la liste des étudiants a ajouter au groupe + */ + @Override + public void free(Groupe g, String name, int min, int max, Set ajout) { + // TODO Auto-generated method stub + + } + + + /** + * ajoute une nouvelle promotion + * @param min le nombre min + * @param max le nombre max + * @param name le nom + * @param ajout les etudiant a ajouter a la promo + */ + @Override + public void addPromo(int min, int max, String name, Set ajout) { + // TODO Auto-generated method stub + + } + +/** + * Fonction pour supprimer un etudiant. + * @param e l'etudiant a supprimer + * @return boolean true si l'etudiant a ete supprimer, false sinon + + */ + @Override + public boolean deleteEtu(Etudiant e) { + // TODO Auto-generated method stub + return false; + } + + /** + * Fonction pour afficher une fenetre listnatn les changements + * + */ + @Override + public void listChange() { + // TODO Auto-generated method stub + + } + + /** + * Fonction pour effectuer un changement + * @param Changement le changement a effecteur + */ + @Override + public void change(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction supprimant un changement + * + * @param to_delete la changement a delete + */ + @Override + public void deleteChange(Changement to_delete) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction affichant les raison d'un changement + * + * @param change le changement + */ + @Override + public void showRaisonChange(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée + */ + @Override + public void findEtu() { + // TODO Auto-generated method stub + + } + + + /** + * Fonction pour recuperer les etudiant avec ce nom + * @param name le nom de(s) etudiants + * @return la liste + */ + @Override + public Set getEtu(String name) { + // TODO Auto-generated method stub + return null; + } + + + /** + *affiche les groupe d'un etudiant + * @param e l'etudiant + */ + @Override + public void showGroupOfEtudiant(Etudiant e) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MNP/PROF/Model/ModelProf.java b/src/fr/iutfbleau/projetIHM2022FI2/MNP/PROF/Model/ModelProf.java new file mode 100644 index 0000000..59de326 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MNP/PROF/Model/ModelProf.java @@ -0,0 +1,325 @@ +package fr.iutfbleau.projetIHM2022FI2.MNP.PROF.Model; +import javax.swing.*; +import java.awt.*; +import java.util.Set; +import java.util.HashSet; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory; +import fr.iutfbleau.projetIHM2022FI2.API.Changement; +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.MP.PROF.View.FenetreEtudiant; +import fr.iutfbleau.projetIHM2022FI2.MP.PROF.View.FenetreGroupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurFenetre; +import fr.iutfbleau.projetIHM2022FI2.Permanent.View.Chargement; + +/** + * Le Model de L'IHM + */ +public class ModelProf implements Model{ + + // le panel qui contient la fenetre de groupe + private JPanel panGroupe; + // la fenetre de groupe + private FenetreGroupe fenGr; + //la fenetre d'etudiant + private FenetreEtudiant fenEtu; + // le groupe courant + private AbstractGroupeFactory promo; + // le changement courant + private AbstractChangementFactory changement; + // la fenetre principale + private JFrame fenetre; + + /** + * Constructeur du Model. + * + * @param agf le groupe principal + * @param chan le changement courant + */ + public ModelProf(AbstractGroupeFactory agf, AbstractChangementFactory chan){ + this.fenetre=new JFrame(); + this.fenetre.setSize(1200, 720); + this.fenetre.setLocation(100,100); + this.fenetre.addWindowListener(new ObservateurFenetre()); + this.fenetre.setLayout(new GridLayout(1,2)); + this.fenetre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + this.fenetre.setMinimumSize(this.fenetre.getSize()); + Chargement ch=new Chargement(this.fenetre); + this.promo=agf; + this.changement=chan; + if(this.promo.getPromotion()==null){ + this.promo=null; + } + ch.dispose(); + this.fenetre.setVisible(true); + if(this.promo==null){ + this.fenGr=new FenetreGroupe(null, this); + this.fenEtu=new FenetreEtudiant(null); + }else{ + this.fenGr=new FenetreGroupe(this.promo.getPromotion(), this); + this.fenEtu=new FenetreEtudiant(this.promo.getPromotion()); + } + this.panGroupe=new JPanel(new GridLayout(1,1)); + if(this.promo!=null){ + this.showGroupe(this.promo.getPromotion()); + }else{ + this.showGroupe(null); + } + } + + + @Override + /** + * Fonction pour refresh/changer de groupe d'affichage + * @param g le groupe a afficher + */ + public void showGroupe(Groupe g){ + if(g!=null) + g=this.promo .refreshALL(g); + this.panGroupe.removeAll(); + this.fenGr=new FenetreGroupe(g, this); + this.fenEtu=new FenetreEtudiant(g); + this.fenetre.getContentPane().removeAll(); + this.panGroupe.add(this.fenGr.getPan()); + this.panGroupe.revalidate(); + this.fenetre.add(this.panGroupe); + JScrollPane scroll=new JScrollPane(this.fenEtu.getPan()); + scroll.getVerticalScrollBar().setUnitIncrement(15); + this.fenetre.add(scroll); + this.fenetre.revalidate(); + } + @Override + /** + * getteur de la fenetre + * @return JFrame la fenetre + */ + public JFrame getFenetre() { + return fenetre; + } + /** + * permet d'obtenir l'ensemble des etudiants + * @return + */ + @Override + public Set getEtudiant(){ + return this.promo.getPromotion().getEtudiants(); + } + + // ************************** + // FONCTION POUR LES CHANGEMENTS + // ****************************** + /** + * Créer un changement depuis le groupe courant + * @param e l'etudiant + * @param b le groupe a changer + */ + @Override + public void changeGroupe(Etudiant e, Groupe b){ + if(b==null) + return; + b=this.promo.refreshALL(b); + if(b.getEtudiants()!=null && b.getMax()>b.getEtudiants().size()+1){ + if(b.getEtudiants().size()>this.fenGr.getG().getEtudiants().size()){ + JPanel myPanel= new JPanel(new GridLayout(2,1)); + JTextField xField = new JTextField(100); + xField.setMinimumSize(new Dimension(100, 100)); + xField.setPreferredSize(new Dimension(100,100)); + myPanel.add(new JLabel("Ce Groupe est plus grand que le votre raison du changement:")); + myPanel.add(xField); + if(JOptionPane.showConfirmDialog(this.fenetre, myPanel, "Changer dans quel Groupe ?", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ + //IL faut que l'etudiant detaile un minimun la raison + if(xField.getText().length()>5){ + this.changement.createChangement(this.fenGr.getG(), e, b, xField.getText()); + }else{ + JOptionPane.showMessageDialog(this.fenetre, "veuillez detailler votre raison", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + }else{ + this.changement.createChangement(this.fenGr.getG(), e, b); + } + }else{ + JOptionPane.showMessageDialog(this.fenetre, "impossible trop d'etudiant dans l'autre Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(this.fenGr.getG()); + } + /** + * Retourn les groupe auquel on peut demander a changer depuis le groupe courant + * + * @return la liste des groupes + */ + @Override + public Set getGroupePartition(){ + this.promo.refreshALL(this.fenGr.getG().getPointPoint()); + Set retour=new HashSet<>(); + if(this.fenGr.getG().getPointPoint().getType()!=TypeGroupe.PARTITION) + throw new IllegalStateException("impossible de changer un étudiant d'un groupe ne provenant pas d'une partition"); + for(Groupe sous:this.fenGr.getG().getPointPoint().getSousGroupes()){ + if(sous.getId()!=this.fenGr.getG().getId()){ + retour.add(sous); + } + } + return retour; + } + /** + * Fonction pour ajouter un étudiant au groupe + * @param g + * @param e + * @return boolean pour savoir si il a pus être ajouter + */ + @Override + public boolean addEtudiant(Groupe g, Etudiant e) { + // TODO Auto-generated method stub + return false; + } + + /** + * Fonction pour supprimer un groupe + * @param g le groupe a supprimer + */ + @Override + public void delete(Groupe g) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction pour renomer un groupe + * @param name + * @param g + */ + @Override + public void rename(String name, Groupe g) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction permetant de créer une partition d'un groupe + * @param g le groupe a partitionner + * @param n le nombre de partition + * @param name le nom des partition + */ + @Override + public void partition(Groupe g, int n, String name) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction permettant de créer un sous-groupe d'un groupe + * @param g le groupe parent + * @param name le nom du sous-groupe + * @param min le nombre min d'etudiant + * @param max le nombre max d'etudiant + * @param ajout la liste des étudiants a ajouter au groupe + */ + @Override + public void free(Groupe g, String name, int min, int max, Set ajout) { + // TODO Auto-generated method stub + + } + + /** + * ajoute une nouvelle promotion + * @param min le nombre min + * @param max le nombre max + * @param name le nom + * @param ajout les etudiant a ajouter a la promo + */ + @Override + public void addPromo(int min, int max, String name, Set ajout) { + // TODO Auto-generated method stub + + } + +/** + * Fonction pour supprimer un etudiant. + * @param e l'etudiant a supprimer + * @return boolean true si l'etudiant a ete supprimer, false sinon + */ + @Override + public boolean deleteEtu(Etudiant e) { + // TODO Auto-generated method stub + return false; + } + /** + * Fonction pour afficher une fenetre listnatn les changements + * + */ + @Override + public void listChange() { + // TODO Auto-generated method stub + + } + + + /** + * Fonction pour effectuer un changement + * @param Changement le changement a effecteur + */ + @Override + public void change(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction supprimant un changement + * + * @param to_delete la changement a delete + */ + @Override + public void deleteChange(Changement to_delete) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction affichant les raison d'un changement + * + * @param change le changement + */ + @Override + public void showRaisonChange(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée + */ + @Override + public void findEtu() { + // TODO Auto-generated method stub + + } + + /** + * Fonction pour recuperer les etudiant avec ce nom + * @param name le nom de(s) etudiants + * @return la liste + */ + @Override + public Set getEtu(String name) { + // TODO Auto-generated method stub + return null; + } + + /** + *affiche les groupe d'un etudiant + * @param e l'etudiant + */ + @Override + public void showGroupOfEtudiant(Etudiant e) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MNP/ROOT/Model/ModelRoot.java b/src/fr/iutfbleau/projetIHM2022FI2/MNP/ROOT/Model/ModelRoot.java new file mode 100644 index 0000000..6e62a22 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MNP/ROOT/Model/ModelRoot.java @@ -0,0 +1,463 @@ +package fr.iutfbleau.projetIHM2022FI2.MNP.ROOT.Model; +import java.util.HashSet; +import java.util.Set; +import javax.swing.*; +import java.awt.*; + +import fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory; +import fr.iutfbleau.projetIHM2022FI2.API.Changement; +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FenetreChangement; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FenetreEtudiant; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FenetreGroupe; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FindBarFenetre; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurChangeGroupe; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurFenetre; +import fr.iutfbleau.projetIHM2022FI2.Permanent.View.Chargement; + +/** + * Le Model de L'IHM + */ +public class ModelRoot implements Model{ + + // le panel qui contient la fenetre de groupe + private JPanel panGroupe; + // la fenetre de groupe + private FenetreGroupe fenGr; + //la fenetre d'etudiant + private FenetreEtudiant fenEtu; + // le groupe courant + private AbstractGroupeFactory promo; + // le changement courant + private AbstractChangementFactory changement; + // la fenetre principale + private JFrame fenetre; + //fenetre du changement + private FenetreChangement fenChange; + + /** + * Constructeur du model. + * @param agf le groupe courant + * @param change le changement courant + */ + public ModelRoot(AbstractGroupeFactory agf, AbstractChangementFactory change){ + this.fenetre=new JFrame(); + this.fenetre.setSize(1200, 720); + this.fenetre.setLocation(100,100); + this.fenetre.addWindowListener(new ObservateurFenetre()); + this.fenetre.setLayout(new GridLayout(1,2)); + this.fenetre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + this.fenetre.setMinimumSize(this.fenetre.getSize()); + Chargement ch=new Chargement(this.fenetre); + this.promo=agf; + this.changement=change; + ch.dispose(); + this.fenetre.setVisible(true); + if(this.promo.getPromotion()==null){ + this.fenGr=new FenetreGroupe(null, this); + this.fenEtu=new FenetreEtudiant(null, this); + }else{ + this.fenGr=new FenetreGroupe(this.promo.getPromotion(), this); + this.fenEtu=new FenetreEtudiant(this.promo.getPromotion(), this); + } + this.panGroupe=new JPanel(new GridLayout(1,1)); + if(this.promo.getPromotion()!=null){ + this.showGroupe(this.promo.getPromotion()); + }else{ + this.showGroupe(null); + } + this.fenChange=null; + } + + @Override + /** + * Fonction pour refresh/changer de groupe d'affichage + * @param g le groupe a afficher + */ + public void showGroupe(Groupe g){ + if(g!=null) + g=this.promo.refreshALL(g); + this.panGroupe.removeAll(); + this.fenGr=new FenetreGroupe(g, this); + this.fenEtu=new FenetreEtudiant(g, this); + this.fenetre.getContentPane().removeAll(); + this.panGroupe.add(this.fenGr.getPan()); + this.panGroupe.revalidate(); + this.fenetre.add(this.panGroupe); + JScrollPane scroll=new JScrollPane(this.fenEtu.getPan()); + scroll.getVerticalScrollBar().setUnitIncrement(15); + this.fenetre.add(scroll); + this.fenetre.revalidate(); + } + @Override + /** + * getteur de la fenetre + * @return JFrame la fenetre + */ + public JFrame getFenetre() { + return fenetre; + } + /** + * permet d'obtenir l'ensemble des etudiants + * @return + */ + @Override + public Set getEtudiant(){ + return this.promo.getEtudiants(null); + } + + // *********************** + // FONCTION POUR SUPRIMER UN ETUDIANT + // *********************** +/** + * Fonction pour supprimer un etudiant. + * @param e l'etudiant a supprimer + * @return boolean true si l'etudiant a ete supprimer, false sinon + */ + @Override + public boolean deleteEtu(Etudiant e){ + if(this.deleteEtutoChildren(e, this.fenGr.getG())){ + this.promo.dropFromGroupe(this.fenGr.getG(), e); + this.showGroupe(this.fenGr.getG()); + return true; + }else{ + return false; + } + } +/** + * Permet de savoir si un étudiant peut être supprimé + * @param e l'étudiant à supprimer + * @param g le groupe dans lequel on cherche + * @return true si possible, false sinon + */ + private boolean deleteEtutoChildren(Etudiant e, Groupe g){ + if(g.getMax() ajout){ + Chargement ch=new Chargement(this.fenetre); + this.fenetre.setVisible(false); + //on creer le groupe + this.promo.createGroupe(g, name, min, max); + Groupe creer=null; + //on le recupere + for(Groupe gr:g.getSousGroupes()){ + if(gr.getName()==name){ + creer=gr; + break; + } + } + //on y ajoute les étudiant + int n=0; + for(Etudiant e:ajout){ + if(this.addEtudiant(creer, e)==false) + n++; + } + creer=this.promo.refreshALL(creer); + ch.dispose(); + this.fenetre.setVisible(true); + if(n>0) + JOptionPane.showMessageDialog(this.fenetre, "erreur impossible d'ajouter "+n+" etudiants par manque de place dans le groupe de ses parents", "erreur", JOptionPane.ERROR_MESSAGE); + //Si finalement avec les etudiants qui n'ont pas pus être ajouter le min n'est pas atteint + if(creer.getEtudiants().size()+1<=creer.getMin()){ + //On le supprime + this.promo.deleteGroupe(creer); + JOptionPane.showMessageDialog(this.fenetre, "en raison du manque d'etudiant pour le nombre min le groupe n'a pas pus être créer", "errer", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(g); + } + /** + * ajoute une nouvelle promotion + * @param min le nombre min + * @param max le nombre max + * @param name le nom + * @param ajout les etudiant a ajouter a la promo + */ + @Override + public void addPromo(int min, int max, String name, Set ajout){ + Chargement ch=new Chargement(this.fenetre); + this.promo=new AbstractGroupeFactoryNP(name, min, max); + this.changement=new AbstractChangementFactoryNP(this.promo); + this.fenetre.setVisible(false); + for(Etudiant e:ajout){ + this.addEtudiant(this.promo.getPromotion(), e); + } + ch.dispose(); + this.fenetre.setVisible(true); + this.showGroupe(this.promo.getPromotion()); + } + + + /** + * Créer un changement depuis le groupe courant + * @param e l'etudiant + * @param b le groupe a changer + */ + @Override + public void changeGroupe(Etudiant e, Groupe b){ + if(b==null) + return; + b=this.promo.refreshALL(b); + if(b.getEtudiants()!=null && b.getMax()>b.getEtudiants().size()+1){ + if(b.getEtudiants().size()>this.fenGr.getG().getEtudiants().size()){ + JPanel myPanel= new JPanel(new GridLayout(2,1)); + JTextField xField = new JTextField(100); + xField.setMinimumSize(new Dimension(100, 100)); + xField.setPreferredSize(new Dimension(100,100)); + myPanel.add(new JLabel("Ce Groupe est plus grand que le votre raison du changement:")); + myPanel.add(xField); + if(JOptionPane.showConfirmDialog(this.fenetre, myPanel, "Changer dans quel Groupe ?", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ + //IL faut que l'etudiant detaile un minimun la raison + if(xField.getText().length()>5){ + this.changement.createChangement(this.fenGr.getG(), e, b, xField.getText()); + }else{ + JOptionPane.showMessageDialog(this.fenetre, "veuillez detailler votre raison", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + }else{ + this.changement.createChangement(this.fenGr.getG(), e, b); + } + }else{ + JOptionPane.showMessageDialog(this.fenetre, "impossible trop d'etudiant dans l'autre Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(this.fenGr.getG()); + } + /** + * Retourn les groupe auquel on peut demander a changer depuis le groupe courant + * + * @return la liste des groupes + */ + @Override + public Set getGroupePartition(){ + this.promo.refreshALL(this.fenGr.getG().getPointPoint()); + Set retour=new HashSet(); + if(this.fenGr.getG().getPointPoint().getType()!=TypeGroupe.PARTITION) + throw new IllegalStateException("impossible de changer un étudiant d'un groupe ne provenant pas d'une partition"); + for(Groupe sous:this.fenGr.getG().getPointPoint().getSousGroupes()){ + if(sous.getId()!=this.fenGr.getG().getId()){ + retour.add(sous); + } + } + return retour; + } + + /* (non-Javadoc) + * @see fr.iutfbleau.projetIHM2022FI2.API.Model#listChange() + */ + /** + * Fonction pour afficher une fenetre listnatn les changements + * + */ + @Override + public void listChange() { + this.fenChange=new FenetreChangement(changement, this); + JOptionPane.showMessageDialog(this.fenetre, new JScrollPane(this.fenChange), "liste des changements", JOptionPane.OK_OPTION); + } + /** + * Fonction pour effectuer un changement + * @param Changement le changement a effecteur + */ + @Override + public void change(Changement change) { + this.changement.applyChangement(change); + this.fenChange.refresh(); + if(change.getA()==this.fenGr.getG()){ + this.showGroupe(this.fenGr.getG()); + } + } + + /** + * Fonction supprimant un changement + * + * @param to_delete la changement a delete + */ + @Override + public void deleteChange(Changement to_delete) { + this.changement.deleteChangement(to_delete); + this.fenChange.refresh(); + } + + /** + * Fonction affichant les raison d'un changement + * + * @param change le changement + */ + @Override + public void showRaisonChange(Changement change) { + JOptionPane.showMessageDialog(this.fenetre, new JLabel(change.getRaison()), "Raison de la demande", JOptionPane.OK_OPTION); + } + /** + * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée + */ + @Override + public void findEtu() { + JScrollPane scroll=new JScrollPane(new FindBarFenetre(this).getPanel()); + scroll.getVerticalScrollBar().setUnitIncrement(5); + JOptionPane.showMessageDialog(this.fenetre, scroll, "chercher un etudiant", JOptionPane.OK_OPTION); + } + + /* (non-Javadoc) + * @see fr.iutfbleau.projetIHM2022FI2.API.Model#getEtu(java.lang.String) + */ + + /** + * Fonction pour recuperer les etudiant avec ce nom + * @param name le nom de(s) etudiants + * @return la liste + */ + @Override + public Set getEtu(String name) { + return this.promo.getEtudiants(name); + } + /** + *affiche les groupe d'un etudiant + * @param e l'etudiant + */ + @Override + public void showGroupOfEtudiant(Etudiant e){ + Set liste=this.promo.getGroupesOfEtudiant(e); + JPanel myPanel; + if(liste!=null && liste.size()>0){ + myPanel=new JPanel(new GridLayout(liste.size()/2+1, 2, 20, 20)); + for(Groupe g:liste){ + JButton bout=new JButton(g.getName()); + bout.addActionListener(new ObservateurChangeGroupe(this, g)); + myPanel.add(bout); + } + }else{ + myPanel=new JPanel(new GridLayout(2, 2, 20, 20)); + myPanel.add(new JLabel("Cet Etudiant n'appartient encore a aucun groupe")); + } + JOptionPane.showMessageDialog(this.fenChange, myPanel, "groupe de l'etudiant", JOptionPane.OK_OPTION); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/AbstractChangementFactoryNP.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/AbstractChangementFactoryNP.java new file mode 100644 index 0000000..6788ee3 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/AbstractChangementFactoryNP.java @@ -0,0 +1,358 @@ +package fr.iutfbleau.projetIHM2022FI2.MP; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import java.sql.Connection; +import org.mariadb.jdbc.*; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import java.util.*; +/** + * Usine abstraite gérant l'ensemble des changements. + * + */ + +public class AbstractChangementFactoryNP implements AbstractChangementFactory { + + // l'usine à groupe travaillant en tandem avec cette usine. + private AbstractGroupeFactory agf; + private JFrame fenetre; + // On utilise une table de hachage pour retrouver facilement un changement (à partir de son id). + // Si il y a beaucoup de changements c'est plus rapide que de parcourir toute une liste. + private HashMap brain; + /** + * Constructeur de l'usine à changement. + * @param agf l'usine à groupe travaillant en tandem avec cette usine. + * @param fenetre la fenetre principale + */ + public AbstractChangementFactoryNP(AbstractGroupeFactory agf, JFrame fenetre){ + Objects.requireNonNull(agf,"On ne peut pas créer une usine à changement dont l'usine à groupe parternaire est null"); + this.agf=agf; + this.fenetre=fenetre; + this.brain=new HashMap(); + this.getChange(); + } + /** + * Constructeur de l'usine à changement. + * @param agf l'usine à groupe travaillant en tandem avec cette usine. + * @param fenetre la fenetre principale + * @param liste la liste des changements + */ + public AbstractChangementFactoryNP(AbstractGroupeFactory agf, JFrame fenetre, Set liste){ + Objects.requireNonNull(agf,"On ne peut pas créer une usine à changement dont l'usine à groupe parternaire est null"); + this.agf=agf; + this.fenetre=fenetre; + this.brain=new HashMap(); + for(Changement ch:liste){ + this.brain.put(ch.getId(), ch); + } + this.getChange(); + } + + + /** + * permet de récupérer l'usine abstraite pour les groupes qui fonctionne en tandem avec cette usine abstraite + * @return cette usine abstraite pour les groupes + */ + public AbstractGroupeFactory getGroupeFactory(){ + return this.agf; + } + + /** + * permet de récupérer les changements + * @return l'ensemble de tous les changements en attente + */ + public Set getAllChangements(){ + this.refresh(); + // la méthode value() d'un hashmap retourne la collection des valeurs. + // Il faut transformer la collection en Set. + // Un constructeur de HashSet permet de faire cette opération. + Set out = new HashSet(this.brain.values()); + return out; + } + + /** + * permet de mettre en oeuvre un changement connu de l'usine abstraite. + * @param c le changement à mettre en oeuvre. + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException si le changement n'a pas de sens en l'état actuel (e.g. étudiant pas dans le groupe de départ a, groupe b inconnu, groupe a inconnu, etc). + * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite + */ + public void applyChangement(Changement c){ + Objects.requireNonNull(c,"On ne peut pas appliquer un changement qui est null"); + Etudiant e = c.getEtu(); + Groupe a = c.getA(); + Groupe b = c.getB(); + + if (!agf.knows(a)) throw new IllegalStateException("Le groupe de départ du changement est inconnu. Impossible à mettre en oeuvre."); + + if (!agf.knows(b)) throw new IllegalStateException("Le groupe d'arrivée du changement est inconnu. Impossible à mettre en oeuvre."); + // pas encore implanté. + // if(!agf.getGroupesOfEtudiant(e).contains(a)) throw new IllegalStateException("Le groupe de départ ne contient pas l'étudiant. Impossible à mettre en oeuvre."); + + agf.dropFromGroupe(a,e); + agf.addToGroupe(b,e); + // En cas de succès, on enlève le changement du cerveau + this.deleteChangement(c); + for(Changement ch: this.getAllChangements()){ + if(ch.getB().getSize()+1==ch.getB().getMax()){ + this.deleteChangement(ch); + } + } + } + + + /** + * permet de supprimer un changement connu de l'usine abstraite. + * @param c le changement à supprimer. + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite + */ + public void deleteChangement(Changement c){ + Objects.requireNonNull(c,"On ne peut pas demander la suppression d'un changement qui est null"); + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement("DELETE FROM `Changement` where `id`=?"); + pst.setInt(1, c.getId()); + pst.executeUpdate(); + pst.close(); + }catch(SQLException er){ + System.out.println(er.toString()); + if(this.erreurSQL()){ + this.deleteChangement(c); + }else{ + return; + } + } + this.close(cnx); + this.brain.remove(c.getId()); + } + + /** + * permet d'ajouter un nouveau changement. + * + * @param A groupe actuel + * @param B groupe demandé + * @param e étudiant concerné par le changement + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si les groupes ou l'étudiant ne sont pas connus de la factory partenaire, ou e n'appartient pas à A ou A et B ne sont pas frères dans l'arbre des groupes. + * + */ + public void createChangement(Groupe A, Etudiant e, Groupe B){ + Objects.requireNonNull(A,"Le groupe d'origine ne peut pas être null"); + Objects.requireNonNull(B,"Le groupe d'arrivée ne peut pas être null"); + Objects.requireNonNull(e,"L'étudiant ne peut pas être null"); + Changement c = new ChangementNP(A,e,B); + this.brain.put(Integer.valueOf(c.getId()),c); + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement("SELECT * FROM `Changement` where `idGroupeA`=? AND `idGroupeB`=? AND `idEtudiant`=?; "); + pst.setInt(1, A.getId()); + pst.setInt(2, B.getId()); + pst.setInt(3, e.getId()); + if(!pst.executeQuery().next()){ + pst.close(); + pst=cnx.prepareStatement("INSERT INTO `Changement` (`idGroupeA`, `idGroupeB`, `idEtudiant`, `id`) VALUES (?, ?, ?, ?);"); + pst.setInt(1, A.getId()); + pst.setInt(2, B.getId()); + pst.setInt(3, e.getId()); + pst.setInt(4, c.getId()); + pst.executeUpdate(); + pst.close(); + }else{ + pst.close(); + JOptionPane.showMessageDialog(this.fenetre, "Vous Avez deja demander a Chnager dans ce Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + }catch(SQLException er){ + System.out.println(er.toString()); + if(this.erreurSQL()){ + this.createChangement(A, e, B); + }else{ + return; + } + } + this.close(cnx); + } + + @Override + /** + * permet d'ajouter un nouveau changement. de type 2 + * + * @param A groupe actuel + * @param B groupe demandé + * @param e étudiant concerné par le changement + * @param raison la raison du changement de type 2 + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si les groupes ou l'étudiant ne sont pas connus de la factory partenaire, ou e n'appartient pas à A ou A et B ne sont pas frères dans l'arbre des groupes. + * + */ + public void createChangement(Groupe A, Etudiant e, Groupe B, String raison){ + Objects.requireNonNull(A,"Le groupe d'origine ne peut pas être null"); + Objects.requireNonNull(B,"Le groupe d'arrivée ne peut pas être null"); + Objects.requireNonNull(e,"L'étudiant ne peut pas être null"); + Changement c = new ChangementNP(A,e,B, raison); + this.brain.put(Integer.valueOf(c.getId()),c); + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement("SELECT * FROM `Changement` where `idGroupeA`=? AND `idGroupeB`=? AND `idEtudiant`=?; "); + pst.setInt(1, A.getId()); + pst.setInt(2, B.getId()); + pst.setInt(3, e.getId()); + if(!pst.executeQuery().next()){ + pst.close(); + pst=cnx.prepareStatement("INSERT INTO `Changement` (`id`, `idGroupeA`, `idGroupeB`, `idEtudiant`, `Raison`) VALUES (?, ?, ?, ?, ?);"); + pst.setInt(1, c.getId()); + pst.setInt(2, A.getId()); + pst.setInt(3, B.getId()); + pst.setInt(4, e.getId()); + pst.setString(5, raison); + pst.executeUpdate(); + pst.close(); + }else{ + pst.close(); + JOptionPane.showMessageDialog(this.fenetre, "Vous Avez deja demander a Chnager dans ce Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + }catch(SQLException er){ + System.out.println(er.toString()); + if(this.erreurSQL()){ + this.createChangement(A, e, B, raison); + }else{ + return; + } + } + this.close(cnx); + } + + + // ********************** + // FONCTION POUR SIMPLIFIER LES Modification BD + // *********************** + + /** + * permet de se connecter à la base de donnée + * + * @return la connexion à la base de donnée + */ + private Connection cnx(){ + //On se Connecte a la BD + try{ + Class.forName("org.mariadb.jdbc.Driver"); + Connection cnx = DriverManager.getConnection( + "jdbc:mariadb://dwarves.iut-fbleau.fr/chaignea", + "chaignea", "Chaigneauphpmyadmin"); + return cnx; + }catch(Exception e){ + if(this.erreurCO()==true){ + return this.cnx(); + } + } + return null; + } + + /** + * permet de détécter une erreur de connexion à la base de donnée + * + * @return true si une erreur est détéctée, false sinon + * + * + */ + private boolean erreurCO(){ + if(JOptionPane.showConfirmDialog(this.fenetre, "erreur connection a la BD reassayer?", "erreur connection", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ + return true; + }else{ + this.fenetre.dispose(); + return false; + } + } + /** + * permet de détécter une erreur SQL + * + * @return true si une erreur est détéctée, false sinon + * + * + */ + private boolean erreurSQL(){ + if(JOptionPane.showConfirmDialog(this.fenetre, "erreur lors de la modification, reasssayer?", "erreur SQL", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ + return true; + }else{ + return false; + } + } + + /** + * permet de fermer la connexion à la base de donnée + * + * @param clos outil de fermture de la connexion + * + */ + private void close(AutoCloseable clos){ + try{ + clos.close(); + }catch(Exception e){ + if(this.erreurCO()==true) + this.close(clos); + } + } + + /** + * permet de remplir la liste des changements de l'usine + */ + private void getChange(){ + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement("SELECT * FROM `Changement` NATURAL JOIN Etudiant; "); + ResultSet rs=pst.executeQuery(); + while(rs.next()){ + Groupe[] ab=new Groupe[2]; + this.getGroupe(rs.getInt(2), rs.getInt(3), ab, this.agf.getPromotion()); + Etudiant e=new EtudiantNP(rs.getString(6), rs.getString(7), rs.getInt(4)); + if(rs.getString(5)!=null){ + this.brain.put(rs.getInt(1), new ChangementNP(ab[0], e, ab[1], rs.getInt(1), rs.getString(5))); + }else{ + this.brain.put(rs.getInt(1), new ChangementNP(ab[0], e, ab[1], rs.getInt(1))); + } + } + pst.close(); + }catch(SQLException e){ + if(this.erreurCO()) + this.getChange(); + return; + } + this.close(cnx); + } + /** + * permet de chercher les sous-groupes d'un groupe + * + * @param idA id du groupe A + * @param idB id du groupe B + * @param retour tableau de groupe dans lequel on va stocker les groupes + * @param toFind le groupe à comparer (ou groupe père pour la première itération) + */ + private void getGroupe(int idA, int idB, Groupe[] retour, Groupe tofind){ + if(retour[0]!=null && retour[1]!=null) + return; + if(tofind.getId()==idA){ + retour[0]=tofind; + } + if(tofind.getId()==idB){ + retour[1]=tofind; + } + for(Groupe sous:tofind.getSousGroupes()){ + this.getGroupe(idA, idB, retour, sous); + } + } + + /** + * pemet de arfricher la liste des changements + * + */ + private void refresh(){ + this.brain=new HashMap(); + this.getChange(); + } + + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/AbstractGroupeFactoryNP.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/AbstractGroupeFactoryNP.java new file mode 100644 index 0000000..f895fb1 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/AbstractGroupeFactoryNP.java @@ -0,0 +1,782 @@ +package fr.iutfbleau.projetIHM2022FI2.MP; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import java.sql.Connection; +import org.mariadb.jdbc.*; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import java.util.*; +/** + * Usine abstraite gérant l'ensemble des groupes. + * + */ + +public class AbstractGroupeFactoryNP implements AbstractGroupeFactory { + + // la racine (promotion) + private Groupe promo; + + //la fentre pour les fenetre modale + private JFrame fenetre; + + // On utilise une table de hachage pour retrouver facilement un groupe (à partir de son id). + // Si il y a beaucoup de groupes c'est plus rapide que de parcourir toute une liste. + private HashMap brain; + + /** + * Le constructeur fabrique le groupe promotion déja plein (utilisé en Modèle persistant de donné). + * @param fenetre fenetre principale + * + */ + public AbstractGroupeFactoryNP(JFrame fenetre){ + this.fenetre=fenetre; + this.brain=new HashMap(); + this.init(); + } + + /** + * Le constructeur fabrique le groupe promotion vide. + * Il faut ensuite y ajouter les étudiants. + * @param fenetre fenetre principale + * @param name nom de la promotion + * @param min le nombre minimum d'étudiants dans la promotion + * @param max le nombre maximum d'étudiants dans la promotion + */ + public AbstractGroupeFactoryNP(String name, int min, int max, JFrame fenetre){ + Objects.requireNonNull(name,"On ne peut pas créer une promotion dont le nom est null"); + this.promo=new GroupeNP(name,min,max); + this.fenetre=fenetre; + this.brain=new HashMap(); + this.brain.put(Integer.valueOf(this.promo.getId()),this.promo); + this.saveGroupe(promo); + } + + + /** + * Test plutôt optimiste. Si la clé est identique alors on fait comme si c'était le bon groupe. + * @param g le groupe à tester + * @return true si le groupe est connu + */ + public Boolean knows(Groupe g){ + return this.brain.containsKey(Integer.valueOf(g.getId())); + } + + /** + * pemet de changer le nom d'un groupe dans la base de données + * + * @param g le groupe dont on veut changer le nom + * @param name le nouveau nom + * + * @return true si le changement a été effectué, false s'il y a eu une erreur + * + * + */ + public boolean changeNameGroupe(Groupe g, String name){ + if(!this.knows(g)){ + throw new IllegalArgumentException("Groupe inconu "); + } + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement( + "UPDATE `Groupe` SET `nom` = ? WHERE `Groupe`.`id` = ? " + ); + pst.setString(1, name); + pst.setInt(2, g.getId()); + pst.executeUpdate(); + pst.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurSQL()){ + this.changeNameGroupe(g, name); + }else{ + return false; + } + } + this.close(cnx); + g.setName(name); + return true; + } + + + + /** + * permet de récupérer le Groupe qui contient les étudiants de toute la promotion + * @return la promo. + */ + public Groupe getPromotion(){ + return this.promo; + } + + /** + * permet de supprimer un groupe connu de l'usine abstraite qui ne contient pas de groupes. + * Pour détruire un groupe connu qui en contient d'autres il faut le faire récursivement. + * + * @param g le groupe à supprimer + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalStateException si le groupe contient des groupes + * @throws java.lang.IllegalArgumentException si le groupe n'est pas connu de l'usine abstraite ou bien si le groupe est celui de toute la promotion (renvoyé par getPromotion) + */ + public void deleteGroupe(Groupe g){ + Objects.requireNonNull(g,"On ne peut pas enlever un groupe null car null n'est pas un groupe autorisé"); + if (!this.knows(g)){ + throw new IllegalArgumentException("Impossible d'enlever un groupe inconnu"); + } + g.getPointPoint().removeSousGroupe(g); + this.brain.remove(Integer.valueOf(g.getId())); + this.suprGroupe(g); + } + + /** + * permet d'ajouter un groupe vide de type FREE comme sous-groupe d'un groupe donné. + * @param pere le groupe père du groupe à créer + * @param name le nom du groupe à créer + * @param min,max bornes indicatives sur la taille du groupe à créer + * + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou si il n'y a pas 0 < min <= max + */ + public void createGroupe(Groupe pere, String name, int min, int max){ + Objects.requireNonNull(pere,"Le groupe pere ne peut pas être null"); + Objects.requireNonNull(name,"Le nouveau groupe ne peut pas avoir null comme nom"); + + if (!this.knows(pere)){ + throw new IllegalArgumentException("Interdit d'ajouter un fils à un groupe inconnu"); + } + if (pere.getType().equals(TypeGroupe.PARTITION)){ + throw new IllegalArgumentException("Impossible d'ajouter un groupe à une parition. Il faut utiliser createPartition pour créer une partition"); + } + if ( min <= 0 || max < min){ + throw new IllegalArgumentException("Il faut que 0 < min <= max"); + } + + Groupe g = new GroupeNP(pere,name,min,max); + pere.addSousGroupe(g); + this.brain.put(Integer.valueOf(g.getId()),g); + this.saveGroupe(g); + } + + /** + * permet de créer une partition automatiquement sous un groupe donné. + * + * @param pere le groupe père du groupe à partitionner + * @param name le nom des groupe à créer (on ajoute à la suite un numéro de 1 à n pour distinguer chaque groupe formant la partition) + * @param n le nombre de partitions + * @throws java.lang.NullPointerException si un argument est null + * @throws java.lang.IllegalArgumentException si le groupe pere est de type PARTITION + * ou n négatif ou nul + * + * NB. doit créer une "copie" de pere + * sous pere de type Partition et ajouter sous ce groupe, n groupes de type "FREE". + * les valeurs min et max de ces n groupes sont + * min = 0 et + * max = partie entière de N/n plus 1, où N est le nombre max du groupe pere. + */ + public void createPartition(Groupe pere, String name, int n){ + Objects.requireNonNull(pere,"Le groupe pere ne peut pas être null"); + Objects.requireNonNull(name,"Le nouveau groupe ne peut pas avoir null comme nom"); + if (!this.knows(pere)){ + throw new IllegalArgumentException("Impossible de partitionner ce groupe inconnu"); + } + if (pere.getType().equals(TypeGroupe.PARTITION)){ + throw new IllegalArgumentException("Impossible de créer une partition à ce niveau. Il faut soit repartitionner le groupe au dessus, soit partitionner une partition en dessous."); + } + if ( n <= 0){ + throw new IllegalArgumentException("Le nombre de partitions doit être strictement positif"); + } + //Création de la racine de la partition. + Groupe copiePereRacinePartition = new GroupeNP(pere); + pere.addSousGroupe(copiePereRacinePartition); + this.brain.put(Integer.valueOf(copiePereRacinePartition.getId()),copiePereRacinePartition); + // création des sous-groupes + int min = 0; + int max = ((int) Math.floor(pere.getSize()/n))+1; + List groupes = new ArrayList(n); + for(int i = 0; i l'ensemble des étudiants connus de la factory ayant un nom "proche" de ce string au sens de la remarque ci-dessus. + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getEtudiants(String nomEtu){ + Set s=new LinkedHashSet<>(); + //on retourne tous les etudiants + if(nomEtu==null){ + if(this.getPromotion()!=null){ + for(Etudiant et:this.getPromotion().getEtudiants()){ + s.add(et); + } + } + //ceux qui sont connu mais pas dans la promo + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement("SELECT * FROM Etudiant where Etudiant.id NOT IN (SELECT CONTIENT.idEt FROM CONTIENT) Group by Etudiant.id;"); + ResultSet rs=pst.executeQuery(); + while(rs.next()){ + s.add(new EtudiantNP(rs.getString(2), rs.getString(3), rs.getInt(1))); + } + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurCO()) + return this.getEtudiants(nomEtu); + return null; + } + this.close(cnx); + }else{ + for(Etudiant e:this.getPromotion().getEtudiants()){ + if((e.getNom()).contains(nomEtu)){ + s.add(e); + } + } + } + return s; + } + + /** + * permet de retrouver les groupes d'un étudiant. + * + * @param Etu un étudiant + * @return Etudiant l'étudiant connu de la factory ayant cet identifiant + * + * @throws java.lang.NullPointerException si le String est null. + */ + public Set getGroupesOfEtudiant(Etudiant etu){ + if(etu==null) + throw new NullPointerException(); + Set ret=new LinkedHashSet(); + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement("SELECT `idGroupe` FROM CONTIENT where idEt=? Group by `idGroupe`;"); + pst.setInt(1, etu.getId()); + ResultSet rs=pst.executeQuery(); + while(rs.next()){ + ret.add(this.brain.get(rs.getInt(1))); + } + rs.close(); + pst.close(); + }catch(SQLException e){ + + } + this.close(cnx); + return ret; + } + + // ********************** + // FONCTION POUR SIMPLIFIER LES Modification BD + // *********************** + + + /** + * permet de se connecter à la base de donnée + * + * @return la connexion à la base de donnée + */ + private Connection cnx(){ + //On se Connecte a la BD + try{ + Class.forName("org.mariadb.jdbc.Driver"); + Connection cnx = DriverManager.getConnection( + "jdbc:mariadb://dwarves.iut-fbleau.fr/chaignea", + "chaignea", "Chaigneauphpmyadmin"); + return cnx; + }catch(Exception e){ + System.out.println(e.toString()); + if(this.erreurCO()==true){ + return this.cnx(); + } + } + return null; + } + /** + * permet de détécter une erreur de connexion à la base de donnée + * + * @return true si une erreur est détéctée, false sinon + * + * + */ + private boolean erreurCO(){ + if(JOptionPane.showConfirmDialog(this.fenetre, "erreur connection a la BD reassayer?", "erreur connection", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ + return true; + }else{ + this.fenetre.dispose(); + return false; + } + } + /** + * permet de détécter une erreur SQL + * + * @return true si une erreur est détéctée, false sinon + * + * + */ + private boolean erreurSQL(){ + if(JOptionPane.showConfirmDialog(this.fenetre, "erreur lors de la modification, reasssayer?", "erreur SQL", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ + return true; + }else{ + return false; + } + } + /** + * permet de supprimer un étudiant de la base de donnée + * @param et l'étudiant à supprimer + * @param g le groupe dans lequel il est + */ + private void deleteEtu(Etudiant et, Groupe g){ + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement( + "DELETE FROM CONTIENT WHERE idGroupe=? AND idEt=?; " + ); + pst.setInt(2, et.getId()); + this.deleteEtu(pst, cnx, g.getId()); + pst.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurSQL()){ + this.deleteEtu(et, brain.get(g.getId())); + } + } + this.close(cnx); + } + /** + * permet de supprimer un étudiant de la base de donnée + * @param pst la requete préparée + * @param cnx la connexion à la base de donnée + * @param id le groupe parent + */ + private void deleteEtu(PreparedStatement pst, Connection cnx, int id){ + try{ + pst.setInt(1, id); + pst.executeUpdate(); + + PreparedStatement sous=cnx.prepareStatement( + "SELECT * FROM Groupe WHERE `id-parent`=? AND `id-parent`!=id; " + ); + sous.setInt(1, id); + ResultSet rs=sous.executeQuery(); + while(rs.next()){ + this.deleteEtu(pst, cnx, rs.getInt(1)); + } + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurSQL()){ + this.deleteEtu(pst, cnx, id); + } + } + } + /** + * permet de fermer la connexion à la base de donnée + * + * @param clos outil de fermture de la connexion + * + */ + private void close(AutoCloseable clos){ + try{ + clos.close(); + }catch(Exception e){ + System.out.println(e.toString()); + if(this.erreurCO()==true) + this.close(clos); + } + } + +/** + * permet d'ajouter un groupe de la base de donnée + * @param etudiant l'étudiant à ajouter + * @param g le groupe de l'étudiant + * @return true s'il n'y a pas eu d'erreur, false sinon + */ +private boolean saveEtu(Etudiant etudiant, Groupe g){ + Connection cnx = this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement( + "Select id from Etudiant where id=?; "); + pst.setString(1, String.valueOf(etudiant.getId())); + ResultSet rs=pst.executeQuery(); + if(rs.next()){ + //L'etudiant est déja connu de la BD + pst.close(); + pst=cnx.prepareStatement( + "INSERT INTO `CONTIENT` (`idGroupe`, `idEt`) VALUES (?, ?);"); + pst.setInt(2, etudiant.getId()); + pst.setInt(1, g.getId()); + pst.executeUpdate(); + }else{ + pst.close(); + pst=cnx.prepareStatement( + "INSERT INTO `Etudiant` (`id`, `nom`, `prenom`) VALUES (?, ?, ?) ;"); + pst.setInt(1, etudiant.getId()); + pst.setString(2, etudiant.getNom()); + pst.setString(3, etudiant.getPrenom()); + pst.executeUpdate(); + } + rs.close(); + pst.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurSQL()){ + this.saveEtu(etudiant, g); + }else{ + return false; + } + } + this.close(cnx); + return true; + } + /** + * permet d'ajouter un groupe dans la base de donnée + * @param g le groupe à ajouter + * @return true s'il n'y a pas eu d'erreur, false sinon + */ + private boolean saveGroupe(Groupe g){ + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement( + "INSERT INTO `Groupe` (`id`, `nom`, `min`, `max`, `Type`, `id-parent`) VALUES (?, ?, ?, ?, ?, ?);" + ); + pst.setInt(1, g.getId()); + pst.setString(2, g.getName()); + pst.setInt(3, g.getMin()); + pst.setInt(4, g.getMax()); + pst.setString(5, g.getType().name()); + pst.setInt(6, g.getPointPoint().getId()); + pst.executeUpdate(); + pst.close(); + for(Etudiant e: g.getEtudiants()){ + this.saveEtu(e, g); + } + for(Groupe sous:g.getSousGroupes()){ + this.saveGroupe(sous); + } + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurSQL()){ + this.saveGroupe(g); + }else{ + return false; + } + } + this.close(cnx); + return true; + } + /** + * permet de supprimer un groupe de la base de donnée + * @param g le groupe à supprimer + * @return true s'il n'y a pas eu d'erreur, false sinon + */ + private boolean suprGroupe(Groupe g){ + Connection cnx=this.cnx(); + try{ + PreparedStatement pst=cnx.prepareStatement("Delete FROM Groupe where id=?;"); + pst.setInt(1, g.getId()); + pst.executeUpdate(); + pst.close(); + pst=cnx.prepareStatement("Delete FROM CONTIENT where idGroupe=?;"); + pst.setInt(1, g.getId()); + pst.executeUpdate(); + pst.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurSQL()){ + this.suprGroupe(g); + }else{ + return false; + } + } + this.close(cnx); + return true; + } + + + + /***************************** + * FONCTION POUR INITIALISER LA FACTORY AVEC LA BD + * ******************************** + */ + /** + * permet de charger les groupes de la base de donnée + */ + private void init(){ + Connection cnx=this.cnx(); + //on récupère le Groupe de la BD n'ayant pas de Parent (La promo donc) + try{ + PreparedStatement pst = cnx.prepareStatement( + "SELECT `id`, `nom`, `min`, `max`, `value`, `id-parent` FROM `Groupe` join `TYPE` on Groupe.Type=TYPE.name ORDER BY Groupe.id ASC;"); + ResultSet rs = pst.executeQuery(); + rs=pst.executeQuery(); + //Si il existe bien une promotion + if(rs.next()){ + //On créer le groupe de promo + this.promo=new GroupeNP(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getInt(4), TypeGroupe.getType(rs.getString(5)), null); + //on ajoute au cerveau + this.brain.put(this.promo.getId(), this.promo); + //On lui ajoute tout ses sous-groupe + this.addSousGroupe(this.promo, cnx); + //On ajoute les étudiants: + for(Groupe sous: this.brain.values()){ + this.addBDEtudiant(sous, cnx); + } + }else{ + //Si aucune ligne et donc pas de promo: + this.promo=null; + } + rs.close(); + pst.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurCO()) + this.init(); + } + this.close(cnx); + } + + /** + * Fonction recursive permettant de récuperrer les sous groupe a partir de la BD + * @param g le groupe + * @param cnx la connection a la BD (evite de la surcharger) + */ + private void addSousGroupe(Groupe g, Connection cnx){ + try{ + //On récupere les Groupe qui ont le parent :g + PreparedStatement pst= cnx.prepareStatement( + "SELECT `id`, `nom`, `min`, `max`, `value`, `id-parent` FROM `Groupe` join `TYPE` on Groupe.Type=TYPE.name where Groupe.`id-parent`=? and Groupe.id!=Groupe.`id-parent`;"); + pst.setString(1, String.valueOf(g.getId())); + ResultSet rs=pst.executeQuery(); + rs=pst.executeQuery(); + //autrement si le groupe as des sous groupe + while(rs.next()){ + //on les ajoute + Groupe nouveau=new GroupeNP(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getInt(4), TypeGroupe.getType(rs.getString(5)), g); + //Si one le connait pas + if(this.brain.get(nouveau.getId())==null){ + this.brain.put(nouveau.getId(), nouveau); + } + g.addSousGroupe(nouveau); + this.addSousGroupe(nouveau, cnx); + //on ajoute les sous groupe des sous-groupe + } + rs.close(); + }catch(SQLException e){ + System.out.println(e); + if(this.erreurCO()) + this.addSousGroupe(g, cnx); + } + } + + /** + * Fonction recursive ajoutant les étudiant aux groupe de la promo + * @param g le groupe pour qui ajouter les Etudiant + * @param cnx la connection (evite de surcharger la BD) + */ + private void addBDEtudiant(Groupe g, Connection cnx){ + try{ + //On récupère les etudiants contenue du groupe + PreparedStatement pst; + //Si c'est la promo + pst= cnx.prepareStatement("SELECT Etudiant.nom, Etudiant.prenom, Etudiant.id FROM `CONTIENT` JOIN Etudiant on CONTIENT.idEt=Etudiant.id WHERE CONTIENT.idGroupe=? ORDER BY Etudiant.id ASC"); + pst.setInt(1, g.getId()); + ResultSet rs=pst.executeQuery(); + //Pour tous les étudiants + while(rs.next()){ + boolean exist=false; + //autrement on recupere l'etudiant + for(Etudiant e: g.getPointPoint().getEtudiants()){ + if(e.getId()==rs.getInt(3)){ + exist=true; + g.addEtudiant(e); + break; + } + } + if(exist==false){ + g.addEtudiant(new EtudiantNP(rs.getString(1), rs.getString(2), rs.getInt(3))); + } + } + rs.close(); + pst.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurCO()) + this.addBDEtudiant(g, cnx); + } + } + + + + + /******************* + * FONCTION POUR REFRESH + * ******************* + */ + + + + + /** + * Refresh le groupe donnée pour le mettre a jour avec la Base de donnée + * Si le groupe n'existe plus on retourne le groupe parent le plus proche existant encore + * @param g le groupe a refresh + * @param cnx la connection a la BD (evite de la surcharger) + * @return le groupe refresh + */ + private Groupe refreshGroupe(Groupe g, Connection cnx){ + try{ + PreparedStatement pst = cnx.prepareStatement( + "SELECT `id`, `nom`, `min`, `max`, `value`, `id-parent` FROM `Groupe` join `TYPE` on Groupe.Type=TYPE.name where Groupe.`id`=? OR Groupe.`id-parent`=? ORDER BY Groupe.id ASC;"); + pst.setString(1, String.valueOf(g.getId())); + pst.setString(2, String.valueOf(g.getId())); + ResultSet rs=pst.executeQuery(); + if(rs.next()){ + if(rs.getString(2)!=g.getName()){ + g.setName(rs.getString(2)); + } + Set it=new LinkedHashSet<>(); + for(Groupe gr:g.getSousGroupes()){ + it.add(gr); + } + for(Groupe gr:it){ + g.removeSousGroupe(gr); + } + Set et=new LinkedHashSet<>(); + for(Etudiant gr:g.getEtudiants()){ + et.add(gr); + } + for(Etudiant gr:et){ + g.removeEtudiant(gr); + } + this.addSousGroupePasRecursif(g, cnx); + }else{ + if(g==g.getPointPoint()){ + g=null; + }else{ + g=this.refreshGroupe(g.getPointPoint(), cnx); + } + } + rs.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurCO()) + this.refreshGroupe(g, cnx); + } + return g; + } + + /** + * refresh le Groupe ainsi que ses etudiants + * @param g le groupe + * @return le groupe refresh/un parent si il a été refresh + */ + public Groupe refreshALL(Groupe g){ + Connection cnx = this.cnx(); + g=this.refreshGroupe(g, cnx); + Set et=new LinkedHashSet<>(); + for(Etudiant gr:g.getEtudiants()){ + et.add(gr); + } + for(Etudiant gr:et){ + g.removeEtudiant(gr); + } + this.addBDEtudiant(g, cnx); + this.close(cnx); + return g; + } + + + /** + * Fonction recursive permettant de récuperrer les sous groupe a partir de la BD + * @param g le groupe + * @param cnx la connection a la BD (evite de la surcharger) + * @param pourcent le pourcentage de ce groupe dans le chargement + */ + private void addSousGroupePasRecursif(Groupe g, Connection cnx){ + try{ + //On récupere les Groupe qui ont le parent :g + PreparedStatement pst= cnx.prepareStatement( + "SELECT `id`, `nom`, `min`, `max`, `value`, `id-parent` FROM `Groupe` join `TYPE` on Groupe.Type=TYPE.name where Groupe.`id-parent`=? and Groupe.id!=Groupe.`id-parent`;"); + pst.setString(1, String.valueOf(g.getId())); + ResultSet rs=pst.executeQuery(); + rs=pst.executeQuery(); + //autrement si le groupe as des sous groupe + while(rs.next()){ + //on les ajoute + Groupe nouveau=new GroupeNP(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getInt(4), TypeGroupe.getType(rs.getString(5)), g); + //Si one le connait pas + if(this.brain.get(nouveau.getId())==null){ + this.brain.put(nouveau.getId(), nouveau); + } + g.addSousGroupe(nouveau); + //on ajoute les sous groupe des sous-groupe + } + rs.close(); + }catch(SQLException e){ + System.out.println(e.toString()); + if(this.erreurCO()) + this.addSousGroupe(g, cnx); + } + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ChangementNP.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ChangementNP.java new file mode 100644 index 0000000..74f42e9 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ChangementNP.java @@ -0,0 +1,141 @@ +package fr.iutfbleau.projetIHM2022FI2.MP; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import java.util.*; +/** + * Une demande de changement de groupe + * concerne un étudiant, qui est dans un groupe A et veut aller dans un groupe B. + * + * Implémentation non persistante fournie avec l'API. + */ + +public class ChangementNP implements Changement { + + //auto-incrément des changements + private static int nextId=0; + // id du changement + private int id; + // groupe d'origine et d'arrivée + private Groupe a,b; + // étudiant concerné + private Etudiant e; + // raison de la demande + private String raison; + /** + * Constructeur d'un changement. + * @param a le groupe de départ + * @param b le groupe d'arrivée + * @param e l'étudiant demandant le changement + * @param raison la raison du changement + */ + public ChangementNP(Groupe a, Etudiant e, Groupe b){ + Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null"); + Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null"); + Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null"); + this.raison=null; + this.id=++this.nextId; + this.a=a; + this.b=b; + this.e=e; + } + /** + * Constructeur d'un changement. + * @param a le groupe de départ + * @param b le groupe d'arrivée + * @param e l'étudiant demandant le changement + * @param raison la raison du changement + * + */ + public ChangementNP(Groupe a, Etudiant e, Groupe b, String raison){ + Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null"); + Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null"); + Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null"); + this.raison=raison; + this.id=++this.nextId; + this.a=a; + this.b=b; + this.e=e; + } + /** + * Constructeur d'un changement. + * @param a le groupe de départ + * @param b le groupe d'arrivée + * @param e l'étudiant demandant le changement + * @param id l'id du changement + * + */ + public ChangementNP(Groupe a, Etudiant e, Groupe b, int id){ + Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null"); + Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null"); + Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null"); + + this.id=id; + this.a=a; + this.b=b; + this.e=e; + if(this.id>this.nextId){ + this.nextId=this.id; + } + } + /** + * Constructeur d'un changement. + * @param a le groupe de départ + * @param b le groupe d'arrivée + * @param e l'étudiant demandant le changement + * @param id l'id du changement + * @param raison la raison du changement + * + */ + public ChangementNP(Groupe a, Etudiant e, Groupe b, int id, String raison){ + Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null"); + Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null"); + Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null"); + this.raison=raison; + this.id=id; + this.a=a; + this.b=b; + this.e=e; + if(this.id>this.nextId){ + this.nextId=this.id; + } + } + + /** + * permet de récupérer l'identifiant du changement (référence interne sans intérêt irl). + * @return l'identifiant. + */ + public int getId(){ + return this.id; + } + + /** + * permet de récupérer le groupe de depart + * @return ce groupe. + */ + public Groupe getA(){ + return this.a; + } + + /** e + * @return ce groupe. + */ + public Groupe getB(){ + return this.b; + } + + /** + * permet de récupérer l'étudiant demandant le changement + * @return cet étudiant + */ + public Etudiant getEtu(){ + return this.e; + } + /** + * permet de récupérer la raison du changement + * @return la raison du changement + */ + @Override + public String getRaison() { + return this.raison; + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/Model/ModelEtu.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/Model/ModelEtu.java new file mode 100644 index 0000000..3947c29 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/Model/ModelEtu.java @@ -0,0 +1,358 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ETU.Model; +import javax.swing.*; +import java.awt.*; +import java.util.Set; +import java.util.HashSet; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory; +import fr.iutfbleau.projetIHM2022FI2.API.Changement; +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurFenetre; +import fr.iutfbleau.projetIHM2022FI2.Permanent.View.Chargement; +import fr.iutfbleau.projetIHM2022FI2.MP.AbstractChangementFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MP.AbstractGroupeFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MP.ETU.View.FenetreEtudiant; +import fr.iutfbleau.projetIHM2022FI2.MP.ETU.View.FenetreGroupe; + +/** + * Le Model de L'IHM + */ +public class ModelEtu implements Model{ + // le panel qui contient la fenetre de groupe + private JPanel panGroupe; + // la fenetre de groupe + private FenetreGroupe fenGr; + //la fenetre d'etudiant + private FenetreEtudiant fenEtu; + // le groupe courant + private AbstractGroupeFactory promo; + // le changement courant + private AbstractChangementFactory changement; + // la fenetre principale + private JFrame fenetre; + // l'etudiant courant + private Etudiant Selected; + /** + * Constructeur du Model + */ + public ModelEtu(){ + this.fenetre=new JFrame(); + this.fenetre.setSize(1200, 720); + this.fenetre.setLocation(100,100); + this.fenetre.addWindowListener(new ObservateurFenetre()); + this.fenetre.setLayout(new GridLayout(1,2)); + this.fenetre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + this.fenetre.setMinimumSize(this.fenetre.getSize()); + Chargement ch=new Chargement(this.fenetre); + this.promo=new AbstractGroupeFactoryNP(this.fenetre); + if(this.promo.getPromotion()==null){ + this.promo=null; + } + ch.dispose(); + this.fenetre.setVisible(true); + this.initEtu(null); + if(this.promo==null){ + this.fenGr=new FenetreGroupe(null, this, null); + this.fenEtu=new FenetreEtudiant(null, this.Selected, this); + this.changement=null; + }else{ + this.changement=new AbstractChangementFactoryNP(promo, this.fenetre); + this.fenGr=new FenetreGroupe(this.promo.getPromotion(), this,this.promo.getGroupesOfEtudiant(this.Selected)); + this.fenEtu=new FenetreEtudiant(this.promo.getPromotion(), this.Selected, this); + } + this.panGroupe=new JPanel(new GridLayout(1,1)); + if(this.promo!=null){ + this.showGroupe(this.promo.getPromotion()); + }else{ + this.showGroupe(null); + } + } + + + @Override + /** + * Fonction pour refresh/changer de groupe d'affichage + * @param g le groupe a afficher + */ + public void showGroupe(Groupe g){ + if(g!=null) + g=this.promo .refreshALL(g); + this.panGroupe.removeAll(); + this.fenGr=new FenetreGroupe(g, this, this.promo.getGroupesOfEtudiant(this.Selected)); + this.fenEtu=new FenetreEtudiant(g, this.Selected, this); + this.fenetre.getContentPane().removeAll(); + this.panGroupe.add(this.fenGr.getPan()); + this.panGroupe.revalidate(); + this.fenetre.add(this.panGroupe); + JScrollPane scroll=new JScrollPane(this.fenEtu.getPan()); + scroll.getVerticalScrollBar().setUnitIncrement(15); + this.fenetre.add(scroll); + this.fenetre.revalidate(); + } + @Override + /** + * getteur de la fenetre + * @return JFrame la fenetre + */ + public JFrame getFenetre() { + return fenetre; + } + /** + * Permet d'obtenir les étudiants du groupe courant. + * @return les étudiants du groupe courant + */ + @Override + public Set getEtudiant(){ + return this.promo.getPromotion().getEtudiants(); + } + + private void initEtu(String err){ + Set liste=this.promo.getPromotion().getEtudiants(); + JPanel panel = new JPanel(); + JPanel myPanel = new JPanel(); + JTextField idd = new JTextField(15); + myPanel.add(new JLabel("Id:")); + myPanel.add(idd); + if(err!=null){ + myPanel.add(new JLabel(err, SwingConstants.RIGHT)); + } + panel.add(myPanel); + + if(JOptionPane.showConfirmDialog(this.fenetre, panel, "login", JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION){ + this.fenetre.dispose(); + System.exit(0); + }else{ + try{ + int id=Integer.parseInt(idd.getText()); + for(Etudiant et:liste){ + if(et.getId()==id){ + this.Selected=et; + return; + } + } + }catch(NumberFormatException e){ + this.initEtu("Id incomprhéhensible"); + } + } + this.initEtu("Etudiant introuvable"); + } + + // ************************** + // FONCTION POUR LES CHANGEMENTS + // ****************************** + /** + * Permet de changer de groupe. + * @param e l'étudiant qui change de groupe + * @param g le groupe dans lequel l'étudiant va + */ + @Override + public void changeGroupe(Etudiant e, Groupe b){ + if(b==null) + return; + b=this.promo.refreshALL(b); + if(b.getEtudiants()!=null && b.getMax()>b.getEtudiants().size()+1){ + if(b.getEtudiants().size()>this.fenGr.getG().getEtudiants().size()){ + JPanel myPanel= new JPanel(new GridLayout(2,1)); + JTextField xField = new JTextField(100); + xField.setMinimumSize(new Dimension(100, 100)); + xField.setPreferredSize(new Dimension(100,100)); + myPanel.add(new JLabel("Ce Groupe est plus grand que le votre raison du changement:")); + myPanel.add(xField); + if(JOptionPane.showConfirmDialog(this.fenetre, myPanel, "Changer dans quel Groupe ?", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ + //IL faut que l'etudiant detaile un minimun la raison + if(xField.getText().length()>5){ + this.changement.createChangement(this.fenGr.getG(), e, b, xField.getText()); + }else{ + JOptionPane.showMessageDialog(this.fenetre, "veuillez detailler votre raison", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + }else{ + this.changement.createChangement(this.fenGr.getG(), e, b); + } + }else{ + JOptionPane.showMessageDialog(this.fenetre, "impossible trop d'etudiant dans l'autre Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(this.fenGr.getG()); + } +/** + * pemet d'obtenir les sous groupes du groupe courant. + * @return les sous groupes du groupe courant + */ + @Override + public Set getGroupePartition(){ + this.promo.refreshALL(this.fenGr.getG().getPointPoint()); + Set retour=new HashSet<>(); + if(this.fenGr.getG().getPointPoint().getType()!=TypeGroupe.PARTITION) + throw new IllegalStateException("impossible de changer un étudiant d'un groupe ne provenant pas d'une partition"); + for(Groupe sous:this.fenGr.getG().getPointPoint().getSousGroupes()){ + if(sous.getId()!=this.fenGr.getG().getId()){ + retour.add(sous); + } + } + return retour; + } + /** + * ajoute un étudiant dans un groupe. + * @param e l'étudiant à ajouter + * @param g le groupe dans lequel l'étudiant va + * @return true si l'ajout a réussi, false sinon + */ + @Override + public boolean addEtudiant(Groupe g, Etudiant e) { + // TODO Auto-generated method stub + return false; + } + + /** + * supprime un groupe. + * @param g le groupe à supprimer + */ + @Override + public void delete(Groupe g) { + // TODO Auto-generated method stub + + } + + /** + * rennome un groupe. + * @param g le groupe à renommer + * @param nom le nouveau nom du groupe + * + */ + @Override + public void rename(String name, Groupe g) { + // TODO Auto-generated method stub + + } + + /** + * Fonction permetant de créer une partition d'un groupe + * @param g le groupe a partitionner + * @param n le nombre de partition + * @param name le nom des partition + */ + @Override + public void partition(Groupe g, int n, String name) { + // TODO Auto-generated method stub + + } + + /** + * Fonction permettant de créer un sous-groupe d'un groupe + * @param g le groupe parent + * @param name le nom du sous-groupe + * @param min le nombre min d'etudiant + * @param max le nombre max d'etudiant + * @param ajout la liste des étudiants a ajouter au groupe + */ + @Override + public void free(Groupe g, String name, int min, int max, Set ajout) { + // TODO Auto-generated method stub + + } + + + /** + * ajoute une nouvelle promotion + * @param min le nombre min + * @param max le nombre max + * @param name le nom + * @param ajout les etudiant a ajouter a la promo + */ + @Override + public void addPromo(int min, int max, String name, Set ajout) { + // TODO Auto-generated method stub + + } + +/** + * Fonction pour supprimer un etudiant. + * @param e l'etudiant a supprimer + * @return boolean true si l'etudiant a ete supprimer, false sinon + + */ + @Override + public boolean deleteEtu(Etudiant e) { + // TODO Auto-generated method stub + return false; + } + + /** + * Fonction pour afficher une fenetre listnatn les changements + * + */ + @Override + public void listChange() { + // TODO Auto-generated method stub + + } + + /** + * Fonction pour effectuer un changement + * @param Changement le changement a effecteur + */ + @Override + public void change(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction supprimant un changement + * + * @param to_delete la changement a delete + */ + @Override + public void deleteChange(Changement to_delete) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction affichant les raison d'un changement + * + * @param change le changement + */ + @Override + public void showRaisonChange(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée + */ + @Override + public void findEtu() { + // TODO Auto-generated method stub + + } + + + /** + * Fonction pour recuperer les etudiant avec ce nom + * @param name le nom de(s) etudiants + * @return la liste + */ + @Override + public Set getEtu(String name) { + // TODO Auto-generated method stub + return null; + } + + + /** + *affiche les groupe d'un etudiant + * @param e l'etudiant + */ + @Override + public void showGroupOfEtudiant(Etudiant e) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/FenetreEtudiant.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/FenetreEtudiant.java new file mode 100644 index 0000000..e58e7d1 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/FenetreEtudiant.java @@ -0,0 +1,91 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ETU.View; + + +import javax.swing.JLabel; +import javax.swing.JPanel; + +import java.awt.*; +import java.util.LinkedHashSet; +import java.util.Set; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ActionListenerChangeEtu; +import fr.iutfbleau.projetIHM2022FI2.API.Model; + +/** + * Affichage des édudiants d'un groupe + * + */ +public class FenetreEtudiant{ + //liste des étudiants + private Set etu; + // panel + private JPanel pan; + // l'étudiant sélectionné + private Etudiant concerner; + // model + private Model model; + // tru si le groupe est une partition + private boolean partition; + + /** + * Constructeur de l'affichage des étudiants + * @param g le groupe + * @param m le model + * @param e l'étudiant sélectionné + */ + public FenetreEtudiant(Groupe g, Etudiant e, Model m){ + this.pan=new JPanel(); + this.model=m; + if(g!=null){ + this.etu=g.getEtudiants(); + }else{ + this.etu=new LinkedHashSet<>(); + } + this.concerner=e; + if(g.getPointPoint().getType()==TypeGroupe.PARTITION) + this.partition=true; + else{ + this.partition=false; + } + this.draw(); + } + /** + * Gère l'affichage des étudiants + */ + private void draw(){ + if(this.etu.size()!=0){ + this.pan.setLayout(new GridLayout(this.etu.size(), 1, 30, 0)); + PanelEtudiant p=new PanelEtudiant(this.concerner, this.partition); + p.addActionChangeListener(new ActionListenerChangeEtu(this.model, this.concerner)); + this.pan.add(p); + for(Etudiant e: this.etu){ + if(this.concerner.getId() != e.getId()){ + this.pan.add(p); + p=new PanelEtudiant(e,false); + } + } + }else{ + this.pan.setLayout(new FlowLayout()); + this.pan.add(new JLabel("Il n'y a pas d'étudiant")); + } + } + /** + * rafraichit l'affichage. + */ + public void refresh(){ + this.pan.removeAll(); + this.draw(); + this.pan.revalidate(); + } + + /** + * premet d'obtenir le panel de l'affichage + * @return le panel de l'affichage + */ + public JPanel getPan() { + return pan; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/FenetreGroupe.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/FenetreGroupe.java new file mode 100644 index 0000000..3b83a6b --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/FenetreGroupe.java @@ -0,0 +1,132 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ETU.View; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import java.awt.Font; +import java.awt.GridLayout; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurChangeGroupe; + +import java.util.Set; +import java.awt.Color; + +/** + * Affichage d'un groupe + * +*/ +public class FenetreGroupe{ + // le groupe affiché + private Groupe g; + // le panel d'affichage + private JPanel pan; + // le modèle + private Model m; + // liste des sous groupes + private Set appartient; + + /** + * Constructeur de l'affichage d'un groupe + * @param g le groupe à afficher + * @param m le model + * @param appartient la liste des sous groupes + * + */ + public FenetreGroupe(Groupe g, Model m, Set appartient){ + super(); + this.g=g; + this.appartient=appartient; + this.m=m; + this.pan=new JPanel(); + this.draw(); + } + /** + * permet de récupérer le groupe affiché + * @return le groupe affiché + */ + public Groupe getG() { + return this.g; + } + /** + * rafraichit l'affichage du groupe + */ + public void refresh(){ + this.pan.removeAll(); + this.draw(); + this.pan.revalidate(); + } + /** + * gère l'affichage du groupe + */ + private void draw(){ + if(g!=null){ + int taille=1; + if(g.getType()==TypeGroupe.PARTITION || g.getType()==TypeGroupe.ROOT) + taille--; + if(g.getSousGroupes().size()>0) + this.pan.setLayout(new GridLayout(7, 1)); + else{this.pan.setLayout(new GridLayout(6, 1));} + JPanel tache=new JPanel(new GridLayout(1,taille)); + + if(g.getType()!=TypeGroupe.ROOT){ + JButton bout=new JButton(g.getPointPoint().getName()); + bout.addActionListener(new ObservateurChangeGroupe(m, g.getPointPoint())); + tache.add(bout); + } + this.pan.add(tache); + JLabel titre=new JLabel("Groupe : "+g.getName(), JLabel.CENTER); + titre.setFont(new Font(Font.SERIF, Font.BOLD, titre.getFont().getSize()+10)); + this.pan.add(titre); + this.pan.add(new JLabel("min= "+String.valueOf(g.getMin())+"\t || \t max= "+String.valueOf(g.getMax()),JLabel.CENTER)); + JButton refresh= new JButton("Resfresh"); + refresh.addActionListener(new ObservateurChangeGroupe(m, g)); + this.pan.add(refresh); + this.pan.add(new JLabel("Type: "+g.getType().name()+"\t || \t id="+String.valueOf(g.getId()), JLabel.CENTER)); + this.pan.add(new JLabel("Sous groupe:",JLabel.CENTER)); + if(g.getSousGroupes().size()>0){ + JPanel sous=new JPanel(new GridLayout(g.getSousGroupes().size(), 1)); + for(Groupe gr: g.getSousGroupes()){ + JButton b=new JButton(gr.getName()); + boolean contenu=false; + for(Groupe t: this.appartient){ + if(t.getId()==gr.getId()){ + contenu=true; + break; + } + } + if(contenu){ + b.addActionListener(new ObservateurChangeGroupe(m, gr)); + }else{ + b.setBackground(Color.RED); + } + sous.add(b); + } + this.pan.add(new JScrollPane(sous)); + } + } + } + /** + * permet de modifier le groupe affiché + * @param g le nouveau groupe à afficher + */ + public void setG(Groupe g) { + this.g = g; + } + /** + * permet de modifier la liste des sous groupes + * @param appartient la nouvelle liste des sous groupes + */ + public void setAppartient(Set appartient) { + this.appartient = appartient; + } + /** + * Permet de récupérer le panel d'affichage. + * @return le panel d'affichage + */ + public JPanel getPan() { + return pan; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/PanelEtudiant.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/PanelEtudiant.java new file mode 100644 index 0000000..f8dccd6 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ETU/View/PanelEtudiant.java @@ -0,0 +1,41 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ETU.View; + +import javax.swing.JLabel; +import javax.swing.JPanel; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; + +import javax.swing.JButton; +import java.awt.*; +import java.awt.event.ActionListener; + + +public class PanelEtudiant extends JPanel{ + + // bouton déplacement + private JButton deplacer; + /** + * Constructeur du panel d'affichage d'un étudiant + * @param e l'étudiant à afficher + * @param concerner si l'étudiant à afficher est l'étudiant logué + */ + public PanelEtudiant(Etudiant e, boolean concerner){ + super(new GridLayout(1,2,20,10)); + JLabel label=new JLabel(" "+e.getNom()+" "+e.getPrenom()+" "+e.getId(), JLabel.LEFT); + label.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20)); + + this.add(label); + this.deplacer=new JButton("changer de groupe"); + if(concerner==true) + this.add(this.deplacer); + } + + + /** + * Ajoute un listener au bouton de changement de groupe + * @param a le listener + */ + public void addActionChangeListener(ActionListener a){ + this.deplacer.addActionListener(a); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/EtudiantNP.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/EtudiantNP.java new file mode 100644 index 0000000..b7d13f1 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/EtudiantNP.java @@ -0,0 +1,74 @@ +package fr.iutfbleau.projetIHM2022FI2.MP; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import java.util.*; +/** + * Un étudiant + */ + +public class EtudiantNP implements Etudiant{ + + // auto-incrément des étudiants + private static int nextId=0; + // id de l'étudiant + private int id; + // nom et prénom de l'étudiant + private String nom, prenom; + + /** + * Constructeur d'un étudiant. + * @param nom le nom de l'étudiant + * @param prenom le prénom de l'étudiant + * + */ + public EtudiantNP(String nom, String prenom){ + Objects.requireNonNull(nom,"On ne peut pas créer un étudiant avec un nom null"); + Objects.requireNonNull(prenom,"On ne peut pas créer un étudiant avec un nom null"); + // auto incrément de l'id + this.id=++this.nextId; + this.nom=nom; + this.prenom=prenom; + } + + /** + * Constructeur d'un étudiant. + * @param nom le nom de l'étudiant + * @param prenom le prénom de l'étudiant + * @param id l'id de l'étudiant + */ + public EtudiantNP(String nom, String prenom, int id){ + Objects.requireNonNull(nom,"On ne peut pas créer un étudiant avec un nom null"); + Objects.requireNonNull(prenom,"On ne peut pas créer un étudiant avec un nom null"); + if(id>=this.nextId){ + this.nextId=id; + } + this.id=id; + this.nom=nom; + this.prenom=prenom; + } + + /** + * permet de récupérer l'identifiant de l'étudiant. + * @return l'identifiant. + */ + public int getId(){ + return this.id; + } + + /** + * permet de récupérer + * @return le nom de l'étudiant. + */ + public String getNom(){ + return this.nom; + } + + /** + * permet de récupérer + * @return le prénom de l'étudiant + */ + public String getPrenom(){ + return this.prenom; + } + + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/GroupeNP.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/GroupeNP.java new file mode 100644 index 0000000..ac11a0c --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/GroupeNP.java @@ -0,0 +1,254 @@ +package fr.iutfbleau.projetIHM2022FI2.MP; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import java.util.*; +/** + * Un groupe + */ + +public class GroupeNP implements Groupe { + + //auto-incrément des groupes. (NB. inutile, mais ça fair un exemple d'attribut statique). + private static int nextId=0; + // attributs naturels induits par getter de l'interface Groupe + private int id; + // nom du groupe + private String name; + // bornes limitatives du groupe + private int min,max; + // type de groupe + private TypeGroupe type; + // groupe père + private Groupe pointPoint; + // On utilise une interface set pour les sous-groupes et pour les membres (ce sont bien des ensembles en pratique). + private Set sousGroupes; + // Liste des étudiants du groupe + private Set membresDuGroupe; + + /** + * Nouveau groupe vide de type ROOT sans étudiants, sans sous-Groupe + * + * @param name le nom du groupe + * @param min le nombre minimum d'étudiants + * @param max le nombre maximum d'étudiants + */ + public GroupeNP(String name, int min, int max){ + Objects.requireNonNull(name,"On ne peut pas créer un groupe dont le nom est null"); + this.id=++this.nextId; + this.name=name; + this.min=min; + this.max=max; + this.type=TypeGroupe.ROOT; + this.pointPoint=this; + this.sousGroupes=new LinkedHashSet(); + this.membresDuGroupe=new LinkedHashSet(); + } + /** + * Nouveau groupe vide de type FREE sans étudiants, sans sous-Groupe + * + * @param name le nom du groupe + * @param min le nombre minimum d'étudiants + * @param max le nombre maximum d'étudiants + * @param pere le groupe père + * @param id l'id du groupe + * @param type le type du groupe + * + * + */ + public GroupeNP(int id, String name, int min, int max, TypeGroupe type, Groupe pere){ + Objects.requireNonNull(name,"On ne peut pas créer un groupe dont le nom est null"); + this.id=id; + if(id>this.nextId){ + this.nextId=id; + } + this.name=name; + this.min=min; + this.max=max; + this.type=type; + if(pere==null){ + this.pointPoint=this; + }else{ + this.pointPoint=pere; + } + this.sousGroupes=new LinkedHashSet(); + this.membresDuGroupe=new LinkedHashSet(); + } + + /** + * Nouveau groupe vide de type FREE sans étudiants, sans sous-Groupe + * + * @param name le nom du groupe + * @param min le nombre minimum d'étudiants + * @param max le nombre maximum d'étudiants + * @param pere le groupe père + * + */ + public GroupeNP(Groupe pere, String name, int min, int max){ + Objects.requireNonNull(pere,"On ne peut pas créer un groupe dont le père est null"); + Objects.requireNonNull(name,"On ne peut pas créer un groupe dont le nom est null"); + this.id=++this.nextId; + this.name=name; + this.min=min; + this.max=max; + this.type=TypeGroupe.FREE; + this.pointPoint=pere; + this.sousGroupes=new LinkedHashSet(); + this.membresDuGroupe=new LinkedHashSet(); + } + + /** + * Nouveau groupe de type PARTITION dupliquant le groupe passé en paramètre (pour servir de racine à une partition de ce groupe de type FREE passé en paramètre). + * + * @param pere le groupe père + */ + public GroupeNP(Groupe pere){ + Objects.requireNonNull(pere,"On ne peut pas créer un groupe dont le père est null"); + this.id=++this.nextId; + this.name=pere.getName()+"_PARTITION_"+ this.id; + this.min=pere.getMin(); + this.max=pere.getMax(); + this.type=TypeGroupe.PARTITION; + this.pointPoint=pere; + this.sousGroupes= new LinkedHashSet(); + this.membresDuGroupe= pere.getEtudiants(); + } + + /** + * Ajoute un étudiant. Se comporte comme add de l'interface Set. + * + * @param e l'étudiant à ajouter + * + * @return true iff e est ajouté + */ + public boolean addEtudiant(Etudiant e){ + Objects.requireNonNull(e,"On ne peut pas ajouter un Étudiant qui est null"); + return this.membresDuGroupe.add(e); + } + + /** + * Enlève un étudiant. Se comporte comme remove de l'interface Set. + * + * @param e l'étudiant à enlever + * + * @return true iff e est enlevé + */ + public boolean removeEtudiant(Etudiant e){ + Objects.requireNonNull(e,"On ne peut pas enlever un Étudiant qui est null"); + return this.membresDuGroupe.remove(e); + } + + /** + * Ajoute un sous-groupe. Se comporte comme add de l'interface Set. + * vérifie que le groupe passé en argument a bien renseigné this comme son père. + * + * @param g le groupe à ajouter + * + * @return true iff g est ajouté + */ + public boolean addSousGroupe(Groupe g){ + Objects.requireNonNull(g,"On ne peut pas ajouter un sous-groupe qui est null"); + if (this.equals(g.getPointPoint())) + return this.sousGroupes.add(g); + else throw new IllegalArgumentException("on ne peut pas ajouter un sous-groupe ont le père n'est pas this"); + } + + /** + * Enlève un groupe. Se comporte comme remove de l'interface Set. + * + * @param g le sous-groupe à enlever + * + * @return true iff e est enlevé + */ + public boolean removeSousGroupe(Groupe g){ + Objects.requireNonNull(g,"On ne peut pas enlever un Étudiant qui est null"); + return this.sousGroupes.remove(g); + } + + + /** + * permet de récupérer l'identifiant d'un groupe (référence interne sans intérêt irl). + * @return l'identifiant. + */ + public int getId(){ + return this.id; + } + + /** + * permet de récupérer le nom d'un groupe (utile irl). + * @return le nom. + */ + public String getName(){ + return this.name; + } + + /** + * permet de récupérer le nombre minimum d'étudiants souhaités dans le groupe. + * @return le minimum souhaité + */ + public int getMin(){ + return this.min; + } + + /** + * permet de récupérer le nombre maximum d'étudiants souhaités dans un groupe. + * @return le maximum souhaité + */ + public int getMax(){ + return this.max; + } + + /** + * permet de récupérer le nombre d'étudiants dans ce groupe. + * @return le nombre de places prises (pas forcément limité entre Min et Max, mais c'est le but) + */ + public int getSize(){ + return this.membresDuGroupe.size(); + } + + /** + * permet de récupérer la nature du groupe + * @return le type du groupe + */ + public TypeGroupe getType(){ + return type; + } + + /** + * permet de récupérer le groupe père + * un groupe racine devrait retourner lui-même + * + * @return le père + */ + public Groupe getPointPoint(){ + return this.pointPoint; + } + + /** + * Potentiellement "vide" + * Attention nous renvoyons l'ensemble sans le copier + * + * @return l'ensemble des sous-groupes. + */ + public Set getSousGroupes(){ + return this.sousGroupes; + } + + /** + * Potentiellement "vide" + * Attention nous renvoyons l'ensemble sans le copier + * + * @return l'ensemble des étudiants. + */ + public Set getEtudiants(){ + return this.membresDuGroupe; + } + + /** + * Change le nom du groupe + * @param s le nouveau nom + */ + @Override + public void setName(String s){ + this.name=s; + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/Model/ModelProf.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/Model/ModelProf.java new file mode 100644 index 0000000..45feaa0 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/Model/ModelProf.java @@ -0,0 +1,325 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.PROF.Model; +import javax.swing.*; +import java.awt.*; +import java.util.Set; +import java.util.HashSet; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory; +import fr.iutfbleau.projetIHM2022FI2.API.Changement; +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.MP.AbstractChangementFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MP.AbstractGroupeFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MP.PROF.View.FenetreEtudiant; +import fr.iutfbleau.projetIHM2022FI2.MP.PROF.View.FenetreGroupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurFenetre; +import fr.iutfbleau.projetIHM2022FI2.Permanent.View.Chargement; + +/** + * Le Model de L'IHM + */ +public class ModelProf implements Model{ + + // le panel qui contient la fenetre de groupe + private JPanel panGroupe; + // la fenetre de groupe + private FenetreGroupe fenGr; + //la fenetre d'etudiant + private FenetreEtudiant fenEtu; + // le groupe courant + private AbstractGroupeFactory promo; + // le changement courant + private AbstractChangementFactory changement; + // la fenetre principale + private JFrame fenetre; + + /** + * Constructeur du Model. + */ + public ModelProf(){ + this.fenetre=new JFrame(); + this.fenetre.setSize(1200, 720); + this.fenetre.setLocation(100,100); + this.fenetre.addWindowListener(new ObservateurFenetre()); + this.fenetre.setLayout(new GridLayout(1,2)); + this.fenetre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + this.fenetre.setMinimumSize(this.fenetre.getSize()); + Chargement ch=new Chargement(this.fenetre); + this.promo=new AbstractGroupeFactoryNP(this.fenetre); + if(this.promo.getPromotion()==null){ + this.promo=null; + } + ch.dispose(); + this.fenetre.setVisible(true); + if(this.promo==null){ + this.fenGr=new FenetreGroupe(null, this); + this.fenEtu=new FenetreEtudiant(null); + this.changement=null; + }else{ + this.changement=new AbstractChangementFactoryNP(promo, this.fenetre); + this.fenGr=new FenetreGroupe(this.promo.getPromotion(), this); + this.fenEtu=new FenetreEtudiant(this.promo.getPromotion()); + } + this.panGroupe=new JPanel(new GridLayout(1,1)); + if(this.promo!=null){ + this.showGroupe(this.promo.getPromotion()); + }else{ + this.showGroupe(null); + } + } + + + @Override + /** + * Fonction pour refresh/changer de groupe d'affichage + * @param g le groupe a afficher + */ + public void showGroupe(Groupe g){ + if(g!=null) + g=this.promo .refreshALL(g); + this.panGroupe.removeAll(); + this.fenGr=new FenetreGroupe(g, this); + this.fenEtu=new FenetreEtudiant(g); + this.fenetre.getContentPane().removeAll(); + this.panGroupe.add(this.fenGr.getPan()); + this.panGroupe.revalidate(); + this.fenetre.add(this.panGroupe); + JScrollPane scroll=new JScrollPane(this.fenEtu.getPan()); + scroll.getVerticalScrollBar().setUnitIncrement(15); + this.fenetre.add(scroll); + this.fenetre.revalidate(); + } + @Override + /** + * getteur de la fenetre + * @return JFrame la fenetre + */ + public JFrame getFenetre() { + return fenetre; + } + /** + * permet d'obtenir l'ensemble des etudiants + * @return + */ + @Override + public Set getEtudiant(){ + return this.promo.getPromotion().getEtudiants(); + } + + // ************************** + // FONCTION POUR LES CHANGEMENTS + // ****************************** + /** + * Créer un changement depuis le groupe courant + * @param e l'etudiant + * @param b le groupe a changer + */ + @Override + public void changeGroupe(Etudiant e, Groupe b){ + if(b==null) + return; + b=this.promo.refreshALL(b); + if(b.getEtudiants()!=null && b.getMax()>b.getEtudiants().size()+1){ + if(b.getEtudiants().size()>this.fenGr.getG().getEtudiants().size()){ + JPanel myPanel= new JPanel(new GridLayout(2,1)); + JTextField xField = new JTextField(100); + xField.setMinimumSize(new Dimension(100, 100)); + xField.setPreferredSize(new Dimension(100,100)); + myPanel.add(new JLabel("Ce Groupe est plus grand que le votre raison du changement:")); + myPanel.add(xField); + if(JOptionPane.showConfirmDialog(this.fenetre, myPanel, "Changer dans quel Groupe ?", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ + //IL faut que l'etudiant detaile un minimun la raison + if(xField.getText().length()>5){ + this.changement.createChangement(this.fenGr.getG(), e, b, xField.getText()); + }else{ + JOptionPane.showMessageDialog(this.fenetre, "veuillez detailler votre raison", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + }else{ + this.changement.createChangement(this.fenGr.getG(), e, b); + } + }else{ + JOptionPane.showMessageDialog(this.fenetre, "impossible trop d'etudiant dans l'autre Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(this.fenGr.getG()); + } + /** + * Retourn les groupe auquel on peut demander a changer depuis le groupe courant + * + * @return la liste des groupes + */ + @Override + public Set getGroupePartition(){ + this.promo.refreshALL(this.fenGr.getG().getPointPoint()); + Set retour=new HashSet<>(); + if(this.fenGr.getG().getPointPoint().getType()!=TypeGroupe.PARTITION) + throw new IllegalStateException("impossible de changer un étudiant d'un groupe ne provenant pas d'une partition"); + for(Groupe sous:this.fenGr.getG().getPointPoint().getSousGroupes()){ + if(sous.getId()!=this.fenGr.getG().getId()){ + retour.add(sous); + } + } + return retour; + } + /** + * Fonction pour ajouter un étudiant au groupe + * @param g + * @param e + * @return boolean pour savoir si il a pus être ajouter + */ + @Override + public boolean addEtudiant(Groupe g, Etudiant e) { + // TODO Auto-generated method stub + return false; + } + + /** + * Fonction pour supprimer un groupe + * @param g le groupe a supprimer + */ + @Override + public void delete(Groupe g) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction pour renomer un groupe + * @param name + * @param g + */ + @Override + public void rename(String name, Groupe g) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction permetant de créer une partition d'un groupe + * @param g le groupe a partitionner + * @param n le nombre de partition + * @param name le nom des partition + */ + @Override + public void partition(Groupe g, int n, String name) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction permettant de créer un sous-groupe d'un groupe + * @param g le groupe parent + * @param name le nom du sous-groupe + * @param min le nombre min d'etudiant + * @param max le nombre max d'etudiant + * @param ajout la liste des étudiants a ajouter au groupe + */ + @Override + public void free(Groupe g, String name, int min, int max, Set ajout) { + // TODO Auto-generated method stub + + } + /** + * ajoute une nouvelle promotion + * @param min le nombre min + * @param max le nombre max + * @param name le nom + * @param ajout les etudiant a ajouter a la promo + */ + + @Override + public void addPromo(int min, int max, String name, Set ajout) { + // TODO Auto-generated method stub + + } + +/** + * Fonction pour supprimer un etudiant. + * @param e l'etudiant a supprimer + * @return boolean true si l'etudiant a ete supprimer, false sinon + */ + @Override + public boolean deleteEtu(Etudiant e) { + // TODO Auto-generated method stub + return false; + } + /** + * Fonction pour afficher une fenetre listnatn les changements + * + */ + @Override + public void listChange() { + // TODO Auto-generated method stub + + } + + + /** + * Fonction pour effectuer un changement + * @param Changement le changement a effecteur + */ + @Override + public void change(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction supprimant un changement + * + * @param to_delete la changement a delete + */ + @Override + public void deleteChange(Changement to_delete) { + // TODO Auto-generated method stub + + } + + + /** + * Fonction affichant les raison d'un changement + * + * @param change le changement + */ + @Override + public void showRaisonChange(Changement change) { + // TODO Auto-generated method stub + + } + + /** + * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée + */ + @Override + public void findEtu() { + // TODO Auto-generated method stub + + } + + /** + * Fonction pour recuperer les etudiant avec ce nom + * @param name le nom de(s) etudiants + * @return la liste + */ + @Override + public Set getEtu(String name) { + // TODO Auto-generated method stub + return null; + } + + /** + *affiche les groupe d'un etudiant + * @param e l'etudiant + */ + @Override + public void showGroupOfEtudiant(Etudiant e) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/FenetreEtudiant.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/FenetreEtudiant.java new file mode 100644 index 0000000..3eb3037 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/FenetreEtudiant.java @@ -0,0 +1,67 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.PROF.View; + + +import javax.swing.JLabel; +import javax.swing.JPanel; + +import java.awt.*; +import java.util.LinkedHashSet; +import java.util.Set; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; + +/** + * Affichage des édudiants d'un groupe + * + */ +public class FenetreEtudiant{ + // liste des étudiants + private Set etu; + // panel + private JPanel pan; + + /** + * Constructeur de l'affichage des étudiants + * @param g le groupe + */ + public FenetreEtudiant(Groupe g){ + this.pan=new JPanel(); + if(g!=null){ + this.etu=g.getEtudiants(); + }else{ + this.etu=new LinkedHashSet<>(); + } + this.draw(); + } + /** + * Gère l'affichage des étudiants + */ + private void draw(){ + if(this.etu.size()!=0){ + this.pan.setLayout(new GridLayout(this.etu.size(), 1, 30, 0)); + for(Etudiant e: this.etu){ + PanelEtudiant p=new PanelEtudiant(e); + this.pan.add(p); + } + }else{ + this.pan.setLayout(new FlowLayout()); + this.pan.add(new JLabel("Il n'y a pas d'étudiant")); + } + } + /** + * rafraichit l'affichage. + */ + public void refresh(){ + this.pan.removeAll(); + this.draw(); + this.pan.revalidate(); + } + /** + * premet d'obtenir le panel de l'affichage + * @return le panel de l'affichage + */ + public JPanel getPan() { + return pan; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/FenetreGroupe.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/FenetreGroupe.java new file mode 100644 index 0000000..4d3f356 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/FenetreGroupe.java @@ -0,0 +1,106 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.PROF.View; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import java.awt.Font; +import java.awt.GridLayout; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurChangeGroupe; + +/** + * Affichage d'un groupe + * +*/ +public class FenetreGroupe{ + // le groupe affiché + private Groupe g; + // le panel d'affichage + private JPanel pan; + // le modèle + private Model m; + + /** + * Constructeur de l'affichage d'un groupe + * @param g le groupe à afficher + * @param m le model + */ + public FenetreGroupe(Groupe g, Model m){ + super(); + this.g=g; + this.m=m; + this.pan=new JPanel(); + this.draw(); + } + /** + * permet de récupérer le groupe affiché + * @return le groupe affiché + */ + public Groupe getG() { + return this.g; + } + /** + * rafraichit l'affichage du groupe + */ + public void refresh(){ + this.pan.removeAll(); + this.draw(); + this.pan.revalidate(); + } + /** + * gère l'affichage du groupe + */ + private void draw(){ + if(g!=null){ + int taille=1; + if(g.getType()==TypeGroupe.PARTITION || g.getType()==TypeGroupe.ROOT) + taille--; + if(g.getSousGroupes().size()>0) + this.pan.setLayout(new GridLayout(7, 1)); + else{this.pan.setLayout(new GridLayout(6, 1));} + JPanel tache=new JPanel(new GridLayout(1,taille)); + + if(g.getType()!=TypeGroupe.ROOT){ + JButton bout=new JButton(g.getPointPoint().getName()); + bout.addActionListener(new ObservateurChangeGroupe(m, g.getPointPoint())); + tache.add(bout); + } + this.pan.add(tache); + JLabel titre=new JLabel("Groupe : "+g.getName(), JLabel.CENTER); + titre.setFont(new Font(Font.SERIF, Font.BOLD, titre.getFont().getSize()+10)); + this.pan.add(titre); + this.pan.add(new JLabel("min= "+String.valueOf(g.getMin())+"\t || \t max= "+String.valueOf(g.getMax()),JLabel.CENTER)); + JButton refresh= new JButton("Resfresh"); + refresh.addActionListener(new ObservateurChangeGroupe(m, g)); + this.pan.add(refresh); + this.pan.add(new JLabel("Type: "+g.getType().name()+"\t || \t id="+String.valueOf(g.getId()), JLabel.CENTER)); + this.pan.add(new JLabel("Sous groupe:",JLabel.CENTER)); + if(g.getSousGroupes().size()>0){ + JPanel sous=new JPanel(new GridLayout(g.getSousGroupes().size(), 1)); + for(Groupe gr: g.getSousGroupes()){ + JButton b=new JButton(gr.getName()); + b.addActionListener(new ObservateurChangeGroupe(m, gr)); + sous.add(b); + } + this.pan.add(new JScrollPane(sous)); + } + } + } + /** + * permet de modifier le groupe affiché + * @param g le nouveau groupe à afficher + */ + public void setG(Groupe g) { + this.g = g; + } + /** + * Permet de récupérer le panel d'affichage. + * @return le panel d'affichage + */ + public JPanel getPan() { + return pan; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/PanelEtudiant.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/PanelEtudiant.java new file mode 100644 index 0000000..e174084 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/PROF/View/PanelEtudiant.java @@ -0,0 +1,21 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.PROF.View; + +import javax.swing.JLabel; +import javax.swing.JPanel; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import java.awt.*; + +public class PanelEtudiant extends JPanel{ + /** + * Constructeur du panel d'affichage d'un étudiant + * @param e l'étudiant à afficher + * @param change si l'étudiant peut être déplacé + */ + public PanelEtudiant(Etudiant e){ + super(new GridLayout(1,1,20, 20)); + JLabel label=new JLabel(" "+e.getNom()+" "+e.getPrenom()+" "+e.getId(), JLabel.LEFT); + label.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20)); + this.add(label); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionChangement.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionChangement.java new file mode 100644 index 0000000..11f733f --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionChangement.java @@ -0,0 +1,47 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +import fr.iutfbleau.projetIHM2022FI2.API.Changement; +import fr.iutfbleau.projetIHM2022FI2.API.Model; + +/** + * le controller pour les changements + */ +public class ActionChangement implements ActionListener{ + //le model + private Model m; + //le changement + private Changement change; + /** + * le constructeur + * + * @param m le model + * @param change le changement + * + */ + public ActionChangement(Model m, Changement change){ + this.m=m; + this.change=change; + } + /** + * méthode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + String text=((JButton)e.getSource()).getText(); + if(text.equals("Supprimer")){ + this.m.deleteChange(change); + } + if(text.equals("Valider")){ + this.m.change(change); + } + if(text.equals("Raison")){ + this.m.showRaisonChange(change); + } + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListChange.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListChange.java new file mode 100644 index 0000000..28e46fe --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListChange.java @@ -0,0 +1,38 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +import fr.iutfbleau.projetIHM2022FI2.API.Model; +/** + * listener pour la liste des étudiants + */ +public class ActionListChange implements ActionListener{ + // le model + private Model m; + /** + * le constructeur + * + * @param m le model + * + */ + public ActionListChange(Model m){ + this.m=m; + } + /** + * méthode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + String text=((JButton)e.getSource()).getText(); + if(text.equals("Changement")){ + this.m.listChange(); + } + if(text.equals("Find Etu")){ + this.m.findEtu(); + } + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListenerNouveauEtu.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListenerNouveauEtu.java new file mode 100644 index 0000000..e79e1da --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListenerNouveauEtu.java @@ -0,0 +1,49 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller; + +import java.awt.event.ActionListener; + +import javax.swing.*; + +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FenetreSelectionEtu; + +import java.awt.event.ActionEvent; + +/** + * listener pour la création d'étudiants + */ +public class ActionListenerNouveauEtu implements ActionListener{ + // la fenetre de sélection + private FenetreSelectionEtu pere; + /** + * le constructeur + * @param pere la fenetre de sélection + */ + public ActionListenerNouveauEtu(FenetreSelectionEtu pere){ + this.pere=pere; + } + /** + * méthode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + if(e.getActionCommand()=="tous"){ + this.pere.addAll(); + }else{ + JPanel myPanel = new JPanel(); + JTextField xField = new JTextField(20); + JTextField yField = new JTextField(20); + myPanel.add(new JLabel("Nom:")); + myPanel.add(xField); + myPanel.add(Box.createHorizontalStrut(15)); + myPanel.add(new JLabel("Prenom:")); + myPanel.add(yField); + int result = JOptionPane.showConfirmDialog(this.pere, myPanel, + "Entrer le nombre et le nom des Partitions", JOptionPane.OK_CANCEL_OPTION); + if(result==JOptionPane.YES_OPTION){ + this.pere.addEtudiant(xField.getText(), yField.getText()); + } + } + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListenerSuprEtu.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListenerSuprEtu.java new file mode 100644 index 0000000..daf66fd --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ActionListenerSuprEtu.java @@ -0,0 +1,37 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JOptionPane; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +/** + * le controller pour la suppression d'etudiants + */ +public class ActionListenerSuprEtu implements ActionListener { + // l'etudiant a supprimer + public Etudiant etudiant; + // le model + public Model model; + /** + * le constructeur + * @param m le model + * @param e l'etudiant a supprimer + */ + public ActionListenerSuprEtu(Model m, Etudiant e){ + this.model=m; + this.etudiant=e; + } + /** + * méthode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + if(this.model.deleteEtu(this.etudiant)==false){ + JOptionPane.showMessageDialog(this.model.getFenetre(), "erreur trop peu d'etudiant dans le groupe/ les groupes fils", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ListenerFindBar.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ListenerFindBar.java new file mode 100644 index 0000000..1ae68dd --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ListenerFindBar.java @@ -0,0 +1,43 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JTextField; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FindBarFenetre; +/** + * le controller pour la recherche d'etudiants + */ +public class ListenerFindBar implements ActionListener{ + // la fenetre de recherche + private FindBarFenetre fenetre; + // l'etudiant a rechercher + private Etudiant et; + /** + * le constructeur + * @param fenetre la fenetre de recherche + * @param e l'etudiant a rechercher + * + */ + public ListenerFindBar(FindBarFenetre fenetre, Etudiant e){ + this.fenetre=fenetre; + this.et=e; + } + /** + * méthode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + String text=((JButton)e.getSource()).getText(); + if(text.equals("->")) + this.fenetre.search(((JTextField)((JButton)e.getSource()).getParent()).getText()); + else{ + this.fenetre.showGroupe(et); + } + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ObservateurModifGroupe.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ObservateurModifGroupe.java new file mode 100644 index 0000000..6225e41 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/Controller/ObservateurModifGroupe.java @@ -0,0 +1,183 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller; + +import java.awt.event.*; +import java.util.LinkedHashSet; +import fr.iutfbleau.projetIHM2022FI2.API.*; +import javax.swing.JOptionPane; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FenetreSelectionEtu; + +import javax.swing.*; +import java.util.Set; +/** + * le controller pour les groupes + */ +public class ObservateurModifGroupe implements ActionListener{ + //le model + private Model m; + //le groupe courant + private Groupe groupe; + /** + * le constructeur + * @param m le model + * @param g le groupe courant + */ + public ObservateurModifGroupe(Model m, Groupe g){ + this.m=m; + this.groupe=g; + } + /** + * méthode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + if(e.getActionCommand()=="supr"){ + this.m.delete(this.groupe); + } + if(e.getActionCommand()=="new Groupe"){ + String g[]=new String[2]; + g[0]="Partition"; + g[1]="Free"; + int rep=JOptionPane.showOptionDialog(m.getFenetre(), "Type du nouveau Groupe","Type", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, g, g[0]); + if(rep==JOptionPane.YES_OPTION){ + try{ + + JPanel myPanel = new JPanel(); + JTextField xField = new JTextField(5); + JTextField yField = new JTextField(20); + myPanel.add(new JLabel("Nombre:")); + myPanel.add(xField); + myPanel.add(Box.createHorizontalStrut(15)); + myPanel.add(new JLabel("Nom:")); + myPanel.add(yField); + int result = JOptionPane.showConfirmDialog(m.getFenetre(), myPanel, + "Entrer le nombre et le nom des Partitions", JOptionPane.OK_CANCEL_OPTION); + if (result == JOptionPane.OK_OPTION) { + int nb=Integer.parseInt(xField.getText()); + if(nb>this.groupe.getEtudiants().size()){ + JOptionPane.showMessageDialog(m.getFenetre(), "nombre de partition trop grand", "erreur", JOptionPane.ERROR_MESSAGE); + return; + } + m.partition(this.groupe, nb, yField.getText()); + } + }catch(NumberFormatException er){ + JOptionPane.showMessageDialog(m.getFenetre(), "erreur dans le nombre de partition", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + if(rep==JOptionPane.NO_OPTION){ + try{ + JPanel myPanel = new JPanel(); + JTextField xField = new JTextField(5); + JTextField zField = new JTextField(5); + JTextField yField = new JTextField(20); + myPanel.add(new JLabel("Nom:")); + myPanel.add(yField); + myPanel.add(Box.createHorizontalStrut(15)); + myPanel.add(new JLabel("Min:")); + myPanel.add(xField); + myPanel.add(new JLabel("Max:")); + myPanel.add(zField); + int result = JOptionPane.showConfirmDialog(m.getFenetre(), myPanel, + "Entrer le nombre et le nom des Partitions", JOptionPane.OK_CANCEL_OPTION); + if (result == JOptionPane.OK_OPTION) { + int min=Integer.parseInt(xField.getText()); + int max=Integer.parseInt(zField.getText()); + if(max>this.groupe.getMax() || min<=0 || max<=0 || min>max){ + JOptionPane.showMessageDialog(m.getFenetre(), "nombre min/max inchoérent", "erreur", JOptionPane.ERROR_MESSAGE); + return; + } + Set ajout=new LinkedHashSet<>(); + myPanel=new FenetreSelectionEtu(this.groupe, ajout, false, m.getEtudiant()); + if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(myPanel), "Selectionner les étudiant a ajouter", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.YES_OPTION){ + if(ajout.size()>=min && ajout.size()<=max){ + m.free(groupe, yField.getText(), min, max, ajout); + }else{ + if(min>ajout.size()) + JOptionPane.showMessageDialog(m.getFenetre(), "nombre d'etudiant trop petit", "erreur", JOptionPane.ERROR_MESSAGE); + else{ + JOptionPane.showMessageDialog(m.getFenetre(), "nombre d'etudiant trop grand", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + } + } + }catch(NumberFormatException er){ + JOptionPane.showMessageDialog(m.getFenetre(), "erreur dans les nombres min et max", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + } + if(e.getActionCommand()=="rename"){ + JPanel myPanel = new JPanel(); + JTextField xField = new JTextField(50); + myPanel.add(new JLabel("Nom:")); + myPanel.add(xField); + if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(myPanel), "Nouveau Nom", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.OK_OPTION){ + if(xField.getText().length()==0){ + JOptionPane.showMessageDialog(m.getFenetre(), "erreur nom null", "erreur", JOptionPane.ERROR_MESSAGE); + }else{ + m.rename(xField.getText(), this.groupe); + } + } + } + if(e.getActionCommand()=="add"){ + Set ajout=new LinkedHashSet<>(); + JPanel myPanel=new FenetreSelectionEtu(this.groupe, ajout, true, this.m.getEtudiant()); + if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(myPanel), "Selectionner les étudiant a ajouter", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.YES_OPTION){ + if(this.groupe.getMax()0){JOptionPane.showMessageDialog(m.getFenetre(), "erreur impossible d'ajouter "+i+" etudiants par manque de place dans le groupe de ses parents", "errer", JOptionPane.ERROR_MESSAGE);} + } + } + if(e.getActionCommand()=="créer une promo"){ + try{ + JPanel myPanel = new JPanel(); + JTextField xField = new JTextField(5); + JTextField zField = new JTextField(5); + JTextField yField = new JTextField(20); + myPanel.add(new JLabel("Nom:")); + myPanel.add(yField); + myPanel.add(Box.createHorizontalStrut(15)); + myPanel.add(new JLabel("Min:")); + myPanel.add(xField); + myPanel.add(new JLabel("Max:")); + myPanel.add(zField); + int result = JOptionPane.showConfirmDialog(m.getFenetre(), myPanel, + "Entrer le nombre et le nom de la promo", JOptionPane.OK_CANCEL_OPTION); + if (result == JOptionPane.OK_OPTION) { + int min=Integer.parseInt(xField.getText()); + int max=Integer.parseInt(zField.getText()); + if(zField.getText().length()==0){ + JOptionPane.showMessageDialog(m.getFenetre(), "erreur entre un nom", "erreur", JOptionPane.ERROR_MESSAGE); + }else{ + if(min>max){ + JOptionPane.showMessageDialog(m.getFenetre(), "erreur min>max", "erreur", JOptionPane.ERROR_MESSAGE); + }else{ + Set ajout=new LinkedHashSet<>(); + JPanel pan=new FenetreSelectionEtu(null, ajout, false, this.m.getEtudiant()); + if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(pan), "Selectionner les étudiant a ajouter", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.YES_OPTION){ + if(min>ajout.size() || max getEtudiant(){ + return this.promo.getEtudiants(null); + } + + // *********************** + // FONCTION POUR SUPRIMER UN ETUDIANT + // *********************** +/** + * Fonction pour supprimer un etudiant. + * @param e l'etudiant a supprimer + * @return boolean true si l'etudiant a ete supprimer, false sinon + */ + @Override + public boolean deleteEtu(Etudiant e){ + if(this.deleteEtutoChildren(e, this.fenGr.getG())){ + this.promo.dropFromGroupe(this.fenGr.getG(), e); + this.showGroupe(this.fenGr.getG()); + return true; + }else{ + return false; + } + } +/** + * Permet de savoir si un étudiant peut être supprimé + * @param e l'étudiant à supprimer + * @param g le groupe dans lequel on cherche + * @return true si possible, false sinon + */ + private boolean deleteEtutoChildren(Etudiant e, Groupe g){ + if(g.getMax() ajout){ + Chargement ch=new Chargement(this.fenetre); + this.fenetre.setVisible(false); + //on creer le groupe + this.promo.createGroupe(g, name, min, max); + Groupe creer=null; + //on le recupere + for(Groupe gr:g.getSousGroupes()){ + if(gr.getName()==name){ + creer=gr; + break; + } + } + //on y ajoute les étudiant + int n=0; + for(Etudiant e:ajout){ + if(this.addEtudiant(creer, e)==false) + n++; + } + creer=this.promo.refreshALL(creer); + ch.dispose(); + this.fenetre.setVisible(true); + if(n>0) + JOptionPane.showMessageDialog(this.fenetre, "erreur impossible d'ajouter "+n+" etudiants par manque de place dans le groupe de ses parents", "erreur", JOptionPane.ERROR_MESSAGE); + //Si finalement avec les etudiants qui n'ont pas pus être ajouter le min n'est pas atteint + if(creer.getEtudiants().size()+1<=creer.getMin()){ + //On le supprime + this.promo.deleteGroupe(creer); + JOptionPane.showMessageDialog(this.fenetre, "en raison du manque d'etudiant pour le nombre min le groupe n'a pas pus être créer", "errer", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(g); + } + /** + * ajoute une nouvelle promotion + * @param min le nombre min + * @param max le nombre max + * @param name le nom + * @param ajout les etudiant a ajouter a la promo + */ + @Override + public void addPromo(int min, int max, String name, Set ajout){ + Chargement ch=new Chargement(this.fenetre); + this.promo=new AbstractGroupeFactoryNP(name, min, max, this.fenetre); + this.changement=new AbstractChangementFactoryNP(this.promo, this.fenetre); + this.fenetre.setVisible(false); + for(Etudiant e:ajout){ + this.addEtudiant(this.promo.getPromotion(), e); + } + ch.dispose(); + this.fenetre.setVisible(true); + this.showGroupe(this.promo.getPromotion()); + } + + + /** + * Créer un changement depuis le groupe courant + * @param e l'etudiant + * @param b le groupe a changer + */ + @Override + public void changeGroupe(Etudiant e, Groupe b){ + if(b==null) + return; + b=this.promo.refreshALL(b); + if(b.getEtudiants()!=null && b.getMax()>b.getEtudiants().size()+1){ + if(b.getEtudiants().size()>this.fenGr.getG().getEtudiants().size()){ + JPanel myPanel= new JPanel(new GridLayout(2,1)); + JTextField xField = new JTextField(100); + xField.setMinimumSize(new Dimension(100, 100)); + xField.setPreferredSize(new Dimension(100,100)); + myPanel.add(new JLabel("Ce Groupe est plus grand que le votre raison du changement:")); + myPanel.add(xField); + if(JOptionPane.showConfirmDialog(this.fenetre, myPanel, "Changer dans quel Groupe ?", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ + //IL faut que l'etudiant detaile un minimun la raison + if(xField.getText().length()>5){ + this.changement.createChangement(this.fenGr.getG(), e, b, xField.getText()); + }else{ + JOptionPane.showMessageDialog(this.fenetre, "veuillez detailler votre raison", "erreur", JOptionPane.ERROR_MESSAGE); + } + } + }else{ + this.changement.createChangement(this.fenGr.getG(), e, b); + } + }else{ + JOptionPane.showMessageDialog(this.fenetre, "impossible trop d'etudiant dans l'autre Groupe", "erreur", JOptionPane.ERROR_MESSAGE); + } + this.showGroupe(this.fenGr.getG()); + } + /** + * Retourn les groupe auquel on peut demander a changer depuis le groupe courant + * + * @return la liste des groupes + */ + @Override + public Set getGroupePartition(){ + this.promo.refreshALL(this.fenGr.getG().getPointPoint()); + Set retour=new HashSet(); + if(this.fenGr.getG().getPointPoint().getType()!=TypeGroupe.PARTITION) + throw new IllegalStateException("impossible de changer un étudiant d'un groupe ne provenant pas d'une partition"); + for(Groupe sous:this.fenGr.getG().getPointPoint().getSousGroupes()){ + if(sous.getId()!=this.fenGr.getG().getId()){ + retour.add(sous); + } + } + return retour; + } + + /* (non-Javadoc) + * @see fr.iutfbleau.projetIHM2022FI2.API.Model#listChange() + */ + /** + * Fonction pour afficher une fenetre listnatn les changements + * + */ + @Override + public void listChange() { + this.fenChange=new FenetreChangement(changement, this); + JOptionPane.showMessageDialog(this.fenetre, new JScrollPane(this.fenChange), "liste des changements", JOptionPane.OK_OPTION); + } + /** + * Fonction pour effectuer un changement + * @param Changement le changement a effecteur + */ + @Override + public void change(Changement change) { + this.changement.applyChangement(change); + this.fenChange.refresh(); + if(change.getA()==this.fenGr.getG()){ + this.showGroupe(this.fenGr.getG()); + } + } + + /** + * Fonction supprimant un changement + * + * @param to_delete la changement a delete + */ + @Override + public void deleteChange(Changement to_delete) { + this.changement.deleteChangement(to_delete); + this.fenChange.refresh(); + } + + /** + * Fonction affichant les raison d'un changement + * + * @param change le changement + */ + @Override + public void showRaisonChange(Changement change) { + JOptionPane.showMessageDialog(this.fenetre, new JLabel(change.getRaison()), "Raison de la demande", JOptionPane.OK_OPTION); + } + /** + * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée + */ + @Override + public void findEtu() { + JScrollPane scroll=new JScrollPane(new FindBarFenetre(this).getPanel()); + scroll.getVerticalScrollBar().setUnitIncrement(5); + JOptionPane.showMessageDialog(this.fenetre, scroll, "chercher un etudiant", JOptionPane.OK_OPTION); + } + + /* (non-Javadoc) + * @see fr.iutfbleau.projetIHM2022FI2.API.Model#getEtu(java.lang.String) + */ + + /** + * Fonction pour recuperer les etudiant avec ce nom + * @param name le nom de(s) etudiants + * @return la liste + */ + @Override + public Set getEtu(String name) { + return this.promo.getEtudiants(name); + } + /** + *affiche les groupe d'un etudiant + * @param e l'etudiant + */ + @Override + public void showGroupOfEtudiant(Etudiant e){ + Set liste=this.promo.getGroupesOfEtudiant(e); + JPanel myPanel; + if(liste!=null && liste.size()>0){ + myPanel=new JPanel(new GridLayout(liste.size()/2+1, 2, 20, 20)); + for(Groupe g:liste){ + JButton bout=new JButton(g.getName()); + bout.addActionListener(new ObservateurChangeGroupe(this, g)); + myPanel.add(bout); + } + }else{ + myPanel=new JPanel(new GridLayout(2, 2, 20, 20)); + myPanel.add(new JLabel("Cet Etudiant n'appartient encore a aucun groupe")); + } + JOptionPane.showMessageDialog(this.fenChange, myPanel, "groupe de l'etudiant", JOptionPane.OK_OPTION); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreChangement.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreChangement.java new file mode 100644 index 0000000..63bdee6 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreChangement.java @@ -0,0 +1,78 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import java.awt.GridLayout; +import java.awt.Color; +import java.awt.FlowLayout; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory; +import fr.iutfbleau.projetIHM2022FI2.API.Changement; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller.ActionChangement; +/** + * Affichage des changements + * + */ +public class FenetreChangement extends JPanel{ + // les changements a afficher + private AbstractChangementFactory change; + // le modèle + private Model m; + + /** + * Constructeur de l'affichage des changements + * @param list la liste des changements + * @param m le mlodèle + */ + public FenetreChangement(AbstractChangementFactory list, Model m){ + this.change=list; + this.m=m; + this.draw(); + } + + /** + * gère l'affichage des changements + */ + public void draw(){ + if(this.change==null || this.change.getAllChangements().size()==0){ + this.setBackground(Color.RED); + this.setLayout(new FlowLayout()); + JLabel text=new JLabel("Aucune Demande de changement effectuer"); + text.setMinimumSize(this.getSize()); + this.add(text); + }else{ + this.setLayout(new GridLayout(this.change.getAllChangements().size(), 6, 20, 0)); + for(Changement ch: this.change.getAllChangements()){ + this.add(new JLabel("L'etudiant "+ch.getEtu().getNom()+" "+ch.getEtu().getPrenom())); + this.add(new JLabel("veut passer du groupe "+ch.getA().getName())); + this.add(new JLabel(" au groupe "+ch.getB().getName())); + JButton raison; + if(ch.getRaison()==null){ + raison=new JButton("Type 1"); + }else{ + raison=new JButton("Raison"); + raison.addActionListener(new ActionChangement(this.m, ch)); + } + this.add(raison); + JButton supr=new JButton("Supprimer"); + supr.addActionListener(new ActionChangement(this.m, ch)); + JButton val=new JButton("Valider"); + val.addActionListener(new ActionChangement(this.m, ch)); + supr.setBackground(Color.RED); + val.setBackground(Color.GREEN); + this.add(val); + this.add(supr); + } + } + } + /** + * rafraichit l'affichage + */ + public void refresh(){ + this.removeAll(); + this.draw(); + this.revalidate(); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreEtudiant.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreEtudiant.java new file mode 100644 index 0000000..184886b --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreEtudiant.java @@ -0,0 +1,103 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View; + + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import java.awt.*; +import java.util.LinkedHashSet; +import java.util.Set; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller.ActionListChange; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller.ActionListenerSuprEtu; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ActionListenerChangeEtu; +import fr.iutfbleau.projetIHM2022FI2.API.Model; + +/** + * Affichage des édudiants d'un groupe + * + */ +public class FenetreEtudiant{ + //liste des étudiants + private Set etu; + // model + private Model m; + // panel + private JPanel pan; + // le type de groupe + private TypeGroupe type; + + /** + * Constructeur de l'affichage des étudiants + * @param g le groupe + * @param m le model + */ + public FenetreEtudiant(Groupe g, Model m){ + this.pan=new JPanel(); + this.m=m; + if(g!=null){ + this.type=g.getPointPoint().getType(); + this.etu=g.getEtudiants(); + }else{ + this.type=null; + this.etu=new LinkedHashSet<>(); + } + this.draw(); + } + /** + * Gère l'affichage des étudiants + */ + private void draw(){ + if(this.etu.size()!=0){ + this.pan.setLayout(new GridLayout(this.etu.size()+1, 1, 10, 0)); + JPanel bouton=new JPanel(new GridLayout(1, 2)); + JButton boutChange=new JButton("Changement"); + boutChange.addActionListener(new ActionListChange(this.m)); + JButton boutFind=new JButton("Find Etu"); + boutFind.addActionListener(new ActionListChange(this.m)); + bouton.add(boutChange); + bouton.add(boutFind); + this.pan.add(bouton); + + for(Etudiant e: this.etu){ + PanelEtudiant p; + if(type!=null && type==TypeGroupe.PARTITION){ + p=new PanelEtudiant(e, true); + }else{ + p=new PanelEtudiant(e, false); + } + p.addActionDeleteListener(new ActionListenerSuprEtu(m, e)); + p.addActionChangeListener(new ActionListenerChangeEtu(m, e)); + this.pan.add(p); + } + }else{ + this.pan.setLayout(new FlowLayout()); + this.pan.add(new JLabel("Il n'y a pas d'étudiant")); + } + } + /** + * rafraichit l'affichage. + */ + public void refresh(){ + this.pan.removeAll(); + this.draw(); + this.pan.revalidate(); + } + /** + * premet d'obtenir le panel de l'affichage + * @return le panel de l'affichage + */ + public JPanel getPan() { + return pan; + } + /** + * permet d'afficher la liste des demandes de changement + */ + public void listChange(){ + this.m.listChange(); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreGroupe.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreGroupe.java new file mode 100644 index 0000000..637a26c --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreGroupe.java @@ -0,0 +1,127 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import java.awt.Color; +import java.awt.Font; +import java.awt.GridLayout; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller.ObservateurModifGroupe; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Controller.ObservateurChangeGroupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; + +/** + * Affichage d'un groupe + * +*/ +public class FenetreGroupe{ + // le groupe affiché + private Groupe g; + // le panel d'affichage + private JPanel pan; + // le modèle + private Model m; + + /** + * Constructeur de l'affichage d'un groupe + * @param g le groupe à afficher + * @param m le model + */ + public FenetreGroupe(Groupe g, Model m){ + super(); + this.g=g; + this.m=m; + this.pan=new JPanel(); + this.draw(); + } + /** + * permet de récupérer le groupe affiché + * @return le groupe affiché + */ + public Groupe getG() { + return this.g; + } + /** + * rafraichit l'affichage du groupe + */ + public void refresh(){ + this.pan.removeAll(); + this.draw(); + this.pan.revalidate(); + } + /** + * gère l'affichage du groupe + */ + private void draw(){ + if(g!=null){ + int taille=5; + if(g.getType()==TypeGroupe.PARTITION || g.getType()==TypeGroupe.ROOT) + taille--; + if(g.getSousGroupes().size()>0) + this.pan.setLayout(new GridLayout(7, 1)); + else{this.pan.setLayout(new GridLayout(6, 1));} + JPanel tache=new JPanel(new GridLayout(1,taille)); + if(g.getType()!=TypeGroupe.ROOT){ + JButton bout=new JButton(g.getPointPoint().getName()); + bout.addActionListener(new ObservateurChangeGroupe(m, this.g.getPointPoint())); + tache.add(bout); + } + JButton renomer=new JButton("rename"); + renomer.addActionListener(new ObservateurModifGroupe(m, g)); + tache.add(renomer); + JButton ajouter=new JButton("add"); + ajouter.addActionListener(new ObservateurModifGroupe(m, g)); + tache.add(ajouter); + JButton supprimer=new JButton("supr"); + supprimer.addActionListener(new ObservateurModifGroupe(m, g)); + supprimer.setForeground(Color.RED); + tache.add(supprimer); + if(g.getType()!=TypeGroupe.PARTITION){ + JButton creer=new JButton("new Groupe"); + creer.addActionListener(new ObservateurModifGroupe(m, g)); + tache.add(creer); + } + this.pan.add(tache); + JLabel titre=new JLabel("Groupe : "+g.getName(), JLabel.CENTER); + titre.setFont(new Font(Font.SERIF, Font.BOLD, titre.getFont().getSize()+10)); + this.pan.add(titre); + this.pan.add(new JLabel("min= "+String.valueOf(g.getMin())+"\t || \t max= "+String.valueOf(g.getMax()),JLabel.CENTER)); + JButton refresh= new JButton("Resfresh"); + refresh.addActionListener(new ObservateurChangeGroupe(m, g)); + this.pan.add(refresh); + this.pan.add(new JLabel("Type: "+g.getType().name()+"\t || \t id="+String.valueOf(g.getId()), JLabel.CENTER)); + this.pan.add(new JLabel("Sous groupe:",JLabel.CENTER)); + if(g.getSousGroupes().size()>0){ + JPanel sous=new JPanel(new GridLayout(g.getSousGroupes().size(), 1)); + for(Groupe gr: g.getSousGroupes()){ + JButton b=new JButton(gr.getName()); + b.addActionListener(new ObservateurChangeGroupe(m, gr)); + sous.add(b); + } + this.pan.add(new JScrollPane(sous)); + } + }else{ + JButton creer=new JButton("créer une promo"); + creer.addActionListener(new ObservateurModifGroupe(m, g)); + this.pan.add(creer); + } + } + /** + * permet de modifier le groupe affiché + * @param g le nouveau groupe à afficher + */ + public void setG(Groupe g) { + this.g = g; + } + /** + * Permet de récupérer le panel d'affichage. + * @return le panel d'affichage + */ + public JPanel getPan() { + return pan; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreSelectionEtu.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreSelectionEtu.java new file mode 100644 index 0000000..1f3c8f7 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FenetreSelectionEtu.java @@ -0,0 +1,134 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.MP.EtudiantNP; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller.ActionListenerNouveauEtu; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller.SelecteurEtudiant; + +import java.util.Set; +import java.awt.GridLayout; +import java.awt.Color; +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + + +public class FenetreSelectionEtu extends JPanel{ + // liste des étudiants à ajouter + private Set liste; + // liste de tous les étudiants + private Set etu; + + + /** + * Constructeur de l'affichage de la selection des étudiants + * @param g le groupe + * @param liste la liste des étudiants à ajouter + * @param supression savoir si il faut supprimer les étudiants du groupe de la liste + * @param etu0 la liste de tous les + */ + public FenetreSelectionEtu(Groupe g, Set liste, boolean supression, Set etu0){ + super(); + this.etu=etu0; + if(supression==true){ + for(Etudiant e:g.getEtudiants()){ + for(Etudiant et:etu){ + if(e.getId()==et.getId()){ + etu.remove(et); + break; + } + } + } + } + this.liste=liste; + this.draw(); + } +/** + * Ajoute un étudiant à la sélection + * @param index l'index de l'étudiant + */ + public void addList(int index){ + int i=0; + for(Etudiant e:this.etu){ + if(i==index){ + this.liste.add(e); + return; + } + i++; + } + } +/** + * Retire un étudiant de la sélection + * @param index l'index de l'étudiant + */ + public void removeList(int index){ + int i=0; + for(Etudiant e:this.etu){ + if(i==index){ + this.liste.remove(e); + return; + } + i++; + } + } +/** + * Ajoute un étudiant à la liste de tous les étudiants + * @param nom le nom de l'étudiant + * @param prenom le prénom de l'étudiant + */ + public void addEtudiant(String nom, String prenom){ + if(nom.length()==0 || prenom.length()==0){ + JOptionPane.showMessageDialog(this, "le nom/prenom ne peut pas être null"); + return; + } + this.etu.add(new EtudiantNP(nom, prenom)); + this.removeAll(); + this.draw(); + this.revalidate(); + } +/** + * gère l'affichage de la sélection + */ + private void draw(){ + this.setLayout(new GridLayout(this.etu.size()/5+1, 4)); + int index=0; + for(Etudiant e:etu){ + JButton lab=new JButton(e.getNom()+" "+e.getPrenom()+" "+e.getId()); + lab.addMouseListener(new SelecteurEtudiant(index, this)); + this.add(lab); + index++; + } + JButton nouveau=new JButton("Nouveau +"); + nouveau.setBackground(Color.RED); + nouveau.addActionListener(new ActionListenerNouveauEtu(this)); + JButton all=new JButton("tous"); + this.add(all); + all.addActionListener(new ActionListenerNouveauEtu(this)); + this.add(nouveau); + } +/** + * Ajoute tous les étudiants à la liste des étudiants sélectionnés + */ + public void addAll(){ + if(this.getComponent(this.etu.size()).getBackground()==Color.GREEN){ + int i=0; + for(Etudiant e:this.etu){ + this.getComponent(i).setBackground(this.getBackground()); + if(this.liste.contains(e)) + this.liste.remove(e); + i++; + } + this.getComponent(this.etu.size()).setBackground(this.getBackground()); + }else{ + int i=0; + for(Etudiant e:this.etu){ + this.getComponent(i).setBackground(Color.GREEN); + this.liste.add(e); + i++; + } + this.getComponent(this.etu.size()).setBackground(Color.GREEN); + } + this.repaint(); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FindBarFenetre.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FindBarFenetre.java new file mode 100644 index 0000000..845ed8a --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/FindBarFenetre.java @@ -0,0 +1,85 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View; + + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import java.awt.GridLayout; +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller.ListenerFindBar; + +import java.awt.Dimension; +import java.awt.BorderLayout; +import java.util.Set; + +/** + * barre de recherche d'etudiant + * + */ +public class FindBarFenetre { + // panel de la barre de recherche + private JPanel mypanel; + // model + private Model m; + //liste des étudiants trouvés + private Set liste; + + /** + * constructeur de la barre de recherche + * @param m le model + */ + public FindBarFenetre(Model m){ + this.liste=null; + this.m=m; + this.mypanel=new JPanel(); + this.draw(); + } + /** + * gère l'affichage de la barre de recherche + */ + private void draw(){ + JTextField searchField = new JTextField(30); + searchField.setLayout(new BorderLayout()); + JButton label = new JButton("->"); + label.addActionListener(new ListenerFindBar(this, null)); + searchField.add(label, BorderLayout.LINE_END); + if(this.liste!=null && this.liste.size()>0){ + this.mypanel.setLayout(new GridLayout(this.liste.size()+1, 1)); + this.mypanel.add(searchField); + for(Etudiant e: this.liste){ + JButton etu=new JButton(e.getNom()+" "+e.getPrenom()+" "+e.getId()); + etu.addActionListener(new ListenerFindBar(this, e)); + this.mypanel.add(etu); + } + }else{ + this.mypanel.setLayout(new GridLayout(4, 1)); + this.mypanel.add(searchField); + JLabel text=new JLabel("Aucun Etudiant Selectionné"); + this.mypanel.add(text); + } + mypanel.setSize(new Dimension(500, 500)); + } + /** + * retourne le panel de la barre de recherche + * @return le panel de la barre de recherche + */ + public JPanel getPanel() { + return mypanel; + } + /** + * recherche un étudiant par son nom + * @param name le nom de l'étudiant + */ + public void search(String name){ + this.liste=this.m.getEtu(name); + this.mypanel.removeAll(); + this.draw(); + this.mypanel.revalidate(); + } + + public void showGroupe(Etudiant toshow){ + this.m.showGroupOfEtudiant(toshow); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/PanelEtudiant.java b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/PanelEtudiant.java new file mode 100644 index 0000000..fa2f602 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/MP/ROOT/View/PanelEtudiant.java @@ -0,0 +1,54 @@ +package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View; + +import javax.swing.JLabel; +import javax.swing.JPanel; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; + +import javax.swing.JButton; +import java.awt.*; +import java.awt.event.ActionListener; + + +public class PanelEtudiant extends JPanel{ + + // bouton suppression + private JButton supprimer; + // bouton déplacement + private JButton deplacer; + + /** + * Constructeur du panel d'affichage d'un étudiant + * @param e l'étudiant à afficher + * @param change si l'étudiant peut être déplacé + */ + public PanelEtudiant(Etudiant e, boolean change){ + super(new GridLayout(1,2,20,10)); + JPanel bouton=new JPanel(new GridLayout(1,2)); + JLabel label=new JLabel(" "+e.getNom()+" "+e.getPrenom()+" "+e.getId(), JLabel.LEFT); + this.supprimer=new JButton("supr"); + this.supprimer.setForeground(Color.RED); + this.deplacer=new JButton("change"); + if(change==true){ + bouton.add(this.deplacer); + } + this.add(label); + bouton.add(this.supprimer); + this.add(bouton); + } + /** + * Ajoute un listener au bouton de suppression + * @param a le listener + */ + public void addActionDeleteListener(ActionListener a){ + this.supprimer.addActionListener(a); + } + + /** + * Ajoute un listener au bouton de changement de groupe + * @param a le listener + */ + public void addActionChangeListener(ActionListener a){ + this.deplacer.addActionListener(a); + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ActionListenerChangeEtu.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ActionListenerChangeEtu.java new file mode 100644 index 0000000..7acd03f --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ActionListenerChangeEtu.java @@ -0,0 +1,84 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent.Controller; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashSet; +import java.util.Set; + +import javax.swing.JButton; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import java.awt.Color; +import java.awt.GridLayout; + +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +/** + * le controller pour le changement de groupe d'un etudiant + */ +public class ActionListenerChangeEtu implements ActionListener { + // l'etudiant a changer + private Etudiant etudiant; + // le model + private Model model; + // le groupe d'arrivée + private Groupe B; + // les boutons + private Set bout; + // le panel + private JPanel myPanel; + /** + * le constructeur + * @param m le model + * @param e l'etudiant a changer + */ + public ActionListenerChangeEtu(Model m, Etudiant e){ + this.model=m; + this.etudiant=e; + this.B=null; + this.bout=null; + myPanel=null; + } + /** + * methode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + if(this.bout==null){ + this.bout=new HashSet<>(); + for(Groupe sous:this.model.getGroupePartition()){ + JButton bouton=new JButton(sous.getName()); + bouton.addActionListener(new ControllerGroupeBChangement(sous, this)); + this.bout.add(bouton); + } + myPanel = new JPanel(new GridLayout(this.bout.size(), 1)); + } + + + for(JButton b: this.bout){ + myPanel.add(b); + } + + if(JOptionPane.showConfirmDialog(this.model.getFenetre(), this.myPanel, "Changer dans quel Groupe ?", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ + if(this.B!=null) + this.model.changeGroupe(this.etudiant, B); + } + } + /** + * methode pour changer le groupe d'arrivée + * @param b le groupe d'arrivée + */ + public void setGroupeB(Groupe b){ + this.B=b; + for(JButton bouton: this.bout){ + if(bouton.getText()==this.B.getName()){ + bouton.setBackground(Color.GREEN); + }else{ + bouton.setBackground(bouton.getParent().getBackground()); + } + } + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ControllerGroupeBChangement.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ControllerGroupeBChangement.java new file mode 100644 index 0000000..0f3a010 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ControllerGroupeBChangement.java @@ -0,0 +1,32 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent.Controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +/** + * le controleur pour le changement de groupe d'arrivée lors d'un changement de groupe + */ +public class ControllerGroupeBChangement implements ActionListener{ + // le listener parent + private ActionListenerChangeEtu parent; + // le groupe d'arrivée + private Groupe b; + /** + * le constructeur + * @param b le groupe d'arrivée + * @param observateur le listener parent + */ + public ControllerGroupeBChangement(Groupe b, ActionListenerChangeEtu observateur){ + this.parent=observateur; + this.b=b; + } + /** + * méthode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + this.parent.setGroupeB(this.b); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ObservateurChangeGroupe.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ObservateurChangeGroupe.java new file mode 100644 index 0000000..d2c83e4 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ObservateurChangeGroupe.java @@ -0,0 +1,33 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent.Controller; + +import java.awt.event.*; + +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.API.Model; +/** + * l'observateur pour le changement de groupe + */ +public class ObservateurChangeGroupe implements ActionListener{ + // le model + private Model m; + // le groupe + private Groupe g; + /** + * le constructeur + * @param m le model + * @param g le groupe + */ + public ObservateurChangeGroupe(Model m, Groupe g){ + this.m=m; + this.g=g; + } + /** + * methode invoquée lors d'un clic sur un bouton + * @param e l'événement + */ + @Override + public void actionPerformed(ActionEvent e) { + m.showGroupe(this.g); + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ObservateurFenetre.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ObservateurFenetre.java new file mode 100644 index 0000000..cb5c4c4 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Controller/ObservateurFenetre.java @@ -0,0 +1,65 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent.Controller; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import javax.swing.JOptionPane; +import javax.swing.JFrame; +/** + * l'observateur pour la fermeture de la fenetre + */ +public class ObservateurFenetre implements WindowListener{ + /** + * le constructeur + */ + public ObservateurFenetre(){ + + } + + @Override + public void windowActivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowClosed(WindowEvent e) { + // TODO Auto-generated method stub + + } + /** + * méthode invoquée lors de la fermeture de la fenetre + * @param e l'événement + */ + @Override + public void windowClosing(WindowEvent e) { + JFrame fenetre= (JFrame) e.getSource(); + int confirmation = JOptionPane.showConfirmDialog(fenetre.getContentPane(), "Voulez vous quitter?", "Quitter", JOptionPane.YES_NO_OPTION); + if(confirmation == JOptionPane.YES_OPTION){ + fenetre.dispose(); + } + } + + @Override + public void windowDeactivated(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowDeiconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowIconified(WindowEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void windowOpened(WindowEvent e) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/IHM.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/IHM.java new file mode 100644 index 0000000..e078e96 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/IHM.java @@ -0,0 +1,217 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent; + +import java.util.Iterator; + +import fr.iutfbleau.projetIHM2022FI2.API.AbstractChangementFactory; +import fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory; +import fr.iutfbleau.projetIHM2022FI2.API.Etudiant; +import fr.iutfbleau.projetIHM2022FI2.API.Groupe; +import fr.iutfbleau.projetIHM2022FI2.MNP.AbstractChangementFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP; +import fr.iutfbleau.projetIHM2022FI2.MP.EtudiantNP; +import fr.iutfbleau.projetIHM2022FI2.Permanent.Util.User; +import fr.iutfbleau.projetIHM2022FI2.Permanent.View.Connexion; + +public class IHM{ + + + public static void main(String[] args) { + User chois=Connexion.seConnecter(); + if(chois!=null){ + if(chois==User.ROOT){ + switch(Connexion.Persistant()){ + case 1: + new fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Model.ModelRoot(); + break; + case 2: + AbstractGroupeFactory agf=IHM.getAgf(); + new fr.iutfbleau.projetIHM2022FI2.MNP.ROOT.Model.ModelRoot(agf, IHM.getChange(agf)); + break; + } + } + if(chois==User.ETUDIANT){ + switch(Connexion.Persistant()){ + case 1: + new fr.iutfbleau.projetIHM2022FI2.MP.ETU.Model.ModelEtu(); + break; + case 2: + AbstractGroupeFactory agf=IHM.getAgf(); + new fr.iutfbleau.projetIHM2022FI2.MNP.ETU.Model.ModelEtu(agf, IHM.getChange(agf)); + break; + } + } + if(chois==User.PROF){ + switch(Connexion.Persistant()){ + case 1: + new fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Model.ModelRoot(); + break; + case 2: + AbstractGroupeFactory agf=IHM.getAgf(); + new fr.iutfbleau.projetIHM2022FI2.MNP.PROF.Model.ModelProf(agf, IHM.getChange(agf)); + break; + } + } + } + } + + public static AbstractGroupeFactory getAgf(){ + Etudiant e1=new EtudiantNP("césar","lycurgus"); + Etudiant e2=new EtudiantNP("denis","uranus"); + Etudiant e3=new EtudiantNP("marcel","castor"); + Etudiant e4=new EtudiantNP("marin","eurydice"); + Etudiant e5=new EtudiantNP("constantin","akoni"); + Etudiant e6=new EtudiantNP("donat","anakoni"); + Etudiant e7=new EtudiantNP("alexandre","apikalia"); + Etudiant e8=new EtudiantNP("andré","ekewaka"); + Etudiant e9=new EtudiantNP("renard","elikapeka"); + Etudiant e10=new EtudiantNP("achille","haukea"); + + System.out.print("."); + + Etudiant e11=new EtudiantNP("agathe","iakopa"); + Etudiant e12=new EtudiantNP("sabine","spartacus"); + Etudiant e13=new EtudiantNP("michel","caligula"); + Etudiant e14=new EtudiantNP("marthe","alaric"); + Etudiant e15=new EtudiantNP("juliane","hannibal"); + Etudiant e16=new EtudiantNP("anne","juvenal"); + Etudiant e17=new EtudiantNP("sophie","bede"); + Etudiant e18=new EtudiantNP("louis","hamilcar"); + Etudiant e19=new EtudiantNP("diane","ladislas"); + Etudiant e20=new EtudiantNP("christine","mahatma"); + + System.out.print("."); + + Etudiant e21=new EtudiantNP("francine","napoleon"); + Etudiant e22=new EtudiantNP("louise","lalita"); + Etudiant e23=new EtudiantNP("chantal","laxman"); + Etudiant e24=new EtudiantNP("giselle","laxmi"); + Etudiant e25=new EtudiantNP("caroline","leela"); + Etudiant e26=new EtudiantNP("claude","lila"); + Etudiant e27=new EtudiantNP("pauline","lilavati"); + Etudiant e28=new EtudiantNP("avril","lochan"); + Etudiant e29=new EtudiantNP("jacqueline","madhav"); + Etudiant e30=new EtudiantNP("denise","turlough"); + + System.out.print("."); + + Etudiant e31=new EtudiantNP("gabrielle","uaithne"); + Etudiant e32=new EtudiantNP("julie","uilleag"); + Etudiant e33=new EtudiantNP("madeleine","uilliam"); + Etudiant e34=new EtudiantNP("charlotte","uinseann"); + Etudiant e35=new EtudiantNP("bertrand","ulick"); + Etudiant e36=new EtudiantNP("lucile","ultan"); + Etudiant e37=new EtudiantNP("nicole","firdaus"); + Etudiant e38=new EtudiantNP("blanche","yasmin"); + Etudiant e39=new EtudiantNP("jeanine","javed"); + Etudiant e40=new EtudiantNP("roxane","naveed"); + + System.out.print("."); + + Etudiant e41=new EtudiantNP("adeline","shahnaz"); + Etudiant e42=new EtudiantNP("dion","ardashir"); + Etudiant e43=new EtudiantNP("liane","atefeh"); + Etudiant e44=new EtudiantNP("myriam","luigina"); + Etudiant e45=new EtudiantNP("danielle","luigino"); + Etudiant e46=new EtudiantNP("arlette","maddalena"); + Etudiant e47=new EtudiantNP("michelle","manfredo"); + Etudiant e48=new EtudiantNP("justine","manlio"); + Etudiant e49=new EtudiantNP("natalie","marcellino"); + Etudiant e50=new EtudiantNP("aline","mariangela"); + + System.out.print("."); + + Etudiant e51=new EtudiantNP("prosper","marzio"); + Etudiant e52=new EtudiantNP("mirabelle","massimiliano"); + Etudiant e53=new EtudiantNP("carine","matteo"); + Etudiant e54=new EtudiantNP("jeannine","melchiorre"); + Etudiant e55=new EtudiantNP("dianne","micaela"); + Etudiant e56=new EtudiantNP("evette","michela"); + Etudiant e57=new EtudiantNP("gisselle","michelangela"); + + + AbstractGroupeFactory agf = new AbstractGroupeFactoryNP("BUT2 FI", 15, 92); + + agf.addToGroupe(agf.getPromotion(),e1); + agf.addToGroupe(agf.getPromotion(),e2); + agf.addToGroupe(agf.getPromotion(),e3); + agf.addToGroupe(agf.getPromotion(),e4); + agf.addToGroupe(agf.getPromotion(),e5); + agf.addToGroupe(agf.getPromotion(),e6); + agf.addToGroupe(agf.getPromotion(),e7); + agf.addToGroupe(agf.getPromotion(),e8); + agf.addToGroupe(agf.getPromotion(),e9); + agf.addToGroupe(agf.getPromotion(),e10); + + System.out.print("."); + + agf.addToGroupe(agf.getPromotion(),e11); + agf.addToGroupe(agf.getPromotion(),e12); + agf.addToGroupe(agf.getPromotion(),e13); + agf.addToGroupe(agf.getPromotion(),e14); + agf.addToGroupe(agf.getPromotion(),e15); + agf.addToGroupe(agf.getPromotion(),e16); + agf.addToGroupe(agf.getPromotion(),e17); + agf.addToGroupe(agf.getPromotion(),e18); + agf.addToGroupe(agf.getPromotion(),e19); + agf.addToGroupe(agf.getPromotion(),e20); + + System.out.print("."); + + agf.addToGroupe(agf.getPromotion(),e21); + agf.addToGroupe(agf.getPromotion(),e22); + agf.addToGroupe(agf.getPromotion(),e23); + agf.addToGroupe(agf.getPromotion(),e24); + agf.addToGroupe(agf.getPromotion(),e25); + agf.addToGroupe(agf.getPromotion(),e26); + agf.addToGroupe(agf.getPromotion(),e27); + agf.addToGroupe(agf.getPromotion(),e28); + agf.addToGroupe(agf.getPromotion(),e29); + agf.addToGroupe(agf.getPromotion(),e30); + agf.addToGroupe(agf.getPromotion(),e31); + agf.addToGroupe(agf.getPromotion(),e32); + agf.addToGroupe(agf.getPromotion(),e33); + agf.addToGroupe(agf.getPromotion(),e34); + agf.addToGroupe(agf.getPromotion(),e35); + agf.addToGroupe(agf.getPromotion(),e36); + agf.addToGroupe(agf.getPromotion(),e37); + agf.addToGroupe(agf.getPromotion(),e38); + agf.addToGroupe(agf.getPromotion(),e39); + + System.out.print("."); + + agf.addToGroupe(agf.getPromotion(),e40); + agf.addToGroupe(agf.getPromotion(),e41); + agf.addToGroupe(agf.getPromotion(),e42); + agf.addToGroupe(agf.getPromotion(),e43); + agf.addToGroupe(agf.getPromotion(),e44); + agf.addToGroupe(agf.getPromotion(),e45); + agf.addToGroupe(agf.getPromotion(),e46); + agf.addToGroupe(agf.getPromotion(),e47); + agf.addToGroupe(agf.getPromotion(),e48); + agf.addToGroupe(agf.getPromotion(),e49); + agf.addToGroupe(agf.getPromotion(),e50); + agf.addToGroupe(agf.getPromotion(),e51); + agf.addToGroupe(agf.getPromotion(),e52); + agf.addToGroupe(agf.getPromotion(),e53); + agf.addToGroupe(agf.getPromotion(),e54); + agf.addToGroupe(agf.getPromotion(),e55); + agf.addToGroupe(agf.getPromotion(),e56); + agf.addToGroupe(agf.getPromotion(),e57); + agf.createPartition(agf.getPromotion(), "TD",4); + return agf; + } + public static AbstractChangementFactory getChange(AbstractGroupeFactory agf){ + AbstractChangementFactory acf = new AbstractChangementFactoryNP(agf); + Iterator itgr = agf.getPromotion().getSousGroupes().iterator().next().getSousGroupes().iterator(); + Groupe A = itgr.next(); // premier sous-groupe + Groupe B = itgr.next(); // second sous-groupe + B = itgr.next(); // troisième sous-groupe + Etudiant e = A.getEtudiants().iterator().next();// premier étudiant du premier sous-groupe. + acf.createChangement(A,e,B); + Etudiant etu1 = A.getEtudiants().iterator().next();// premier étudiant du premier sous-groupe. + Etudiant etu2 = B.getEtudiants().iterator().next();// premier étudiant du premier sous-groupe. + acf.createChangement(A,etu1,B); + acf.createChangement(B,etu2,A); + return acf; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Util/User.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Util/User.java new file mode 100644 index 0000000..709a015 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/Util/User.java @@ -0,0 +1,11 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent.Util; + +public enum User { + ROOT("root"), PROF("proffeseur"), ETUDIANT("etudiant"); + + private final String name; + + private User(String s) { + name = s; + } +} diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/View/Chargement.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/View/Chargement.java new file mode 100644 index 0000000..9dc3cc2 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/View/Chargement.java @@ -0,0 +1,45 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent.View; + +import java.awt.Graphics; + +import javax.swing.JComponent; +import javax.swing.JFrame; + +import java.awt.*; + +/** + * Class Dessinant les boutons du menu + */ +public class Chargement extends JComponent{ + private JFrame fenetre; + + public Chargement(JFrame n){ + this.fenetre=new JFrame(); + this.fenetre.setSize(n.getSize()); + this.fenetre.setLocation(n.getLocation()); + this.fenetre.add(this, BorderLayout.CENTER); + this.fenetre.setVisible(true); + } + + public void dispose(){ + this.fenetre.dispose(); + } + + @Override + protected void paintComponent(Graphics pinceau) { + // obligatoire : on crée un nouveau pinceau pour pouvoir le modifier plus tard + Graphics2D secondPinceau = (Graphics2D) pinceau.create(); + secondPinceau.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // obligatoire : si le composant n'est pas censé être transparent + if (this.isOpaque()) { + // obligatoire : on repeint toute la surface avec la couleur de fond + secondPinceau.setColor(this.getBackground()); + secondPinceau.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + // maintenant on dessine ce que l'on veut + secondPinceau.setColor(Color.BLUE); + secondPinceau.setFont(new Font(Font.SANS_SERIF, Font.BOLD, (this.getWidth()/10))); + FontMetrics metrics = secondPinceau.getFontMetrics(secondPinceau.getFont()); + secondPinceau.drawString("CHARGEMENT", (this.getWidth()/2-metrics.stringWidth("CHARGEMENT")/2), (this.getHeight()-metrics.getHeight())/3+metrics.getAscent()); + } +} \ No newline at end of file diff --git a/src/fr/iutfbleau/projetIHM2022FI2/Permanent/View/Connexion.java b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/View/Connexion.java new file mode 100644 index 0000000..4c851b6 --- /dev/null +++ b/src/fr/iutfbleau/projetIHM2022FI2/Permanent/View/Connexion.java @@ -0,0 +1,162 @@ +package fr.iutfbleau.projetIHM2022FI2.Permanent.View; +import javax.swing.*; + +import fr.iutfbleau.projetIHM2022FI2.Permanent.Util.User; + +import java.awt.*; + +public class Connexion extends JOptionPane{ + + public static User seConnecter(){ + JFrame fenetre=new JFrame(); + fenetre.setSize(10,10); + fenetre.setVisible(true); + JPanel panel = new JPanel(new GridLayout(2,1)); + User[] use=new User[3]; + use[0]=User.ROOT; + use[1]=User.PROF; + use[2]=User.ETUDIANT; + + JComboBox combo=new JComboBox(use); + + JPanel myPanel = new JPanel(); + JTextField password = new JPasswordField(20); + myPanel.add(new JLabel("Password:")); + myPanel.add(password); + panel.add(combo); + panel.add(myPanel); + + if(JOptionPane.showConfirmDialog(fenetre, panel, "login", JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION){ + fenetre.dispose(); + return null; + } + User choose=null; + switch(combo.getSelectedIndex()){ + case 0: + choose=use[0]; + break; + case 1: + choose=use[1]; + break; + case 2: + choose=use[2]; + break; + } + if(choose==User.ROOT){ + if(password.getText().equals("root")){ + fenetre.dispose(); + return User.ROOT; + } + } + if(choose==User.PROF){ + if(password.getText().equals("prof")){ + fenetre.dispose(); + return User.PROF; + } + } + if(choose==User.ETUDIANT){ + if(password.getText().equals("etuiutsen")){ + fenetre.dispose(); + return User.ETUDIANT; + } + } + User ret=Connexion.retry(choose, fenetre); + fenetre.dispose(); + return ret; + } + + private static User retry(User first, JFrame fenetre){ + JPanel panel = new JPanel(new GridLayout(2,1)); + User[] use=new User[3]; + if(first==User.ETUDIANT){ + use[0]=User.ETUDIANT; + use[1]=User.ROOT; + use[2]=User.PROF; + } + + if(first==User.ROOT){ + use[1]=User.ETUDIANT; + use[0]=User.ROOT; + use[2]=User.PROF; + } + + if(first==User.PROF){ + use[1]=User.ETUDIANT; + use[2]=User.ROOT; + use[0]=User.PROF; + } + JComboBox combo=new JComboBox(use); + + JPanel myPanel = new JPanel(); + JTextField password = new JPasswordField(20); + myPanel.add(new JLabel("Password:")); + myPanel.add(password); + JLabel erre=new JLabel("mdp incorect", SwingConstants.RIGHT); + erre.setForeground(Color.RED); + myPanel.add(erre); + + panel.add(combo); + panel.add(myPanel); + + if(JOptionPane.showConfirmDialog(fenetre, panel, "login", JOptionPane.OK_CANCEL_OPTION) != JOptionPane.OK_OPTION){ + return null; + } + User choose=null; + switch(combo.getSelectedIndex()){ + case 0: + choose=use[0]; + break; + case 1: + choose=use[1]; + break; + case 2: + choose=use[2]; + break; + } + if(choose==User.ROOT){ + if(password.getText().equals("root")){ + fenetre.dispose(); + return User.ROOT; + } + } + if(choose==User.PROF){ + if(password.getText().equals("prof")){ + fenetre.dispose(); + return User.PROF; + } + } + if(choose==User.ETUDIANT){ + if(password.getText().equals("etuiutsen")){ + fenetre.dispose(); + return User.ETUDIANT; + } + } + User ret=Connexion.retry(choose, fenetre); + fenetre.dispose(); + return ret; + } + + public static int Persistant(){ + JFrame fenetre=new JFrame(); + fenetre.setSize(10,10); + fenetre.setVisible(true); + String[] value=new String[2]; + value[0]="Modèle Persistant"; + value[1]="Modèle Non Persistant"; + String result; + if((result=(String)JOptionPane.showInputDialog(fenetre, "Choisir un modèle de donnée", "Model de Donnée", JOptionPane.QUESTION_MESSAGE, null, value, value[0]))==null){ + fenetre.dispose(); + return 0; + } + if(result.equals(value[0])){ + fenetre.dispose(); + return 1; + } + if(result.equals(value[1])){ + fenetre.dispose(); + return 2; + } + return 0; + } + +}