Merge branch 'develop' into trialMerge
[jalview.git] / src / jalview / gui / ScalePanel.java
index 6912a02..9c2b42f 100755 (executable)
@@ -23,7 +23,6 @@ package jalview.gui;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
 import jalview.renderer.ScaleRenderer;
 import jalview.renderer.ScaleRenderer.ScaleMark;
 import jalview.util.MessageManager;
@@ -157,7 +156,12 @@ public class ScalePanel extends JPanel
   protected void rightMouseButtonPressed(MouseEvent evt, final int res)
   {
     JPopupMenu pop = new JPopupMenu();
-    if (reveal != null)
+
+    /*
+     * grab the hidden range in case mouseMoved nulls it
+     */
+    final int[] hiddenRange = reveal;
+    if (hiddenRange != null)
     {
       JMenuItem item = new JMenuItem(
               MessageManager.getString("label.reveal"));
@@ -166,8 +170,9 @@ public class ScalePanel extends JPanel
         @Override
         public void actionPerformed(ActionEvent e)
         {
-          av.showColumn(reveal[0]);
+          av.showColumn(hiddenRange[0]);
           reveal = null;
+          ap.updateLayout();
           ap.paintAlignment(true, true);
           av.sendSelection();
         }
@@ -184,6 +189,7 @@ public class ScalePanel extends JPanel
           {
             av.showAllHiddenColumns();
             reveal = null;
+            ap.updateLayout();
             ap.paintAlignment(true, true);
             av.sendSelection();
           }
@@ -208,6 +214,7 @@ public class ScalePanel extends JPanel
             av.setSelectionGroup(null);
           }
 
+          ap.updateLayout();
           ap.paintAlignment(true, true);
           av.sendSelection();
         }
@@ -236,15 +243,7 @@ public class ScalePanel extends JPanel
     }
 
     av.getColumnSelection().addElement(res);
-    SequenceGroup sg = new SequenceGroup();
-    // try to be as quick as possible
-    SequenceI[] iVec = av.getAlignment().getSequencesArray();
-    for (int i = 0; i < iVec.length; i++)
-    {
-      sg.addSequence(iVec[i], false);
-      iVec[i] = null;
-    }
-    iVec = null;
+    SequenceGroup sg = new SequenceGroup(av.getAlignment().getSequences());
     sg.setStartRes(res);
     sg.setEndRes(res);
 
@@ -273,12 +272,12 @@ public class ScalePanel extends JPanel
   @Override
   public void mouseReleased(MouseEvent evt)
   {
+    boolean wasDragging = mouseDragging;
     mouseDragging = false;
     ap.getSeqPanel().stopScrolling();
 
     // todo res calculation should be a method on AlignViewport
     int xCords = Math.max(0, evt.getX()); // prevent negative X coordinates
-
     int res = (xCords / av.getCharWidth())
             + av.getRanges().getStartRes();
 
@@ -287,7 +286,8 @@ public class ScalePanel extends JPanel
       res = av.getAlignment().getHiddenColumns()
               .visibleToAbsoluteColumn(res);
     }
-    res = Math.min(res, av.getAlignment().getWidth() - 1);
+    res = Math.min(res, av.getRanges().getEndRes());
+    res = Math.max(0, res);
 
     if (!stretchingGroup)
     {
@@ -314,15 +314,26 @@ public class ScalePanel extends JPanel
       {
         sg.setStartRes(res);
       }
+      if (wasDragging)
+      {
+        min = Math.min(res, min);
+        max = Math.max(res, max);
+        av.getColumnSelection().stretchGroup(res, sg, min, max);
+      }
     }
     stretchingGroup = false;
     ap.paintAlignment(false, false);
+    av.isSelectionGroupChanged(true);
+    av.isColSelChanged(true);
     av.sendSelection();
   }
 
   /**
    * Action on dragging the mouse in the scale panel is to expand or shrink the
-   * selection group range (including any hidden columns that it spans)
+   * selection group range (including any hidden columns that it spans). Note
+   * that the selection is only broadcast at the start of the drag (on
+   * mousePressed) and at the end (on mouseReleased), to avoid overload
+   * redrawing of other views.
    * 
    * @param evt
    */