From f72549f93a46ef9cb3c0125b216543fc3605d9f9 Mon Sep 17 00:00:00 2001 From: La Programmatrice Verde Date: Wed, 3 Dec 2025 23:56:28 +0100 Subject: [PATCH] GlobalGUI + FinestraInserisciAlunno --- .../FinestraInserisciAlunno.java | 148 +++++++++++++++- src/gradeanalyzer/FinestraPrincipale.java | 50 +++--- src/gradeanalyzer/GlobalGUI.java | 46 +++++ src/gradeanalyzer/GradeAnalyzer.java | 167 +++++++++--------- src/gradeanalyzer/RecoloredTheme.java | 13 -- 5 files changed, 296 insertions(+), 128 deletions(-) delete mode 100644 src/gradeanalyzer/RecoloredTheme.java diff --git a/src/gradeanalyzer/FinestraInserisciAlunno.java b/src/gradeanalyzer/FinestraInserisciAlunno.java index 1b0964f..00428a8 100644 --- a/src/gradeanalyzer/FinestraInserisciAlunno.java +++ b/src/gradeanalyzer/FinestraInserisciAlunno.java @@ -4,10 +4,156 @@ */ package gradeanalyzer; +import java.util.ArrayList; + +import com.googlecode.lanterna.graphics.SimpleTheme; +import com.googlecode.lanterna.graphics.Theme; +import com.googlecode.lanterna.gui2.BasicWindow; +import com.googlecode.lanterna.gui2.Button; +import com.googlecode.lanterna.gui2.EmptySpace; +import com.googlecode.lanterna.gui2.GridLayout; +import com.googlecode.lanterna.gui2.Label; +import com.googlecode.lanterna.gui2.Panel; +import com.googlecode.lanterna.gui2.TextBox; +import com.googlecode.lanterna.gui2.Window; +import com.googlecode.lanterna.gui2.dialogs.MessageDialog; +import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton; + /** * * @author Verde */ -public class FinestraInserisciAlunno { +public class FinestraInserisciAlunno extends BasicWindow { + public FinestraInserisciAlunno() { + super("Inserisci alunno"); + ArrayList windowHints = new ArrayList<>(); + windowHints.add(Window.Hint.CENTERED); + this.setHints(windowHints); + + Panel contenutoFinestra = new Panel(new GridLayout(2)); + TextBox campoNome = new TextBox(); + TextBox campoCognome = new TextBox(); + TextBox campoVoto = new TextBox(); + + contenutoFinestra.addComponent(new Label("Nome: ")); + contenutoFinestra.addComponent( + campoNome + .setLayoutData( + GridLayout.createLayoutData(GridLayout.Alignment.BEGINNING, + GridLayout.Alignment.CENTER))); + + contenutoFinestra.addComponent(new EmptySpace()); + contenutoFinestra.addComponent(new EmptySpace()); + + contenutoFinestra.addComponent(new Label("Cognome: ")); + contenutoFinestra.addComponent( + campoCognome + .setLayoutData( + GridLayout.createLayoutData(GridLayout.Alignment.BEGINNING, + GridLayout.Alignment.CENTER))); + + contenutoFinestra.addComponent(new EmptySpace()); + contenutoFinestra.addComponent(new EmptySpace()); + + contenutoFinestra.addComponent(new Label("Voto: ")); + contenutoFinestra.addComponent( + campoVoto + .setLayoutData( + GridLayout.createLayoutData(GridLayout.Alignment.BEGINNING, + GridLayout.Alignment.CENTER))); + + contenutoFinestra.addComponent(new EmptySpace()); + contenutoFinestra.addComponent(new EmptySpace()); + + contenutoFinestra.addComponent(new Button("Conferma", () -> { + // imposta gli stati + GradeAnalyzer.isSaved = false; + GradeAnalyzer.isEmpty = false; + double voto = -1; + + boolean validitaCampoNome = !campoNome.getText().isBlank() && !campoNome.getText().isEmpty(); + boolean validitaCampoCognome = !campoCognome.getText().isBlank() && !campoCognome.getText().isEmpty(); + boolean validitaCampoVoto = !campoVoto.getText().isBlank() && !campoVoto.getText().isEmpty(); + + if (!validitaCampoNome) { + GlobalGUI.showErrorMessage("Il nome non può essere vuoto."); + } + + if (!validitaCampoCognome) { + GlobalGUI.showErrorMessage("Il cognome non può essere vuoto."); + } + + if (!validitaCampoVoto) { + GlobalGUI.showErrorMessage("Il voto non può essere vuoto."); + } else { + voto = voto(campoVoto.getText()); + } + + if (voto != -1 && validitaCampoNome && validitaCampoCognome) { + inserisciDati(campoNome.getText().trim(), campoCognome.getText().trim(), + voto); + + this.close(); + } + })); + contenutoFinestra.addComponent(new Button("Indietro", this::close)); + + this.setComponent(contenutoFinestra); + } + + private static boolean inserisciDati(String nome, String cognome, double voto) { + int posizione; + boolean notUpdated = false; + + if ((posizione = exists(nome, cognome, GradeAnalyzer.valutazioni)) != -1) { + boolean scelta = GlobalGUI.showBooleanWarningMessage("Lo studente esiste già.\n\nAggiornarne i dati?"); + + if (scelta) { + GradeAnalyzer.valutazioni.get(posizione).setVoto(voto); + + GlobalGUI.showNoteMessage("Studente aggiunto correttamente."); + + } else { + GlobalGUI.showNoteMessage("Lo studente non è stato aggiornato."); + notUpdated = true; + } + } else { + GradeAnalyzer.valutazioni.add(new Valutazione(nome, cognome, voto)); + + GlobalGUI.showNoteMessage("Studente aggiunto correttamente."); + } + + GlobalGUI.salvaValutazioni(); + + return notUpdated; + } + + private static double voto(String votoStringa) { + double voto = -1; + final double VOTO_MINIMO = 1; + final double VOTO_MASSIMO = 10; + + if (Math.round((Double.parseDouble(votoStringa) * 10) / 10) < VOTO_MINIMO + || Math.round((Double.parseDouble(votoStringa) * 10) / 10) > VOTO_MASSIMO) { + GlobalGUI.showErrorMessage("Il voto deve essere compreso tra " + VOTO_MINIMO + " e " + VOTO_MASSIMO + "."); + } else { + voto = Math.round((Double.parseDouble(votoStringa) * 10) / 10); + } + + return voto; + } + + private static int exists(String nome, String cognome, ArrayList valutazioni) { + boolean exit = false; + int posizione = -1; + for (int i = 0; i < valutazioni.size() && !exit; i++) { + if (nome.equalsIgnoreCase(valutazioni.get(i).getNome()) + && cognome.equalsIgnoreCase(valutazioni.get(i).getCognome())) { + posizione = i; + exit = true; + } + } + return posizione; + } } \ No newline at end of file diff --git a/src/gradeanalyzer/FinestraPrincipale.java b/src/gradeanalyzer/FinestraPrincipale.java index adc00d2..73d9982 100644 --- a/src/gradeanalyzer/FinestraPrincipale.java +++ b/src/gradeanalyzer/FinestraPrincipale.java @@ -9,50 +9,46 @@ import java.util.ArrayList; import com.googlecode.lanterna.gui2.BasicWindow; import com.googlecode.lanterna.gui2.Button; import com.googlecode.lanterna.gui2.Direction; +import com.googlecode.lanterna.gui2.EmptySpace; import com.googlecode.lanterna.gui2.Label; import com.googlecode.lanterna.gui2.LinearLayout; -import com.googlecode.lanterna.gui2.MultiWindowTextGUI; import com.googlecode.lanterna.gui2.Panel; import com.googlecode.lanterna.gui2.Window; -import com.googlecode.lanterna.gui2.WindowBasedTextGUI; import com.googlecode.lanterna.gui2.menu.MenuItem; /** * * @author Verde */ -public class FinestraPrincipale extends BasicWindow{ - public FinestraPrincipale(WindowBasedTextGUI gui) { +public class FinestraPrincipale extends BasicWindow { + public FinestraPrincipale() { - super("Selezionare una delle seguenti opzioni:"); - ArrayList windowHints = new ArrayList<>(); - windowHints.add(Window.Hint.CENTERED); - this.setHints(windowHints); + super("Selezionare una delle seguenti opzioni:"); + ArrayList windowHints = new ArrayList<>(); + windowHints.add(Window.Hint.CENTERED); + this.setHints(windowHints); - Panel contenutoFinestra = new Panel(new LinearLayout(Direction.VERTICAL)); - - contenutoFinestra.addComponent(new MenuItem("Inserisci dati alunno", () -> - new BasicWindow("KEK") - )); - contenutoFinestra.addComponent(new MenuItem("Trova voto più alto e più basso", () -> - openWindow(gui, "Trova voto più alto e più basso", "Questa è la finestra.") - )); - contenutoFinestra.addComponent(new MenuItem("Promossi", () -> - openWindow(gui, "Promossi", "Questa è la finestra.") - )); - contenutoFinestra.addComponent(new Button("Esci", () -> System.exit(0))); - - this.setComponent(contenutoFinestra); - - + Panel contenutoFinestra = new Panel(new LinearLayout(Direction.VERTICAL)); + + contenutoFinestra.addComponent(new MenuItem("Inserisci dati alunno", + () -> GlobalGUI.getGui().addWindowAndWait(new FinestraInserisciAlunno()))); + contenutoFinestra.addComponent(new MenuItem("Trova voto più alto e più basso", + () -> openWindow("Trova voto più alto e più basso", "Questa è la finestra."))); + contenutoFinestra.addComponent(new MenuItem("Promossi", () -> openWindow("Promossi", "Questa è la finestra."))); + + contenutoFinestra.addComponent(new EmptySpace()); + + contenutoFinestra.addComponent(new Button("Esci", () -> System.exit(0))); + + this.setComponent(contenutoFinestra); // Contenuto della finestra principale - //contenutoFinestra.addComponent(new EmptySpace()); // Margine + // contenutoFinestra.addComponent(new EmptySpace()); // Margine this.setComponent(contenutoFinestra); } - private static void openWindow(WindowBasedTextGUI gui, String title, String text) { + private static void openWindow(String title, String text) { BasicWindow window = new BasicWindow(title); Panel panel = new Panel(new LinearLayout(Direction.VERTICAL)); @@ -61,6 +57,6 @@ public class FinestraPrincipale extends BasicWindow{ window.setComponent(panel); - gui.addWindow(window); + GlobalGUI.getGui().addWindow(window); } } \ No newline at end of file diff --git a/src/gradeanalyzer/GlobalGUI.java b/src/gradeanalyzer/GlobalGUI.java index c3efe22..0db8059 100644 --- a/src/gradeanalyzer/GlobalGUI.java +++ b/src/gradeanalyzer/GlobalGUI.java @@ -4,10 +4,56 @@ */ package gradeanalyzer; +import com.googlecode.lanterna.gui2.WindowBasedTextGUI; +import com.googlecode.lanterna.gui2.dialogs.MessageDialog; +import com.googlecode.lanterna.gui2.dialogs.MessageDialogButton; + /** * * @author Verde */ public class GlobalGUI { + private static WindowBasedTextGUI gui; + + public static void setGui(WindowBasedTextGUI g) { + gui = g; + } + + public static WindowBasedTextGUI getGui() { + return gui; + } + + public static void showErrorMessage(String message) { + MessageDialog.showMessageDialog(GlobalGUI.getGui(), "Errore", + message, + MessageDialogButton.OK); + } + + public static void showNoteMessage(String message) { + MessageDialog.showMessageDialog(GlobalGUI.getGui(), "Nota", + message, + MessageDialogButton.OK); + } + + public static boolean showBooleanWarningMessage(String message) { + return MessageDialog.showMessageDialog( + GlobalGUI.getGui(), + "Attenzione", + message, + MessageDialogButton.Yes, + MessageDialogButton.No) == MessageDialogButton.Yes; + } + + public static void salvaValutazioni() { + boolean scelta = GlobalGUI.showBooleanWarningMessage("Salvare i dati?"); + + if (scelta) { + GradeAnalyzer.salva(GradeAnalyzer.valutazioni, GradeAnalyzer.PATH_VOTI); + GradeAnalyzer.valutazioni = GradeAnalyzer.valutazioniDaFile(); + GradeAnalyzer.isSaved = true; + } else { + GlobalGUI.showNoteMessage("I dati non sono stati salvati."); + } + } } \ No newline at end of file diff --git a/src/gradeanalyzer/GradeAnalyzer.java b/src/gradeanalyzer/GradeAnalyzer.java index a4b4dce..2a79820 100644 --- a/src/gradeanalyzer/GradeAnalyzer.java +++ b/src/gradeanalyzer/GradeAnalyzer.java @@ -14,20 +14,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; -import com.googlecode.lanterna.TerminalPosition; -import com.googlecode.lanterna.gui2.BasicWindow; -import com.googlecode.lanterna.gui2.Button; -import com.googlecode.lanterna.gui2.Direction; -import com.googlecode.lanterna.gui2.EmptySpace; -import com.googlecode.lanterna.gui2.Label; -import com.googlecode.lanterna.gui2.LinearLayout; import com.googlecode.lanterna.gui2.MultiWindowTextGUI; -import com.googlecode.lanterna.gui2.Panel; -import com.googlecode.lanterna.gui2.Window; import com.googlecode.lanterna.gui2.WindowBasedTextGUI; -import com.googlecode.lanterna.gui2.menu.MenuBar; -import com.googlecode.lanterna.gui2.menu.MenuItem; -import com.googlecode.lanterna.gui2.menu.Menu; import com.googlecode.lanterna.screen.Screen; import com.googlecode.lanterna.screen.TerminalScreen; import com.googlecode.lanterna.terminal.DefaultTerminalFactory; @@ -51,88 +39,90 @@ public class GradeAnalyzer { static boolean isEmpty = true; /* - public static void main(String[] args) { - int scelta = -1; - - do { - System.out.println("Scegliere un'opzione:"); - System.out.println("1. Inserisci dati alunno"); - System.out.println("2. Trova voto più alto e più basso"); - System.out.println("3. Promossi"); - System.out.println("0. Esci"); - System.out.print("Opzione: "); - - try { - scelta = sc.nextInt(); - sc.nextLine(); - - switch (scelta) { - case 0: - break; - case 1: - isSaved = false; - isEmpty = false; - inserisciDati(); - System.out.println("Studente aggiunto correttamente."); - pausa(); - break; - case 2: - if (isEmpty) { - System.out.println( - "Errore: inserire almeno la valutazione di uno studente prima di proseguire."); - } else { - if (!isSaved) { - System.out.println("Attenzione: ci sono dati non salvati."); - salvaValutazioni(); - } - trovaMigliorePeggiore(); - } - pausa(); - break; - case 3: - if (isEmpty) { - System.out.println( - "Errore: inserire almeno la valutazione di uno studente prima di proseguire."); - } else { - if (!isSaved) { - System.out.println("Attenzione: ci sono dati non salvati."); - System.out.println("Verranno salvati automaticamente."); - salva(valutazioni, PATH_VOTI); - valutazioni = valutazioniDaFile(); - isSaved = true; - } - promossi(); - } - pausa(); - break; - default: - System.out.println(ERRORE_GENERICO); - pausa(); - break; - } - } catch (InputMismatchException _) { - System.out.println("Errore: scelta non valida."); - pausa(); - } - } while (scelta != 0); - } - */ + * public static void main(String[] args) { + * int scelta = -1; + * + * do { + * System.out.println("Scegliere un'opzione:"); + * System.out.println("1. Inserisci dati alunno"); + * System.out.println("2. Trova voto più alto e più basso"); + * System.out.println("3. Promossi"); + * System.out.println("0. Esci"); + * System.out.print("Opzione: "); + * + * try { + * scelta = sc.nextInt(); + * sc.nextLine(); + * + * switch (scelta) { + * case 0: + * break; + * case 1: + * isSaved = false; + * isEmpty = false; + * inserisciDati(); + * System.out.println("Studente aggiunto correttamente."); + * pausa(); + * break; + * case 2: + * if (isEmpty) { + * System.out.println( + * "Errore: inserire almeno la valutazione di uno studente prima di proseguire." + * ); + * } else { + * if (!isSaved) { + * System.out.println("Attenzione: ci sono dati non salvati."); + * salvaValutazioni(); + * } + * trovaMigliorePeggiore(); + * } + * pausa(); + * break; + * case 3: + * if (isEmpty) { + * System.out.println( + * "Errore: inserire almeno la valutazione di uno studente prima di proseguire." + * ); + * } else { + * if (!isSaved) { + * System.out.println("Attenzione: ci sono dati non salvati."); + * System.out.println("Verranno salvati automaticamente."); + * salva(valutazioni, PATH_VOTI); + * valutazioni = valutazioniDaFile(); + * isSaved = true; + * } + * promossi(); + * } + * pausa(); + * break; + * default: + * System.out.println(ERRORE_GENERICO); + * pausa(); + * break; + * } + * } catch (InputMismatchException _) { + * System.out.println("Errore: scelta non valida."); + * pausa(); + * } + * } while (scelta != 0); + * } + */ public static void main(String[] args) { try (Screen schermo = new TerminalScreen(new DefaultTerminalFactory().createTerminal())) { - schermo.startScreen(); //crea terminale, inserisci CRT e dai corrente - final WindowBasedTextGUI gui = new MultiWindowTextGUI(schermo); //crea interfaccia con le finestre + schermo.startScreen(); // crea terminale, inserisci CRT e dai corrente + final WindowBasedTextGUI gui = new MultiWindowTextGUI(schermo); // crea interfaccia con le finestre + GlobalGUI.setGui(gui); - gui.addWindowAndWait(new FinestraPrincipale(gui)); + gui.addWindowAndWait(new FinestraPrincipale()); - } - catch (IOException e) { + } catch (IOException e) { System.out.println("Qualcosa è andato storto nella creazione dell'interfaccia."); System.out.println(e.getMessage()); e.printStackTrace(); } } - + public static void pausa() { System.out.println("Premere un tasto per continuare. . ."); sc.nextLine(); @@ -281,7 +271,8 @@ public class GradeAnalyzer { } while (!exit); } - static void salva(ArrayList valutazioni, String path) { + static String salva(ArrayList valutazioni, String path) { + String messaggio = null; try (BufferedWriter bw = new BufferedWriter(new FileWriter(path))) { StringBuilder sb = new StringBuilder(); for (Valutazione valutazione : valutazioni) { @@ -294,10 +285,12 @@ public class GradeAnalyzer { } bw.write(sb.toString()); - System.out.println("Dati salvati correttamente."); + messaggio = "Dati salvati correttamente."; } catch (IOException e) { - System.out.println("Errore nella scrittura del file: " + e.getMessage()); + messaggio = "Errore nella scrittura del file: " + e.getMessage(); } + + return messaggio; } static void trovaMigliorePeggiore() { diff --git a/src/gradeanalyzer/RecoloredTheme.java b/src/gradeanalyzer/RecoloredTheme.java deleted file mode 100644 index ee7d926..0000000 --- a/src/gradeanalyzer/RecoloredTheme.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template - */ -package gradeanalyzer; - -/** - * - * @author Verde - */ -public class RecoloredTheme { - -} \ No newline at end of file