JAL-1503 update version in GPL header
[jalview.git] / src / jalview / gui / SeqPanel.java
index 8d81f8c..904b856 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.1)
+ * 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
+ * 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
+ *  
+ * 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;
 
@@ -30,10 +31,11 @@ import jalview.datamodel.*;
 import jalview.io.SequenceAnnotationReport;
 import jalview.schemes.*;
 import jalview.structure.*;
+import jalview.util.MessageManager;
 
 /**
  * DOCUMENT ME!
- *
+ * 
  * @author $author$
  * @version $Revision: 1.130 $
  */
@@ -88,7 +90,9 @@ public class SeqPanel extends JPanel implements MouseListener,
   StringBuffer keyboardNo2;
 
   java.net.URL linkImageURL;
+
   private final SequenceAnnotationReport seqARep;
+
   StringBuffer tooltipText = new StringBuffer("<html>");
 
   String tmpString;
@@ -99,7 +103,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * Creates a new SeqPanel object.
-   *
+   * 
    * @param avp
    *          DOCUMENT ME!
    * @param p
@@ -108,7 +112,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());
+    seqARep = new SequenceAnnotationReport(linkImageURL.toString());
     ToolTipManager.sharedInstance().registerComponent(this);
     ToolTipManager.sharedInstance().setInitialDelay(0);
     ToolTipManager.sharedInstance().setDismissDelay(10000);
@@ -126,7 +130,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       addMouseMotionListener(this);
       addMouseListener(this);
       addMouseWheelListener(this);
-      ssm = StructureSelectionManager.getStructureSelectionManager(Desktop.instance);
+      ssm = av.getStructureSelectionManager();
       ssm.addStructureViewerListener(this);
       ssm.addSelectionListener(this);
     }
@@ -171,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();
     }
@@ -206,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;
@@ -300,10 +305,9 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   void setCursorPosition()
   {
-    SequenceI 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();
   }
 
@@ -311,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();
@@ -395,8 +400,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   void setSelectionAreaAtCursor(boolean topLeft)
   {
-    SequenceI sequence = av.getAlignment().getSequenceAt(
-            seqCanvas.cursorY);
+    SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
 
     if (av.getSelectionGroup() != null)
     {
@@ -486,12 +490,13 @@ public class SeqPanel extends JPanel implements MouseListener,
     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)
@@ -513,31 +518,36 @@ 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;
   }
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param evt
    *          DOCUMENT ME!
    */
@@ -558,7 +568,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param evt
    *          DOCUMENT ME!
    */
@@ -632,7 +642,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     {
       if (ap.scrollToPosition(results, false))
       {
-      seqCanvas.revalidate();
+        seqCanvas.revalidate();
       }
     }
     seqCanvas.highlightSearchResults(results);
@@ -647,7 +657,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param evt
    *          DOCUMENT ME!
    */
@@ -715,7 +725,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       SequenceFeature[] features = findFeaturesAtRes(
               sequence.getDatasetSequence(),
               rpos = sequence.findPosition(res));
-      seqARep.appendFeatures(tooltipText,  rpos, features,
+      seqARep.appendFeatures(tooltipText, rpos, features,
               this.ap.seqPanel.seqCanvas.fr.minmax);
     }
     if (tooltipText.length() == 6) // <html></html>
@@ -761,12 +771,11 @@ public class SeqPanel extends JPanel implements MouseListener,
     return lastp = p;
   }
 
-
   String lastTooltip;
 
   /**
    * Set status message in alignment panel
-   *
+   * 
    * @param sequence
    *          aligned sequence object
    * @param res
@@ -814,7 +823,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param evt
    *          DOCUMENT ME!
    */
@@ -892,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;
@@ -906,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;
@@ -1084,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;
@@ -1094,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;
@@ -1190,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);
-             }
-       }
       }
     }
 
@@ -1278,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);
@@ -1295,7 +1310,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param e
    *          DOCUMENT ME!
    */
@@ -1316,7 +1331,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param e
    *          DOCUMENT ME!
    */
@@ -1378,8 +1393,10 @@ public class SeqPanel extends JPanel implements MouseListener,
       if (e.isShiftDown())
       {
         ap.scrollRight(true);
-        
-      } else {
+
+      }
+      else
+      {
         ap.scrollUp(false);
       }
     }
@@ -1388,7 +1405,9 @@ public class SeqPanel extends JPanel implements MouseListener,
       if (e.isShiftDown())
       {
         ap.scrollRight(false);
-      } else {
+      }
+      else
+      {
         ap.scrollUp(true);
       }
     }
@@ -1397,7 +1416,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param evt
    *          DOCUMENT ME!
    */
@@ -1412,8 +1431,8 @@ public class SeqPanel extends JPanel implements MouseListener,
     if (av.wrapAlignment && seq > av.getAlignment().getHeight())
     {
       JOptionPane.showInternalMessageDialog(Desktop.desktop,
-              "Cannot edit annotations in wrapped view.",
-              "Wrapped view - no edit", JOptionPane.WARNING_MESSAGE);
+              MessageManager.getString("label.cannot_edit_annotations_in_wrapped_view"),
+              MessageManager.getString("label.wrapped_view_no_edit"), JOptionPane.WARNING_MESSAGE);
       return;
     }
 
@@ -1542,7 +1561,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param evt
    *          DOCUMENT ME!
    */
@@ -1557,8 +1576,8 @@ public class SeqPanel extends JPanel implements MouseListener,
                                        // state
     if (stretchGroup.cs != null)
     {
-      stretchGroup.cs.alignmentChanged(
-                stretchGroup,av.getHiddenRepSequences());
+      stretchGroup.cs.alignmentChanged(stretchGroup,
+              av.getHiddenRepSequences());
 
       if (stretchGroup.cs.conservationApplied())
       {
@@ -1582,7 +1601,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @param evt
    *          DOCUMENT ME!
    */
@@ -1648,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.
@@ -1792,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())))
     {
@@ -1806,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)
         {
@@ -1844,7 +1865,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         if (av.getColumnSelection() != null)
         {
           av.getColumnSelection().clear();
-          repaint=true;
+          repaint = true;
         }
       }
       else
@@ -1862,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");
     }