/*
* 10/21/2003 - 16:34:49
*
* AnalyseSave.java -
* Copyright (C) 2003 Dreux Loic
* dreuxl@free.fr
*
*
* Modifications :
* ---------------
* @author : Bruno Dabo <bruno.dabo@lywoonsoftware.com>
* @date : 2009 jan 23
* @Objet : Gérer la popup de demande de sauvegarde
*
* Mars 2009 : Début timide du multi-langue
*
* 2009-12-03 bug #489249 : @author Bruno Dabo <bruno.dabo@lywoonsoftware.com>
* 2009-12-03 bug #489249 : Extension "asi" lors de la sauvegarde
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.analyse.core.util.save;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import org.analyse.core.gui.AnalyseFrame;
import org.analyse.core.modules.AnalyseModule;
import org.analyse.core.save.FiltreASI;
import org.analyse.core.util.Constantes;
import org.analyse.core.util.GUIUtilities;
import org.analyse.core.util.Utilities;
import org.analyse.main.Main;
/**
* Cette class contient toute les méthodes pour gérer la sauvegarde des données :
* boite de dialogue, gestion des différents filtres de sauvegardes, ...
*/
public class AnalyseSave {
private static final String[] options = {
Utilities.getLangueMessage(Constantes.MESSAGE_OUI) ,
Utilities.getLangueMessage(Constantes.MESSAGE_NON),
Utilities.getLangueMessage( Constantes.MESSAGE_ANNULER)
};
private boolean isSave;
public boolean isSave() {
return isSave;
}
public void setSave(boolean isSave) {
this.isSave = isSave;
}
private String fileName;
private boolean newOption = false ;
private JFileChooser chooser;
private AnalyseFrame frame;
private List<FiltreASI> filtres;
public AnalyseSave(AnalyseFrame frame)
{
this.frame = frame;
this.setSave ( true ) ;
initFilter();
initFileChooser();
}
public int closeProgram()
{
return ( this.popupExit () ) ;
}
/**
* Sauvegarde les données dans un fichier, si le document a déjà été
* sauvegardé une fois, le nom du fichier ne change pas, sinon, la méthode
* saveAs est lancée.
*/
public void save() {
if ( this.fileName == null ) {
saveAs();
return;
}
if ( ! this.isSave () ) {
saveAs();
return;
}
this.setSave ( true );
AnalyseFilter af = getAnalyseFilter();
if (af != null && af.canSave()) {
// Bug #352415
File file = new File(this.fileName) ;
int sauvegarder = JOptionPane.YES_OPTION ;
if ( file.exists() ) {
sauvegarder = this.popupFichierExiste () ;
}
if ( sauvegarder == JOptionPane.YES_OPTION ) {
((Save) af).save( file );
msgSave ( Utilities.getLangueMessage( Constantes.MESSAGE_SAUVEGARDE_EFFECTUEE )) ;
frame.setTitle(Utilities.getRelease() + " - " + this.fileName);
}
}
}
/**
* Sauvegarde les données dans un nouveau fichier, si le nouveau fichier
* existe, celui-ci sera écrasé.
*/
public void saveAs() {
String fileName;
fileName = chooseFile( Constantes.SAVE );
if (fileName == null)
return;
this.setSave ( true );
AnalyseFilter af = getAnalyseFilter();
if (Utilities.getExtension(fileName).equals(""))
this.fileName = fileName + "." + af.getExtension();
else
this.fileName = fileName;
// Bug #352415
File file = new File(this.fileName) ;
int sauvegarder = JOptionPane.YES_OPTION ;
if ( file.exists() ) {
sauvegarder = this.popupFichierExiste () ;
}
if ( sauvegarder == JOptionPane.YES_OPTION ) {
((Save) af).save( file );
msgSave ( Utilities.getLangueMessage( Constantes.MESSAGE_SAUVEGARDE_EFFECTUEE ) ) ;
}
frame.setTitle(Utilities.getRelease() + " - " + this.fileName);
}
private void msgSave ( String msg ) {
GUIUtilities.messageHTML("<b style=\"color: blue;\">" + msg + "</b>", true, 300, 250);
}
/**
* Récupère les données depuis un fichier et les chargent dans l'application.
*/
public void open() {
int choix = this.popupSauvegarde () ;
if ( choix == JOptionPane.CANCEL_OPTION ) return ;
String fileName = null;
fileName = chooseFile(Constantes.OPEN);
open(fileName);
}
public void open(String fileName)
{
if (fileName == null)
return;
AnalyseModule mod;
for (Iterator<Entry<String, AnalyseModule>> e = Main.modules.entrySet().iterator(); e.hasNext();) {
mod = e.next().getValue();
mod.clear();
}
this.setSave ( true ) ;
this.fileName = fileName;
AnalyseFilter af = getAnalyseFilter();
if (af != null && af.canOpen())
((Open) af).open(new File(this.fileName));
frame.setTitle(Utilities.getRelease() + " - " + this.fileName);
}
private int popupExit () {
int choix ;
choix = GUIUtilities.question_YES_NO ( Utilities.getLangueMessage( Constantes.MESSAGE_FERMER_LOGICIEL )) ;
if ( choix == JOptionPane.NO_OPTION )
/*
* exprès pour la fonction appelante NO dans ce cas est équivalent à CANCEL
*/
choix = JOptionPane.CANCEL_OPTION ;
if ( choix == JOptionPane.YES_OPTION ) {
if ( this.fileName != null ) {
choix = GUIUtilities.question_YES_NO_CANCEL ( Utilities.getLangueMessage( Constantes.MESSAGE_SAUVEGARDER_FICHIER_ENCOURS) ) ;
if (choix == JOptionPane.YES_OPTION)
save();
}
}
return choix ;
}
private int popupSauvegarde () {
if ( this.fileName == null ) return JOptionPane.CLOSED_OPTION ;
int choix = GUIUtilities.question_YES_NO_CANCEL (Utilities.getLangueMessage( Constantes.MESSAGE_SAUVEGARDER_FICHIER_ENCOURS )) ;
if (choix == JOptionPane.YES_OPTION)
save();
return choix ;
}
private int popupFichierExiste () {
int choix = GUIUtilities.question_YES_NO ( Utilities.getLangueMessage( Constantes.MESSAGE_FICHIER_EXISTANT )) ;
return choix ;
}
/**
* Efface toutes les données précédentes. Propose de sauvegarder les données
* avant l'effacement.
*/
public void clear() {
if ( ! this.isNewOption() )
this.popupSauvegarde () ;
AnalyseModule mod;
for (Iterator<Entry<String, AnalyseModule>> e = Main.modules.entrySet().iterator(); e.hasNext();) {
mod = e.next().getValue();
mod.clear();
}
this.setSave ( false ) ;
frame.setTitle( Utilities.getRelease() + " - sans nom");
}
/**
* Initialise les filtres de sauvegardes.
*/
private void initFilter()
{
filtres = new ArrayList<FiltreASI>();
filtres.add(new FiltreASI());
}
/**
* Modifie les filtres selon le mode.
*/
private void initFileFilter(String mode)
{
AnalyseFilter af;
FileChooserFilter cf;
chooser.resetChoosableFileFilters();
for (Iterator<FiltreASI> e = filtres.iterator(); e.hasNext();) {
af = (AnalyseFilter) e.next();
if ( ( mode.equals ( Constantes.OPEN ) && af.canOpen() ) ||
( mode.equals ( Constantes.SAVE ) && af.canSave() ) ) {
cf = new FileChooserFilter(af.getID());
cf.setExtension(af.getExtension());
cf.setDescription(af.getDescription());
chooser.addChoosableFileFilter(cf);
}
}
}
/**
* Retourne l'objet <code>AnalyseFilter</code> correspondant à la
* description du FileChooserFilter courant.
*/
private AnalyseFilter getAnalyseFilter()
{
AnalyseFilter af;
String ext = Constantes.FILE_EXTENSION ; // bug #489240
String ID = "";
FileChooserFilter ff;
if (chooser.getFileFilter() instanceof FileChooserFilter) {
ff = (FileChooserFilter) (chooser.getFileFilter());
ID = ff.getID();
}
if (fileName != null)
ext = Utilities.getExtension(fileName);
for (Iterator<FiltreASI> e = filtres.iterator(); e.hasNext();) {
af = (AnalyseFilter) e.next();
if (af.getID().equals(ID) || af.getExtension().equals(ext))
return af;
}
return null;
}
/**
* Initialise la boite de dialogue <code>JFileChooser</code>.
*/
private void initFileChooser()
{
chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setFileHidingEnabled(true);
}
/**
* Retourne la boite de dialogue <code>JFileChooser</code>.
*
* @param mode
* paramètre indiquant le type de boite : ouverture ou
* sauvegarde.
*/
private JFileChooser getFileChooser(String mode)
{
initFileFilter(mode);
if ( mode.equals ( Constantes.SAVE ) || mode.equals ( Constantes.RAPPORT ) ) {
chooser.setDialogType(JFileChooser.SAVE_DIALOG);
} else {
chooser.setDialogType(JFileChooser.OPEN_DIALOG);
}
return chooser;
}
private String chooseFile(String mode)
{
JFileChooser chooser = getFileChooser(mode);
if (chooser.showDialog(org.analyse.main.Main.analyseFrame, null) == JFileChooser.APPROVE_OPTION) {
return chooser.getSelectedFile().getAbsolutePath();
}
return null;
}
public void setNewOption(boolean newOption) {
this.newOption = newOption;
}
public boolean isNewOption() {
return newOption;
}
}