JAL-1432 updated copyright notices
[jalview.git] / src / jalview / gui / SeqPanel.java
index 13527d0..938d48c 100644 (file)
@@ -1,19 +1,20 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+ * Copyright (C) 2014 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- * 
+ *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.gui;
 
@@ -27,6 +28,7 @@ import javax.swing.*;
 
 import jalview.commands.*;
 import jalview.datamodel.*;
+import jalview.io.SequenceAnnotationReport;
 import jalview.schemes.*;
 import jalview.structure.*;
 
@@ -88,6 +90,8 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   java.net.URL linkImageURL;
 
+  private final SequenceAnnotationReport seqARep;
+
   StringBuffer tooltipText = new StringBuffer("<html>");
 
   String tmpString;
@@ -107,6 +111,7 @@ public class SeqPanel extends JPanel implements MouseListener,
   public SeqPanel(AlignViewport av, AlignmentPanel ap)
   {
     linkImageURL = getClass().getResource("/images/link.gif");
+    seqARep = new SequenceAnnotationReport(linkImageURL.toString());
     ToolTipManager.sharedInstance().registerComponent(this);
     ToolTipManager.sharedInstance().setInitialDelay(0);
     ToolTipManager.sharedInstance().setDismissDelay(10000);
@@ -124,7 +129,8 @@ public class SeqPanel extends JPanel implements MouseListener,
       addMouseMotionListener(this);
       addMouseListener(this);
       addMouseWheelListener(this);
-      ssm = StructureSelectionManager.getStructureSelectionManager(Desktop.instance);
+      ssm = StructureSelectionManager
+              .getStructureSelectionManager(Desktop.instance);
       ssm.addStructureViewerListener(this);
       ssm.addSelectionListener(this);
     }
@@ -169,10 +175,11 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
     else
     {
-      if (x>seqCanvas.getWidth()+seqCanvas.getWidth())
+      if (x > seqCanvas.getWidth() + seqCanvas.getWidth())
       {
-        // make sure we calculate relative to visible alignment, rather than right-hand gutter
-        x = seqCanvas.getX()+seqCanvas.getWidth();
+        // make sure we calculate relative to visible alignment, rather than
+        // right-hand gutter
+        x = seqCanvas.getX() + seqCanvas.getWidth();
       }
       res = (x / av.getCharWidth()) + av.getStartRes();
     }
@@ -204,13 +211,13 @@ public class SeqPanel extends JPanel implements MouseListener,
 
       y -= hgap;
 
-      seq = Math.min((y % cHeight) / av.getCharHeight(),
-              av.getAlignment().getHeight() - 1);
+      seq = Math.min((y % cHeight) / av.getCharHeight(), av.getAlignment()
+              .getHeight() - 1);
     }
     else
     {
-      seq = Math.min((y / av.getCharHeight()) + av.getStartSeq(),
-              av.getAlignment().getHeight() - 1);
+      seq = Math.min((y / av.getCharHeight()) + av.getStartSeq(), av
+              .getAlignment().getHeight() - 1);
     }
 
     return seq;
@@ -298,10 +305,9 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   void setCursorPosition()
   {
-    SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(
-            seqCanvas.cursorY);
+    SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
 
-    seqCanvas.cursorX = sequence.findIndex(getKeyboardNo1() - 1);
+    seqCanvas.cursorX = sequence.findIndex(getKeyboardNo1()) - 1;
     scrollToVisible();
   }
 
@@ -309,7 +315,8 @@ public class SeqPanel extends JPanel implements MouseListener,
   {
     seqCanvas.cursorX += dx;
     seqCanvas.cursorY += dy;
-    if (av.hasHiddenColumns() && !av.getColumnSelection().isVisible(seqCanvas.cursorX))
+    if (av.hasHiddenColumns()
+            && !av.getColumnSelection().isVisible(seqCanvas.cursorX))
     {
       int original = seqCanvas.cursorX - dx;
       int maxWidth = av.getAlignment().getWidth();
@@ -393,8 +400,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   void setSelectionAreaAtCursor(boolean topLeft)
   {
-    SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(
-            seqCanvas.cursorY);
+    SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
 
     if (av.getSelectionGroup() != null)
     {
@@ -483,13 +489,14 @@ public class SeqPanel extends JPanel implements MouseListener,
     editSequence(false, false, seqCanvas.cursorX);
     endEditing();
   }
-  
-  void insertNucAtCursor(boolean group,String nuc){
-         groupEditing = group;
-           startseq = seqCanvas.cursorY;
-           lastres = seqCanvas.cursorX;
-           editSequence(false, true, seqCanvas.cursorX + getKeyboardNo1());
-           endEditing();
+
+  void insertNucAtCursor(boolean group, String nuc)
+  {
+    groupEditing = group;
+    startseq = seqCanvas.cursorY;
+    lastres = seqCanvas.cursorX;
+    editSequence(false, true, seqCanvas.cursorX + getKeyboardNo1());
+    endEditing();
   }
 
   void numberPressed(char value)
@@ -511,26 +518,31 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   int getKeyboardNo1()
   {
-    if (keyboardNo1 == null)
-      return 1;
-    else
+    try {
+    if (keyboardNo1 != null) 
     {
       int value = Integer.parseInt(keyboardNo1.toString());
       keyboardNo1 = null;
       return value;
     }
+    } catch (Exception x)
+    {}
+    keyboardNo1 = null;
+    return 1;
   }
 
   int getKeyboardNo2()
   {
-    if (keyboardNo2 == null)
-      return 1;
-    else
-    {
+    try {
+    if (keyboardNo2!=null){
       int value = Integer.parseInt(keyboardNo2.toString());
       keyboardNo2 = null;
       return value;
     }
+    } catch (Exception x)
+    {}
+    keyboardNo2 = null;
+    return 1;
   }
 
   /**
@@ -539,6 +551,7 @@ public class SeqPanel extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     mouseDragging = false;
@@ -559,6 +572,7 @@ public class SeqPanel extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mousePressed(MouseEvent evt)
   {
     lastMousePress = evt.getPoint();
@@ -608,6 +622,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   String lastMessage;
 
+  @Override
   public void mouseOverSequence(SequenceI sequence, int index, int pos)
   {
     String tmp = sequence.hashCode() + " " + index + " " + pos;
@@ -620,18 +635,20 @@ public class SeqPanel extends JPanel implements MouseListener,
     lastMessage = tmp;
   }
 
+  @Override
   public void highlightSequence(SearchResults results)
   {
     if (av.followHighlight)
     {
       if (ap.scrollToPosition(results, false))
       {
-      seqCanvas.revalidate();
+        seqCanvas.revalidate();
       }
     }
     seqCanvas.highlightSearchResults(results);
   }
 
+  @Override
   public void updateColours(SequenceI seq, int index)
   {
     System.out.println("update the seqPanel colours");
@@ -644,6 +661,7 @@ public class SeqPanel extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseMoved(MouseEvent evt)
   {
     if (editingSeqs)
@@ -707,7 +725,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       SequenceFeature[] features = findFeaturesAtRes(
               sequence.getDatasetSequence(),
               rpos = sequence.findPosition(res));
-      appendFeatures(tooltipText, linkImageURL.toString(), rpos, features,
+      seqARep.appendFeatures(tooltipText, rpos, features,
               this.ap.seqPanel.seqCanvas.fr.minmax);
     }
     if (tooltipText.length() == 6) // <html></html>
@@ -753,146 +771,6 @@ public class SeqPanel extends JPanel implements MouseListener,
     return lastp = p;
   }
 
-  /**
-   * appends the features at rpos to the given stringbuffer ready for display in
-   * a tooltip
-   * 
-   * @param tooltipText2
-   * @param linkImageURL
-   * @param rpos
-   * @param features
-   *          TODO refactor to Jalview 'utilities' somehow.
-   */
-  public void appendFeatures(StringBuffer tooltipText2,
-          String linkImageURL, int rpos, SequenceFeature[] features)
-  {
-    appendFeatures(tooltipText2, linkImageURL, rpos, features, null);
-  }
-
-  public void appendFeatures(StringBuffer tooltipText2, String string,
-          int rpos, SequenceFeature[] features, Hashtable minmax)
-  {
-    String tmpString;
-    if (features != null)
-    {
-      for (int i = 0; i < features.length; i++)
-      {
-        if (features[i].getType().equals("disulfide bond"))
-        {
-          if (features[i].getBegin() == rpos
-                  || features[i].getEnd() == rpos)
-          {
-            if (tooltipText2.length() > 6)
-            {
-              tooltipText2.append("<br>");
-            }
-            tooltipText2.append("disulfide bond " + features[i].getBegin()
-                    + ":" + features[i].getEnd());
-            if (features[i].links != null)
-            {
-              tooltipText2.append(" <img src=\"" + linkImageURL + "\">");
-            }
-          }
-        }
-        else
-        {
-          if (tooltipText2.length() > 6)
-          {
-            tooltipText2.append("<br>");
-          }
-          // TODO: remove this hack to display link only features
-          boolean linkOnly = features[i].getValue("linkonly") != null;
-          if (!linkOnly)
-          {
-            tooltipText2.append(features[i].getType() + " ");
-            if (rpos != 0)
-            {
-              // we are marking a positional feature
-              tooltipText2.append(features[i].begin);
-            }
-            if (features[i].begin != features[i].end)
-            {
-              tooltipText2.append(" " + features[i].end);
-            }
-
-            if (features[i].getDescription() != null
-                    && !features[i].description.equals(features[i]
-                            .getType()))
-            {
-              tmpString = features[i].getDescription();
-              String tmp2up=tmpString.toUpperCase();
-              int startTag = tmp2up.indexOf("<HTML>");
-              if (startTag > -1)
-              {
-                tmpString = tmpString.substring(startTag + 6);
-                tmp2up = tmp2up.substring(startTag+6);
-              }
-              int endTag = tmp2up.indexOf("</BODY>");
-              if (endTag > -1)
-              {
-                tmpString = tmpString.substring(0, endTag);
-                tmp2up = tmp2up.substring(0, endTag);
-              }
-              endTag = tmp2up.indexOf("</HTML>");
-              if (endTag > -1)
-              {
-                tmpString = tmpString.substring(0, endTag);
-              }
-
-              if (startTag > -1)
-              {
-                tooltipText2.append("; " + tmpString);
-              }
-              else
-              {
-                if (tmpString.indexOf("<") > -1
-                        || tmpString.indexOf(">") > -1)
-                {
-                  // The description does not specify html is to
-                  // be used, so we must remove < > symbols
-                  tmpString = tmpString.replaceAll("<", "&lt;");
-                  tmpString = tmpString.replaceAll(">", "&gt;");
-
-                  tooltipText2.append("; ");
-                  tooltipText2.append(tmpString);
-
-                }
-                else
-                {
-                  tooltipText2.append("; " + tmpString);
-                }
-              }
-            }
-            // check score should be shown
-            if (features[i].getScore() != Float.NaN)
-            {
-              float[][] rng = (minmax == null) ? null : ((float[][]) minmax
-                      .get(features[i].getType()));
-              if (rng != null && rng[0] != null && rng[0][0] != rng[0][1])
-              {
-                tooltipText2.append(" Score=" + features[i].getScore());
-              }
-            }
-            if (features[i].getValue("status") != null)
-            {
-              String status = features[i].getValue("status").toString();
-              if (status.length() > 0)
-              {
-                tooltipText2.append("; (" + features[i].getValue("status")
-                        + ")");
-              }
-            }
-          }
-          if (features[i].links != null)
-          {
-            tooltipText2.append(" <img src=\"" + linkImageURL + "\">");
-          }
-
-        }
-      }
-    }
-  }
-
   String lastTooltip;
 
   /**
@@ -949,6 +827,7 @@ public class SeqPanel extends JPanel implements MouseListener,
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseDragged(MouseEvent evt)
   {
     if (mouseWheelPressed)
@@ -1022,11 +901,11 @@ public class SeqPanel extends JPanel implements MouseListener,
     if ((res < av.getAlignment().getWidth()) && (res < lastres))
     {
       // dragLeft, delete gap
-      editSequence(false, false,res);
+      editSequence(false, false, res);
     }
     else
     {
-      editSequence(true, false,res);
+      editSequence(true, false, res);
     }
 
     mouseDragging = true;
@@ -1036,8 +915,9 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
   }
 
-  //TODO: Make it more clever than many booleans
-  synchronized void editSequence(boolean insertGap, boolean editSeq, int startres)
+  // TODO: Make it more clever than many booleans
+  synchronized void editSequence(boolean insertGap, boolean editSeq,
+          int startres)
   {
     int fixedLeft = -1;
     int fixedRight = -1;
@@ -1169,7 +1049,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       SequenceI[] groupSeqs = new SequenceI[groupSize];
       for (g = 0; g < groupSeqs.length; g++)
       {
-        groupSeqs[g] = (SequenceI) vseqs.get(g);
+        groupSeqs[g] = vseqs.get(g);
       }
 
       // drag to right
@@ -1214,8 +1094,8 @@ public class SeqPanel extends JPanel implements MouseListener,
         {
           if (sg.getSize() == av.getAlignment().getHeight())
           {
-            if ((av.hasHiddenColumns() && startres < av.getColumnSelection()
-                    .getHiddenBoundaryRight(startres)))
+            if ((av.hasHiddenColumns() && startres < av
+                    .getColumnSelection().getHiddenBoundaryRight(startres)))
             {
               endEditing();
               return;
@@ -1224,7 +1104,8 @@ public class SeqPanel extends JPanel implements MouseListener,
             int alWidth = av.getAlignment().getWidth();
             if (av.hasHiddenRows())
             {
-              int hwidth = av.getAlignment().getHiddenSequences().getWidth();
+              int hwidth = av.getAlignment().getHiddenSequences()
+                      .getWidth();
               if (hwidth > alWidth)
               {
                 alWidth = hwidth;
@@ -1320,59 +1201,63 @@ public class SeqPanel extends JPanel implements MouseListener,
         {
           editCommand.appendEdit(EditCommand.INSERT_GAP, new SequenceI[]
           { seq }, lastres, startres - lastres, av.getAlignment(), true);
-         }
+        }
       }
       else
       {
-       if(!editSeq){
-        // dragging to the left
-        if (fixedColumns && fixedRight != -1)
+        if (!editSeq)
         {
-          for (int j = lastres; j > startres; j--)
+          // dragging to the left
+          if (fixedColumns && fixedRight != -1)
           {
-            if (!jalview.util.Comparison.isGap(seq.getCharAt(startres)))
+            for (int j = lastres; j > startres; j--)
             {
-              endEditing();
-              break;
+              if (!jalview.util.Comparison.isGap(seq.getCharAt(startres)))
+              {
+                endEditing();
+                break;
+              }
+              deleteChar(startres, new SequenceI[]
+              { seq }, fixedRight);
+            }
+          }
+          else
+          {
+            // could be a keyboard edit trying to delete none gaps
+            int max = 0;
+            for (int m = startres; m < lastres; m++)
+            {
+              if (!jalview.util.Comparison.isGap(seq.getCharAt(m)))
+              {
+                break;
+              }
+              max++;
+            }
+
+            if (max > 0)
+            {
+              editCommand.appendEdit(EditCommand.DELETE_GAP,
+                      new SequenceI[]
+                      { seq }, startres, max, av.getAlignment(), true);
             }
-            deleteChar(startres, new SequenceI[]
-            { seq }, fixedRight);
           }
         }
         else
-        {
-          // could be a keyboard edit trying to delete none gaps
-          int max = 0;
-          for (int m = startres; m < lastres; m++)
+        {// insertGap==false AND editSeq==TRUE;
+          if (fixedColumns && fixedRight != -1)
           {
-            if (!jalview.util.Comparison.isGap(seq.getCharAt(m)))
+            for (int j = lastres; j < startres; j++)
             {
-              break;
+              insertChar(j, new SequenceI[]
+              { seq }, fixedRight);
             }
-            max++;
           }
-
-          if (max > 0)
+          else
           {
-            editCommand.appendEdit(EditCommand.DELETE_GAP, new SequenceI[]
-            { seq }, startres, max, av.getAlignment(), true);
+            editCommand.appendEdit(EditCommand.INSERT_NUC, new SequenceI[]
+            { seq }, lastres, startres - lastres, av.getAlignment(), true);
           }
         }
-       }else{//insertGap==false AND editSeq==TRUE;
-               if (fixedColumns && fixedRight != -1)
-            {
-              for (int j = lastres; j < startres; j++)
-              {
-                insertChar(j, new SequenceI[]
-                { seq }, fixedRight);
-              }
-              }
-            else
-            {
-              editCommand.appendEdit(EditCommand.INSERT_NUC, new SequenceI[]
-              { seq }, lastres, startres - lastres, av.getAlignment(), true);
-             }
-       }
       }
     }
 
@@ -1408,16 +1293,16 @@ public class SeqPanel extends JPanel implements MouseListener,
     editCommand.appendEdit(EditCommand.DELETE_GAP, seq, blankColumn, 1,
             av.getAlignment(), true);
 
-    editCommand.appendEdit(EditCommand.INSERT_GAP, seq, j, 1, av.getAlignment(),
-            true);
+    editCommand.appendEdit(EditCommand.INSERT_GAP, seq, j, 1,
+            av.getAlignment(), true);
 
   }
 
   void deleteChar(int j, SequenceI[] seq, int fixedColumn)
   {
 
-    editCommand.appendEdit(EditCommand.DELETE_GAP, seq, j, 1, av.getAlignment(),
-            true);
+    editCommand.appendEdit(EditCommand.DELETE_GAP, seq, j, 1,
+            av.getAlignment(), true);
 
     editCommand.appendEdit(EditCommand.INSERT_GAP, seq, fixedColumn, 1,
             av.getAlignment(), true);
@@ -1429,6 +1314,7 @@ public class SeqPanel extends JPanel implements MouseListener,
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseEntered(MouseEvent e)
   {
     if (oldSeq < 0)
@@ -1449,6 +1335,7 @@ public class SeqPanel extends JPanel implements MouseListener,
    * @param e
    *          DOCUMENT ME!
    */
+  @Override
   public void mouseExited(MouseEvent e)
   {
     if (av.getWrapAlignment())
@@ -1462,6 +1349,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
   }
 
+  @Override
   public void mouseClicked(MouseEvent evt)
   {
     SequenceGroup sg = null;
@@ -1496,16 +1384,32 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
   }
 
+  @Override
   public void mouseWheelMoved(MouseWheelEvent e)
   {
     e.consume();
     if (e.getWheelRotation() > 0)
     {
-      ap.scrollUp(false);
+      if (e.isShiftDown())
+      {
+        ap.scrollRight(true);
+
+      }
+      else
+      {
+        ap.scrollUp(false);
+      }
     }
     else
     {
-      ap.scrollUp(true);
+      if (e.isShiftDown())
+      {
+        ap.scrollRight(false);
+      }
+      else
+      {
+        ap.scrollUp(true);
+      }
     }
     // TODO Update tooltip for new position.
   }
@@ -1537,7 +1441,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       return;
     }
 
-    SequenceI sequence = (Sequence) av.getAlignment().getSequenceAt(seq);
+    SequenceI sequence = av.getAlignment().getSequenceAt(seq);
 
     if ((sequence == null) || (res > sequence.getLength()))
     {
@@ -1672,11 +1576,8 @@ public class SeqPanel extends JPanel implements MouseListener,
                                        // state
     if (stretchGroup.cs != null)
     {
-      if (stretchGroup.cs instanceof ClustalxColourScheme)
-      {
-        ((ClustalxColourScheme) stretchGroup.cs).alignmentChanged(
-                stretchGroup,av.getHiddenRepSequences());
-      }
+      stretchGroup.cs.alignmentChanged(stretchGroup,
+              av.getHiddenRepSequences());
 
       if (stretchGroup.cs.conservationApplied())
       {
@@ -1766,7 +1667,8 @@ public class SeqPanel extends JPanel implements MouseListener,
       dragDirection = -1;
     }
 
-    while ((y != oldSeq) && (oldSeq > -1) && (y < av.getAlignment().getHeight()))
+    while ((y != oldSeq) && (oldSeq > -1)
+            && (y < av.getAlignment().getHeight()))
     {
       // This routine ensures we don't skip any sequences, as the
       // selection is quite slow.
@@ -1857,6 +1759,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       running = false;
     }
 
+    @Override
     public void run()
     {
       running = true;
@@ -1899,6 +1802,7 @@ public class SeqPanel extends JPanel implements MouseListener,
   /**
    * modify current selection according to a received message.
    */
+  @Override
   public void selection(SequenceGroup seqsel, ColumnSelection colsel,
           SelectionSource source)
   {
@@ -1908,7 +1812,8 @@ public class SeqPanel extends JPanel implements MouseListener,
     // shared between viewports.
     if (av == source
             || !av.followSelection
-            || (av.isSelectionGroupChanged(false) || av.isColSelChanged(false))
+            || (av.isSelectionGroupChanged(false) || av
+                    .isColSelChanged(false))
             || (source instanceof AlignViewport && ((AlignViewport) source)
                     .getSequenceSetId().equals(av.getSequenceSetId())))
     {
@@ -1922,7 +1827,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     // if (!av.isSelectionGroupChanged(false))
     {
       SequenceGroup sgroup = null;
-      if (seqsel != null && seqsel.getSize()>0)
+      if (seqsel != null && seqsel.getSize() > 0)
       {
         if (av.getAlignment() == null)
         {
@@ -1960,7 +1865,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         if (av.getColumnSelection() != null)
         {
           av.getColumnSelection().clear();
-          repaint=true;
+          repaint = true;
         }
       }
       else
@@ -1978,8 +1883,10 @@ public class SeqPanel extends JPanel implements MouseListener,
       av.isColSelChanged(true);
       repaint = true;
     }
-    if (copycolsel && av.hasHiddenColumns()
-            && (av.getColumnSelection() == null || av.getColumnSelection().getHiddenColumns() == null))
+    if (copycolsel
+            && av.hasHiddenColumns()
+            && (av.getColumnSelection() == null || av.getColumnSelection()
+                    .getHiddenColumns() == null))
     {
       System.err.println("Bad things");
     }