Hidden representatives moved from sequence to viewport
[jalview.git] / src / jalview / gui / AlignmentPanel.java
index 0acf425..4047ac8 100755 (executable)
@@ -1,6 +1,6 @@
 /*\r
  * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
  *\r
  * This program is free software; you can redistribute it and/or\r
  * modify it under the terms of the GNU General Public License\r
@@ -27,10 +27,10 @@ import jalview.schemes.*;
 import java.awt.*;\r
 import java.awt.event.*;\r
 import java.awt.print.*;\r
-\r
 import java.io.*;\r
-\r
 import javax.swing.*;\r
+import java.beans.*;\r
+\r
 \r
 \r
 /**\r
@@ -81,65 +81,55 @@ public class AlignmentPanel extends GAlignmentPanel
     annotationPanel = new AnnotationPanel(this);\r
     alabels = new AnnotationLabels(this);\r
 \r
-\r
     annotationScroller.setViewportView(annotationPanel);\r
     annotationSpaceFillerHolder.add(alabels, BorderLayout.CENTER);\r
 \r
     fontChanged();\r
 \r
     scalePanelHolder.add(scalePanel, BorderLayout.CENTER);\r
-    seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
+   seqPanelHolder.add(seqPanel, BorderLayout.CENTER);\r
 \r
     setScrollValues(0, 0);\r
 \r
-    annotationPanel.adjustPanelHeight();\r
-    annotationSpaceFillerHolder.setPreferredSize(annotationPanel.\r
-                                                 getPreferredSize());\r
-    annotationScroller.setPreferredSize(annotationPanel.\r
-                                        getPreferredSize());\r
     setAnnotationVisible(av.getShowAnnotation());\r
 \r
     hscroll.addAdjustmentListener(this);\r
     vscroll.addAdjustmentListener(this);\r
 \r
-    af.addKeyListener(new KeyAdapter()\r
+    final AlignmentPanel ap = this;\r
+    av.addPropertyChangeListener(new PropertyChangeListener()\r
     {\r
-      public void keyPressed(KeyEvent evt)\r
+      public void propertyChange(PropertyChangeEvent evt)\r
       {\r
-        switch (evt.getKeyCode())\r
+        if (evt.getPropertyName().equals("alignment"))\r
         {\r
-          case 27: // escape key\r
-            av.setSelectionGroup(null);\r
-            repaint();\r
-\r
-            break;\r
+          PaintRefresher.Refresh(ap,\r
+                                 av.getSequenceSetId(),\r
+                                 true,\r
+                                 true);\r
+          alignmentChanged();\r
+        }\r
+      }\r
+      });\r
 \r
-          case KeyEvent.VK_DOWN:\r
-            alignFrame.moveSelectedSequences(false);\r
+    adjustAnnotationHeight();\r
 \r
-            break;\r
+  }\r
 \r
-          case KeyEvent.VK_UP:\r
-            alignFrame.moveSelectedSequences(true);\r
+  public void alignmentChanged()\r
+  {\r
+    av.alignmentChanged(this);\r
 \r
-            break;\r
+    if (overviewPanel != null)\r
+      overviewPanel.updateOverviewImage();\r
 \r
-          case KeyEvent.VK_BACK_SPACE:\r
-          case KeyEvent.VK_DELETE:\r
-            alignFrame.cut_actionPerformed(null);\r
-            break;\r
+    alignFrame.updateEditMenuBar();\r
 \r
-          case KeyEvent.VK_P:\r
-            seqPanel.seqCanvas.increaseAARatio();\r
-            break;\r
-          case KeyEvent.VK_L:\r
-            seqPanel.seqCanvas.decreaseAARation();\r
-            break;\r
-        }\r
-      }\r
-    });\r
+    repaint();\r
   }\r
 \r
+\r
+\r
   /**\r
    * DOCUMENT ME!\r
    */\r
@@ -163,19 +153,6 @@ public class AlignmentPanel extends GAlignmentPanel
     idPanel.idCanvas.setPreferredSize(d);\r
     hscrollFillerPanel.setPreferredSize(d);\r
 \r
-    if (av.getWrapAlignment())\r
-    {\r
-      int max = av.alignment.getWidth() /\r
-          seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
-      vscroll.setMaximum(max);\r
-      vscroll.setUnitIncrement(1);\r
-      vscroll.setVisibleAmount(1);\r
-    }\r
-    else\r
-    {\r
-      setScrollValues(av.getStartRes(), av.getStartSeq());\r
-    }\r
-\r
     if (overviewPanel != null)\r
       overviewPanel.setBoxPosition();\r
 \r
@@ -191,7 +168,9 @@ public class AlignmentPanel extends GAlignmentPanel
   {\r
     Container c = new Container();\r
 \r
-    FontMetrics fm = c.getFontMetrics(av.font);\r
+    FontMetrics fm = c.getFontMetrics(\r
+      new Font(av.font.getName(), Font.ITALIC, av.font.getSize()));\r
+\r
     AlignmentI al = av.getAlignment();\r
 \r
     int i = 0;\r
@@ -262,16 +241,21 @@ public class AlignmentPanel extends GAlignmentPanel
       }\r
       else\r
       {\r
-        int cwidth = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
-        if( start<av.getStartRes() || start>(av.getStartRes()+cwidth) )\r
-        {\r
-          vscroll.setValue(start / cwidth);\r
-          av.startRes = vscroll.getValue() * cwidth;\r
-        }\r
+        scrollToWrappedVisible(start);\r
       }\r
     }\r
   }\r
 \r
+  void scrollToWrappedVisible(int res)\r
+  {\r
+    int cwidth = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
+    if( res<=av.getStartRes() || res>=(av.getStartRes()+cwidth) )\r
+    {\r
+      vscroll.setValue(res / cwidth);\r
+      av.startRes = vscroll.getValue() * cwidth;\r
+    }\r
+  }\r
+\r
   /**\r
    * DOCUMENT ME!\r
    *\r
@@ -307,6 +291,31 @@ public class AlignmentPanel extends GAlignmentPanel
     repaint();\r
   }\r
 \r
+  public void adjustAnnotationHeight()\r
+  {\r
+    if (alignFrame.getHeight() == 0)\r
+    {\r
+      System.out.println("NEEDS FIXING");\r
+    }\r
+\r
+    int height = annotationPanel.adjustPanelHeight();\r
+\r
+    if (height > alignFrame.getHeight() / 2)\r
+    {\r
+      height = alignFrame.getHeight() / 2;\r
+    }\r
+\r
+    annotationScroller.setPreferredSize(\r
+        new Dimension(annotationScroller.getWidth(),\r
+                      height));\r
+\r
+    annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
+        annotationSpaceFillerHolder.getWidth(),\r
+        height));\r
+\r
+    repaint();\r
+  }\r
+\r
   /**\r
    * DOCUMENT ME!\r
    *\r
@@ -373,7 +382,7 @@ public class AlignmentPanel extends GAlignmentPanel
    */\r
   public boolean scrollRight(boolean right)\r
   {\r
-    if (right)\r
+    if (!right)\r
     {\r
       if (hscroll.getValue() < 1)\r
       {\r
@@ -407,30 +416,36 @@ public class AlignmentPanel extends GAlignmentPanel
    */\r
   public void setScrollValues(int x, int y)\r
   {\r
-    av.setEndRes( (x + (seqPanel.seqCanvas.getWidth() / av.getCharWidth())) -\r
-                 1);\r
+\r
+    int width = av.alignment.getWidth();\r
+    int height = av.alignment.getHeight();\r
+\r
+    if(av.hasHiddenColumns)\r
+     width = av.getColumnSelection().findColumnPosition(width);\r
+\r
+    av.setEndRes( (x + (seqPanel.seqCanvas.getWidth() / av.charWidth)) -1);\r
 \r
     hextent = seqPanel.seqCanvas.getWidth() / av.charWidth;\r
     vextent = seqPanel.seqCanvas.getHeight() / av.charHeight;\r
 \r
-    if (hextent > av.alignment.getWidth())\r
+    if (hextent > width)\r
     {\r
-      hextent = av.alignment.getWidth();\r
+      hextent = width;\r
     }\r
 \r
-    if (vextent > av.alignment.getHeight())\r
+    if (vextent > height)\r
     {\r
-      vextent = av.alignment.getHeight();\r
+      vextent = height;\r
     }\r
 \r
-    if ( (hextent + x) > av.getAlignment().getWidth())\r
+    if ( (hextent + x) > width)\r
     {\r
-      x = av.getAlignment().getWidth() - hextent;\r
+      x = width - hextent;\r
     }\r
 \r
-    if ( (vextent + y) > av.getAlignment().getHeight())\r
+    if ( (vextent + y) > height)\r
     {\r
-      y = av.getAlignment().getHeight() - vextent;\r
+      y = height - vextent;\r
     }\r
 \r
     if (y < 0)\r
@@ -443,8 +458,8 @@ public class AlignmentPanel extends GAlignmentPanel
       x = 0;\r
     }\r
 \r
-    hscroll.setValues(x, hextent, 0, av.getAlignment().getWidth());\r
-    vscroll.setValues(y, vextent, 0, av.getAlignment().getHeight());\r
+    hscroll.setValues(x, hextent, 0, width);\r
+    vscroll.setValues(y, vextent, 0, height);\r
   }\r
 \r
   /**\r
@@ -472,10 +487,26 @@ public class AlignmentPanel extends GAlignmentPanel
 \r
       if (av.getWrapAlignment())\r
       {\r
-        int rowSize = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.\r
-            seqCanvas.getWidth());\r
-        av.setStartRes(vscroll.getValue() * rowSize);\r
-        av.setEndRes( (vscroll.getValue() + 1) * rowSize);\r
+        if(offy>-1)\r
+        {\r
+          int rowSize = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.\r
+              seqCanvas.getWidth());\r
+          av.setStartRes(offy * rowSize);\r
+          av.setEndRes( (offy + 1) * rowSize);\r
+        }\r
+        else\r
+        {\r
+          //This is only called if file loaded is a jar file that\r
+          //was wrapped when saved and user has wrap alignment true\r
+          //as preference setting\r
+          SwingUtilities.invokeLater(new Runnable()\r
+              {\r
+                public void run()\r
+                {\r
+                  setScrollValues(av.getStartRes(), av.getStartSeq());\r
+                }\r
+              });\r
+        }\r
       }\r
       else\r
       {\r
@@ -537,23 +568,31 @@ public class AlignmentPanel extends GAlignmentPanel
 \r
     if (av.getWrapAlignment())\r
     {\r
-      int max = av.alignment.getWidth() /\r
-          seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth()) +1;\r
-      vscroll.setMaximum(max);\r
-      vscroll.setUnitIncrement(1);\r
-      vscroll.setVisibleAmount(1);\r
+      int maxwidth = av.alignment.getWidth();\r
+\r
+      if (av.hasHiddenColumns)\r
+        maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+\r
+      int canvasWidth = seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());\r
+            if(canvasWidth>0)\r
+      {\r
+        int max = maxwidth /\r
+            seqPanel.seqCanvas.getWrappedCanvasWidth(seqPanel.seqCanvas.\r
+            getWidth()) +\r
+            1;\r
+        vscroll.setMaximum(max);\r
+        vscroll.setUnitIncrement(1);\r
+        vscroll.setVisibleAmount(1);\r
+      }\r
     }\r
     else\r
     {\r
       setScrollValues(av.getStartRes(), av.getStartSeq());\r
     }\r
 \r
-\r
-    if( this.getVisibleRect().getBounds() == g.getClipBounds() )\r
-    {\r
-      if (overviewPanel != null)\r
+    if( this.getVisibleRect().getBounds() == g.getClipBounds()\r
+        && overviewPanel != null)\r
         overviewPanel.updateOverviewImage();\r
-    }\r
   }\r
 \r
   /**\r
@@ -600,7 +639,7 @@ public class AlignmentPanel extends GAlignmentPanel
   public int printUnwrapped(Graphics pg, int pwidth, int pheight, int pi)\r
       throws PrinterException\r
   {\r
-    int idWidth = calculateIdWidth().width + 4;\r
+    int idWidth = getVisibleIdWidth();\r
     FontMetrics fm = getFontMetrics(av.getFont());\r
     int scaleHeight = av.charHeight + fm.getDescent();\r
 \r
@@ -675,18 +714,19 @@ public class AlignmentPanel extends GAlignmentPanel
     pg.setFont(new Font(av.getFont().getName(),\r
                         Font.ITALIC,\r
                         av.getFont().getSize()));\r
+    SequenceI seq;\r
     for (int i = startSeq; i < endSeq; i++)\r
     {\r
+      seq = av.getAlignment().getSequenceAt(i);\r
       if ( (av.getSelectionGroup() != null) &&\r
-          av.getSelectionGroup().sequences.contains(\r
-              av.getAlignment().getSequenceAt(i)))\r
+          av.getSelectionGroup().getSequences(null).contains(seq))\r
       {\r
         currentColor = Color.gray;\r
         currentTextColor = Color.black;\r
       }\r
       else\r
       {\r
-        currentColor = av.getAlignment().getSequenceAt(i).getColor();\r
+        currentColor = av.getSequenceColour(seq);\r
         currentTextColor = Color.black;\r
       }\r
 \r
@@ -696,10 +736,17 @@ public class AlignmentPanel extends GAlignmentPanel
 \r
       pg.setColor(currentTextColor);\r
 \r
-      String string = av.getAlignment().getSequenceAt(i).getDisplayId\r
-          ( av.getShowJVSuffix());\r
+      int xPos = 0;\r
+      if (av.rightAlignIds)\r
+      {\r
+        fm = pg.getFontMetrics();\r
+        xPos = idWidth - fm.stringWidth(\r
+            seq.getDisplayId(av.getShowJVSuffix())\r
+            ) - 4;\r
+      }\r
 \r
-      pg.drawString(string, 0,\r
+      pg.drawString(seq.getDisplayId( av.getShowJVSuffix()),\r
+                    xPos,\r
                     ( ( (i - startSeq) * av.charHeight) + av.getCharHeight()) -\r
                     (av.getCharHeight() / 5));\r
     }\r
@@ -755,12 +802,17 @@ public class AlignmentPanel extends GAlignmentPanel
         + hgap\r
         + annotationHeight;\r
 \r
-    int idWidth = calculateIdWidth().width + 4;\r
+    int idWidth = getVisibleIdWidth();\r
+\r
+    int maxwidth = av.alignment.getWidth();\r
+    if (av.hasHiddenColumns)\r
+      maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+\r
 \r
     int resWidth = seqPanel.seqCanvas.getWrappedCanvasWidth(pwidth -\r
         idWidth);\r
 \r
-    int totalHeight = cHeight * (av.alignment.getWidth() / resWidth + 1);\r
+    int totalHeight = cHeight * (maxwidth / resWidth + 1);\r
 \r
     pg.setColor(Color.white);\r
     pg.fillRect(0, 0, pwidth, pheight);\r
@@ -785,8 +837,13 @@ public class AlignmentPanel extends GAlignmentPanel
       {\r
         SequenceI s = av.alignment.getSequenceAt(i);\r
         String string = s.getDisplayId( av.getShowJVSuffix());\r
-\r
-        pg.drawString(string, 0,\r
+        int xPos = 0;\r
+        if (av.rightAlignIds)\r
+        {\r
+          FontMetrics fm = getFontMetrics(italic);\r
+          xPos = idWidth - fm.stringWidth( string ) - 4;\r
+        }\r
+        pg.drawString(string, xPos,\r
                       ( (i * av.charHeight) + ypos + av.charHeight) -\r
                       (av.charHeight / 5));\r
       }\r
@@ -823,26 +880,42 @@ public class AlignmentPanel extends GAlignmentPanel
     }\r
   }\r
 \r
+  int getVisibleIdWidth()\r
+  {\r
+    return\r
+        idPanel.getWidth() > 0 ? idPanel.getWidth() :\r
+        calculateIdWidth().width + 4;\r
+  }\r
+\r
   void makeAlignmentImage(int type, File file)\r
   {\r
-    int height = ( (av.alignment.getHeight() + 1) * av.charHeight) + 30;\r
-    int width = idPanel.getWidth() + (av.alignment.getWidth() * av.charWidth);\r
+    int maxwidth = av.alignment.getWidth();\r
+    if (av.hasHiddenColumns)\r
+      maxwidth = av.getColumnSelection().findColumnPosition(maxwidth);\r
 \r
-    if (idPanel.getWidth() == 0)\r
-    {\r
-      width += calculateIdWidth().getWidth() + 4;\r
-    }\r
+    int height = ( (av.alignment.getHeight() + 1) * av.charHeight) + 30;\r
+    int width = getVisibleIdWidth() + (maxwidth * av.charWidth);\r
 \r
     if (av.getWrapAlignment())\r
     {\r
       height = getWrappedHeight();\r
-      width = seqPanel.getWidth() + idPanel.getWidth();\r
+      if (System.getProperty("java.awt.headless") != null\r
+          && System.getProperty("java.awt.headless").equals("true"))\r
+      {\r
+        width = alignFrame.getWidth() - 22;\r
+      }\r
+      else\r
+        width = seqPanel.getWidth() + getVisibleIdWidth();\r
+\r
     }\r
     else if (av.getShowAnnotation())\r
     {\r
       height += annotationPanel.adjustPanelHeight() + 3;\r
     }\r
 \r
+    try\r
+    {\r
+\r
     jalview.util.ImageMaker im;\r
     if(type==jalview.util.ImageMaker.PNG)\r
       im  = new jalview.util.ImageMaker(this,\r
@@ -855,8 +928,6 @@ public class AlignmentPanel extends GAlignmentPanel
                                        "Create EPS file from alignment",\r
                                         width, height, file, alignFrame.getTitle() );\r
 \r
-    try\r
-    {\r
       if (av.getWrapAlignment())\r
       {\r
         if(im.getGraphics()!=null)\r
@@ -915,7 +986,7 @@ public class AlignmentPanel extends GAlignmentPanel
   {\r
     ///////ONLY WORKS WITH NONE WRAPPED ALIGNMENTS\r
     //////////////////////////////////////////////\r
-    int idWidth = calculateIdWidth().width + 4;\r
+    int idWidth = getVisibleIdWidth();\r
     FontMetrics fm = getFontMetrics(av.getFont());\r
     int scaleHeight = av.charHeight + fm.getDescent();\r
 \r
@@ -1009,9 +1080,9 @@ public class AlignmentPanel extends GAlignmentPanel
                       if (features[f].getDescription() != null && !features[f].getType().equals(features[f].getDescription()))\r
                         text.append(" " + features[f].getDescription());\r
 \r
-                      if (features[f].getStatus() != null && features[f].getStatus().length()>0)\r
+                      if (features[f].getValue("status") != null )\r
                       {\r
-                        text.append(" (" + features[f].getStatus() + ")");\r
+                        text.append(" (" + features[f].getValue("status") + ")");\r
                       }\r
                     }\r
                   }\r
@@ -1039,9 +1110,18 @@ public class AlignmentPanel extends GAlignmentPanel
 \r
   int getWrappedHeight()\r
   {\r
+    int seqPanelWidth = seqPanel.seqCanvas.getWidth();\r
+\r
+    //If headless, seqPanel will have 0 width\r
+    if (System.getProperty("java.awt.headless") != null\r
+              && System.getProperty("java.awt.headless").equals("true"))\r
+    {\r
+      seqPanelWidth = alignFrame.getWidth() - getVisibleIdWidth();\r
+    }\r
 \r
     int chunkWidth = seqPanel.seqCanvas.getWrappedCanvasWidth(\r
-        seqPanel.seqCanvas.getWidth());\r
+        seqPanelWidth\r
+          );\r
 \r
     int hgap = av.charHeight;\r
     if (av.scaleAboveWrapped)\r
@@ -1057,7 +1137,12 @@ public class AlignmentPanel extends GAlignmentPanel
         + hgap\r
         + annotationHeight;\r
 \r
-    int height = ( (av.alignment.getWidth() / chunkWidth) + 1) * cHeight;\r
+    int maxwidth = av.alignment.getWidth();\r
+    if (av.hasHiddenColumns)\r
+      maxwidth = av.getColumnSelection().findColumnPosition(maxwidth) - 1;\r
+\r
+\r
+    int height = ( (maxwidth / chunkWidth) + 1) * cHeight;\r
 \r
     return height;\r
   }\r