JAL-3949 - refactor logging from jalview.bin.Cache to jalview.bin.Console
[jalview.git] / src / jalview / gui / AlignmentPanel.java
index 0ea2b8a..5366913 100644 (file)
@@ -24,6 +24,7 @@ import jalview.analysis.AnnotationSorter;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.bin.Cache;
+import jalview.bin.Console;
 import jalview.bin.Jalview;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.HiddenColumns;
@@ -73,9 +74,15 @@ import javax.swing.SwingUtilities;
  * @author $author$
  * @version $Revision: 1.161 $
  */
+@SuppressWarnings("serial")
 public class AlignmentPanel extends GAlignmentPanel implements
         AdjustmentListener, Printable, AlignmentViewPanel, ViewportListenerI
 {
+  /*
+   * spare space in pixels between sequence id and alignment panel
+   */
+  private static final int ID_WIDTH_PADDING = 4;
+
   public AlignViewport av;
 
   OverviewPanel overviewPanel;
@@ -234,8 +241,6 @@ public class AlignmentPanel extends GAlignmentPanel implements
     getAnnotationPanel().adjustPanelHeight();
 
     Dimension d = calculateIdWidth();
-
-    d.setSize(d.width + 4, d.height);
     getIdPanel().getIdCanvas().setPreferredSize(d);
     hscrollFillerPanel.setPreferredSize(d);
 
@@ -243,20 +248,24 @@ public class AlignmentPanel extends GAlignmentPanel implements
   }
 
   /**
-   * Calculate the width of the alignment labels based on the displayed names
-   * and any bounds on label width set in preferences.
+   * Calculates the width of the alignment labels based on the displayed names
+   * and any bounds on label width set in preferences. The calculated width is
+   * also set as a property of the viewport.
    * 
    * @return Dimension giving the maximum width of the alignment label panel
    *         that should be used.
    */
   public Dimension calculateIdWidth()
   {
+    int oldWidth = av.getIdWidth();
+
     // calculate sensible default width when no preference is available
     Dimension r = null;
     if (av.getIdWidth() < 0)
     {
       int afwidth = (alignFrame != null ? alignFrame.getWidth() : 300);
-      int maxwidth = Math.max(20, Math.min(afwidth - 200, 2 * afwidth / 3));
+      int idWidth = Math.min(afwidth - 200, 2 * afwidth / 3);
+      int maxwidth = Math.max(IdwidthAdjuster.MIN_ID_WIDTH, idWidth);
       r = calculateIdWidth(maxwidth);
       av.setIdWidth(r.width);
     }
@@ -266,6 +275,16 @@ public class AlignmentPanel extends GAlignmentPanel implements
       r.width = av.getIdWidth();
       r.height = 0;
     }
+
+    /*
+     * fudge: if desired width has changed, update layout
+     * (see also paintComponent - updates layout on a repaint)
+     */
+    if (r.width != oldWidth)
+    {
+      idPanelHolder.setPreferredSize(r);
+      validate();
+    }
     return r;
   }
 
@@ -278,7 +297,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @return Dimension giving the maximum width of the alignment label panel
    *         that should be used.
    */
-  public Dimension calculateIdWidth(int maxwidth)
+  protected Dimension calculateIdWidth(int maxwidth)
   {
     Container c = new Container();
 
@@ -288,19 +307,13 @@ public class AlignmentPanel extends GAlignmentPanel implements
     AlignmentI al = av.getAlignment();
     int i = 0;
     int idWidth = 0;
-    String id;
 
     while ((i < al.getHeight()) && (al.getSequenceAt(i) != null))
     {
       SequenceI s = al.getSequenceAt(i);
-
-      id = s.getDisplayId(av.getShowJVSuffix());
-
-      if (fm.stringWidth(id) > idWidth)
-      {
-        idWidth = fm.stringWidth(id);
-      }
-
+      String id = s.getDisplayId(av.getShowJVSuffix());
+      int stringWidth = fm.stringWidth(id);
+      idWidth = Math.max(idWidth, stringWidth);
       i++;
     }
 
@@ -314,27 +327,25 @@ public class AlignmentPanel extends GAlignmentPanel implements
       while (i < al.getAlignmentAnnotation().length)
       {
         String label = al.getAlignmentAnnotation()[i].label;
-
-        if (fm.stringWidth(label) > idWidth)
-        {
-          idWidth = fm.stringWidth(label);
-        }
-
+        int stringWidth = fm.stringWidth(label);
+        idWidth = Math.max(idWidth, stringWidth);
         i++;
       }
     }
 
-    return new Dimension(
-            maxwidth < 0 ? idWidth : Math.min(maxwidth, idWidth), 12);
+    int w = maxwidth < 0 ? idWidth : Math.min(maxwidth, idWidth);
+    w += ID_WIDTH_PADDING;
+
+    return new Dimension(w, 12);
   }
 
   /**
-   * Highlight the given results on the alignment.
+   * Highlight the given results on the alignment
    * 
    */
   public void highlightSearchResults(SearchResultsI results)
   {
-    boolean scrolled = scrollToPosition(results, 0, true, false);
+    boolean scrolled = scrollToPosition(results, 0, false);
 
     boolean fastPaint = !(scrolled && av.getWrapAlignment());
 
@@ -346,13 +357,11 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * (if any)
    * 
    * @param searchResults
-   * @param redrawOverview
    * @return
    */
-  public boolean scrollToPosition(SearchResultsI searchResults,
-          boolean redrawOverview)
+  public boolean scrollToPosition(SearchResultsI searchResults)
   {
-    return scrollToPosition(searchResults, 0, redrawOverview, false);
+    return scrollToPosition(searchResults, 0, false);
   }
 
   /**
@@ -365,14 +374,12 @@ public class AlignmentPanel extends GAlignmentPanel implements
    * @param verticalOffset
    *          if greater than zero, allows scrolling to a position below the
    *          first displayed sequence
-   * @param redrawOverview
-   *          - when set, the overview will be recalculated (takes longer)
    * @param centre
    *          if true, try to centre the search results horizontally in the view
    * @return
    */
   protected boolean scrollToPosition(SearchResultsI results,
-          int verticalOffset, boolean redrawOverview, boolean centre)
+          int verticalOffset, boolean centre)
   {
     int startv, endv, starts, ends;
     ViewportRanges ranges = av.getRanges();
@@ -478,7 +485,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
       scrollNeeded = ranges.scrollToWrappedVisible(start);
     }
 
-    paintAlignment(redrawOverview, false);
+    paintAlignment(false, false);
 
     return scrollNeeded;
   }
@@ -537,7 +544,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     addNotify();
     // TODO: many places call this method and also paintAlignment with various
     // different settings. this means multiple redraws are triggered...
-    paintAlignment(true, false);
+    paintAlignment(true, av.needToUpdateStructureViews());
   }
 
   /**
@@ -546,6 +553,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);
@@ -557,6 +573,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();
@@ -642,16 +659,9 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
     else
     {
-      int width = av.getAlignment().getWidth();
+      int width = av.getAlignment().getVisibleWidth();
       int height = av.getAlignment().getHeight();
 
-      if (av.hasHiddenColumns())
-      {
-        // reset the width to exclude hidden columns
-        width = av.getAlignment().getHiddenColumns()
-                .absoluteToVisibleColumn(width);
-      }
-
       hextent = getSeqPanel().seqCanvas.getWidth() / av.getCharWidth();
       vextent = getSeqPanel().seqCanvas.getHeight() / av.getCharHeight();
 
@@ -797,7 +807,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
           // could not be validated and it is not clear if it is now being
           // called. Log warning here in case it is called and unforeseen
           // problems occur
-          Cache.log.warn(
+          Console.warn(
                   "Unexpected path through code: Wrapped jar file opened with wrap alignment set in preferences");
 
           // scroll to start of panel
@@ -836,12 +846,6 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param g
-   *          DOCUMENT ME!
-   */
   @Override
   public void paintComponent(Graphics g)
   {
@@ -964,8 +968,8 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
     final int totalSeq = (pageHeight - scaleHeight) / charHeight - 1;
 
-    final int alignmentWidth = av.getAlignment().getWidth();
-    final int pagesWide = (alignmentWidth / totalRes) + 1;
+    final int alignmentWidth = av.getAlignment().getVisibleWidth();
+    int pagesWide = (alignmentWidth / totalRes) + 1;
 
     final int startRes = (pageIndex % pagesWide) * totalRes;
     final int endRes = Math.min(startRes + totalRes - 1,
@@ -1065,6 +1069,8 @@ public class AlignmentPanel extends GAlignmentPanel implements
   public int printWrappedAlignment(int pageWidth, int pageHeight, int pageNumber,
           Graphics g) throws PrinterException
   {
+    getSeqPanel().seqCanvas.calculateWrappedGeometry(getWidth(),
+            getHeight());
     int annotationHeight = 0;
     if (av.isShowAnnotation())
     {
@@ -1082,15 +1088,11 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
     int idWidth = getVisibleIdWidth(false);
 
-    int maxwidth = av.getAlignment().getWidth();
-    if (av.hasHiddenColumns())
-    {
-      maxwidth = av.getAlignment().getHiddenColumns()
-              .absoluteToVisibleColumn(maxwidth) - 1;
-    }
+    int maxwidth = av.getAlignment().getVisibleWidth();
 
     int resWidth = getSeqPanel().seqCanvas
             .getWrappedCanvasWidth(pageWidth - idWidth);
+    av.getRanges().setViewportStartAndWidth(0, resWidth);
 
     int totalHeight = cHeight * (maxwidth / resWidth + 1);
 
@@ -1102,8 +1104,8 @@ public class AlignmentPanel extends GAlignmentPanel implements
     /*
      * method: print the whole wrapped alignment, but with a clip region that
      * is restricted to the requested page; this supports selective print of 
-     * single  pages or ranges, (at the cost of some repeated processing in 
-     * the 'normal' case, when all pages are printed)
+     * single pages or ranges, (at the cost of repeated processing in the 
+     * 'normal' case, when all pages are printed)
      */
     g.translate(0, -pageNumber * pageHeight);
 
@@ -1150,21 +1152,22 @@ public class AlignmentPanel extends GAlignmentPanel implements
    *          be returned
    * @return
    */
-  public int getVisibleIdWidth(boolean onscreen)
+  protected int getVisibleIdWidth(boolean onscreen)
   {
     // see if rendering offscreen - check preferences and calc width accordingly
     if (!onscreen && Cache.getDefault("FIGURE_AUTOIDWIDTH", false))
     {
-      return calculateIdWidth(-1).width + 4;
+      return calculateIdWidth(-1).width;
     }
-    Integer idwidth = null;
-    if (onscreen || (idwidth = Cache
-            .getIntegerProperty("FIGURE_FIXEDIDWIDTH")) == null)
+    Integer idwidth = onscreen ? null
+            : Cache.getIntegerProperty("FIGURE_FIXEDIDWIDTH");
+    if (idwidth != null)
     {
-      int w = getIdPanel().getWidth();
-      return (w > 0 ? w : calculateIdWidth().width + 4);
+      return idwidth.intValue() + ID_WIDTH_PADDING;
     }
-    return idwidth.intValue() + 4;
+
+    int w = getIdPanel().getWidth();
+    return (w > 0 ? w : calculateIdWidth().width);
   }
 
   /**
@@ -1215,12 +1218,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    */
   public AlignmentDimension getAlignmentDimension()
   {
-    int maxwidth = av.getAlignment().getWidth();
-    if (av.hasHiddenColumns())
-    {
-      maxwidth = av.getAlignment().getHiddenColumns()
-              .absoluteToVisibleColumn(maxwidth);
-    }
+    int maxwidth = av.getAlignment().getVisibleWidth();
 
     int height = ((av.getAlignment().getHeight() + 1) * av.getCharHeight())
             + getScalePanel().getHeight();
@@ -1382,6 +1380,12 @@ public class AlignmentPanel extends GAlignmentPanel implements
 
   }
 
+  /**
+   * Answers the height of the entire alignment in pixels, assuming it is in
+   * wrapped mode
+   * 
+   * @return
+   */
   int getWrappedHeight()
   {
     int seqPanelWidth = getSeqPanel().seqCanvas.getWidth();
@@ -1406,6 +1410,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     int annotationHeight = 0;
     if (av.isShowAnnotation())
     {
+      hgap += SeqCanvas.SEQS_ANNOTATION_GAP;
       annotationHeight = getAnnotationPanel().adjustPanelHeight();
     }
 
@@ -1460,9 +1465,9 @@ public class AlignmentPanel extends GAlignmentPanel implements
     }
     else
     {
-      if (Cache.log.isDebugEnabled())
+      if (Console.isDebugEnabled())
       {
-        Cache.log.warn("Closing alignment panel which is already closed.");
+        Console.warn("Closing alignment panel which is already closed.");
       }
     }
   }
@@ -1537,13 +1542,16 @@ public class AlignmentPanel extends GAlignmentPanel implements
     } catch (Exception ex)
     {
     }
-
     if (b)
     {
-      alignFrame.setDisplayedView(this);
+      setAlignFrameView();
     }
   }
-
+  public void setAlignFrameView()
+  {
+    alignFrame.setDisplayedView(this);
+  }
+  
   @Override
   public StructureSelectionManager getStructureSelectionManager()
   {
@@ -1645,7 +1653,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
    */
   protected void scrollToCentre(SearchResultsI sr, int verticalOffset)
   {
-    scrollToPosition(sr, verticalOffset, true, true);
+    scrollToPosition(sr, verticalOffset, true);
   }
 
   /**
@@ -1732,4 +1740,5 @@ public class AlignmentPanel extends GAlignmentPanel implements
   {
     return calculationDialog;
   }
+
 }