/*
* This file is part of LaTeXDraw.
* Copyright (c) 2005-2017 Arnaud BLOUIN
* LaTeXDraw 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 (at your option) any later version.
* LaTeXDraw is distributed 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.
*/
package net.sf.latexdraw.instruments;
import com.google.inject.Inject;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.ResourceBundle;
import java.util.stream.Collectors;
import javafx.collections.ListChangeListener;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.stage.FileChooser;
import net.sf.latexdraw.LaTeXDraw;
import net.sf.latexdraw.actions.Export;
import net.sf.latexdraw.actions.ExportFormat;
import net.sf.latexdraw.actions.ExportTemplate;
import net.sf.latexdraw.models.interfaces.shape.IShape;
import net.sf.latexdraw.util.LNamespace;
import net.sf.latexdraw.util.LPath;
import net.sf.latexdraw.util.LSystem;
import net.sf.latexdraw.util.LangTool;
import net.sf.latexdraw.view.jfx.Canvas;
import net.sf.latexdraw.view.latex.LaTeXGenerator;
import net.sf.latexdraw.view.pst.PSTCodeGenerator;
import net.sf.latexdraw.view.svg.SVGDocumentGenerator;
import org.malai.action.Action;
import org.malai.javafx.instrument.JfxInstrument;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* This instrument exports a drawing to different formats.
* @author Arnaud BLOUIN
*/
public class Exporter extends JfxInstrument implements Initializable {
/** The export menu that contains all the export menu item. */
@FXML private MenuButton exportMenu;
/** The menu item that export as PST code. */
@FXML private MenuItem menuItemPST;
/** The menu item that export as JPG picture. */
@FXML private MenuItem menuItemJPG;
/** The menu item that export as PNG picture. */
@FXML private MenuItem menuItemPNG;
/** The menu item that export as BMP picture. */
@FXML private MenuItem menuItemBMP;
/** The menu item that export as PDF document. */
@FXML private MenuItem menuItemPDF;
/** The menu item that export as PS (using latex) document. */
@FXML private MenuItem menuItemEPSLatex;
/** The menu item that export as PDF (using pdfcrop) document. */
@FXML private MenuItem menuItemPDFcrop;
@FXML private MenuItem exportTemplateMenu;
/** The PST generator. */
@Inject private PSTCodeGenerator pstGen;
@Inject private StatusBarController statusBar;
@Inject TemplateManager templateManager;
/** The default location of the exports. */
private String pathExport;
/**
* The latex packages that the interactive system saves by default. These
* packages should by set by the user and must be general, i.e. independent of any document.
*/
private String defaultPackages;
@Inject private FileLoaderSaver loader;
/**
* The canvas that contains the shapes to export. The canvas is used instead
* of the drawing because to export as picture, we paint the views into a graphics.
*/
@Inject private Canvas canvas;
/** The dialog box that allows to define where the drawing must be exported. */
private FileChooser fileChooserExport;
/**
* Creates the instrument.
*/
Exporter() {
super();
defaultPackages = ""; //$NON-NLS-1$
reinit();
}
@Override
public void reinit() {
LaTeXGenerator.setPackages(defaultPackages);
}
@Override
public void load(final boolean generalPreferences, final String nsURI, final Element root) {
super.load(generalPreferences, nsURI, root);
final String name = root.getNodeName();
if(name.endsWith(LNamespace.XML_LATEX_INCLUDES)) {
final String[] lines = root.getTextContent().split(LSystem.EOL);
final String pkgs = LaTeXGenerator.getPackages();
LaTeXGenerator.setPackages(LaTeXGenerator.getPackages() +
Arrays.stream(lines).filter(line -> !pkgs.contains(line)).collect(Collectors.joining(LSystem.EOL, LSystem.EOL, "")));
}
}
@Override
public void save(final boolean generalPreferences, final String nsURI, final Document document, final Element root) {
super.save(generalPreferences, nsURI, document, root);
if(document == null || root == null) return;
if(generalPreferences) {
Element elt = document.createElement(LNamespace.XML_PATH_EXPORT);
elt.setTextContent(pathExport);
root.appendChild(elt);
elt = document.createElement(LNamespace.XML_LATEX_INCLUDES);
elt.setTextContent(defaultPackages);
root.appendChild(elt);
}else {
final String ns = LPath.INSTANCE.getNormaliseNamespaceURI(nsURI);
final Element elt = document.createElement(ns + LNamespace.XML_LATEX_INCLUDES);
elt.appendChild(document.createTextNode(LaTeXGenerator.getPackages()));
root.appendChild(elt);
}
}
@Override
public void setActivated(final boolean isActivated, final boolean hide) {
super.setActivated(isActivated);
exportMenu.setVisible(isActivated || !hide);
exportMenu.setDisable(!isActivated);
}
@Override
public void setActivated(final boolean activated) {
setActivated(activated, false);
}
@Override
protected void configureBindings() throws IllegalAccessException, InstantiationException {
bindMenu(Export.class, (action, interaction) -> {
if(interaction.getWidget().getUserData() instanceof ExportFormat) {
final ExportFormat format = (ExportFormat) interaction.getWidget().getUserData();
action.setDialogueBox(getExportDialog(format));
action.setCanvas(canvas);
action.setFormat(format);
action.setPstGen(pstGen);
}
}, menuItemBMP, menuItemEPSLatex, menuItemJPG, menuItemPDF, menuItemPDFcrop, menuItemPNG, menuItemPST);
bindMenu(ExportTemplate.class, action -> {
action.setTemplatesPane(templateManager.templatePane);
action.setOpenSaveManager(SVGDocumentGenerator.INSTANCE);
action.setUi(LaTeXDraw.getINSTANCE());
action.setProgressBar(statusBar.getProgressBar());
action.setStatusWidget(statusBar.getLabel());
}, exportTemplateMenu);
}
/**
* @param format The format of the document to export.
* @return The export dialog to select a path.
* @since 3.0
*/
protected FileChooser getExportDialog(final ExportFormat format) {
if(fileChooserExport == null) {
fileChooserExport = new FileChooser();
fileChooserExport.setTitle(LangTool.INSTANCE.getBundle().getString("Exporter.1"));
}
fileChooserExport.getExtensionFilters().clear();
fileChooserExport.getExtensionFilters().addAll(format.getFilter());
if(pathExport == null || !new File(pathExport).isDirectory()) {
final File currentFile = loader.getCurrentFile();
if(currentFile != null && currentFile.isDirectory()) {
fileChooserExport.setInitialDirectory(new File(currentFile.getPath()).getParentFile());
}
}else {
fileChooserExport.setInitialDirectory(new File(pathExport));
}
return fileChooserExport;
}
@Override
public void onActionExecuted(final Action action) {
statusBar.getLabel().setText(LangTool.INSTANCE.getBundle().getString("LaTeXDrawFrame.184")); //$NON-NLS-1$
if(action instanceof Export) {
final File outputFile = ((Export) action).getOutputFile();
if(outputFile != null) {
pathExport = outputFile.getParentFile().getPath();
}
}
}
/**
* @return The latex packages that the interactive system saves by default.
* @since 3.0
*/
public String getDefaultPackages() {
return defaultPackages;
}
/**
* @param defaultPkgs The latex packages that the interactive system saves by
* default. These packages should by set by the user and must be
* general, i.e. independent of any document. Packages for a
* given document should by set using
* {@link #setPackages(String)}.
* @since 3.0
*/
public void setDefaultPackages(final String defaultPkgs) {
if(defaultPkgs != null) {
if(defaultPackages.isEmpty()) {
LaTeXGenerator.setPackages(defaultPkgs + LSystem.EOL + LaTeXGenerator.getPackages());
}
defaultPackages = defaultPkgs;
}
}
/**
* @param packages The latex packages used when exporting using latex. These
* packages are defined for the current document but not for all
* documents. These general packages can be set using
* {@link #setDefaultPackages(String)}.
* @since 3.0
*/
public void setPackages(final String packages) {
if(packages != null) {
LaTeXGenerator.setPackages(packages);
setModified(true);
}
}
/**
* @return The path where files are exported.
* @since 3.0
*/
public String getPathExport() {
return pathExport;
}
/**
* @param path The path where files are exported.
* @since 3.0
*/
public void setPathExport(final String path) {
if(path != null) {
pathExport = path;
}
}
@Override
public void initialize(final URL location, final ResourceBundle resources) {
setActivated(false);
canvas.getDrawing().getShapes().addListener((ListChangeListener<IShape>) c -> setActivated(!canvas.getDrawing().isEmpty()));
menuItemPDF.setUserData(ExportFormat.PDF);
menuItemPDFcrop.setUserData(ExportFormat.PDF_CROP);
menuItemEPSLatex.setUserData(ExportFormat.EPS_LATEX);
menuItemJPG.setUserData(ExportFormat.JPG);
menuItemPST.setUserData(ExportFormat.TEX);
menuItemPNG.setUserData(ExportFormat.PNG);
menuItemBMP.setUserData(ExportFormat.BMP);
}
}