Merge branch 'features/JAL-1738_JAL-345_selectionfromhighlight' into develop
[jalview.git] / src / jalview / gui / AlignmentPanel.java
index 4db029c..235c81f 100644 (file)
@@ -25,7 +25,7 @@ import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
-import jalview.datamodel.SearchResults;
+import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
@@ -297,7 +297,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * Highlight the given results on the alignment.
    * 
    */
-  public void highlightSearchResults(SearchResults results)
+  public void highlightSearchResults(SearchResultsI results)
   {
     scrollToPosition(results);
     getSeqPanel().seqCanvas.highlightSearchResults(results);
@@ -309,7 +309,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * 
    * @param results
    */
-  public boolean scrollToPosition(SearchResults results)
+  public boolean scrollToPosition(SearchResultsI results)
   {
     return scrollToPosition(results, 0, true, false);
   }
@@ -322,7 +322,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @param redrawOverview
    * @return
    */
-  public boolean scrollToPosition(SearchResults searchResults,
+  public boolean scrollToPosition(SearchResultsI searchResults,
           boolean redrawOverview)
   {
     return scrollToPosition(searchResults, 0, redrawOverview, false);
@@ -342,7 +342,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    *          if true, try to centre the search results horizontally in the view
    * @return false if results were not found
    */
-  public boolean scrollToPosition(SearchResults results,
+  public boolean scrollToPosition(SearchResultsI results,
           int verticalOffset, boolean redrawOverview, boolean centre)
   {
     int startv, endv, starts, ends;
@@ -956,11 +956,11 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
     if (av.getWrapAlignment())
     {
-      return printWrappedAlignment(pg, pwidth, pheight, pi);
+      return printWrappedAlignment(pwidth, pheight, pi, pg);
     }
     else
     {
-      return printUnwrapped(pg, pwidth, pheight, pi);
+      return printUnwrapped(pwidth, pheight, pi, pg);
     }
   }
 
@@ -981,16 +981,28 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @throws PrinterException
    *           DOCUMENT ME!
    */
-  public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi)
+  public int printUnwrapped(int pwidth, int pheight, int pi,
+          Graphics... pg)
           throws PrinterException
   {
+    boolean isMultiGraphics = pg.length > 1;
+    int G0 = 0; // Graphic index of idPanel graphics in multi-graphics mode or
+                // entire graphics for non mulit-graphics mode
+    int G1 = 0; // Graphic index of alignmentPanel graphics for multi-graphics
+                // mode
+    if (isMultiGraphics)
+    {
+      G0 = 0;
+      G1 = 1;
+    }
+
     int idWidth = getVisibleIdWidth(false);
     FontMetrics fm = getFontMetrics(av.getFont());
     int scaleHeight = av.getCharHeight() + fm.getDescent();
 
-    pg.setColor(Color.white);
-    pg.fillRect(0, 0, pwidth, pheight);
-    pg.setFont(av.getFont());
+    pg[G0].setColor(Color.white);
+    pg[G0].fillRect(0, 0, pwidth, pheight);
+    pg[G0].setFont(av.getFont());
 
     // //////////////////////////////////
     // / How many sequences and residues can we fit on a printable page?
@@ -1047,17 +1059,31 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
 
     // draw Scale
-    pg.translate(idWidth, 0);
-    getScalePanel().drawScale(pg, startRes, endRes, pwidth - idWidth,
-            scaleHeight);
-    pg.translate(-idWidth, scaleHeight);
+    if (isMultiGraphics)
+    {
+      pg[G1].translate(0, 0);
+      getScalePanel().drawScale(pg[G1], startRes, endRes,
+              pwidth - idWidth, scaleHeight);
+      pg[G1].translate(-idWidth, scaleHeight);
+    }
+    else
+    {
+      pg[G0].translate(idWidth, 0);
+      getScalePanel().drawScale(pg[G0], startRes, endRes, pwidth - idWidth,
+              scaleHeight);
+      pg[G0].translate(-idWidth, scaleHeight);
+    }
 
     // //////////////
     // Draw the ids
     Color currentColor = null;
     Color currentTextColor = null;
 
-    pg.setFont(getIdPanel().getIdCanvas().getIdfont());
+    if (isMultiGraphics)
+    {
+      pg[G0].translate(0, scaleHeight);
+    }
+    pg[G0].setFont(getIdPanel().getIdCanvas().getIdfont());
 
     SequenceI seq;
     for (int i = startSeq; i < endSeq; i++)
@@ -1075,45 +1101,70 @@ public class AlignmentPanel extends GAlignmentPanel implements
         currentTextColor = Color.black;
       }
 
-      pg.setColor(currentColor);
-      pg.fillRect(0, (i - startSeq) * av.getCharHeight(), idWidth,
+      pg[G0].setColor(currentColor);
+      pg[G0].fillRect(0, (i - startSeq) * av.getCharHeight(), idWidth,
               av.getCharHeight());
 
-      pg.setColor(currentTextColor);
+      pg[G0].setColor(currentTextColor);
 
       int xPos = 0;
       if (av.isRightAlignIds())
       {
-        fm = pg.getFontMetrics();
+        fm = pg[G0].getFontMetrics();
         xPos = idWidth
                 - fm.stringWidth(seq.getDisplayId(av.getShowJVSuffix()))
                 - 4;
       }
 
-      pg.drawString(seq.getDisplayId(av.getShowJVSuffix()), xPos,
+      pg[G0].drawString(seq.getDisplayId(av.getShowJVSuffix()), xPos,
               (((i - startSeq) * av.getCharHeight()) + av.getCharHeight())
                       - (av.getCharHeight() / 5));
     }
 
-    pg.setFont(av.getFont());
+    pg[G0].setFont(av.getFont());
+
 
     // draw main sequence panel
-    pg.translate(idWidth, 0);
-    getSeqPanel().seqCanvas.drawPanel(pg, startRes, endRes, startSeq,
-            endSeq, 0);
+    pg[G0].translate(idWidth, 0);
+    if (isMultiGraphics)
+    {
+      pg[G1].translate(idWidth, 0);
+      getSeqPanel().seqCanvas.drawPanel(pg[G1], startRes, endRes,
+              startSeq, endSeq, 0);
+    }
+    else
+    {
+      getSeqPanel().seqCanvas.drawPanel(pg[G0], startRes, endRes, startSeq,
+              endSeq, 0);
+    }
 
     if (av.isShowAnnotation() && (endSeq == av.getAlignment().getHeight()))
     {
-      // draw annotation - need to offset for current scroll position
+      // draw annotation label - need to offset for current scroll position
       int offset = -getAlabels().getScrollOffset();
-      pg.translate(0, offset);
-      pg.translate(-idWidth - 3, (endSeq - startSeq) * av.getCharHeight()
-              + 3);
-      getAlabels().drawComponent(pg, idWidth);
-      pg.translate(idWidth + 3, 0);
-      getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(), av,
-              pg, -1, startRes, endRes + 1);
-      pg.translate(0, -offset);
+      pg[G0].translate(0, offset);
+      pg[G0].translate(-idWidth - 3,
+              (endSeq - startSeq) * av.getCharHeight() + 3);
+      getAlabels().drawComponent(pg[G0], idWidth);
+      pg[G0].translate(idWidth + 3, 0);
+      pg[G0].translate(0, -offset);
+      if (isMultiGraphics)
+      {
+        // draw annotation - need to offset for current scroll position
+        // pg[G1].translate(0, offset);
+        pg[G1].translate(-idWidth - 3,
+                (endSeq - startSeq) * av.getCharHeight() + 3);
+        pg[G1].translate(idWidth + 3, 0);
+        getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(),
+                av, pg[G1], -1, startRes, endRes + 1);
+        pg[G1].translate(0, -offset);
+      }
+      else
+      {
+        getAnnotationPanel().renderer.drawComponent(getAnnotationPanel(),
+                av, pg[G0], -1, startRes, endRes + 1);
+        pg[G0].translate(0, -offset);
+      }
     }
 
     return Printable.PAGE_EXISTS;
@@ -1136,8 +1187,8 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @throws PrinterException
    *           DOCUMENT ME!
    */
-  public int printWrappedAlignment(Graphics pg, int pwidth, int pheight,
-          int pi) throws PrinterException
+  public int printWrappedAlignment(int pwidth, int pheight, int pi,
+          Graphics pg) throws PrinterException
   {
     int annotationHeight = 0;
     AnnotationLabels labels = null;
@@ -1316,8 +1367,9 @@ public class AlignmentPanel extends GAlignmentPanel implements
         {
           if (im.getGraphics() != null)
           {
-            printWrappedAlignment(im.getGraphics(), aDimension.getWidth(),
-                    aDimension.getHeight() + boarderBottomOffset, 0);
+            printWrappedAlignment(aDimension.getWidth(),
+                    aDimension.getHeight() + boarderBottomOffset, 0,
+                    im.getGraphics());
             im.writeImage();
           }
         }
@@ -1325,8 +1377,8 @@ public class AlignmentPanel extends GAlignmentPanel implements
         {
           if (im.getGraphics() != null)
           {
-            printUnwrapped(im.getGraphics(), aDimension.getWidth(),
-                    aDimension.getHeight(), 0);
+            printUnwrapped(aDimension.getWidth(), aDimension.getHeight(),
+                    0, im.getGraphics());
             im.writeImage();
           }
         }
@@ -1788,14 +1840,14 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @param verticalOffset
    *          the number of visible sequences to show above the mapped region
    */
-  public void scrollToCentre(SearchResults sr, int verticalOffset)
+  public void scrollToCentre(SearchResultsI sr, int verticalOffset)
   {
     /*
      * To avoid jumpy vertical scrolling (if some sequences are gapped or not
      * mapped), we can make the scroll-to location a sequence above the one
      * actually mapped.
      */
-    SequenceI mappedTo = sr.getResultSequence(0);
+    SequenceI mappedTo = sr.getResults().get(0).getSequence();
     List<SequenceI> seqs = av.getAlignment().getSequences();
 
     /*