2022-11-26 18:09:08 +01:00
package fr.iutfbleau.projetIHM2022FI2.ETU.Model ;
2022-11-15 15:08:13 +01:00
import java.sql.PreparedStatement ;
import java.sql.SQLException ;
import java.util.Set ;
import java.sql.Connection ;
import java.sql.ResultSet ;
2022-11-17 10:34:29 +01:00
2022-11-15 15:08:13 +01:00
import javax.swing.* ;
import java.awt.* ;
import fr.iutfbleau.projetIHM2022FI2.API.AbstractGroupeFactory ;
import fr.iutfbleau.projetIHM2022FI2.API.Etudiant ;
import fr.iutfbleau.projetIHM2022FI2.API.Groupe ;
import fr.iutfbleau.projetIHM2022FI2.API.TypeGroupe ;
import fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP ;
import fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP ;
2022-11-26 18:09:08 +01:00
import fr.iutfbleau.projetIHM2022FI2.ETU.Controller.ObservateurFenetre ;
import fr.iutfbleau.projetIHM2022FI2.ETU.Util.BD ;
import fr.iutfbleau.projetIHM2022FI2.ETU.View.Chargement ;
import fr.iutfbleau.projetIHM2022FI2.ETU.View.FenetreEtudiant ;
import fr.iutfbleau.projetIHM2022FI2.ETU.View.FenetreGroupe ;
2022-11-15 15:08:13 +01:00
/ * *
* Le Model de L ' IHM
* /
public class Model {
2022-11-17 14:45:42 +01:00
2022-11-23 15:06:55 +01:00
private JPanel panGroupe ;
private FenetreGroupe fenGr ;
private FenetreEtudiant fenEtu ;
private AbstractGroupeFactory promo ;
2022-11-26 18:09:08 +01:00
private JFrame fenetre ;
private Etudiant Selected ;
2022-11-23 15:06:55 +01:00
//private JTree tree;
private BD bd ;
public Model ( ) {
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 ( ) ) ;
this . bd = new BD ( this . fenetre ) ;
2022-11-26 18:09:08 +01:00
Chargement ch = new Chargement ( this . fenetre ) ;
2022-11-23 15:06:55 +01:00
this . promo = this . getPromo ( ch ) ;
ch . dispose ( ) ;
this . fenetre . setVisible ( true ) ;
2022-11-26 18:09:08 +01:00
this . initEtu ( null ) ;
2022-11-23 15:06:55 +01:00
if ( this . promo = = null ) {
2022-11-26 18:09:08 +01:00
this . fenGr = new FenetreGroupe ( null , this , null ) ;
this . fenEtu = new FenetreEtudiant ( null , this . Selected ) ;
2022-11-23 15:06:55 +01:00
} else {
2022-11-26 18:09:08 +01:00
this . fenGr = new FenetreGroupe ( this . promo . getPromotion ( ) , this , this . promo . getGroupesOfEtudiant ( this . Selected ) ) ;
this . fenEtu = new FenetreEtudiant ( this . promo . getPromotion ( ) , this . Selected ) ;
2022-11-23 15:06:55 +01:00
}
this . panGroupe = new JPanel ( new GridLayout ( 1 , 1 ) ) ;
if ( this . promo ! = null ) {
this . showGroupe ( this . promo . getPromotion ( ) ) ;
} else {
this . showGroupe ( null ) ;
2022-11-15 15:08:13 +01:00
}
}
2022-11-23 15:06:55 +01:00
/ * *
* Fonction pour refresh / changer de groupe d ' affichage
* @param g le groupe a afficher
* /
public void showGroupe ( Groupe g ) {
if ( g ! = null )
g = this . bd . refreshALL ( g ) ;
this . panGroupe . removeAll ( ) ;
2022-11-26 18:09:08 +01:00
this . fenGr = new FenetreGroupe ( g , this , this . promo . getGroupesOfEtudiant ( this . Selected ) ) ;
this . fenEtu = new FenetreEtudiant ( g , this . Selected ) ;
2022-11-23 15:06:55 +01:00
this . fenetre . getContentPane ( ) . removeAll ( ) ;
2022-11-26 18:09:08 +01:00
this . panGroupe . add ( this . fenGr . getPan ( ) ) ;
2022-11-23 15:06:55 +01:00
this . panGroupe . revalidate ( ) ;
this . fenetre . add ( this . panGroupe ) ;
2022-11-26 18:09:08 +01:00
JScrollPane scroll = new JScrollPane ( this . fenEtu . getPan ( ) ) ;
2022-11-23 15:06:55 +01:00
scroll . getVerticalScrollBar ( ) . setUnitIncrement ( 15 ) ;
this . fenetre . add ( scroll ) ;
this . fenetre . revalidate ( ) ;
}
2022-11-15 15:08:13 +01:00
/ * *
* getteur de la fenetre
* @return JFrame la fenetre
* /
public JFrame getFenetre ( ) {
return fenetre ;
}
2022-11-26 18:09:08 +01:00
/ * *
* Fonction permettant d ' initialiser l ' AbstractFactory de la promo
* avec la Base de donné
* @param Chargement : pour indiquer la progression du chargement
* /
private AbstractGroupeFactory getPromo ( Chargement chargement ) {
AbstractGroupeFactory agf = null ;
Connection cnx = this . bd . 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 ( ) ;
rs . last ( ) ;
int nbgrp = rs . getRow ( ) ;
rs = pst . executeQuery ( ) ;
try {
//Si il existe bien une promotion
if ( rs . next ( ) ) {
//On créer le groupe de promo
Groupe groupe = new GroupeNP ( rs . getInt ( 1 ) , rs . getString ( 2 ) , rs . getInt ( 3 ) , rs . getInt ( 4 ) , TypeGroupe . getType ( rs . getString ( 5 ) ) , null ) ;
//On lui ajoute tout ses sous-groupe
this . init ( groupe , ( 100 / nbgrp ) , chargement ) ;
//On créer la Factory
agf = new AbstractGroupeFactoryNP ( groupe , this . fenetre ) ;
} else {
//Si aucune ligne et donc pas de promo:
this . promo = null ;
}
} catch ( SQLException e ) {
}
rs . close ( ) ;
pst . close ( ) ;
} catch ( SQLException e ) {
}
this . bd . close ( cnx ) ;
return agf ;
}
public Set < Etudiant > getEtudiant ( ) {
return this . bd . getEtudiant ( ) ;
}
private void init ( Groupe g , int pourcentage , Chargement ch ) {
this . bd . refreshALL ( g ) ;
ch . addPourcent ( pourcentage + 1 ) ;
for ( Groupe gr : g . getSousGroupes ( ) ) {
this . init ( gr , pourcentage , ch ) ;
}
}
private void initEtu ( String err ) {
Set < Etudiant > 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 ( null , 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 SUPRIMER UN ETUDIANT
// ***********************
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 ;
}
}
private boolean deleteEtutoChildren ( Etudiant e , Groupe g ) {
if ( g . getMax ( ) < g . getEtudiants ( ) . size ( ) - 1 )
return false ;
for ( Groupe sous : g . getSousGroupes ( ) ) {
if ( this . deleteEtutoChildren ( e , sous ) = = false ) {
return false ;
}
}
return true ;
}
// ***********************
// 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 ) {
//Si on a la place
if ( g ! = g . getPointPoint ( ) )
if ( this . addEtuToParent ( g . getPointPoint ( ) , e ) = = false )
return false ;
//On induqe a la BD de sauvegarder cette modification
this . promo . addToGroupe ( g , e ) ;
return true ;
}
/ * *
* Fonction recursive pour ajouter l ' etudiant a ses parents si il ne l ' ont pas
* @param g groupe
* @param e etudiant
* @return true si possible
* /
private boolean addEtuToParent ( Groupe g , Etudiant e ) {
if ( g . getMax ( ) = = g . getSize ( ) )
return false ;
for ( Etudiant et : g . getEtudiants ( ) ) {
if ( et . getId ( ) = = e . getId ( ) ) {
return true ;
}
}
if ( g . getPointPoint ( ) ! = g ) {
if ( this . addEtuToParent ( g . getPointPoint ( ) , e ) = = false ) {
return false ;
}
}
this . promo . addToGroupe ( g , e ) ;
return true ;
}
// ***********************
// FONCTION POUR SUPRIMER UN GROUPE
// ***********************
2022-11-15 15:08:13 +01:00
/ * *
* Fonction pour supprimer un groupe
* @param g le groupe a supprimer
* /
public void delete ( Groupe g ) {
2022-11-16 17:03:05 +01:00
//On ne peut pas supprimer la promo normallement
2022-11-15 15:08:13 +01:00
if ( g = = this . promo . getPromotion ( ) ) {
2022-11-16 17:03:05 +01:00
if ( JOptionPane . showConfirmDialog ( this . fenetre , " Attention ête vous sûr de vouloir supprimer la promo " , " Attention " , JOptionPane . YES_NO_OPTION ) = = JOptionPane . YES_OPTION ) {
2022-11-26 18:09:08 +01:00
this . promo . deleteGroupe ( g ) ;
2022-11-16 17:03:05 +01:00
this . promo = null ;
this . showGroupe ( null ) ;
} else {
return ;
}
2022-11-16 14:59:56 +01:00
//JOptionPane.showMessageDialog(this.fenetre, "impossible de supprimer la promotion", "alerte", JOptionPane.ERROR_MESSAGE);
2022-11-16 11:14:29 +01:00
} else {
2022-11-26 18:09:08 +01:00
//on suprime le groupe
this . promo . deleteGroupe ( g ) ;
2022-11-16 11:14:29 +01:00
this . showGroupe ( g . getPointPoint ( ) ) ;
2022-11-15 15:08:13 +01:00
}
}
2022-11-26 18:09:08 +01:00
// ***********************
// FONCTION POUR RENOMER UN GROUPE
// ***********************
/ * *
* Fonction pour renomer un groupe
* @param name
* @param g
* /
public void rename ( String name , Groupe g ) {
this . promo . changeNameGroupe ( g , name ) ;
this . showGroupe ( g ) ;
2022-11-15 15:08:13 +01:00
}
2022-11-26 18:09:08 +01:00
// **********************
// FONCTION POUR CREER UN GROUPE
// **********************
2022-11-15 15:08:13 +01:00
/ * *
* 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 ) {
2022-11-26 18:09:08 +01:00
Chargement ch = new Chargement ( this . fenetre ) ;
this . fenetre . setVisible ( false ) ;
2022-11-15 15:08:13 +01:00
this . promo . createPartition ( g , name , n ) ;
2022-11-26 18:09:08 +01:00
ch . dispose ( ) ;
this . fenetre . setVisible ( true ) ;
2022-11-16 11:14:29 +01:00
this . showGroupe ( g ) ;
2022-11-15 15:08:13 +01:00
}
/ * *
* 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 < Etudiant > ajout ) {
2022-11-26 18:09:08 +01:00
Chargement ch = new Chargement ( this . fenetre ) ;
this . fenetre . setVisible ( false ) ;
2022-11-15 15:08:13 +01:00
//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 + + ;
}
2022-11-16 11:14:29 +01:00
creer = this . bd . refreshALL ( creer ) ;
2022-11-26 18:09:08 +01:00
ch . dispose ( ) ;
this . fenetre . setVisible ( true ) ;
2022-11-15 15:08:13 +01:00
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
2022-11-26 18:09:08 +01:00
if ( creer . getEtudiants ( ) . size ( ) + 1 < = creer . getMin ( ) ) {
2022-11-15 15:08:13 +01:00
//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 ) ;
}
2022-11-16 17:03:05 +01:00
public void addPromo ( int min , int max , String name , Set < Etudiant > ajout ) {
2022-11-26 18:09:08 +01:00
Chargement ch = new Chargement ( this . fenetre ) ;
this . promo = new AbstractGroupeFactoryNP ( name , min , max , this . fenetre ) ;
2022-11-16 11:14:29 +01:00
this . fenetre . setVisible ( false ) ;
2022-11-16 17:03:05 +01:00
ch . addPourcent ( 20 ) ;
int pourcent = 85 / ajout . size ( ) ;
for ( Etudiant e : ajout ) {
this . addEtudiant ( this . promo . getPromotion ( ) , e ) ;
ch . addPourcent ( pourcent ) ;
}
2022-11-16 14:59:56 +01:00
ch . dispose ( ) ;
2022-11-16 11:14:29 +01:00
this . fenetre . setVisible ( true ) ;
2022-11-16 17:03:05 +01:00
this . showGroupe ( this . promo . getPromotion ( ) ) ;
2022-11-15 15:08:13 +01:00
}
}