package org.geogebra.desktop.gui.menubar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import org.geogebra.common.export.pstricks.GeoGebraToAsymptote;
import org.geogebra.common.main.Feature;
import org.geogebra.common.move.events.BaseEvent;
import org.geogebra.common.move.ggtapi.TubeAvailabilityCheckEvent;
import org.geogebra.common.move.views.EventRenderable;
import org.geogebra.common.util.FileExtensions;
import org.geogebra.common.util.debug.Log;
import org.geogebra.common.util.lang.Unicode;
import org.geogebra.desktop.export.AnimationExportDialogD;
import org.geogebra.desktop.export.WorksheetExportDialog;
import org.geogebra.desktop.export.pstricks.AsymptoteFrame;
import org.geogebra.desktop.export.pstricks.GeoGebraToAsymptoteD;
import org.geogebra.desktop.export.pstricks.GeoGebraToPdfD;
import org.geogebra.desktop.export.pstricks.GeoGebraToPgfD;
import org.geogebra.desktop.export.pstricks.GeoGebraToPstricksD;
import org.geogebra.desktop.export.pstricks.PdfFrame;
import org.geogebra.desktop.export.pstricks.PgfFrame;
import org.geogebra.desktop.export.pstricks.PstricksFrame;
import org.geogebra.desktop.gui.app.GeoGebraFrame;
import org.geogebra.desktop.main.AppD;
import org.geogebra.desktop.move.ggtapi.models.LoginOperationD;
import org.geogebra.desktop.util.GuiResourcesD;
/**
* The "File" menu.
*/
class FileMenuD extends BaseMenu implements EventRenderable {
private static final long serialVersionUID = -5154067739481481835L;
private AbstractAction newWindowAction, deleteAll, saveAction, saveAsAction,
loadAction, loadURLAction, exportWorksheet, shareAction,
exportGraphicAction, exportAnimationAction, exportPgfAction,
exportPSTricksAction, exportAsymptoteAction, exportPDFaction;
/** load from MAT item */
JMenuItem loadURLMenuItem;
/** share item */
AbstractAction exportGeoGebraTubeAction;
private AbstractAction drawingPadToClipboardAction;
private AbstractAction printEuclidianViewAction;
private AbstractAction exitAction;
private AbstractAction exitAllAction;
/**
* @param app
* application
*/
public FileMenuD(AppD app) {
super(app, "File");
// items are added to the menu when it's opened, see BaseMenu:
// addMenuListener(this);
}
/**
* Initialize all items.
*/
@Override
public void initItems() {
if (!initialized) {
return;
}
removeAll();
JMenuItem mi;
if (!app.isApplet()) {
// "New" in application: new window
mi = new JMenuItem(newWindowAction);
setMenuShortCutAccelerator(mi, 'N');
add(mi);
}
// "New": reset
add(deleteAll);
mi = add(loadAction);
setMenuShortCutAccelerator(mi, 'O'); // open
LoginOperationD signIn = (LoginOperationD) app.getLoginOperation();
if (!app.isApplet()
&& (signIn.isTubeAvailable() || !signIn.isTubeCheckDone())) {
loadURLMenuItem = add(loadURLAction);
// If GeoGebraTube is not available we disable the item and
// listen to the event that tube becomes available
if (!signIn.isTubeAvailable()) {
loadURLAction.setEnabled(false);
signIn.getView().add(this);
}
}
// recent SubMenu
JMenu submenuRecent = new JMenu(loc.getMenu("Recent"));
submenuRecent.setIcon(app.getEmptyIcon());
add(submenuRecent);
// Recent files list
int size = AppD.getFileListSize();
if (size > 0) {
for (int i = 0; i < AppD.MAX_RECENT_FILES; i++) {
File file = AppD.getFromFileList(i);
if (file != null) {
mi = new JMenuItem(file.getName());
mi.setIcon(app.getMenuIcon(GuiResourcesD.GEOGEBRA));
ActionListener al = new LoadFileListener(app, file);
mi.addActionListener(al);
submenuRecent.add(mi);
}
}
}
addSeparator();
mi = add(saveAction);
setMenuShortCutAccelerator(mi, 'S');
mi = add(saveAsAction);
addSeparator();
mi = add(shareAction);
mi.setIcon(app.getMenuIcon(GuiResourcesD.EXPORT_SMALL));
// export
JMenu submenu = new JMenu(loc.getMenu("Export"));
submenu.setIcon(app.getEmptyIcon());
add(submenu);
mi = submenu.add(exportWorksheet);
setMenuShortCutShiftAccelerator(mi, 'W');
mi = submenu.add(exportGraphicAction);
setMenuShortCutShiftAccelerator(mi, 'U');
mi = submenu.add(exportAnimationAction);
// Graphical clipboard is not working under Mac when Java == 7:
if (!app.isMacOS() || !app.isJava7()) {
mi = submenu.add(drawingPadToClipboardAction);
setMenuShortCutShiftAccelerator(mi, 'C');
}
submenu.addSeparator();
mi = submenu.add(exportPSTricksAction);
setMenuShortCutShiftAccelerator(mi, 'T');
mi = submenu.add(exportPgfAction);
mi = submenu.add(exportAsymptoteAction);
if (app.has(Feature.EXPORT_ANIMATED_PDF)) {
mi = submenu.add(exportPDFaction);
}
addSeparator();
mi = add(printEuclidianViewAction);
mi.setText(loc.getMenu("PrintPreview"));
mi.setIcon(app.getMenuIcon(GuiResourcesD.DOCUMENT_PRINT_PREVIEW));
setMenuShortCutAccelerator(mi, 'P');
// End Export SubMenu
// DONE HERE WHEN APPLET
if (app.isApplet()) {
return;
}
// close
addSeparator();
mi = add(exitAction);
if (AppD.MAC_OS) {
setMenuShortCutAccelerator(mi, 'W');
} else {
// Alt + F4
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F4,
InputEvent.ALT_MASK);
mi.setAccelerator(ks);
}
// close all
if (GeoGebraFrame.getInstanceCount() > 1) {
add(exitAllAction);
}
// support for right-to-left languages
app.setComponentOrientation(this);
}
/**
* Initialize all actions of this menu.
*/
@Override
protected void initActions() {
deleteAll = new AbstractAction(loc.getMenu("New"), app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.setWaitCursor();
app.fileNew();
app.setDefaultCursor();
}
};
newWindowAction = new AbstractAction(loc.getMenu("NewWindow"),
app.getMenuIcon(GuiResourcesD.DOCUMENT_NEW)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
Thread runner = new Thread() {
@Override
public void run() {
app.setWaitCursor();
app.createNewWindow();
app.setDefaultCursor();
}
};
runner.start();
}
};
saveAction = new AbstractAction(loc.getMenu("Save"),
app.getMenuIcon(GuiResourcesD.DOCUMENT_SAVE)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.getGuiManager().save();
}
};
saveAsAction = new AbstractAction(
loc.getMenu("SaveAs") + Unicode.ellipsis,
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.getGuiManager().saveAs();
}
};
shareAction = new AbstractAction(
loc.getMenu("Share") + Unicode.ellipsis,
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
exportGeoGebraTubeAction.actionPerformed(e);
}
};
/*
* printProtocolAction = new AbstractAction(
* loc.getMenu("ConstructionProtocol") + " ...") { private static final
* long serialVersionUID = 1L;
*
* public void actionPerformed(ActionEvent e) { Thread runner = new
* Thread() { public void run() { ConstructionProtocol constProtocol =
* app.getConstructionProtocol(); if (constProtocol == null) {
* constProtocol = new ConstructionProtocol(app); }
* constProtocol.initProtocol();
*
* try { new PrintPreview(app, constProtocol, PageFormat.PORTRAIT); }
* catch (Exception e) { Application.debug("Print preview not available"
* ); } } }; runner.start(); } };
*/
printEuclidianViewAction = new AbstractAction(
loc.getMenu("DrawingPad") + " ...") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
GeoGebraMenuBar.showPrintPreview(app);
}
};
exitAction = new AbstractAction(loc.getMenu("Close"),
app.getMenuIcon(GuiResourcesD.EXIT)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.exit();
}
};
exitAllAction = new AbstractAction(loc.getMenu("CloseAll"),
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.exitAll();
}
};
loadAction = new AbstractAction(loc.getMenu("Load") + " ...",
app.getMenuIcon(GuiResourcesD.DOCUMENT_OPEN)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.getGuiManager().openFile();
}
};
loadURLAction = new AbstractAction(
loc.getMenu("OpenFromGeoGebraTube") + " ...",
app.getMenuIcon(GuiResourcesD.DOCUMENT_OPEN)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
// Check if javafx is available
boolean javaFx22Available = false;
try {
this.getClass().getClassLoader()
.loadClass("javafx.embed.swing.JFXPanel");
javaFx22Available = true;
} catch (ClassNotFoundException ex) {
Log.error("JavaFX 2.2 not available");
}
// Open the Search dialog only when javafx is available.
// The User can force opening the old 'Open URL' dialog by
// pressing shift.
if (javaFx22Available
&& ((e.getModifiers() & ActionEvent.SHIFT_MASK) == 0)) {
app.getGuiManager().openFromGGT();
} else {
// old File -> Open from Webpage by pressing <Shift>
app.getGuiManager().openURL();
}
}
};
drawingPadToClipboardAction = new AbstractAction(
loc.getMenu("DrawingPadToClipboard"),
app.getMenuIcon(GuiResourcesD.MENU_EDIT_COPY)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
app.getSelectionManager().clearSelectedGeos(true, false);
app.updateSelection(false);
Thread runner = new Thread() {
@Override
public void run() {
app.setWaitCursor();
// copy drawing pad to the system clipboard
app.copyGraphicsViewToClipboard();
app.setDefaultCursor();
}
};
runner.start();
}
};
/*
* updateAction = new AbstractAction(getMenu("Update"), getEmptyIcon())
* { private static final long serialVersionUID = 1L; public void
* actionPerformed(ActionEvent e) { Thread runner = new Thread() {
* public void run() { updateGeoGebra(); } }; runner.start(); } };
*/
exportGraphicAction = new AbstractAction(
loc.getMenu("DrawingPadAsPicture") + " (" + FileExtensions.PNG
+ ", " + FileExtensions.EPS + ") ...",
app.getMenuIcon(GuiResourcesD.IMAGE_X_GENERIC)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
try {
Thread runner = new Thread() {
@Override
public void run() {
app.setWaitCursor();
try {
app.getGuiManager().showGraphicExport();
} catch (Exception e1) {
Log.debug(
"GraphicExportDialog not available for 3D view yet");
// for 3D View
app.copyGraphicsViewToClipboard();
}
app.setDefaultCursor();
}
};
runner.start();
}
catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
// export slider as animation
exportAnimationAction = new AbstractAction(
loc.getMenu("ExportAnimatedGIF") + " ...") {
private static final long serialVersionUID = 1L;
@Override
@SuppressWarnings("unused")
public void actionPerformed(ActionEvent e) {
try {
new AnimationExportDialogD(app);
} catch (Exception ex) {
Log.debug("AnimationExportDialog not available");
} catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
exportPSTricksAction = new AbstractAction(
loc.getMenu("DrawingPadAsPSTricks") + " ...",
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
try {
GeoGebraToPstricksD export = new GeoGebraToPstricksD(app);
new PstricksFrame(export).setVisible(true);
} catch (Exception ex) {
Log.debug("GeoGebraToPstricks not available");
} catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
// Added By Loic Le Coq
exportPgfAction = new AbstractAction(
loc.getMenu("DrawingPagAsPGF") + " ...", app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
@SuppressWarnings("unused")
public void actionPerformed(ActionEvent e) {
try {
GeoGebraToPgfD export = new GeoGebraToPgfD(app);
new PgfFrame(export);
} catch (Exception ex) {
Log.debug("GeoGebraToPGF not available");
} catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
if (app.has(Feature.EXPORT_ANIMATED_PDF)) {
// added by Hoszu Henrietta, animated pdf export
exportPDFaction = new AbstractAction(
loc.getMenu("Graphics View as Animated PDF") + " ...",
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
@SuppressWarnings("unused")
public void actionPerformed(ActionEvent e) {
try {
GeoGebraToPdfD export = new GeoGebraToPdfD(app);
new PdfFrame(export);
} catch (Exception ex) {
Log.debug("GeoGebraToPDF not available");
} catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
}
// Added by Andy Zhu; Asymptote export
exportAsymptoteAction = new AbstractAction(
loc.getMenu("GraphicsViewAsAsymptote") + " ...",
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
@SuppressWarnings("unused")
public void actionPerformed(ActionEvent e) {
try {
GeoGebraToAsymptote export = new GeoGebraToAsymptoteD(app);
new AsymptoteFrame(export);
} catch (Exception ex) {
Log.debug("GeoGebraToAsymptote not available");
} catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
// End
exportWorksheet = new AbstractAction(
loc.getMenu("DynamicWorksheetAsWebpage") + " ("
+ FileExtensions.HTML + ") ...",
app.getMenuIcon(GuiResourcesD.TEXT_HTML)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
try {
Thread runner = new Thread() {
@Override
public void run() {
app.setWaitCursor();
try {
app.getSelectionManager()
.clearSelectedGeos(true, false);
app.updateSelection(false);
WorksheetExportDialog d = new WorksheetExportDialog(
app);
d.setVisible(true);
} catch (Exception e1) {
Log.debug(
"WorksheetExportDialog not available");
e1.printStackTrace();
}
app.setDefaultCursor();
}
};
runner.start();
}
catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
exportGeoGebraTubeAction = new AbstractAction(
loc.getMenu("UploadGeoGebraTube") + " ...",
app.getEmptyIcon()) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
try {
Thread runner = new Thread() {
@Override
public void run() {
app.setWaitCursor();
try {
app.getSelectionManager()
.clearSelectedGeos(true, false);
app.updateSelection(false);
// callback for 3D
app.uploadToGeoGebraTubeOnCallback();
} catch (Exception e1) {
Log.debug("Uploading failed");
e1.printStackTrace();
}
app.setDefaultCursor();
}
};
runner.start();
}
catch (java.lang.NoClassDefFoundError ee) {
app.showError("ExportJarMissing");
ee.printStackTrace();
}
}
};
}
@Override
public void update() {
//
}
@Override
public void renderEvent(BaseEvent event) {
if (event instanceof TubeAvailabilityCheckEvent) {
TubeAvailabilityCheckEvent checkEvent = (TubeAvailabilityCheckEvent) event;
if (!checkEvent.isAvailable()) {
remove(loadURLMenuItem);
} else {
loadURLAction.setEnabled(true);
}
}
}
}