JAL-2322 Refactored unified architecture for data + html exporting for SVG & BioJS...
[jalview.git] / src / jalview / io / HtmlSvgOutput.java
index e6e698c..e60824a 100644 (file)
  */
 package jalview.io;
 
-import jalview.api.AlignExportSettingI;
-import jalview.api.FeatureRenderer;
-import jalview.datamodel.AlignmentExportData;
-import jalview.gui.AlignViewport;
 import jalview.gui.AlignmentPanel;
 import jalview.gui.HTMLOptions;
-import jalview.gui.IProgressIndicator;
 import jalview.gui.OOMWarning;
 import jalview.math.AlignmentDimension;
 import jalview.util.MessageManager;
@@ -40,67 +35,34 @@ import java.io.IOException;
 import org.jfree.graphics2d.svg.SVGGraphics2D;
 import org.jfree.graphics2d.svg.SVGHints;
 
-public class HtmlSvgOutput
+public class HtmlSvgOutput extends HTMLOutput
 {
-  AlignViewport av;
 
-  FeatureRenderer fr;
-
-  AlignmentPanel ap;
-
-  private IProgressIndicator pIndicator;
-
-  private long pSessionId;
-
-  private boolean headless;
+  private File generatedFile;
 
   public HtmlSvgOutput(AlignmentPanel ap)
   {
-    this.av = ap.av;
-    this.ap = ap;
-    fr = ap.cloneFeatureRenderer();
+    super(ap);
   }
 
-  public void generateHtmlSvgOutput(File file)
+  @Override
+  public void exportHTML(String file)
   {
-    pIndicator = ap.alignFrame;
-    pSessionId = System.currentTimeMillis();
+    exportStarted();
     try
     {
-      headless = (System.getProperty("java.awt.headless") != null && System
-              .getProperty("java.awt.headless").equals("true"));
       if (file == null)
       {
-        setProgressMessage(MessageManager.formatMessage(
-                "status.waiting_for_user_to_select_output_file", "HTML"));
-        JalviewFileChooser chooser = getHTMLChooser();
-        chooser.setFileView(new jalview.io.JalviewFileView());
-        chooser.setDialogTitle(ap.alignFrame.getTitle());
-        chooser.setToolTipText(MessageManager.getString("action.save"));
-        int value = chooser.showSaveDialog(ap.alignFrame);
-
-        if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION)
-        {
-          jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser
-                  .getSelectedFile().getParent());
-          file = chooser.getSelectedFile();
-          ap.alignFrame.repaint();
-        }
-        else
-        {
-          setProgressMessage(MessageManager.formatMessage(
-                  "status.cancelled_image_export_operation", "HTML"));
-          return;
-        }
+        file = getOutputFile();
       }
+      generatedFile = new File(file);
     } catch (Exception e)
     {
-      pIndicator.setProgressBar(MessageManager.formatMessage(
-              "info.error_creating_file", "HTML"), pSessionId);
+      setProgressMessage(MessageManager.formatMessage(
+              "info.error_creating_file", "HTML"));
       e.printStackTrace();
       return;
     }
-    final File fileX = file;
     new Thread()
     {
       @Override
@@ -125,8 +87,7 @@ public class HtmlSvgOutput
           // If we need to prompt, and if the GUI is visible then
           // Prompt for rendering style
           if (renderStyle.equalsIgnoreCase("Prompt each time")
-                  && !(System.getProperty("java.awt.headless") != null && System
-                          .getProperty("java.awt.headless").equals("true")))
+                  && !isHeadless())
           {
             HTMLOptions svgOption = new HTMLOptions();
             renderStyle = svgOption.getValue();
@@ -147,7 +108,7 @@ public class HtmlSvgOutput
                     SVGHints.KEY_DRAW_STRING_TYPE,
                     SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR);
           }
-          if (av.getWrapAlignment())
+          if (ap.av.getWrapAlignment())
           {
             printWrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
                     alignPanelGraphics);
@@ -160,82 +121,25 @@ public class HtmlSvgOutput
 
           String idPanelSvgData = idPanelGraphics.getSVGDocument();
           String alignPanelSvgData = alignPanelGraphics.getSVGDocument();
-          String jsonData = null;
-          boolean isEmbbedBioJSON = Boolean.valueOf(jalview.bin.Cache
-                  .getDefault("EXPORT_EMBBED_BIOJSON", "true"));
-          if (isEmbbedBioJSON)
-          {
-            AlignExportSettingI exportSettings = new AlignExportSettingI()
-            {
-              @Override
-              public boolean isExportHiddenSequences()
-              {
-                return true;
-              }
-
-              @Override
-              public boolean isExportHiddenColumns()
-              {
-                return true;
-              }
-
-              @Override
-              public boolean isExportAnnotations()
-              {
-                return true;
-              }
-
-              @Override
-              public boolean isExportFeatures()
-              {
-                return true;
-              }
-
-              @Override
-              public boolean isExportGroups()
-              {
-                return true;
-              }
-
-              @Override
-              public boolean isCancelled()
-              {
-                return false;
-              }
-
-            };
-            AlignmentExportData exportData = jalview.gui.AlignFrame
-                    .getAlignmentForExport(JSONFile.FILE_DESC, av,
-                            exportSettings);
-            jsonData = new FormatAdapter(ap, exportData.getSettings())
-                    .formatSequences(JSONFile.FILE_DESC,
-                            exportData.getAlignment(),
-                            exportData.getOmitHidden(),
-                            exportData.getStartEndPostions(),
-                            av.getColumnSelection());
-          }
+          String jsonData = getBioJSONData();
           String htmlData = getHtml(idPanelSvgData, alignPanelSvgData, jsonData,
-                  av.getWrapAlignment());
-          FileOutputStream out = new FileOutputStream(fileX);
+ ap.av.getWrapAlignment());
+          FileOutputStream out = new FileOutputStream(generatedFile);
           out.write(htmlData.getBytes());
           out.flush();
           out.close();
-          if (!(System.getProperty("java.awt.headless") != null && System
-                  .getProperty("java.awt.headless").equals("true")))
-          {
-            jalview.util.BrowserLauncher.openURL("file:///" + fileX);
-          }
+          exportCompleted();
         } catch (OutOfMemoryError err)
         {
           System.out.println("########################\n"
-                  + "OUT OF MEMORY " + fileX + "\n"
+                  + "OUT OF MEMORY " + generatedFile + "\n"
                   + "########################");
-          new OOMWarning("Creating Image for " + fileX, err);
+          new OOMWarning("Creating Image for " + generatedFile, err);
         } catch (Exception e)
         {
           e.printStackTrace();
-          pIndicator.setProgressBar(MessageManager.formatMessage(
-                  "info.error_creating_file", "HTML"), pSessionId);
+          setProgressMessage(MessageManager.formatMessage(
+                  "info.error_creating_file", "HTML"));
         }
         setProgressMessage(MessageManager.formatMessage(
                 "status.export_complete", "HTML"));
@@ -244,17 +148,6 @@ public class HtmlSvgOutput
 
   }
 
-  private void setProgressMessage(String message)
-  {
-    if (pIndicator != null && !headless)
-    {
-      pIndicator.setProgressBar(message, pSessionId);
-    }
-    else
-    {
-      System.out.println(message);
-    }
-  }
 
   static JalviewFileChooser getHTMLChooser()
   {
@@ -383,7 +276,7 @@ public class HtmlSvgOutput
       File faceBoxJsFile = new File("examples/javascript/facebox-1.3.js");
       try
       {
-        htmlSvg.append(HtmlFile.readFileAsString(faceBoxJsFile));
+        htmlSvg.append(HTMLOutput.readFileAsString(faceBoxJsFile));
       } catch (IOException e)
       {
         e.printStackTrace();
@@ -394,4 +287,23 @@ public class HtmlSvgOutput
     htmlSvg.append("</html>");
     return htmlSvg.toString();
   }
+
+  @Override
+  public boolean isEmbedData()
+  {
+    return Boolean.valueOf(jalview.bin.Cache.getDefault(
+            "EXPORT_EMBBED_BIOJSON", "true"));
+  }
+
+  @Override
+  public boolean isLaunchInBrowserAfterExport()
+  {
+    return true;
+  }
+
+  @Override
+  public File getExportedFile()
+  {
+    return generatedFile;
+  }
 }