package fr.iutfbleau.projetIHM2022FI2.Graphic.Model; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.LinkedList; import java.util.Set; import java.sql.Connection; import java.sql.ResultSet; import javax.swing.JFrame; 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.Graphic.Controller.ObservateurFenetre; import fr.iutfbleau.projetIHM2022FI2.Graphic.Util.BD; import fr.iutfbleau.projetIHM2022FI2.Graphic.View.Chargement; import fr.iutfbleau.projetIHM2022FI2.Graphic.View.FenetreEtudiant; import fr.iutfbleau.projetIHM2022FI2.Graphic.View.FenetreGroupe; import fr.iutfbleau.projetIHM2022FI2.MNP.AbstractGroupeFactoryNP; import fr.iutfbleau.projetIHM2022FI2.MNP.GroupeNP; /** * Le Model de L'IHM */ public class Model{ private FenetreGroupe fenGr; private FenetreEtudiant fenEtu; private AbstractGroupeFactory promo; private JFrame fenetre; private BD bd; public Model(){ this.fenetre=new JFrame(); this.fenetre.setSize(1200, 720); this.fenetre.setLocation(100,100); Chargement ch=new Chargement(); this.fenetre.add(ch, BorderLayout.CENTER); this.fenetre.setVisible(true); this.bd=new BD(this.fenetre); this.promo=this.getPromo(ch); 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.fenetre.dispose(); this.fenetre=new JFrame(); this.fenetre.setSize(1200, 720); this.bd.setFenetre(this.fenetre); 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.fenetre.add(this.fenGr); JScrollPane scroll=new JScrollPane(this.fenEtu); scroll.getVerticalScrollBar().setUnitIncrement(15); this.fenetre.add(scroll); this.fenetre.setVisible(true); } /** * Fonction pour refresh/changer de groupe d'affichage * @param g le groupe a afficher */ public void showGroupe(Groupe g){ g=this.bd.refreshALL(g); this.promo=this.getPromo(null); this.fenGr=new FenetreGroupe(g, this); this.fenEtu=new FenetreEtudiant(g); this.fenetre.getContentPane().removeAll(); this.fenetre.add(this.fenGr); JScrollPane scroll=new JScrollPane(this.fenEtu); scroll.getVerticalScrollBar().setUnitIncrement(15); this.fenetre.add(scroll); this.fenetre.revalidate(); } /** * getteur de la fenetre * @return JFrame la fenetre */ public JFrame getFenetre() { return fenetre; } /** * Fonction pour supprimer un groupe * @param g le groupe a supprimer */ public void delete(Groupe g){ //On ne peut pas supprimer la promo if(g==this.promo.getPromotion()){ JOptionPane.showMessageDialog(this.fenetre, "impossible de supprimer la promotion", "alerte", JOptionPane.ERROR_MESSAGE); return; } //autrement on récupere les groupe a supprimer par ordre avec une fonction recursive //elle contiendra les sous-groupe remontant j'usqau groupe a supprimer LinkedList file=new LinkedList<>(); //On initialise la liste this.deleteRecursif(file, g); for(Groupe sup:file){ //on supprime les groupe this.promo.deleteGroupe(sup); } this.showGroupe(g.getPointPoint()); } /** * fonction recursive initialisant la liste ordonnée de tous les groupe a supprimer avant de supprimer ce groupe * @param file la liste * @param bedelete le groupe a supprimer */ private void deleteRecursif(LinkedList file, Groupe bedelete){ //on parcour tous ses sous groupe for(Groupe g: bedelete.getSousGroupes()){ //qui eux aussi ajouterons leurs sous-groupe a la file this.deleteRecursif(file, g); } // on ajoute le groupe (les sous-groupe ayant déja ajouter leur groupe) file.add(bedelete); } /** * 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){ this.promo.createPartition(g, name, n); //On recherche le groupe Partitionner pour le sauvegarder dans la BD Groupe creer; for(Groupe gr: g.getSousGroupes()){ if(gr.getName()==name){ creer=gr; break; } } //On dis a la BD de sauvegarder ce groupe et tous ces sous Groupe this.fenGr.setG(this.bd.refreshGroupe(g)); this.fenGr.refresh(); } /** * 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){ //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++; } 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.getSize()