package net.sourceforge.fidocadj;
import javax.swing.*;
import java.util.prefs.*;
import java.io.*;
import net.sourceforge.fidocadj.export.*;
import net.sourceforge.fidocadj.circuit.*;
import net.sourceforge.fidocadj.dialogs.*;
import net.sourceforge.fidocadj.globals.*;
import net.sourceforge.fidocadj.geom.*;
/** ExportTools.java
Class performing interface operations for launching export operations.
It also reads and stores preferences.
<pre>
This file is part of FidoCadJ.
FidoCadJ 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 3 of the License, or
(at your option) any later version.
FidoCadJ 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 FidoCadJ. If not,
@see <a href=http://www.gnu.org/licenses/>http://www.gnu.org/licenses/</a>.
Copyright 2015-2016 by Davide Bucci
</pre>
@author Davide Bucci
*/
public class ExportTools
{
// Export default properties
private String exportFileName;
private String exportFormat;
private boolean exportBlackWhite;
private double exportUnitPerPixel;
private double exportMagnification;
final private Preferences prefs;
private ChangeCoordinatesListener coordL;
/** Standard constructor.
@param p the preferences object which will be used to save or
retrieve the settings. If null, preferences will not be stored.
*/
public ExportTools(Preferences p)
{
exportFileName="";
exportMagnification=1.0;
prefs=p;
exportBlackWhite=false;
exportFormat = "";
}
/** Read the preferences regarding the export.
*/
public void readPrefs()
{
if(prefs!=null) {
exportFormat = prefs.get("EXPORT_FORMAT", "png");
exportUnitPerPixel= Double.parseDouble(
prefs.get("EXPORT_UNITPERPIXEL", "1"));
exportMagnification = Double.parseDouble(
prefs.get("EXPORT_MAGNIFICATION", "1"));
exportBlackWhite = prefs.get("EXPORT_BW", "false").equals("true");
}
}
/** Show a dialog for exporting the current drawing.
@param fff the parent frame which will be used for dialogs and message
boxes.
@param CC the CircuitPanel containing the drawing to be exported.
@param openFileDirectory the directory where to search if no file
name has been already defined for the export (for example, because
it is the first time an export is done).
*/
public void launchExport(JFrame fff, CircuitPanel CC,
String openFileDirectory)
{
// At first, we create and configure the dialog allowing the user
// to choose the exporting options
DialogExport export=new DialogExport(fff);
export.setAntiAlias(true);
export.setFormat(exportFormat);
// The default export directory is the same where the FidoCadJ file
// are opened.
if("".equals(exportFileName)) {
exportFileName=openFileDirectory;
}
export.setFileName(exportFileName);
export.setUnitPerPixel(exportUnitPerPixel);
export.setBlackWhite(exportBlackWhite);
export.setMagnification(exportMagnification);
// Once configured, we show the modal dialog
export.setVisible(true);
if (export.shouldExport()) {
exportFileName=export.getFileName();
exportFormat=export.getFormat();
// The resolution based export should be used only for bitmap
// file formats
if("png".equals(exportFormat) ||
"jpg".equals(exportFormat))
exportUnitPerPixel=export.getUnitPerPixel();
else
exportUnitPerPixel = export.getMagnification();
exportBlackWhite=export.getBlackWhite();
exportMagnification = export.getMagnification();
File f = new File(exportFileName);
// We first check if the file is a directory
if(f.isDirectory()) {
JOptionPane.showMessageDialog(null,
Globals.messages.getString("Warning_noname"),
Globals.messages.getString("Warning"),
JOptionPane.INFORMATION_MESSAGE );
return;
}
int selection;
// We first check if the file name chosen by the user has a correct
// file extension, coherent with the file format chosen.
if(!Globals.checkExtension(exportFileName, exportFormat)) {
selection = JOptionPane.showConfirmDialog(null,
Globals.messages.getString("Warning_extension"),
Globals.messages.getString("Warning"),
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
// If useful, we correct the extension.
if(selection==JOptionPane.OK_OPTION)
exportFileName = Globals.adjustExtension(
exportFileName, exportFormat);
f = new File(exportFileName);
}
// If the file already exists, we asks for confirmation
if(f.exists()) {
selection = JOptionPane.showConfirmDialog(null,
Globals.messages.getString("Warning_overwrite"),
Globals.messages.getString("Warning"),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(selection!=JOptionPane.OK_OPTION)
return;
}
// We do the export
RunExport doExport = new RunExport();
doExport.setCoordinateListener(coordL);
// Here we use the multithreaded structure of Java.
doExport.setParam(new File(exportFileName), CC.dmp,
exportFormat, exportUnitPerPixel,
export.getAntiAlias(),exportBlackWhite,!CC.extStrict,
fff);
SwingUtilities.invokeLater(doExport);
if(prefs!=null) {
prefs.put("EXPORT_FORMAT", exportFormat);
prefs.put("EXPORT_UNITPERPIXEL", ""+exportUnitPerPixel);
prefs.put("EXPORT_MAGNIFICATION", ""+exportMagnification);
prefs.put("EXPORT_BW", exportBlackWhite?"true":"false");
}
/*
The following code would require a thread safe implementation
of some of the inner classes (such as CircuitModel), which is
indeed not the case...
Thread thread = new Thread(doExport);
thread.setDaemon(true);
// Start the thread
thread.start();
*/
}
}
/** Set the coordinate listener which is employed here for showing
message in a non-invasive way.
@param c the listener.
*/
public void setCoordinateListener(ChangeCoordinatesListener c)
{
coordL=c;
}
}