maj V1.0.6

This commit is contained in:
pablo rodriguez 2023-07-26 21:55:40 +02:00
parent c06e565122
commit 0706a9114f
9 changed files with 445 additions and 8 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -164,6 +164,10 @@ public class importInscriptionXLS {
nFormation.setAttribut("Verouillage_Groupe_Projet", "false"); nFormation.setAttribut("Verouillage_Groupe_Projet", "false");
nFormation.setAttribut("Verouillage_Tous_Les_Groupes", "false"); nFormation.setAttribut("Verouillage_Tous_Les_Groupes", "false");
nFormation.setAttribut("pattern_Groupe_Principal", "grp @");
nFormation.setAttribut("nombre_Student_Groupe_Principal", "30");
nFormation.setAttribut("aleatoire_Groupe_Principal", "false");
nYear.addChild(nFormation); nYear.addChild(nFormation);
} }

View File

@ -0,0 +1,412 @@
package Windows;
import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import base.sauvegardeXMLBase;
import base.sauvegardeXMLBase.saveType;
import outils.commandes;
import outils.noeud;
public class Window_genere_groupe extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private JPanel contentPane = new JPanel();
private JTextField textPattern_Groupe;
private JTextField textNombre_Etudiant_Groupe;
private int nombreEtudiantDansGroupe = 30;
/**
* Create the frame.
*/
public Window_genere_groupe(noeud table, String nameGroupe, Window_gestionnaire instance) {
initialize(table, nameGroupe, instance);
}
private void initialize(noeud table, String nameGroupe,Window_gestionnaire instance) {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(0, 0, 863, 534);
setTitle("Générer des groupes");
setLocationRelativeTo(null); // Centre la fenêtre à l'écran
ImageIcon img = new ImageIcon(Window_demarre.class.getResource("/resources/logo.png"));
setIconImage(img.getImage());
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
getContentPane().setLayout(null);
noeud nFormation = commandes.nBase.getChild(table.getAttributes("Formation"));
boolean verrouillageGroupe = (Boolean.valueOf(nFormation.getAttributes("Verouillage_"+nameGroupe))
|| Boolean.valueOf(nFormation.getAttributes("Verouillage_Tous_Les_Groupes"))) ;
JLabel lblInformation = new JLabel("<html><p>La formation est : "+ table.getAttributes("Formation")+"<br>"
+ "Le groupe sélectionné est : " + nameGroupe +"<br><hr>"
+ "<b>Les groupes sont verrouillés</b>.<br>"
+ "Ce qui signifie que seul les étudiants qui ne sont pas dans des groupes seront placés dans un groupe.</p>\r\n</html>");
lblInformation.setVerticalAlignment(SwingConstants.TOP);
if(!verrouillageGroupe) {
lblInformation = new JLabel("<html><p>La formation est : "+ table.getAttributes("Formation")+"<br>"
+ "Le groupe sélectionné est : " + nameGroupe +"<br><hr>"
+ "<b><u>AVERTISSEMENT</u> : Les groupes ne sont pas verrouillés</b>.<br>"
+ "Ce qui signifie que tous les étudiants auront une attribution dans un groupe.<br>"
+ "Y compris ce qui sont déjà dans un groupe.</p>\r\n</html>");
}
lblInformation.setFont(new Font("Tahoma", Font.BOLD, 14));
lblInformation.setBounds(10, 261, 467, 132);
getContentPane().add(lblInformation);
JButton btnGenere_Groupe = new JButton("Générer les groupes");
btnGenere_Groupe.setFont(new Font("Arial", Font.BOLD, 14));
btnGenere_Groupe.setBounds(493, 396, 344, 80);
getContentPane().add(btnGenere_Groupe);
textPattern_Groupe = new JTextField();
textPattern_Groupe.setFont(new Font("Arial", Font.BOLD, 14));
textPattern_Groupe.setBounds(660, 262, 177, 34);
getContentPane().add(textPattern_Groupe);
textPattern_Groupe.setColumns(12);
textPattern_Groupe.setText(commandes.nBase.getChild(table.getAttributes("Formation")).getAttributes("pattern_"+nameGroupe));
JLabel lblNewLabel = new JLabel("Pattern du groupe (1)");
lblNewLabel.setFont(new Font("Arial", Font.BOLD, 14));
lblNewLabel.setBounds(487, 261, 163, 34);
getContentPane().add(lblNewLabel);
textNombre_Etudiant_Groupe = new JTextField();
textNombre_Etudiant_Groupe.setFont(new Font("Arial", Font.BOLD, 14));
textNombre_Etudiant_Groupe.setBounds(724, 307, 113, 34);
getContentPane().add(textNombre_Etudiant_Groupe);
textNombre_Etudiant_Groupe.setColumns(6);
textNombre_Etudiant_Groupe.setText(nFormation.getAttributes("nombre_Student_" + nameGroupe));
textNombre_Etudiant_Groupe.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
checkIsNumber();
}
@Override
public void removeUpdate(DocumentEvent e) {
checkIsNumber();
}
@Override
public void changedUpdate(DocumentEvent e) {
checkIsNumber();
}
private void checkIsNumber() {
String inputText = textNombre_Etudiant_Groupe.getText().trim();
if (inputText.isEmpty()) {
System.out.println("Le champ est vide.");
return;
}
if (inputText.matches("\\d+")) {
nombreEtudiantDansGroupe = Integer.parseInt(inputText);
System.out.println("Le texte est un nombre : " + nombreEtudiantDansGroupe);
} else {
JOptionPane.showMessageDialog(null, "Ce n'est pas un nombre entier.", "Erreur", JOptionPane.ERROR_MESSAGE);
textNombre_Etudiant_Groupe.setText(nFormation.getAttributes("nombre_Student_"+nameGroupe));
}
}
});
JLabel lblNombre_Etudiant_Groupe = new JLabel("<html>Nombre maximum d'étudiants<br>dans un groupe</html>");
lblNombre_Etudiant_Groupe.setVerticalAlignment(SwingConstants.TOP);
lblNombre_Etudiant_Groupe.setFont(new Font("Arial", Font.BOLD, 14));
lblNombre_Etudiant_Groupe.setBounds(487, 305, 248, 40);
getContentPane().add(lblNombre_Etudiant_Groupe);
JLabel lblNewLabel_1 = new JLabel("<html>(1) - Si le caractère @ ou # n'est pas présent alors pattern fixe.<br><br>@ : correspond à une lettre de A à Z<br># : correspond à un nombre de 1 à 100</html>");
lblNewLabel_1.setForeground(Color.BLUE);
lblNewLabel_1.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 14));
lblNewLabel_1.setVerticalAlignment(SwingConstants.TOP);
lblNewLabel_1.setBounds(10, 396, 441, 100);
getContentPane().add(lblNewLabel_1);
Random random = new Random();
int randomNumber = random.nextInt(commandes.nombreImage) + 1;
ImageIcon imageIcon = new ImageIcon(Window_demarre.class.getResource("/resources/Sans titre_"+ String.valueOf(randomNumber) +".jpg"));
Image image = imageIcon.getImage();
// Détermination de la taille souhaitée pour l'image
int newWidth = getWidth();
int newHeight = getHeight()-100;
// Redimensionnement de l'image pour qu'elle s'adapte à la taille souhaitée
Image resizedImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
JLabel lblImage = new JLabel("");
lblImage.setIcon(new ImageIcon(resizedImage));
lblImage.setBounds(0, 0, 847, 260);
getContentPane().add(lblImage);
JRadioButton rdbtnAleatoire = new JRadioButton("Aléatoire");
rdbtnAleatoire.setFont(new Font("Arial", Font.BOLD, 14));
rdbtnAleatoire.setSelected(true);
rdbtnAleatoire.setBounds(483, 352, 109, 23);
getContentPane().add(rdbtnAleatoire);
JRadioButton rdbtnAlphabetique = new JRadioButton("Alphabétique");
rdbtnAlphabetique.setFont(new Font("Arial", Font.BOLD, 14));
rdbtnAlphabetique.setBounds(594, 352, 143, 23);
getContentPane().add(rdbtnAlphabetique);
rdbtnAlphabetique.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rdbtnAleatoire.setEnabled(!rdbtnAlphabetique.isSelected());
}
});
rdbtnAleatoire.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
rdbtnAlphabetique.setEnabled(!rdbtnAleatoire.isSelected());
}
});
btnGenere_Groupe.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(!verrouillageGroupe) {
int choice = showCustomDialog();
if (choice == JOptionPane.YES_OPTION) {
if(rdbtnAleatoire.isSelected()) generateAleatoireGroupe(table, nameGroupe, instance, textPattern_Groupe.getText(), Integer.parseInt(textNombre_Etudiant_Groupe.getText()));
if(rdbtnAlphabetique.isSelected()) generateAlphabetiqueGroupe(table, nameGroupe, instance, textPattern_Groupe.getText(), Integer.parseInt(textNombre_Etudiant_Groupe.getText()));
}
}else {
if(rdbtnAleatoire.isSelected()) generateAleatoireGroupe(table, nameGroupe, instance, textPattern_Groupe.getText(), Integer.parseInt(textNombre_Etudiant_Groupe.getText()));
if(rdbtnAlphabetique.isSelected()) generateAlphabetiqueGroupe(table, nameGroupe, instance, textPattern_Groupe.getText(), Integer.parseInt(textNombre_Etudiant_Groupe.getText()));
}
}
});
setVisible(true);
}
/**
* Génération aléatoire des groupes en suivant un pattern.
* @param table
* @param nameGroupe
* @param instance
* @param patternGroupe
* @param tailleDesGroupes
*/
private static void generateAleatoireGroupe(noeud table, String nameGroupe,Window_gestionnaire instance, String patternGroupe, Integer tailleDesGroupes) {
noeud nFormation = commandes.nBase.getChild(table.getAttributes("Formation"));
List<noeud> tableChild = table.getChildren();
int totalElements = tableChild.size();
int nombreDeGroupes = (int) Math.ceil((double) totalElements / tailleDesGroupes);
boolean verrouillageGroupe = (Boolean.valueOf(nFormation.getAttributes("Verouillage_"+nameGroupe))
|| Boolean.valueOf(nFormation.getAttributes("Verouillage_Tous_Les_Groupes"))) ;
nFormation.setAttribut("pattern_"+nameGroupe, patternGroupe);
nFormation.setAttribut("nombre_Student_"+nameGroupe,String.valueOf(tailleDesGroupes));
tailleDesGroupes = tailleDesGroupes-1;
if(patternGroupe.contains("@")) {
patternGroupe = patternGroupe.replaceAll("@", "");
Random random = new Random();
String str = "";
for (noeud child : tableChild) {
if(!verrouillageGroupe || child.getAttributes(nameGroupe).isEmpty()) {
do {
char randomChar = (char) ('A' + random.nextInt(nombreDeGroupes));
str = patternGroupe + randomChar;
}while(nFormation.getNumberAttribut(nameGroupe, str)>tailleDesGroupes);
nFormation.getChild(child.getName()).setAttribut(nameGroupe, str);
}
}
sauvegardeXMLBase.save(commandes.nBase,saveType.SANS_MESSAGE,null);
instance.majFiltres();
}else if (patternGroupe.contains("#")) {
patternGroupe = patternGroupe.replaceAll("#", "");
Random random = new Random();
String str = "";
for (noeud child : tableChild) {
if(!verrouillageGroupe || child.getAttributes(nameGroupe).isEmpty()) {
do {
int randomInteger = (1 + random.nextInt(nombreDeGroupes));
str = patternGroupe + String.valueOf(randomInteger);
}while(nFormation.getNumberAttribut(nameGroupe, str)>tailleDesGroupes);
nFormation.getChild(child.getName()).setAttribut(nameGroupe, str);
}
}
sauvegardeXMLBase.save(commandes.nBase,saveType.SANS_MESSAGE,null);
instance.majFiltres();
}else {
for (noeud child : tableChild) {
if(!verrouillageGroupe || child.getAttributes(nameGroupe).isEmpty()) {
if(nFormation.getNumberAttribut(nameGroupe, patternGroupe)<=tailleDesGroupes+1) {
nFormation.getChild(child.getName()).setAttribut(nameGroupe, patternGroupe);
}
}
}
sauvegardeXMLBase.save(commandes.nBase,saveType.SANS_MESSAGE,null);
instance.majFiltres();
}
}
private static void generateAlphabetiqueGroupe(noeud table, String nameGroupe, Window_gestionnaire instance, String patternGroupe, Integer tailleDesGroupes) {
noeud nFormation = commandes.nBase.getChild(table.getAttributes("Formation"));
List<noeud> tableChild = table.getChildren();
boolean verrouillageGroupe = (Boolean.valueOf(nFormation.getAttributes("Verouillage_"+nameGroupe))
|| Boolean.valueOf(nFormation.getAttributes("Verouillage_Tous_Les_Groupes"))) ;
nFormation.setAttribut("pattern_"+nameGroupe, patternGroupe);
nFormation.setAttribut("nombre_Student_"+nameGroupe,String.valueOf(tailleDesGroupes));
if(patternGroupe.contains("@")) {
patternGroupe = patternGroupe.replaceAll("@", "");
int nombreDeGroupes=0;
char randomChar = (char) ('A' + nombreDeGroupes);
String str = patternGroupe + randomChar;
for (noeud child : tableChild) {
if(!verrouillageGroupe || child.getAttributes(nameGroupe).isEmpty()) {
int nombreGroupeDejaPresent = nFormation.getNumberAttribut(nameGroupe, str);
if(nombreGroupeDejaPresent>=tailleDesGroupes) {
do {
nombreDeGroupes++;
randomChar = (char) ('A' + nombreDeGroupes);
str = patternGroupe + randomChar;
}while(nFormation.getNumberAttribut(nameGroupe, str)<tailleDesGroupes);
}
nFormation.getChild(child.getName()).setAttribut(nameGroupe, str);
}
}
sauvegardeXMLBase.save(commandes.nBase,saveType.SANS_MESSAGE,null);
instance.majFiltres();
}else if (patternGroupe.contains("#")) {
patternGroupe = patternGroupe.replaceAll("#", "");
int nombreDeGroupes = 1;
String str = patternGroupe + String.valueOf(nombreDeGroupes);
for (noeud child : tableChild) {
if(!verrouillageGroupe || child.getAttributes(nameGroupe).isEmpty()) {
if(nFormation.getNumberAttribut(nameGroupe, str)<=tailleDesGroupes) {
nombreDeGroupes++;
str = patternGroupe + String.valueOf(nombreDeGroupes);
};
nFormation.getChild(child.getName()).setAttribut(nameGroupe, str);
}
}
sauvegardeXMLBase.save(commandes.nBase,saveType.SANS_MESSAGE,null);
instance.majFiltres();
}else {
for (noeud child : tableChild) {
if(!verrouillageGroupe || child.getAttributes(nameGroupe).isEmpty()) {
if(nFormation.getNumberAttribut(nameGroupe, patternGroupe)<=tailleDesGroupes+1) {
nFormation.getChild(child.getName()).setAttribut(nameGroupe, patternGroupe);
}
}
}
sauvegardeXMLBase.save(commandes.nBase,saveType.SANS_MESSAGE,null);
instance.majFiltres();
}
}
private static Map<String, Integer> listeDesGroupesPresents(noeud nFormation, String nameGroupe){
Map<String, Integer> dictionary = new HashMap<>();
for(noeud student : nFormation.getChildren()) {
String groupe = student.getAttributes(nameGroupe);
if(dictionary.containsKey(groupe)) {
int nombre = dictionary.get(groupe) + 1;
dictionary.put(groupe, nombre);
}else {
dictionary.put(groupe, 1);
}
}
return dictionary;
}
private static String retourneLeGroupeAvecLeMoinsEtudiant(noeud nFormation, String nameGroupe) {
String groupe = null;
int taille = 10000;
Map<String, Integer> TouslesGroupes = listeDesGroupesPresents(nFormation,nameGroupe);
for(Entry<String,Integer> entry : TouslesGroupes.entrySet()) {
if(entry.getValue()<taille) {
groupe = entry.getKey();
taille = entry.getValue();
}
}
return groupe;
}
/**
* Boite de dialogue personnalisable avec une image de danger.
* @return
*/
private static int showCustomDialog() {
String message = "<html>Quelques étudiants peuvent être déjà placés dans des groupes.<br>"
+ "Ces étudiants vont se retrouver dans d'autres groupes.<br>"
+ "Il serait peut-être préférable de verrouiller le groupe avant de poursuivre !<br><br>"
+ "<b>Cependant, voulez-vous poursuivre et placer tous les étudiants<br>dans des nouveaux groupes ?</b></html>";
String title = "Confirmation";
int optionType = JOptionPane.YES_NO_OPTION;
Icon icon = new ImageIcon(Window_demarre.class.getResource("/resources/Danger.png"));
return JOptionPane.showOptionDialog(null, message, title, optionType, JOptionPane.QUESTION_MESSAGE, icon, null, null);
}
}

View File

@ -92,6 +92,7 @@ public class Window_gestionnaire extends JFrame {
private JComboBox<String> cGroupePrincipal; private JComboBox<String> cGroupePrincipal;
private JComboBox<String> cGroupeProjet; private JComboBox<String> cGroupeProjet;
private JComboBox<String> cRegime; private JComboBox<String> cRegime;
private JCheckBoxMenuItem chckToutesLesColonnes = new JCheckBoxMenuItem("Affiche toutes les colonnes"); private JCheckBoxMenuItem chckToutesLesColonnes = new JCheckBoxMenuItem("Affiche toutes les colonnes");
private JCheckBoxMenuItem chckGroupeTD = new JCheckBoxMenuItem("Groupe TD"); private JCheckBoxMenuItem chckGroupeTD = new JCheckBoxMenuItem("Groupe TD");
private JCheckBoxMenuItem chckGroupeLV1 = new JCheckBoxMenuItem("Groupe LV1"); private JCheckBoxMenuItem chckGroupeLV1 = new JCheckBoxMenuItem("Groupe LV1");
@ -142,6 +143,7 @@ public class Window_gestionnaire extends JFrame {
List<String> prefereAffichage = new ArrayList<>(); List<String> prefereAffichage = new ArrayList<>();
Window_gestionnaire instance = null;
/** /**
@ -154,7 +156,7 @@ public class Window_gestionnaire extends JFrame {
commandes.nBase = recupeBases.recupeLaBase(); commandes.nBase = recupeBases.recupeLaBase();
} }
initialize(); initialize();
instance = this;
} }
@ -795,7 +797,6 @@ public class Window_gestionnaire extends JFrame {
chckVerouillage_Tous_Les_Groupes.setFont(new Font("Arial", Font.BOLD, 16)); chckVerouillage_Tous_Les_Groupes.setFont(new Font("Arial", Font.BOLD, 16));
menuGroupe.add(chckVerouillage_Tous_Les_Groupes); menuGroupe.add(chckVerouillage_Tous_Les_Groupes);
chckVerouillage_Tous_Les_Groupes.addItemListener(new ItemListener() { chckVerouillage_Tous_Les_Groupes.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) {
if(!ignoreItemStateChange) { if(!ignoreItemStateChange) {
@ -904,6 +905,20 @@ public class Window_gestionnaire extends JFrame {
}); });
JMenu menuGenerer_Groupe = new JMenu("Générer des groupes");
menuGenerer_Groupe.setFont(new Font("Arial", Font.BOLD, 16));
menuBar.add(menuGenerer_Groupe);
JMenuItem menuGroupe_Principal = new JMenuItem("Groupe Principal");
menuGroupe_Principal.setFont(new Font("Arial", Font.BOLD, 16));
menuGenerer_Groupe.add(menuGroupe_Principal);
menuGroupe_Principal.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Window_genere_groupe(nTable, "Groupe_Principal",instance);
}
});
JScrollPane scrollPaneFiltre = new JScrollPane(panelFiltre); JScrollPane scrollPaneFiltre = new JScrollPane(panelFiltre);

View File

@ -23,9 +23,9 @@ public class sauvegardeXMLBase {
/** /**
* Sauvegarde dans le répertoire base de l'application de la base de données. * Sauvegarde dans le répertoire base de l'application de la base de données.
* @param nBase : le noeud base de la base de données. * @param nBase : Le noeud base de la base de données.
* @param type : le type de massage. * @param type : Le type de message (SANS_MESSAGE, WITH_DEFAULT_MESSAGE, WITH_MESSAGE)
* @param message : le message de la sauvegarde. * @param message : Le message de la sauvegarde.
*/ */
public static void save(noeud nBase, saveType type, String message) { public static void save(noeud nBase, saveType type, String message) {

View File

@ -420,6 +420,12 @@ public class VersionChecker {
nFormation.setAttribut("Verouillage_Groupe_Documentation", "false"); nFormation.setAttribut("Verouillage_Groupe_Documentation", "false");
nFormation.setAttribut("Verouillage_Groupe_Projet", "false"); nFormation.setAttribut("Verouillage_Groupe_Projet", "false");
nFormation.setAttribut("Verouillage_Tous_Les_Groupes", "false"); nFormation.setAttribut("Verouillage_Tous_Les_Groupes", "false");
nFormation.setAttribut("pattern_Groupe_Principal", "grp @");
nFormation.setAttribut("nombre_Student_Groupe_Principal", "30");
nFormation.setAttribut("aleatoire_Groupe_Principal", "false");
} }
return nBase; return nBase;
} }

BIN
src/resources/Danger.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB