JAL-3541 selectively merged build.gradle and gradle.properties
[jalview.git] / src / jalview / gui / AlignmentPanel.java
index dfe0ffa..45e4b95 100644 (file)
@@ -24,18 +24,21 @@ import jalview.analysis.AnnotationSorter;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.bin.Cache;
+import jalview.bin.Jalview;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.gui.ImageExporter.ImageWriterI;
 import jalview.io.HTMLOutput;
 import jalview.jbgui.GAlignmentPanel;
 import jalview.math.AlignmentDimension;
 import jalview.schemes.ResidueProperties;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.Comparison;
+import jalview.util.ImageMaker;
 import jalview.util.MessageManager;
 import jalview.viewmodel.ViewportListenerI;
 import jalview.viewmodel.ViewportRanges;
@@ -70,6 +73,7 @@ import javax.swing.SwingUtilities;
  * @author $author$
  * @version $Revision: 1.161 $
  */
+@SuppressWarnings("serial")
 public class AlignmentPanel extends GAlignmentPanel implements
         AdjustmentListener, Printable, AlignmentViewPanel, ViewportListenerI
 {
@@ -86,11 +90,8 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
   private IdPanel idPanel;
 
-  private boolean headless;
-
   IdwidthAdjuster idwidthAdjuster;
 
-  /** DOCUMENT ME!! */
   public AlignFrame alignFrame;
 
   private ScalePanel scalePanel;
@@ -121,6 +122,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    */
   public AlignmentPanel(AlignFrame af, final AlignViewport av)
   {
+//     setBackground(Color.white);  // BH 2019
     alignFrame = af;
     this.av = av;
     setSeqPanel(new SeqPanel(av, this));
@@ -233,7 +235,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
             new Dimension(10, av.getCharHeight() + fm.getDescent()));
     idwidthAdjuster.invalidate();
     scalePanelHolder.invalidate();
-    getIdPanel().getIdCanvas().gg = null;
+    // BH 2018 getIdPanel().getIdCanvas().gg = null;
     getSeqPanel().seqCanvas.img = null;
     getAnnotationPanel().adjustPanelHeight();
 
@@ -344,9 +346,9 @@ public class AlignmentPanel extends GAlignmentPanel implements
   {
     boolean scrolled = scrollToPosition(results, 0, false);
 
-    boolean noFastPaint = scrolled && av.getWrapAlignment();
+    boolean fastPaint = !(scrolled && av.getWrapAlignment());
 
-    getSeqPanel().seqCanvas.highlightSearchResults(results, noFastPaint);
+    getSeqPanel().seqCanvas.highlightSearchResults(results, fastPaint);
   }
 
   /**
@@ -550,6 +552,15 @@ public class AlignmentPanel extends GAlignmentPanel implements
    */
   protected void validateAnnotationDimensions(boolean adjustPanelHeight)
   {
+    // BH 2018.04.18 comment: addNotify() is not appropriate here. We
+    // are not changing ancestors, and keyboard action listeners do
+    // not need to be reset. addNotify() is a very expensive operation,
+    // requiring a full re-layout of all parents and children.
+    // Note in JComponent:
+    // This method is called by the toolkit internally and should
+    // not be called directly by programs.
+    // I note that addNotify() is called in several areas of Jalview.
+
     int annotationHeight = getAnnotationPanel().adjustPanelHeight();
     annotationHeight = getAnnotationPanel()
             .adjustForAlignFrame(adjustPanelHeight, annotationHeight);
@@ -561,6 +572,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     Dimension e = idPanel.getSize();
     alabels.setSize(new Dimension(e.width, annotationHeight));
 
+
     annotationSpaceFillerHolder.setPreferredSize(new Dimension(
             annotationSpaceFillerHolder.getWidth(), annotationHeight));
     annotationScroller.validate();
@@ -850,6 +862,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
      */
     ViewportRanges ranges = av.getRanges();
     setScrollValues(ranges.getStartRes(), ranges.getStartSeq());
+    super.paintComponent(g);
   }
 
   /**
@@ -1156,86 +1169,52 @@ public class AlignmentPanel extends GAlignmentPanel implements
     return (w > 0 ? w : calculateIdWidth().width);
   }
 
-  void makeAlignmentImage(jalview.util.ImageMaker.TYPE type, File file)
+  /**
+   * Builds an image of the alignment of the specified type (EPS/PNG/SVG) and
+   * writes it to the specified file
+   * 
+   * @param type
+   * @param file
+   */
+  void makeAlignmentImage(ImageMaker.TYPE type, File file)
   {
-    int boarderBottomOffset = 5;
-    long pSessionId = System.currentTimeMillis();
-    headless = (System.getProperty("java.awt.headless") != null
-            && System.getProperty("java.awt.headless").equals("true"));
-    if (alignFrame != null && !headless)
-    {
-      if (file != null)
-      {
-        alignFrame.setProgressBar(MessageManager
-                .formatMessage("status.saving_file", new Object[]
-                { type.getLabel() }), pSessionId);
-      }
-    }
-    try
+    final int borderBottomOffset = 5;
+
+    AlignmentDimension aDimension = getAlignmentDimension();
+    // todo use a lambda function in place of callback here?
+    ImageWriterI writer = new ImageWriterI()
     {
-      AlignmentDimension aDimension = getAlignmentDimension();
-      try
+      @Override
+      public void exportImage(Graphics graphics) throws Exception
       {
-        jalview.util.ImageMaker im;
-        final String imageAction, imageTitle;
-        if (type == jalview.util.ImageMaker.TYPE.PNG)
-        {
-          imageAction = "Create PNG image from alignment";
-          imageTitle = null;
-        }
-        else if (type == jalview.util.ImageMaker.TYPE.EPS)
-        {
-          imageAction = "Create EPS file from alignment";
-          imageTitle = alignFrame.getTitle();
-        }
-        else
-        {
-          imageAction = "Create SVG file from alignment";
-          imageTitle = alignFrame.getTitle();
-        }
-
-        im = new jalview.util.ImageMaker(this, type, imageAction,
-                aDimension.getWidth(),
-                aDimension.getHeight() + boarderBottomOffset, file,
-                imageTitle, alignFrame, pSessionId, headless);
-        Graphics graphics = im.getGraphics();
         if (av.getWrapAlignment())
         {
-          if (graphics != null)
-          {
-            printWrappedAlignment(aDimension.getWidth(),
-                    aDimension.getHeight() + boarderBottomOffset, 0,
-                    graphics);
-            im.writeImage();
-          }
+          printWrappedAlignment(aDimension.getWidth(),
+                  aDimension.getHeight() + borderBottomOffset, 0, graphics);
         }
         else
         {
-          if (graphics != null)
-          {
-            printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
-                    graphics, graphics);
-            im.writeImage();
-          }
+          printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0,
+                  graphics, graphics);
         }
-
-      } catch (OutOfMemoryError err)
-      {
-        // Be noisy here.
-        System.out.println("########################\n" + "OUT OF MEMORY "
-                + file + "\n" + "########################");
-        new OOMWarning("Creating Image for " + file, err);
-        // System.out.println("Create IMAGE: " + err);
-      } catch (Exception ex)
-      {
-        ex.printStackTrace();
       }
-    } finally
-    {
+    };
 
-    }
+    String fileTitle = alignFrame.getTitle();
+    ImageExporter exporter = new ImageExporter(writer, alignFrame, type,
+            fileTitle);
+    int imageWidth = aDimension.getWidth();
+    int imageHeight = aDimension.getHeight() + borderBottomOffset;
+    String of = MessageManager.getString("label.alignment");
+    exporter.doExport(file, this, imageWidth, imageHeight, of);
   }
 
+  /**
+   * Calculates and returns a suitable width and height (in pixels) for an
+   * exported image
+   * 
+   * @return
+   */
   public AlignmentDimension getAlignmentDimension()
   {
     int maxwidth = av.getAlignment().getVisibleWidth();
@@ -1247,7 +1226,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     if (av.getWrapAlignment())
     {
       height = getWrappedHeight();
-      if (headless)
+      if (Jalview.isHeadlessMode())
       {
         // need to obtain default alignment width and then add in any
         // additional allowance for id margin
@@ -1271,27 +1250,6 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
   }
 
-  /**
-   * DOCUMENT ME!
-   */
-  public void makeEPS(File epsFile)
-  {
-    makeAlignmentImage(jalview.util.ImageMaker.TYPE.EPS, epsFile);
-  }
-
-  /**
-   * DOCUMENT ME!
-   */
-  public void makePNG(File pngFile)
-  {
-    makeAlignmentImage(jalview.util.ImageMaker.TYPE.PNG, pngFile);
-  }
-
-  public void makeSVG(File svgFile)
-  {
-    makeAlignmentImage(jalview.util.ImageMaker.TYPE.SVG, svgFile);
-  }
-
   public void makePNGImageMap(File imgMapFile, String imageName)
   {
     // /////ONLY WORKS WITH NON WRAPPED ALIGNMENTS
@@ -1778,4 +1736,5 @@ public class AlignmentPanel extends GAlignmentPanel implements
   {
     return calculationDialog;
   }
+
 }