Package geogebra.export

Source Code of geogebra.export.WorksheetExportDialog

/*
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 geogebra.export;

import geogebra.GeoGebra;
import geogebra.euclidian.EuclidianView;
import geogebra.gui.TitlePanel;
import geogebra.gui.view.algebra.InputPanel;
import geogebra.kernel.Construction;
import geogebra.kernel.Kernel;
import geogebra.main.Application;
import geogebra.main.GeoGebraPreferences;
import geogebra.main.GuiManager;
import geogebra.util.DownloadManager;
import geogebra.util.Util;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
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.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;

/**
* Dialog which provides for exporting into an HTML page
* enriched with an Applet.
*
* @author Markus Hohenwarter
* @author Philipp Weissenbacher (materthron@users.sourceforge.net)
*/
public class WorksheetExportDialog extends JDialog {

  private static final long serialVersionUID = 1L;

  private static final int BUTTON_WIDTH = 200;
  private static final int BUTTON_HEIGHT = 40;
  private static final int DEFAULT_HTML_PAGE_WIDTH = 600;
  private static final int DEFAULT_APPLET_WIDTH = 600;
  private static final int DEFAULT_APPLET_HEIGHT = 500
 
  final private static int TYPE_HTMLFILE = 0;
  final private static int TYPE_HTMLCLIPBOARD = 1;
  final private static int TYPE_MEDIAWIKI = 2;
  final private static int TYPE_GOOGLEGADGET = 3;

  private Application app;
  private Kernel kernel;
  private InputPanel textAbove, textBelow;
  private JCheckBox cbShowFrame, cbEnableRightClick, cbEnableLabelDrags, cbShowResetIcon,
          cbShowMenuBar, cbSavePrint, cbShowToolBar, cbShowToolBarHelp, cbShowInputField,
          cbOfflineArchiveAndGgbFile;
  private JComboBox cbFileType;
  private JButton exportButton;
  private GraphicSizePanel sizePanel;
  private boolean useWorksheet = true, kernelChanged = false;     
  private JTabbedPane tabbedPane;
  private GeoGebraPreferences ggbPref;
  private GuiManager guiManager;

  public WorksheetExportDialog(Application app) {
    super(app.getFrame(), true);
    this.app = app;
    kernel = app.getKernel();
   
    ggbPref = GeoGebraPreferences.getPref();
    guiManager = app.getGuiManager();
   
    initGUI();         
  }
   
 
  /**
   * Checks if the EuclidianView has a selected rectangle.
   * In this case we will automatically move the coord system
   * to put the selection rectangle into the upper left
   * corner of the euclidian view.
   */
  private void checkEuclidianView() {
    EuclidianView ev = app.getEuclidianView();
   
    // 1) selection rectangle
    Rectangle rect = ev.getSelectionRectangle();
    if (rect != null) {
      double xZero = ev.getXZero() - rect.x;
      double yZero = ev.getYZero() - rect.y;
      rect.x = 0;
      rect.y = 0;     
      ev.setCoordSystem(xZero, yZero, ev.getXscale(), ev.getYscale(), true);

      // update size panel
      int width = sizePanel.getSelectedWidth() - (ev.getWidth() - rect.width);
      int height = sizePanel.getSelectedHeight() - (ev.getHeight() - rect.height);
      sizePanel.setValues(width, height, false);                       
    }
  }

  private void initGUI() { 
   
    // title, author, date
    TitlePanel tp = new TitlePanel(app);
    ActionListener kernelChangedListener = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        kernelChanged = true;
      }
    };
    tp.addActionListener(kernelChangedListener);
    tp.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

    tabbedPane = new JTabbedPane();
    tabbedPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    tabbedPane.addTab(app.getMenu("General"), createGeneralSettingsTab());
    tabbedPane.addTab(app.getMenu("Advanced"), createAdvancedSettingsTab());

    // Cancel and Export Button
    JButton cancelButton = new JButton(app.getPlain("Cancel"));
    cancelButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        setVisible(false);
      }
    });

    exportButton = new JButton(app.getMenu("Export"));
    exportButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {       
        Thread runner = new Thread() {
          public void run() {
            setVisible(false);
            if (kernelChanged)
              app.storeUndoInfo();
           
            int type = cbFileType.getSelectedIndex();
           
            // index 0 = file + html
            if ( type == TYPE_HTMLFILE)
              exportHTMLtoFile();
            else
              //index 1 = clipboard + html
              // index 2 = clipboard + mediawiki
              // index 3 = clipboard + google gadget
              try {
                exportToClipboard(cbFileType.getSelectedIndex());
               
                if (type == TYPE_GOOGLEGADGET) {
                  // open Google Gadgets Editor
                  app.getGuiManager().showURLinBrowser("http://code.google.com/apis/gadgets/docs/tools.html#GGE");
                }
              } catch (Exception e) {
                  app.showError("SaveFileFailed");
                  Application.debug(e.toString());         
              }
          }
        };
        runner.start();
      }
    });
   
    /*
    JButton clipboardButton = new JButton(app.getMenu("Clipboard"));
    clipboardButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {       
        Thread runner = new Thread() {
          public void run() {
            setVisible(false);
            if (kernelChanged)
              app.storeUndoInfo();
           
            Toolkit toolkit = Toolkit.getDefaultToolkit();
            Clipboard clipboard = toolkit.getSystemClipboard();
            StringSelection stringSelection = new StringSelection(getHTML(null));
            clipboard.setContents(stringSelection, null);

          }
        };
        runner.start();
      }
    });*/
   
   
    JPanel buttonPanel = new JPanel();
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
    buttonPanel.add(Box.createHorizontalGlue());
    buttonPanel.add(exportButton);
    buttonPanel.add(Box.createRigidArea(new Dimension(5, 0)));
    //buttonPanel.add(clipboardButton);
    buttonPanel.add(Box.createRigidArea(new Dimension(5, 0)));
    buttonPanel.add(cancelButton);
   
    getContentPane().setLayout(new BorderLayout());
    getContentPane().add(tp, BorderLayout.NORTH);   
    getContentPane().add(tabbedPane, BorderLayout.CENTER);
    getContentPane().add(buttonPanel, BorderLayout.SOUTH);

    Util.registerForDisposeOnEscape(this);

    setTitle(app.getMenu("Export") + ": "
        + app.getPlain("DynamicWorksheet") + " ("
        + Application.FILE_EXT_HTML + ")");
    setResizable(false);
    centerOnScreen();
  }
 
  private void loadPreferences() {
    try {
     
     
        cbEnableRightClick.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_RIGHT_CLICK, "false")).booleanValue() );
        cbEnableLabelDrags.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_LABEL_DRAGS, "false")).booleanValue() );
        cbShowResetIcon.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_RESET_ICON, "false")).booleanValue() );
        cbShowFrame.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_FRAME_POSSIBLE, "false")).booleanValue() );
       
        cbShowMenuBar.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_SHOW_MENUBAR, "false")).booleanValue() );
        cbSavePrint.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_SAVE_PRINT, "false")).booleanValue() );
       
        cbShowToolBar.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_SHOW_TOOLBAR, "false")).booleanValue() );
        cbShowToolBarHelp.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_SHOW_TOOLBAR_HELP, "false")).booleanValue() );
        cbShowToolBarHelp.setEnabled(cbShowToolBar.isSelected());
       
        cbShowInputField.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            ggbPref.EXPORT_WS_SHOW_INPUT_FIELD, "false")).booleanValue() );
       
        //cbOfflineArchive.setSelected( Boolean.valueOf(ggbPref.loadPreference(
        //    GeoGebraPreferences.EXPORT_WS_OFFLINE_ARCHIVE, "false")).booleanValue() );
        cbOfflineArchiveAndGgbFile.setSelected( Boolean.valueOf(ggbPref.loadPreference(
            GeoGebraPreferences.EXPORT_WS_GGB_FILE, "false")).booleanValue() );
        addHeight();
     
    } catch (Exception e) {
      e.printStackTrace();
    }
    }
 
  private void addHeight() {
    int height = 0;
   
    if (cbShowToolBar.isSelected()) {
      height += guiManager.getToolBarHeight();     
    }
    if (cbShowMenuBar.isSelected()) {
      height += guiManager.getMenuBarHeight();
    }
    if (cbShowInputField.isSelected()) {
      height +=guiManager.getAlgebraInputHeight();
    }
   
    sizePanel.setValues(sizePanel.getSelectedWidth(),
        sizePanel.getSelectedHeight() + height,
        false);
  }
   
    private void savePreferences() {           
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_RIGHT_CLICK, Boolean.toString(cbEnableRightClick.isSelected()));
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_LABEL_DRAGS, Boolean.toString(cbEnableLabelDrags.isSelected()));
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_RESET_ICON, Boolean.toString(cbShowResetIcon.isSelected()));           
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_FRAME_POSSIBLE, Boolean.toString(cbShowFrame.isSelected()));
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_SHOW_MENUBAR, Boolean.toString(cbShowMenuBar.isSelected()));
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_SHOW_TOOLBAR, Boolean.toString(cbShowToolBar.isSelected()));
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_SHOW_TOOLBAR_HELP, Boolean.toString(cbShowToolBarHelp.isSelected()));
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_SHOW_INPUT_FIELD, Boolean.toString(cbShowInputField.isSelected()));   
      //ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_OFFLINE_ARCHIVE, Boolean.toString(cbOfflineArchive.isSelected()));       
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_SAVE_PRINT, Boolean.toString(cbSavePrint.isSelected()));
      ggbPref.savePreference(GeoGebraPreferences.EXPORT_WS_GGB_FILE, Boolean.toString(cbOfflineArchiveAndGgbFile.isSelected()));       
    }

  /**
   * The General Settings Tab contains some of the more general settings.
   */
  private JPanel createGeneralSettingsTab() {
    JPanel tab = new JPanel(new BorderLayout(5, 5));
    tab.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
   
    // text areas
    JPanel centerPanel = new JPanel(new BorderLayout(5, 5));
    JLabel label = new JLabel(app.getPlain("TextBeforeConstruction") + ":");
    textAbove = new InputPanel(null, app, 5, 40, true, true, false);       
    //JScrollPane scrollPane = new JScrollPane(textAbove);

    JPanel p = new JPanel(new BorderLayout());
    p.add(label, BorderLayout.NORTH);
    p.add(textAbove, BorderLayout.CENTER);
    centerPanel.add(p, BorderLayout.NORTH);

    label = new JLabel(app.getPlain("TextAfterConstruction") + ":");
    textBelow = new InputPanel(null, app, 8, 40, true, true, false)
    //scrollPane = new JScrollPane(textBelow);
    p = new JPanel(new BorderLayout());
    p.add(label, BorderLayout.NORTH);
    p.add(textBelow, BorderLayout.CENTER);
    centerPanel.add(p, BorderLayout.SOUTH);

    // set line wrapping
    JTextArea ta =  (JTextArea) textAbove.getTextComponent();
    ta.setLineWrap(true);
    ta.setWrapStyleWord(true);
   
    ta =  (JTextArea) textBelow.getTextComponent();
    ta.setLineWrap(true);
    ta.setWrapStyleWord(true);

    // init text areas
    Construction cons = kernel.getConstruction();
    String text = cons.getWorksheetText(0);
    if (text.length() > 0)
      textAbove.setText(text);
    text = cons.getWorksheetText(1);
    if (text.length() > 0)
      textBelow.setText(text);

    // action listener for radio buttons
    ActionListener lst = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        useWorksheet = cmd.equals("worksheet");
        updateEnabledStates();
      }
    };

    // applet panel:
    // radio buttons for dynamic worksheet and open button
    JPanel appletPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));

    appletPanel.setBorder(BorderFactory.createEtchedBorder());
    ButtonGroup bg = new ButtonGroup();
    JRadioButton rb = new JRadioButton(app.getPlain("DynamicWorksheet"));
    rb.setActionCommand("worksheet");
    rb.addActionListener(lst);
    rb.setSelected(true);
    bg.add(rb);
    appletPanel.add(rb);
   
    appletPanel.add(Box.createHorizontalGlue());

    // open button
    rb = new JRadioButton(app.getPlain("OpenButton"));
    rb.setActionCommand("openButton");
    rb.addActionListener(lst);
    bg.add(rb);     
    appletPanel.add(rb);
   
    centerPanel.add(appletPanel, BorderLayout.CENTER);
    tab.add(centerPanel, BorderLayout.CENTER);   

    return tab;
  }

  private JPanel createAdvancedSettingsTab() {
    JPanel tab = new JPanel();
    tab.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    //tab.setLayout(new BoxLayout(tab, BoxLayout.Y_AXIS));
    tab.setLayout(new BorderLayout(5,5));
       
    // functionality panel
    JPanel funcPanel = new JPanel();
    funcPanel.setBorder(BorderFactory.createTitledBorder(app.getMenu("Functionality")));
    funcPanel.setLayout(new BoxLayout(funcPanel, BoxLayout.Y_AXIS));
    tab.add(funcPanel, BorderLayout.WEST);       
   
    // enable right click
    cbEnableRightClick = new JCheckBox(app.getMenu("EnableRightClick"))
    cbEnableRightClick.setEnabled(true);
    funcPanel.add(cbEnableRightClick)
   

    // enable label drags
    cbEnableLabelDrags = new JCheckBox(app.getMenu("EnableLabelDrags"))
    cbEnableLabelDrags.setEnabled(true);
    funcPanel.add(cbEnableLabelDrags)
   
    // showResetIcon
    cbShowResetIcon = new JCheckBox(app.getMenu("ShowResetIcon"));   
    funcPanel.add(cbShowResetIcon);
   
    // framPossible
    cbShowFrame = new JCheckBox(app.getPlain("DoubleClickToOpen"));   
    funcPanel.add(cbShowFrame);
    funcPanel.add(Box.createVerticalGlue());
   
    // GUI panel
    JPanel guiPanel = new JPanel();
    guiPanel.setLayout(new BoxLayout(guiPanel, BoxLayout.Y_AXIS));
    guiPanel.setBorder(BorderFactory.createTitledBorder(app.getMenu("UserInterface")));
    tab.add(guiPanel, BorderLayout.EAST);
   
    // two columns
    JPanel guiPanelWest = new JPanel();
    guiPanelWest.setLayout(new BoxLayout(guiPanelWest, BoxLayout.Y_AXIS));
    JPanel guiPanelEast = new JPanel();
    guiPanelEast.setLayout(new BoxLayout(guiPanelEast, BoxLayout.Y_AXIS));
    JPanel twoColumns = new JPanel();
    twoColumns.setLayout(new BorderLayout());
    twoColumns.add(guiPanelEast, BorderLayout.EAST);
    twoColumns.add(guiPanelWest, BorderLayout.WEST);
    twoColumns.setAlignmentX(LEFT_ALIGNMENT);
    guiPanel.add(twoColumns);
   
    // left column
    // showMenuBar
    cbShowMenuBar = new JCheckBox(app.getMenu("ShowMenuBar"));   
    guiPanelWest.add(cbShowMenuBar);
    // showToolBar
    cbShowToolBar = new JCheckBox(app.getMenu("ShowToolBar"));   
    guiPanelWest.add(cbShowToolBar);
    // showAlgebraInput
    cbShowInputField = new JCheckBox(app.getMenu("ShowInputField"));
    guiPanelWest.add(cbShowInputField);
   
    // right column
    // save, print
    cbSavePrint = new JCheckBox(app.getMenu("Save") + ", " + app.getMenu("Print"));
    guiPanelEast.add(cbSavePrint);
    // showToolBarHelp       
    cbShowToolBarHelp = new JCheckBox(app.getMenu("ShowToolBarHelp"));
    cbShowToolBarHelp.setEnabled(cbShowToolBar.isSelected());
    guiPanelEast.add(cbShowToolBarHelp);
   
   
    // width and height of applet, info about double clicking
    int width, height;
    JPanel appCP = app.getCenterPanel();
    if (appCP != null) {
      width = appCP.getWidth();
      height = appCP.getHeight();
    } else {
      width = DEFAULT_APPLET_WIDTH;
      height = DEFAULT_APPLET_HEIGHT;
    }   
    sizePanel = new GraphicSizePanel(app, width, height, false);
    sizePanel.setAlignmentX(LEFT_ALIGNMENT);
    guiPanel.add(sizePanel);
   
    // Applet panel
    JPanel appletPanel = new JPanel();
    appletPanel.setBorder(BorderFactory.createTitledBorder(app.getMenu("Files")));
    appletPanel.setLayout(new BoxLayout(appletPanel, BoxLayout.X_AXIS));
    tab.add(appletPanel, BorderLayout.SOUTH);
   
    // ggb file or base64
    cbOfflineArchiveAndGgbFile = new JCheckBox("ggb " + app.getMenu("File") + " & jar " + app.getMenu("Files"));   
    appletPanel.add(cbOfflineArchiveAndGgbFile);
   
    // file type (file/clipboard, mediaWiki)
    String fileTypeStrings[] = {app.getMenu("File")+": html",app.getMenu("Clipboard")+": html",app.getMenu("Clipboard")+": MediaWiki",app.getMenu("Clipboard")+": Google Gadget" };
    cbFileType = new JComboBox(fileTypeStrings);
    cbFileType.setEnabled(true);
    JPanel secondLine2 = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));       
    //secondLine2.add(new JLabel(app.getPlain("AxisLabel") + ":"));
    secondLine2.add(cbFileType);
    appletPanel.add(secondLine2)
   
   
    cbFileType.addActionListener (new ActionListener () {
        public void actionPerformed(ActionEvent e) {
         
          if (exportButton != null)
              if (cbFileType.getSelectedIndex() == TYPE_HTMLFILE) {
                exportButton.setLabel(app.getMenu("Export"));
              }
              else
              {
                exportButton.setLabel(app.getMenu("Clipboard"));
              }
        }
    });

    /*
    // to load a ggb file we need a signed jar (cbSavePrint) or
    // offline jar files
    cbGgbFile.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        if (cbGgbFile.isSelected() && !cbSavePrint.isSelected()) {
          cbOfflineArchive.setSelected(true);
        }
      }
    });
   
    // use archive from geogebra.org?
    cbOfflineArchive = new JCheckBox("jar " + app.getMenu("Files"));
    appletPanel.add(cbOfflineArchive);*/
   
    ActionListener heightChanger = new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        JCheckBox src = (JCheckBox) ae.getSource();       
       
        int heightChange = 0;
        if (src == cbShowToolBar) {
          heightChange = guiManager.getToolBarHeight();
          if (!cbShowToolBarHelp.isSelected())
            cbShowToolBarHelp.setSelected(false);
          cbShowToolBarHelp.setEnabled(cbShowToolBar.isSelected());
        }
        else if (src == cbShowInputField) {
          heightChange = guiManager.getAlgebraInputHeight();
        }
       
        if (!src.isSelected())
          heightChange = -heightChange;
       
        sizePanel.setValues(sizePanel.getSelectedWidth(),
                  sizePanel.getSelectedHeight() + heightChange,
                  false);
      }
    };
   
    cbShowToolBar.addActionListener(heightChanger);
    cbShowMenuBar.addActionListener(heightChanger);
    cbShowInputField.addActionListener(heightChanger);
   
    return tab;
  }
 


  public void setVisible(boolean flag) {
    if (flag) {
      checkEuclidianView();
      loadPreferences();
      super.setVisible(true);
    } else {
      // store the texts of the text ares in
      // the current construction
      Construction cons = kernel.getConstruction();
      cons.setWorksheetText(textAbove.getText(), 0);
      cons.setWorksheetText(textBelow.getText(), 1);
   
      savePreferences();
      super.setVisible(false);
    }   
  }

  private void updateEnabledStates() {       
    tabbedPane.setEnabledAt(1, useWorksheet);
  }

  private void centerOnScreen() {
    pack();
    setLocationRelativeTo(app.getMainComponent());
  }
 
  private void exportToClipboard(int type) throws IOException {
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Clipboard clipboard = toolkit.getSystemClipboard();
    StringSelection stringSelection = null;
   
    switch (type) {
    case TYPE_HTMLCLIPBOARD:
      stringSelection = new StringSelection(getHTML(null));
      break;
     
    case TYPE_MEDIAWIKI:
      stringSelection = new StringSelection(getMediaWiki());
      break;
     
    case TYPE_GOOGLEGADGET:
      stringSelection = new StringSelection(getGoogleGadget());
    break;
    }
   
    clipboard.setContents(stringSelection, null);

  }

  /**
   * Exports construction as html worksheet and returns success state
   */
  private void exportHTMLtoFile() {
    File htmlFile = null;

    File currFile = Application.removeExtension(app.getCurrentFile());
    if (currFile != null)
      htmlFile = Application
          .addExtension(currFile, Application.FILE_EXT_HTML);

    htmlFile = guiManager.showSaveDialog(Application.FILE_EXT_HTML, htmlFile, app
        .getPlain("html")
        + " " + app.getMenu("Files"));
    if (htmlFile == null)
      return;
   
    try {
      // save construction file
      // as worksheet_file.ggb
      File ggbFile = null;
      if (cbOfflineArchiveAndGgbFile.isSelected()) {
        String ggbFileName = Application.removeExtension(htmlFile).getName()
            + ".ggb";
        ggbFile = new File(htmlFile.getParent(), ggbFileName);
        app.getXMLio().writeGeoGebraFile(ggbFile);
      }

      // write html string to file
      FileWriter fw = new FileWriter(htmlFile);
      fw.write(getHTML(ggbFile));
      fw.close();

      final File HTMLfile = htmlFile;
      // copy files and open browser
      Thread runner = new Thread() {
          public void run() {   
            try {
              //copy jar to same directory as ggbFile
              if (cbOfflineArchiveAndGgbFile.isSelected()) { 
                // copy all jar files
                copyJarsTo(getAppletCodebase(), HTMLfile.getParent());
              }
             
              // open html file in browser
              guiManager.showURLinBrowser(HTMLfile.toURL());
            } catch (Exception ex) {     
              app.showError("SaveFileFailed");
              Application.debug(ex.toString());
            }
          }
      };
      runner.start();
           
    } catch (Exception ex) {     
      app.showError("SaveFileFailed");
      Application.debug(ex.toString());
    }
  }
 
  /**
   * Returns the code base for exported applet depending on
   * whether a signed or unsigned applet is needed for the options set.
   */
  private URL getAppletCodebase() {
    URL codebase = app.getCodeBase();
    if (!cbSavePrint.isSelected()) {
      try {
        codebase = new URL(app.getCodeBase(), "unsigned/");
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return codebase;
  }
 
  /**
   * Copies all jar files to the given destination directory.
   */
  public synchronized void copyJarsTo(URL codeBase, String destDir) throws Exception {
    for (int i=0; i < Application.JAR_FILES.length; i++) {
      // jar file
      URL src = new URL(codeBase, Application.JAR_FILES[i]);
      File dest = new File(destDir, Application.JAR_FILES[i]);
      DownloadManager.copyURLToFile(src, dest);
     
      // jar.pack.gz file
//      try {
//        src = new URL(codeBase, Application.JAR_FILES[i] + ".pack.gz");
//        dest = new File(destDir, Application.JAR_FILES[i] + ".pack.gz");
//        DownloadManager.copyURLToFile(src, dest);
//      } catch (Exception e) {
//        System.err.println("could not copy: " + Application.JAR_FILES[i] + ".pack.gz");
//      }
    }
  }
 
//  private void packFile(File jarFile) {
//    Packer packer = Pack200.newPacker();
//   
//      // Initialize the state by setting the desired properties
//      Map p = packer.properties();
//      // take more time choosing codings for better compression
//      p.put(Packer.EFFORT, "7");  // default is "5"
//      // use largest-possible archive segments (>10% better compression).
//      p.put(Packer.SEGMENT_LIMIT, "-1");
//      // reorder files for better compression.
//      p.put(Packer.KEEP_FILE_ORDER, Packer.FALSE);
//      // smear modification times to a single value.
//      p.put(Packer.MODIFICATION_TIME, Packer.LATEST);
//      // ignore all JAR deflation requests,
//      // transmitting a single request to use "store" mode.
//      p.put(Packer.DEFLATE_HINT, Packer.FALSE);
//      // discard debug attributes
//      p.put(Packer.CODE_ATTRIBUTE_PFX+"LineNumberTable", Packer.STRIP);
//      // throw an error if an attribute is unrecognized
//      p.put(Packer.UNKNOWN_ATTRIBUTE, Packer.ERROR);
//
//      try {
//          JarFile jarFile = new JarFile("/tmp/testref.jar");
//          FileOutputStream fos = new FileOutputStream("/tmp/test.pack");
//          // Call the packer
//          packer.pack(jarFile, fos);
//          jarFile.close();
//          fos.close();
//         
//          File f = new File("/tmp/test.pack");
//          FileOutputStream fostream = new FileOutputStream("/tmp/test.jar");
//          JarOutputStream jostream = new JarOutputStream(fostream);
//          Unpacker unpacker = Pack200.newUnpacker();
//          // Call the unpacker
//          unpacker.unpack(f, jostream);
//          // Must explicitly close the output.
//          jostream.close();
//      } catch (IOException ioe) {
//          ioe.printStackTrace();
//      }
//  }
 
  private void appendBase64(StringBuffer sb) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    //try {
      app.getXMLio().writeGeoGebraFile(baos, false);
      sb.append(geogebra.util.Base64.encode(baos.toByteArray(), 0));
    //} catch (IOException e) {
    //  e.printStackTrace();
    //}

  }
 
  /*
   * returns string like this:
   * <ggb_applet width="585" height="470" ggbBase64="UEsDBBQACAAIAMWreDsAAAAAAAAAAAAAAAAMAAAAZ2VvZ2VicmEueG1srVM9b9swEJ2bX0FwbyzZFZAAkoMmU4C0Hdx26EaRZ4k1RQr8sOX++h5JyXYzdyLu3eO7d8dj/TQNihzBOml0Q8v7ghLQ3Aipu4YGv//4QJ+2d3UHpoPWMrI3dmC+oZv7NY14kNu7D7XrzYkwlSg/JZwaumfKASVutMCE6wH8PzgLk1SS2fO39jdw766JLPKqx4BVvA2I8UG8SbeEq1hwb7QnxMk/0NB1EbF6lbzUELiSQjId6yVvSCLkJIXvG1o9VJT0ILse5T6Vj1mNG2PF7uw8DGT6BdagaFnFWZxztMmR40xhwapIqdsoycBxB97j5BxhE7jFfmeluPQXg1f3bNQVGo3U/oWNPtg09c0M7fw56mMpG/1+1p2CGStxKD3wQ2umXZpBucnS389jupL8tN2LUcYSi+1U2Hc3n20+EycavbCKxCkSY9aIopd8+bhOjHS2+UwsJXW2NjdeLl2XxVJGOhKBOEVclmU2irWgGkpJ0NK/LYGX/HDtNPK/hqHFJb1dgYtk+Z8k69W73akPYDWovCEaHzaY4MiRqeXpkg8BXA4Y5sQ8EBYf6wcayKiAzsLiO294HlfKFrdb+A6uV4uJ6MGhV+7xq2I/PvYSf5LvDb7NF8l7Boo8G4urYYWjRDAfKVHk9m76K/N/3v4FUEsHCD5fkJDvAQAAAQQAAFBLAQIUABQACAAIAMWreDs+X5CQ7wEAAAEEAAAMAAAAAAAAAAAAAAAAAAAAAABnZW9nZWJyYS54bWxQSwUGAAAAAAEAAQA6AAAAKQIAAAAA" framePossible = "false" showResetIcon = "true" showAnimationButton = "true" enableRightClick = "false" errorDialogsActive = "true" enableLabelDrags = "false" showMenuBar = "false" showToolBar = "true" showToolBarHelp = "true" showAlgebraInput = "false" />
   * for insertion into MediaWiki
   */
  private String getMediaWiki() throws IOException {
    StringBuffer sb = new StringBuffer();

    sb.append("<ggb_applet width=\"");
    sb.append(sizePanel.getSelectedWidth());
    sb.append("\" height=\"");
    sb.append(sizePanel.getSelectedHeight());
    sb.append("\" ");
   
    // GeoGebra version
    sb.append(" version=\"");
    sb.append(GeoGebra.SHORT_VERSION_STRING);
    sb.append("\" ");

    // base64 encoding
    sb.append("ggbBase64=\"");
    appendBase64(sb);
    /*
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
      app.getXMLio().writeGeoGebraFile(baos, false);
      sb.append(geogebra.util.Base64.encode(baos.toByteArray(), 0));
    } catch (IOException e) {
      e.printStackTrace();
    }*/
    sb.append("\"");
 
    appendGgbAppletParameters(sb, TYPE_MEDIAWIKI)
   
    sb.append(" />");
   
    return sb.toString();
   
  }

  private String getGoogleGadget() throws IOException {
    StringBuffer sb = new StringBuffer();

    sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
    sb.append("<Module>\n");
    sb.append("<ModulePrefs title=\"");
    Construction cons = kernel.getConstruction();
    String title = cons.getTitle();
    if (!title.equals("")) {
      sb.append(Util.toHTMLString(title));
    } else {
      sb.append("GeoGebra Gadget");
    }
    sb.append("\" height=\"");
    sb.append(sizePanel.getSelectedHeight());
    sb.append("\" width=\"");
    sb.append(sizePanel.getSelectedWidth());
    sb.append("\" scrolling=\"false\" ");
    sb.append("author=\"");
    sb.append(Util.toHTMLString(cons.getAuthor()));
    sb.append("\" author_email=\"xxx@google.com\" ");
    sb.append("description=\"GeoGebra applet as a Google-Site gadget\" thumbnail=\"http://www.geogebra.org/static/images/geogebra_logo67x60.png\">\n");
    sb.append("</ModulePrefs>\n");
    sb.append("<Content type=\"html\">\n");
    sb.append("<![CDATA[\n");
    sb.append("<script src=\"http://java.com/js/deployJava.js\">\n");
    sb.append("</script>\n");
    sb.append("<div id='ggbapplet'>\n");
    sb.append("<script>\n");
    sb.append("var jarUrl = \"geogebra.jar\";\n");
    //sb.append("var cachedJarUrl = _IG_GetCachedUrl(jarUrl);\n");

   
    sb.append("deployJava.runApplet({archive:jarUrl, name:\"ggbApplet\", code:\"geogebra.GeoGebraApplet\", codebase:\"");
    sb.append(GeoGebra.GEOGEBRA_ONLINE_ARCHIVE_BASE);
    sb.append("unsigned/");
    sb.append("\", width:\"");
    sb.append(sizePanel.getSelectedWidth());
    sb.append("\", height:\"");
    sb.append(sizePanel.getSelectedHeight());
    sb.append("\",\n");
    //sb.append("filename:\"xxx.ggb\",");
    sb.append("ggbBase64:\"");
    appendBase64(sb);
    sb.append("\",\n");
    //sb.append("java_arguments:\"-Xmx256m\", framePossible:\"true\", showResetIcon:\"true\", showAnimationButton:\"true\", enableRightClick:\"false\", enableLabelDrags:\"true\", showMenuBar:\"false\", showToolBar:\"false\", showToolBarHelp:\"false\", showAlgebraInput:\"false\"});\n");
    appendGgbAppletParameters(sb, TYPE_GOOGLEGADGET);     
    sb.setLength(sb.lastIndexOf(",")); // remove last comma
    sb.append("});\n");

    sb.append("</script>\n");
    sb.append("</div>\n");
    sb.append("]]>\n");
    sb.append("</Content>\n");
    sb.append("</Module>\n");
   
    return sb.toString();
   
  }

  /**
   * Returns a html page with the applet included
   *
   * @param ggbFile
   *            construction File
   */
  private String getHTML(File ggbFile) {
    StringBuffer sb = new StringBuffer();

    // applet width
    int appletWidth, appletHeight;
    if (!useWorksheet) { // change width and height for open button
      appletWidth = BUTTON_WIDTH;
      appletHeight = BUTTON_HEIGHT;
    } else {
      appletWidth = sizePanel.getSelectedWidth();
      appletHeight = sizePanel.getSelectedHeight();
    }

    // width for table
    int pageWidth = Math.max(appletWidth, DEFAULT_HTML_PAGE_WIDTH);
   
    // xhtml header
    // Michael Borcherds 2008-05-01
    // xhtml header
    // The declaration may be optionally omitted because it declares as its encoding the default encoding.
    // and casuses problems on some servers (when short php tags enabled)
    //sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n");
    sb.append("\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n");
    sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");

    sb.append("<head>\n");
    sb.append("<title>");
    Construction cons = kernel.getConstruction();
    String title = cons.getTitle();
    if (!title.equals("")) {
      sb.append(Util.toHTMLString(title));
      sb.append(" - ");
    }
    sb.append(Util.toHTMLString(app.getPlain("ApplicationName") + " "
        + app.getPlain("DynamicWorksheet")));
    sb.append("</title>\n");
    // charset
    sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n");
    // sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />\n");
   
    sb.append("<meta name=\"generator\" content=\"GeoGebra\" />\n");
    String css = app.getSetting("cssDynamicWorksheet");
    if (css != null) {
      sb.append(css);
      sb.append("\n");
    }
    sb.append("</head>\n");

    sb.append("<body>\n");
    sb.append("<table border=\"0\" width=\"" + pageWidth + "\">\n");
    sb.append("<tr><td>\n");

    // header with title
    if (!title.equals("")) {
      sb.append("<h2>");
      sb.append(Util.toHTMLString(title));
      sb.append("</h2>\n");
    }

    // text before applet
    String text = textAbove.getText();
    if (text != null) {
      sb.append("<p>\n");
      sb.append(Util.toHTMLString(text));
      sb.append("</p>\n");
    }

    // includ applet tag
    sb.append("\n\n");
    sb.append(getAppletTag(ggbFile, appletWidth, appletHeight));
    sb.append("\n\n");

    // text after applet
    text = textBelow.getText();
    if (text != null) {
      sb.append("<p>\n");
      sb.append(Util.toHTMLString(text));
      sb.append("</p>\n");
    }

    // footer
    // author and date information for footer
    String author = cons.getAuthor();
    String date = cons.getDate();
    String line = null;
    if (!author.equals("")) {
      line = author;
    }
    if (!date.equals("")) {
      if (line == null)
        line = date;
      else
        line = line + ", " + date;
    }

    sb.append("<p>");
    sb.append("<span style=\"font-size:small\">");
    if (line != null) {
      sb.append(Util.toHTMLString(line));
      sb.append(", ");
    }
    sb.append(guiManager.getCreatedWithHTML());
    sb.append("</span>");
    sb.append("</p>");

    sb.append("</td></tr>\n");
    sb.append("</table>");
    sb.append("</body>\n");
    sb.append("</html>");

    return sb.toString();
  }
 
  private String getAppletTag(File ggbFile, int width, int height) {
    StringBuffer sb = new StringBuffer();
    // include applet
    sb.append("<applet name=\"ggbApplet\" code=\"geogebra.GeoGebraApplet\"");
    // archive geogebra.jar
    sb.append(" archive=\"geogebra.jar\"");
   
   
    if (cbOfflineArchiveAndGgbFile.isSelected()) {
      // codebase for offline applet
      sb.append("\n\tcodebase=\"./\"");
    } else {
      // add codebase for online applets
      sb.append("\n\tcodebase=\"");
      sb.append(GeoGebra.GEOGEBRA_ONLINE_ARCHIVE_BASE);
      if (!cbSavePrint.isSelected() && !cbOfflineArchiveAndGgbFile.isSelected())
        sb.append("unsigned/");
      sb.append("\"");
    }
   
    // width, height
    sb.append("\n\twidth=\"");
    sb.append(width);
    sb.append("\" height=\"");
    sb.append(height);
    // add MAYSCRIPT to ensure ggbOnInit() can be called
    sb.append("\" MAYSCRIPT>\n");

    if (cbOfflineArchiveAndGgbFile.isSelected()) {
      // ggb file
      sb.append("\t<param name=\"filename\" value=\"");
      sb.append(ggbFile.getName());
      sb.append("\"/>\n");   
    } else {
      // base64 encoding
      sb.append("\t<param name=\"ggbBase64\" value=\"");
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      try {
        app.getXMLio().writeGeoGebraFile(baos, false);
        sb.append(geogebra.util.Base64.encode(baos.toByteArray(), 0));
      } catch (IOException e) {
        e.printStackTrace();
      }
      sb.append("\"/>\n");
    }
   
    // loading image for online applet
    if (!cbOfflineArchiveAndGgbFile.isSelected()) {
      sb.append("\t<param name=\"image\" value=\""+ GeoGebra.LOADING_GIF + "\"  />\n");
      sb.append("\t<param name=\"boxborder\" value=\"false\"  />\n");
      sb.append("\t<param name=\"centerimage\" value=\"true\"  />\n");
    }

    if (useWorksheet) {
      appendAllAppletParameters(sb, TYPE_HTMLFILE);     
    } else {// button type
      sb.append("\t<param name=\"type\" value=\"button\"  />\n");
      // white background
      sb.append("\t<param name=\"bgcolor\" value=\"#FFFFFF\"  />\n");
    }

    sb.append("Sorry, the GeoGebra Applet could not be started. Please make sure that ");
    sb.append("Java 1.4.2 (or later) is installed and active in your browser ");
    sb.append("(<a href=\"http://java.sun.com/getjava\">Click here to install Java now</a>)\n");
    sb.append("</applet>");
    return sb.toString();
  }
 
  private void appletParam(StringBuffer sb, String param, boolean value, int type) {
    appletParam(sb, param, value+"", type);
 
  }
  private void appletParam(StringBuffer sb, String param, String value, int type) {
   
    switch (type) {
    case TYPE_MEDIAWIKI:
      sb.append(' ');
      sb.append(param);
      sb.append(" = \"");
      sb.append(value);
      sb.append('\"');
      break;
     
    case TYPE_GOOGLEGADGET:
      sb.append(param);
      sb.append(":\"");
      sb.append(value);
      sb.append("\", ");
     
      break;
     
    default: // HTML file/clipboard
      sb.append("\t<param name=\"");
      sb.append(param);
      sb.append("\" value=\"");
      sb.append(value);
      sb.append("\" />\n");
    }
   
  }
 
  private void appendGgbAppletParameters(StringBuffer sb, int type) {
   
    // framePossible (double click opens GeoGebra window)
    appletParam(sb, "framePossible", cbShowFrame.isSelected(), type);
   
    // showResetIcon
    appletParam(sb, "showResetIcon", cbShowResetIcon.isSelected(), type);
   
    // TODO: implement show animation controls
    appletParam(sb, "showAnimationButton", true, type);
   
    // enable right click
    appletParam(sb, "enableRightClick", cbEnableRightClick.isSelected(), type);
   
    // enable error dialogs
    appletParam(sb, "errorDialogsActive", true, type);// sb.append(cbEnableErrorDialogs.isSelected());
   
    // enable label drags
    appletParam(sb, "enableLabelDrags", cbEnableLabelDrags.isSelected(), type);
   
    // showMenuBar
    appletParam(sb, "showMenuBar", cbShowMenuBar.isSelected(), type);
   
    // showToolBar
    appletParam(sb, "showToolBar", cbShowToolBar.isSelected(), type);
   
    // showToolBarHelp
    appletParam(sb, "showToolBarHelp", cbShowToolBarHelp.isSelected(), type);
   
    // showAlgebraInput
    appletParam(sb, "showAlgebraInput", cbShowInputField.isSelected(), type);
   
  }
 
  StringBuffer sb2 = new StringBuffer();
 
  /**
   * Appends all selected applet parameters
   */
  private void appendAllAppletParameters(StringBuffer sb, int type) {
   
   
    // JVM arguments, for Java 1.6.0_10 and later
    // increase heap memory for applets
    String javaArgs = "-Xmx" + GeoGebra.MAX_HEAP_SPACE + "m";
    // TODO: include pack.gz files in offline export
//    if (cbOfflineArchive.isSelected()) {
//      // look for local pack200 files: jar.pack.gz
//      javaArgs += " -Djnlp.packEnabled=true";
//    }

    //sb.append("\t<param name=\"java_arguments\" value=\"" + javaArgs + "\" />\n");   
    appletParam(sb, "java_arguments", javaArgs, type);
   
    // add caching information to help JVM with faster applet loading
    //sb.append("\t<param name=\"cache_archive\" value=\"");
    sb2.setLength(0);
    for (int i=0; i < Application.JAR_FILES.length; i++) {
      sb2.append(Application.JAR_FILES[i]);
      if (i < Application.JAR_FILES.length-1) sb2.append(", ");
    }
    //sb.append("\" />\n");
   
    appletParam(sb, "cache_archive", sb2.toString(), type);

   
    // cache versions of jar files: if this version is already present on the client
    // then the JVM does not need to connect to the server to compare jar time stamps
    //sb.append("\t<param name=\"cache_version\" value=\"");
    sb2.setLength(0);
    for (int i=0; i < Application.JAR_FILES.length; i++) {
      sb2.append(GeoGebra.VERSION_STRING);
      if (i < Application.JAR_FILES.length-1) sb2.append(", ");
    }
    //sb.append("\" />\n");
    appletParam(sb, "cache_version", sb2.toString(), type);
   
    appendGgbAppletParameters(sb, type);
   
  }

}
TOP

Related Classes of geogebra.export.WorksheetExportDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.