diff --git a/asset/test1.pif b/asset/test1.pif new file mode 100644 index 0000000..6b2d0c1 Binary files /dev/null and b/asset/test1.pif differ diff --git a/pifConverter.jar b/pifConverter.jar new file mode 100644 index 0000000..f46c2eb Binary files /dev/null and b/pifConverter.jar differ diff --git a/src/fr/iutfbleau/sae/ConverterController.java b/src/fr/iutfbleau/sae/ConverterController.java index 46b9aa8..611dea4 100644 --- a/src/fr/iutfbleau/sae/ConverterController.java +++ b/src/fr/iutfbleau/sae/ConverterController.java @@ -3,7 +3,6 @@ import fr.iutfbleau.sae.mhuffman.*; import fr.iutfbleau.sae.mpif.PIFWriter; import fr.iutfbleau.sae.mpif.Pixel; import fr.iutfbleau.sae.mpif.RGBImage; - import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -185,30 +184,74 @@ public class ConverterController { /** * Gere la sauvegarde via le bouton de l'interface. - * Si un chemin de sortie est defini, sauvegarde directement. + * Si un chemin de sortie est defini, sauvegarde directement vers ce chemin. * Sinon, ouvre un selecteur de fichier pour que l'utilisateur choisisse * l'emplacement de sauvegarde. * La sauvegarde est effectuee dans un thread separe pour ne pas bloquer * l'interface graphique. */ public void saveViaBtn() { - if (outputPath != null) { - saveAsPIF(outputPath); - GestionErreur.afficherInfo("Fichier sauvegarde avec succes. Chemin : " + outputPath); - return; - } + File fichierSortie; + + // pas de chemin fourni, ouvrir JFileChooser + if (outputPath == null) { + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle("Enregistrer le fichier .pif"); - // Sinon JFileChooser - JFileChooser chooser = new JFileChooser(); - chooser.setDialogTitle("Enregistrer le fichier .pif"); - - if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { - File fichierSelectionne = chooser.getSelectedFile(); - ThreadSauvegardePIF thread = new ThreadSauvegardePIF(this, fichierSelectionne); + if (chooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + fichierSortie = chooser.getSelectedFile(); + + // Verifier et corriger l'extension + fichierSortie = verifierExtensionPIF(fichierSortie); + + ThreadSauvegardePIF thread = new ThreadSauvegardePIF(this, fichierSortie); + thread.start(); + } + } + // chemin fourni, sauvegarder directement + else { + fichierSortie = new File(outputPath); + + // Verifier et corriger l'extension + fichierSortie = verifierExtensionPIF(fichierSortie); + + ThreadSauvegardePIF thread = new ThreadSauvegardePIF(this, fichierSortie); thread.start(); + + // Je retire le bouton apres le clic + fen.removeSaveButton(); } } + /** + * Verifie et corrige l'extension du fichier pour qu'elle soit .pif en minuscules. + * Si le fichier a une extension .PIF en majuscules, elle est remplacee. + * Si le fichier n'a pas d'extension .pif, elle est ajoutee. + * + * @param fichier le fichier a verifier + * @return le fichier avec l'extension .pif correcte + */ + private File verifierExtensionPIF(File fichier) { + String chemin = fichier.getAbsolutePath(); + String cheminMinuscule = chemin.toLowerCase(); + + // Si le fichier se termine par .pif (en minuscules), OK + if (chemin.endsWith(".pif")) { + return fichier; + } + + // Si le fichier se termine par .PIF, .Pif, etc., remplacer par .pif + if (cheminMinuscule.endsWith(".pif")) { + // Enlever les 4 derniers caracteres (.PIF, .Pif, etc.) + chemin = chemin.substring(0, chemin.length() - 4); + // Ajouter .pif en minuscules + return new File(chemin + ".pif"); + } + + // Sinon, ajouter .pif + return new File(chemin + ".pif"); + } + /** * Lance le processus complet de conversion d'une image au format PIF. * Etapes : @@ -247,14 +290,7 @@ public class ConverterController { computeHuffman(); computeCanonical(); - // Sauvegarder : si un second argument est donne, sauvegarde automatique - if (this.outputPath != null) { - this.saveAsPIF(this.outputPath); - GestionErreur.afficherInfo("Fichier sauvegarde automatiquement : " + this.outputPath); - } else { - // Pas de deuxieme argument : ajouter un bouton pour choisir avec un JFileChooser - fen.addSaveButton(this); - } + fen.addSaveButton(this); } /** diff --git a/src/fr/iutfbleau/sae/ConverterWindow.java b/src/fr/iutfbleau/sae/ConverterWindow.java index 96e535c..11c7eb3 100644 --- a/src/fr/iutfbleau/sae/ConverterWindow.java +++ b/src/fr/iutfbleau/sae/ConverterWindow.java @@ -16,6 +16,7 @@ public class ConverterWindow extends JFrame { private ImagePreviewPanel imagePreviewPanel; private FrequencyTablePanel frequencyTablePanel; private CodeTablePanel codeTablePanel; + private JPanel bottomPanel; /** * Constructeur de la fenĂȘtre du convertisseur. @@ -109,7 +110,7 @@ public class ConverterWindow extends JFrame { ExportButtonListener listener = new ExportButtonListener(controller); saveBtn.addActionListener(listener); - JPanel bottomPanel = new JPanel(); + this.bottomPanel = new JPanel(); bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); bottomPanel.add(saveBtn); @@ -118,4 +119,17 @@ public class ConverterWindow extends JFrame { revalidate(); repaint(); } + +/** + * Retire le bouton d'export apres la sauvegarde. + * Utilise dans le cas ou un chemin de sortie est fourni en argument. + */ + public void removeSaveButton() { + if (bottomPanel != null) { + remove(bottomPanel); + bottomPanel = null; + revalidate(); + repaint(); + } + } } diff --git a/src/fr/iutfbleau/sae/ThreadSauvegardePIF.java b/src/fr/iutfbleau/sae/ThreadSauvegardePIF.java index c852009..797e9a5 100644 --- a/src/fr/iutfbleau/sae/ThreadSauvegardePIF.java +++ b/src/fr/iutfbleau/sae/ThreadSauvegardePIF.java @@ -1,15 +1,19 @@ package fr.iutfbleau.sae; - +import java.awt.BorderLayout; import java.io.File; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JProgressBar; /** * Thread pour sauvegarder un fichier PIF en arriere-plan. * Permet d'eviter de bloquer l'interface graphique pendant la sauvegarde. + * Affiche un dialogue de progression pendant la sauvegarde. */ public class ThreadSauvegardePIF extends Thread { - private final ConverterController controleur; - private final File fichier; + private ConverterController controleur; + private File fichier; /** * Construit un nouveau thread de sauvegarde. @@ -24,13 +28,36 @@ public class ThreadSauvegardePIF extends Thread { /** * Execute la sauvegarde du fichier PIF. + * Affiche un dialogue de progression pendant la sauvegarde. */ @Override public void run() { + // Creer le dialogue de progression + JDialog dialogue = new JDialog(); + dialogue.setTitle("Sauvegarde"); + dialogue.setModal(false); + dialogue.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); + dialogue.setSize(300, 100); + dialogue.setLocationRelativeTo(null); + dialogue.setLayout(new BorderLayout(10, 10)); + + JLabel label = new JLabel("Sauvegarde en cours...", JLabel.CENTER); + dialogue.add(label, BorderLayout.CENTER); + + JProgressBar barre = new JProgressBar(); + barre.setIndeterminate(true); + dialogue.add(barre, BorderLayout.SOUTH); + + dialogue.setVisible(true); + try { + // Sauvegarder le fichier controleur.saveAsPIF(fichier.getAbsolutePath()); + dialogue.dispose(); GestionErreur.afficherInfo("Fichier sauvegarde avec succes : " + fichier.getName()); + } catch (Exception e) { + dialogue.dispose(); GestionErreur.afficherErreur("Erreur lors de la sauvegarde : " + e.getMessage()); } }