Merge branch 'bug/JAL-2750' into develop
authorJim Procter <jprocter@issues.jalview.org>
Mon, 17 Dec 2018 17:04:56 +0000 (17:04 +0000)
committerJim Procter <jprocter@issues.jalview.org>
Mon, 17 Dec 2018 17:04:56 +0000 (17:04 +0000)
src/jalview/datamodel/SequenceGroup.java
src/jalview/gui/ScalePanel.java
test/jalview/gui/ScalePanelTest.java [new file with mode: 0644]

index 944f263..fc8ac49 100755 (executable)
@@ -102,11 +102,15 @@ public class SequenceGroup implements AnnotatedCollectionI
    */
   public ResidueShaderI cs;
 
-  // start column (base 0)
-  int startRes = 0;
+  /**
+   * start column (base 0)
+   */
+  private int startRes = 0;
 
-  // end column (base 0)
-  int endRes = 0;
+  /**
+   *  end column (base 0)
+   */
+  private int endRes = 0;
 
   public Color outlineColour = Color.black;
 
@@ -209,6 +213,7 @@ public class SequenceGroup implements AnnotatedCollectionI
       displayBoxes = seqsel.displayBoxes;
       displayText = seqsel.displayText;
       colourText = seqsel.colourText;
+      
       startRes = seqsel.startRes;
       endRes = seqsel.endRes;
       cs = new ResidueShader((ResidueShader) seqsel.cs);
@@ -752,13 +757,16 @@ public class SequenceGroup implements AnnotatedCollectionI
   /**
    * Set the first column selected by this group. Runs from 0<=i<N_cols
    * 
-   * @param i
+   * @param newStart
    */
-  public void setStartRes(int i)
+  public void setStartRes(int newStart)
   {
     int before = startRes;
-    startRes = i;
-    changeSupport.firePropertyChange(SEQ_GROUP_CHANGED, before, startRes);
+   startRes= Math.max(0,newStart); // sanity check for negative start column positions
+   changeSupport.firePropertyChange(SEQ_GROUP_CHANGED, before, startRes);
+    
+
+
   }
 
   /**
index e6bba02..6abee08 100755 (executable)
@@ -276,7 +276,9 @@ public class ScalePanel extends JPanel
   {
     mouseDragging = false;
 
-    int res = (evt.getX() / av.getCharWidth())
+    int xCords = Math.max(0, evt.getX()); // prevent negative X coordinates
+
+    int res = (xCords / av.getCharWidth())
             + av.getRanges().getStartRes();
 
     if (av.hasHiddenColumns())
diff --git a/test/jalview/gui/ScalePanelTest.java b/test/jalview/gui/ScalePanelTest.java
new file mode 100644 (file)
index 0000000..91b541c
--- /dev/null
@@ -0,0 +1,58 @@
+package jalview.gui;
+
+import static org.testng.Assert.assertTrue;
+
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+
+import java.awt.event.MouseEvent;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class ScalePanelTest
+{
+  @BeforeClass(alwaysRun = true)
+  public void setUpJvOptionPane()
+  {
+    JvOptionPane.setInteractiveMode(false);
+    JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+  }
+
+  @Test(groups = "Functional")
+  public void testPreventNegativeStartColumn()
+  {
+    SequenceI seq1 = new Sequence("Seq1", "MATRESS");
+    SequenceI seq2 = new Sequence("Seq2", "MADNESS");
+    AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
+    
+    AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
+            al.getHeight());
+    ScalePanel scalePanel = new ScalePanel(
+            alignFrame.getViewport(), alignFrame.alignPanel
+    );
+    
+    MouseEvent mouse = new MouseEvent(
+            scalePanel, 0, 1, 0, 4, 0, 1, false
+    );
+    scalePanel.mousePressed(mouse);
+    scalePanel.mouseDragged(mouse);
+
+    // simulate dragging selection leftwards beyond the sequences giving
+    // negative X
+    mouse = new MouseEvent(scalePanel, 0, 1, 0, -30, 0, 1, false);
+
+    scalePanel.mouseReleased(mouse);
+
+    SequenceGroup sg = scalePanel.av.getSelectionGroup();
+    int startCol = sg.getStartRes();
+
+    assertTrue(startCol >= 0);
+
+
+  }
+
+}