Logo Search packages:      
Sourcecode: cdk version File versions

SaveAsAction.java

/*
 *  $RCSfile$
 *  $Author: egonw $
 *  $Date: 2007-05-01 21:15:34 +0200 (Tue, 01 May 2007) $
 *  $Revision: 8292 $
 *
 *  Copyright (C) 1997-2007  The JChemPaint project
 *
 *  Contact: jchempaint-devel@lists.sourceforge.net
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1
 *  of the License, or (at your option) any later version.
 *  All we ask is that proper credit is given for our work, which includes
 *  - but is not limited to - adding the above copyright notice to the beginning
 *  of your source code files, and to any copyright notice that you may distribute
 *  with programs based on this work.
 *
 *  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 Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 */
package org.openscience.cdk.applications.jchempaint.action;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.lang.reflect.Constructor;
import java.util.Iterator;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;

import org.openscience.cdk.Reaction;
import org.openscience.cdk.applications.jchempaint.JCPPropertyHandler;
import org.openscience.cdk.applications.jchempaint.JChemPaintModel;
import org.openscience.cdk.applications.jchempaint.JChemPaintPanel;
import org.openscience.cdk.applications.jchempaint.io.IJCPFileFilter;
import org.openscience.cdk.applications.jchempaint.io.JCPFileView;
import org.openscience.cdk.applications.jchempaint.io.JCPSaveFileFilter;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IChemModel;
import org.openscience.cdk.interfaces.IChemObject;
import org.openscience.cdk.io.CDKSourceCodeWriter;
import org.openscience.cdk.io.IChemObjectWriter;
import org.openscience.cdk.io.MDLWriter;
import org.openscience.cdk.io.SMILESWriter;
import org.openscience.cdk.io.SVGWriter;
import org.openscience.cdk.io.listener.SwingGUIListener;
import org.openscience.cdk.tools.manipulator.ChemModelManipulator;

/**
 * Opens a "Save as" dialog
 *
 * @cdk.module jchempaint
 * @author     steinbeck
 */
00068 public class SaveAsAction extends JCPAction
{

    private static final long serialVersionUID = -5138502232232716970L;
    
    protected IChemObjectWriter cow;
00074     protected static String type = null;
    private FileFilter currentFilter = null;


      /**
       *  Constructor for the SaveAsAction object
       */
00081       public SaveAsAction()
      {
            super();
      }

      /**
       *  Constructor for the SaveAsAction object
       *
       *@param  jcpPanel       Description of the Parameter
       *@param  isPopupAction  Description of the Parameter
       */
00092   public SaveAsAction(JChemPaintPanel jcpPanel, boolean isPopupAction)
      {
            super(jcpPanel, "", isPopupAction);
      }


      /**
       *  Opens a dialog frame and manages the saving of a file.
       *
       *@param  event  Description of the Parameter
       */
00103       public void actionPerformed(ActionEvent event)
      {

            JChemPaintModel jcpm = jcpPanel.getJChemPaintModel();
            if (jcpm == null)
            {
                  String error = "Nothing to save.";
                  JOptionPane.showMessageDialog(jcpPanel, error);
            } else
            {
                  saveAs(event);
            }
      }

      protected void saveAs(ActionEvent event)
      {
            int ready=1;
            while(ready==1){
                  JChemPaintModel jcpm = jcpPanel.getJChemPaintModel();
                  JFileChooser chooser = new JFileChooser();
                  chooser.setCurrentDirectory(jcpPanel.getCurrentWorkDirectory());
                  JCPSaveFileFilter.addChoosableFileFilters(chooser);
                  if (jcpPanel.getCurrentSaveFileFilter() != null)
                  {
                        // XXX needs fixing
                        // chooser.setFileFilter(jcpPanel.getCurrentSaveFileFilter());
                  }
                  if (currentFilter != null)
                  {
                        chooser.setFileFilter(currentFilter);
                  }
                  chooser.setFileView(new JCPFileView());
      
                  int returnVal = chooser.showSaveDialog(jcpPanel);
                  
                  IChemObject object = getSource(event);
                  currentFilter = chooser.getFileFilter();
                  if(returnVal==JFileChooser.CANCEL_OPTION)
                        ready=0;
                  if (returnVal == JFileChooser.APPROVE_OPTION)
                  {
                        type = ((IJCPFileFilter) currentFilter).getType();
                        File outFile = chooser.getSelectedFile();
                        if(outFile.exists()){
                              ready=JOptionPane.showConfirmDialog((Component)null,"File "+outFile.getName()+" already exists. Do you want to overwrite it?","File already exists",JOptionPane.YES_NO_OPTION);
                        }else{
                              ready=0;
                        }
                        if(ready==0){
                              
                              IChemModel model = (IChemModel) jcpm.getChemModel();
                              if (object == null)
                              {
                                    // called from main menu
                                    try
                                    {
                                          if (type.equals(JCPSaveFileFilter.mol))
                                          {
                                                saveAsMol(model, outFile);
                                          } else if (type.equals(JCPSaveFileFilter.cml))
                                          {
                                                saveAsCML2(model, outFile);
                                          } else if (type.equals(JCPSaveFileFilter.smiles))
                                          {
                                                saveAsSMILES(model, outFile);
                                          } else if (type.equals(JCPSaveFileFilter.svg))
                                          {
                                                saveAsSVG(model, outFile);
                                          } else if (type.equals(JCPSaveFileFilter.cdk))
                                          {
                                                saveAsCDKSourceCode(model, outFile);
                                          } else
                                          {
                                                String error = "Cannot save file in this format: " + type;
                                                logger.error(error);
                                                JOptionPane.showMessageDialog(jcpPanel, error);
                                                return;
                                          }
                                          jcpm.resetIsModified();
                                    } catch (Exception exc)
                                    {
                                          String error = "Error while writing file: " + exc.getMessage();
                                          logger.error(error);
                                          logger.debug(exc);
                                          JOptionPane.showMessageDialog(jcpPanel, error);
                                    }
            
                              } else if (object instanceof Reaction)
                              {
                                    try
                                    {
                                          if (type.equals(JCPSaveFileFilter.cml))
                                          {
                                                saveAsCML2(object, outFile);
                                          } else
                                          {
                                                String error = "Cannot save reaction in this format: " + type;
                                                logger.error(error);
                                                JOptionPane.showMessageDialog(jcpPanel, error);
                                          }
                                    } catch (Exception exc)
                                    {
                                          String error = "Error while writing file: " + exc.getMessage();
                                          logger.error(error);
                                          logger.debug(exc);
                                          JOptionPane.showMessageDialog(jcpPanel, error);
                                    }
                              }
                              jcpPanel.setCurrentWorkDirectory(chooser.getCurrentDirectory());
                              jcpPanel.setCurrentSaveFileFilter(chooser.getFileFilter());
                              jcpPanel.setIsAlreadyAFile(outFile);
                              jcpPanel.getJChemPaintModel().setTitle(outFile.getName());
                              ((JFrame)jcpPanel.getParent().getParent().getParent().getParent()).setTitle(outFile.getName());
                        }
                  }
            }
      }

    private boolean askIOSettings() {
        return JCPPropertyHandler.getInstance().getJCPProperties()
            .getProperty("askForIOSettings", "true").equals("true");
    }
    
      protected void saveAsMol(IChemModel model, File outFile) throws Exception
      {
            logger.info("Saving the contents in a MDL molfile file...");
        String fileName = outFile.toString();
        if (!fileName.endsWith(".mol")) {
            fileName += ".mol";
            outFile = new File(fileName);
        }
        outFile=new File(fileName);
        cow = new MDLWriter(new FileWriter(outFile));
            if (cow != null && askIOSettings())
            {
                  cow.addChemObjectIOListener(new SwingGUIListener(jcpPanel, 4));
            }
            org.openscience.cdk.interfaces.IMoleculeSet som = model.getMoleculeSet();
            cow.write(som);
            cow.close();
      }

      protected void saveAsCML2(IChemObject object, File outFile) throws Exception
      {
            if(Float.parseFloat(System.getProperty("java.specification.version"))<1.5){
                  JOptionPane.showMessageDialog(null,"For saving as CML you need Java 1.5 or higher!");
                  return;
            }
            logger.info("Saving the contents in a CML 2.0 file...");
        String fileName = outFile.toString();
        if (!fileName.endsWith(".cml")) {
            fileName += ".cml";
            outFile = new File(fileName);
        }
        FileWriter sw = new FileWriter(outFile);
        Class cmlWriterClass = this.getClass().getClassLoader().loadClass("org.openscience.cdk.io.CMLWriter");

        if (cmlWriterClass != null) {
            cow = (IChemObjectWriter)cmlWriterClass.newInstance();
            Constructor constructor = cow.getClass().getConstructor(new Class[]{Writer.class});
            cow = (IChemObjectWriter)constructor.newInstance(new Object[]{sw});
        } else {
            // provide a fail save for JChemPaint builds for Java 1.4
            cow = new MDLWriter(sw);
        }
            if (cow != null && askIOSettings())
            {
                  cow.addChemObjectIOListener(new SwingGUIListener(jcpPanel, 4));
            }
            cow.write(object);
            cow.close();
            sw.close();
      }

      protected void saveAsSMILES(IChemModel model, File outFile) throws Exception
      {
            logger.info("Saving the contents in SMILES format...");
        String fileName = outFile.toString();
        if (!fileName.endsWith(".smi")) {
            fileName += ".smi";
        }
        cow = new SMILESWriter(new FileWriter(outFile));
            if (cow != null && askIOSettings())
            {
                  cow.addChemObjectIOListener(new SwingGUIListener(jcpPanel, 4));
            }
            org.openscience.cdk.interfaces.IMoleculeSet som = model.getMoleculeSet();
            cow.write(som);
            cow.close();
      }

      protected void saveAsCDKSourceCode(IChemModel model, File outFile) throws Exception
      {
            logger.info("Saving the contents as a CDK source code file...");
        String fileName = outFile.toString();
        if (!fileName.endsWith(".cdk")) {
            fileName += ".cdk";
            outFile = new File(fileName);
        }
            cow = new CDKSourceCodeWriter(new FileWriter(outFile));
            if (cow != null && askIOSettings())
            {
                  cow.addChemObjectIOListener(new SwingGUIListener(jcpPanel, 4));
            }
            Iterator containers = ChemModelManipulator.getAllAtomContainers(model).iterator();
            while (containers.hasNext()) {
                  IAtomContainer ac = (IAtomContainer)containers.next();
                  if (ac != null) {
                        cow.write(ac);
                  } else {
                        System.err.println("AC == null!");
                  }
            }
            cow.close();
      }

      protected void saveAsSVG(IChemModel model, File outFile) throws Exception
      {
            logger.info("Saving the contents as a SVG file...");
            cow = new SVGWriter(new FileWriter(outFile));
            if (cow != null && askIOSettings())
            {
                  cow.addChemObjectIOListener(new SwingGUIListener(jcpPanel, 4));
            }
            Iterator containers = ChemModelManipulator.getAllAtomContainers(model).iterator();
            while (containers.hasNext()) {
                  IAtomContainer ac = (IAtomContainer)containers.next();
                  if (ac != null)
                  {
                        cow.write((IAtomContainer) ac.clone());
                  } else
                  {
                        System.err.println("AC == null!");
                  }
            }
            cow.close();
      }
}


Generated by  Doxygen 1.6.0   Back to index