/*
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
This file is part of GeoGebra.
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.
*/
package org.geogebra.desktop.export;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.main.App;
import org.geogebra.common.main.Localization;
import org.geogebra.common.util.FileExtensions;
import org.geogebra.common.util.debug.Log;
import org.geogebra.desktop.awt.GBufferedImageD;
import org.geogebra.desktop.gui.GuiManagerD;
import org.geogebra.desktop.gui.TitlePanel;
import org.geogebra.desktop.gui.view.consprotocol.ConstructionProtocolViewD;
import org.geogebra.desktop.main.AppD;
import org.geogebra.desktop.plugin.GgbAPID;
import org.geogebra.desktop.util.UtilD;
public class ConstructionProtocolExportDialog extends JDialog
implements KeyListener {
private static final long serialVersionUID = -2626950140196416416L;
private JCheckBox cbDrawingPadPicture, cbScreenshotPicture;
private JCheckBox cbColor;
private JCheckBox cbIcons;
private GraphicSizePanel sizePanel;
boolean kernelChanged = false;
private ConstructionProtocolViewD prot;
private AppD app;
public ConstructionProtocolExportDialog(ConstructionProtocolViewD prot) {
super(prot.getApplication().getFrame(), true);
this.prot = prot;
app = prot.getApplication();
initGUI();
}
private void initGUI() {
setResizable(true);
Localization loc = app.getLocalization();
setTitle(loc.getMenu("Export") + ": "
+ loc.getMenu("ConstructionProtocol") + " ("
+ FileExtensions.HTML + ")");
JPanel cp = new JPanel(new BorderLayout(5, 5));
cp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
getContentPane().add(cp);
TitlePanel tp = new TitlePanel(app);
cp.add(tp, BorderLayout.NORTH);
tp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
kernelChanged = true;
}
});
// checkbox: insert picture of drawing pad
JPanel picPanel = new JPanel(new BorderLayout(20, 5));
cbDrawingPadPicture = new JCheckBox(
loc.getMenu("InsertPictureOfConstruction"));
cbDrawingPadPicture.setSelected(true);
cbScreenshotPicture = new JCheckBox(
loc.getMenu("InsertPictureOfAllOpenViews"));
cbScreenshotPicture.setSelected(false);
picPanel.add(cbDrawingPadPicture, app.getLocalization().borderWest());
if (((GuiManagerD) app.getGuiManager()).showView(App.VIEW_ALGEBRA)) {
picPanel.add(cbScreenshotPicture, BorderLayout.SOUTH);
}
// panel with fields to enter width and height of picture
EuclidianView ev = app.getEuclidianView1();
// int height = (int) Math.ceil(DEFAULT_GRAPHICS_WIDTH *
// (double) ev.getHeight() / ev.getWidth());
// sizePanel = new GraphicSizePanel(app, DEFAULT_GRAPHICS_WIDTH,
// height);
sizePanel = new GraphicSizePanel(app, ev.getWidth(), ev.getHeight());
picPanel.add(sizePanel, BorderLayout.CENTER);
picPanel.setBorder(BorderFactory.createEtchedBorder());
cp.add(picPanel, BorderLayout.CENTER);
cbColor = new JCheckBox(loc.getMenu("ColorfulConstructionProtocol"));
cbColor.setSelected(false);
cbIcons = new JCheckBox(
loc.getMenu("ToolbarIconsConstructionProtocolExport"));
cbIcons.setSelected(prot.getAddIcons());
// disable width and height field when checkbox is deselected
cbDrawingPadPicture.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean flag = cbDrawingPadPicture.isSelected();
sizePanel.setEnabled(flag);
if (flag) {
cbScreenshotPicture.setSelected(false);
}
}
});
cbScreenshotPicture.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean flag = cbScreenshotPicture.isSelected();
sizePanel.setEnabled(false);
if (flag) {
cbDrawingPadPicture.setSelected(false);
}
}
});
cbColor.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
prot.setUseColors(cbColor.isSelected());
}
});
cbIcons.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
prot.setAddIcons(cbIcons.isSelected());
}
});
// Cancel and Export Button
JButton cancelButton = new JButton(loc.getMenu("Cancel"));
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
});
JButton exportButton = new JButton(loc.getMenu("Export"));
exportButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
@Override
public void run() {
dispose();
if (kernelChanged) {
app.storeUndoInfo();
}
exportHTML(cbDrawingPadPicture.isSelected(),
cbScreenshotPicture.isSelected(),
cbColor.isSelected(), cbIcons.isSelected());
}
};
runner.start();
}
});
JButton clipboardButton = new JButton(loc.getMenu("Clipboard"));
clipboardButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
@Override
public void run() {
dispose();
if (kernelChanged) {
app.storeUndoInfo();
}
try {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Clipboard clipboard = toolkit.getSystemClipboard();
StringSelection stringSelection = new StringSelection(
prot.getHTML(null));
clipboard.setContents(stringSelection, null);
} catch (Exception ex) {
app.showError("SaveFileFailed");
Log.debug(ex.toString());
}
}
};
runner.start();
}
});
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttonPanel.add(exportButton);
buttonPanel.add(clipboardButton);
buttonPanel.add(cancelButton);
JPanel southPanel = new JPanel(new BorderLayout());
southPanel.add(cbColor, BorderLayout.NORTH);
southPanel.add(cbIcons, BorderLayout.CENTER);
southPanel.add(buttonPanel, BorderLayout.SOUTH);
cp.add(southPanel, BorderLayout.SOUTH);
UtilD.addKeyListenerToAll(this, this);
centerOnScreen();
}
private void centerOnScreen() {
// center on screen
pack();
setLocationRelativeTo(app.getMainComponent());
}
/*
* Keylistener implementation of ConstructionProtocol
*/
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == KeyEvent.VK_ESCAPE) {
dispose();
}
}
@Override
public void keyReleased(KeyEvent e) {
//
}
@Override
public void keyTyped(KeyEvent e) {
//
}
/*
* ******************* HTML export *******
*/
/**
* Exports construction protocol as html
*
* @param addIcons
* @param includePicture
* : states whether a picture of the drawing pad should be
* exported with the html output file
* @param includeAlgebraPicture
* : states whether a picture of the algebraWindow should be
* exported with the html output file
*/
private void exportHTML(boolean includePicture,
boolean includeAlgebraPicture, boolean useColors,
boolean addIcons) {
File file;
prot.setUseColors(useColors);
file = ((GuiManagerD) app.getGuiManager()).showSaveDialog(
FileExtensions.HTML, null,
app.getLocalization().getMenu("HTML"), true, false);
try {
BufferedImage img = null;
if (includePicture) {
// picture of drawing pad
img = GBufferedImageD.getAwtBufferedImage(
app.getEuclidianView1().getExportImage(1d));
} else if (includeAlgebraPicture) {
// picture of drawing pad
img = getCenterPanelImage();
}
String imgBase64 = GgbAPID.base64encode(img, 72);
String export = prot.getHTML(imgBase64);
Log.debug(export);
BufferedWriter fw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file), "UTF-8"));
fw.write(export);
fw.close();
// This code is mostly copy-pasted from
// geogebra/export/WorksheetExportDialog.java.
// open browser
final File HTMLfile = file;
Thread runner = new Thread() {
@Override
public void run() {
try {
// open html file in browser
((GuiManagerD) app.getGuiManager())
.showURLinBrowser(HTMLfile.toURI().toURL());
} catch (Exception ex) {
app.showError("SaveFileFailed");
Log.debug(ex.toString());
}
}
};
runner.start();
} catch (IOException ex) {
app.showError("SaveFileFailed");
Log.debug(ex.toString());
}
}
private BufferedImage getCenterPanelImage() {
JPanel centPanel = app.getCenterPanel();
BufferedImage img = new BufferedImage(centPanel.getWidth(),
centPanel.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
centPanel.paint(g);
g.dispose();
img.flush();
return img;
}
}