Merge branch 'develop' into features/JAL-2446NCList
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 30 May 2017 09:33:32 +0000 (10:33 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 30 May 2017 09:33:32 +0000 (10:33 +0100)
Conflicts:
src/jalview/appletgui/SeqPanel.java

1  2 
src/jalview/appletgui/SeqPanel.java
src/jalview/gui/SeqPanel.java

@@@ -54,7 -54,6 +54,7 @@@ import java.awt.event.InputEvent
  import java.awt.event.MouseEvent;
  import java.awt.event.MouseListener;
  import java.awt.event.MouseMotionListener;
 +import java.util.List;
  import java.util.Vector;
  
  public class SeqPanel extends Panel implements MouseMotionListener,
          av.setSelectionGroup(null);
        }
  
 -      SequenceFeature[] features = findFeaturesAtRes(sequence,
 +      List<SequenceFeature> features = findFeaturesAtRes(sequence,
                sequence.findPosition(findRes(evt)));
  
 -      if (features != null && features.length > 0)
 +      if (!features.isEmpty())
        {
          SearchResultsI highlight = new SearchResults();
 -        highlight.addResult(sequence, features[0].getBegin(),
 -                features[0].getEnd());
 +        highlight.addResult(sequence, features.get(0).getBegin(), features
 +                .get(0).getEnd());
          seqCanvas.highlightSearchResults(highlight);
 -      }
 -      if (features != null && features.length > 0)
 -      {
 +        SequenceFeature[] featuresArray = features
 +                .toArray(new SequenceFeature[features.size()]);
          seqCanvas.getFeatureRenderer().amendFeatures(
 -                new SequenceI[] { sequence }, features, false, ap);
 +                new SequenceI[] { sequence }, featuresArray, false, ap);
  
          seqCanvas.highlightSearchResults(null);
        }
    @Override
    public void mouseReleased(MouseEvent evt)
    {
+     boolean didDrag = mouseDragging; // did we come here after a drag
      mouseDragging = false;
      mouseWheelPressed = false;
  
      if (!editingSeqs)
      {
-       doMouseReleasedDefineMode(evt);
+       doMouseReleasedDefineMode(evt, didDrag);
        return;
      }
  
       */
      if (respos != -1)
      {
 -      SequenceFeature[] allFeatures = findFeaturesAtRes(sequence,
 -              sequence.findPosition(column));
 -
 -      int index = 0;
 -      while (index < allFeatures.length)
 +      List<SequenceFeature> allFeatures = findFeaturesAtRes(sequence,
 +              respos);
 +      for (SequenceFeature sf : allFeatures)
        {
 -        SequenceFeature sf = allFeatures[index];
 -
          tooltipText.append(sf.getType() + " " + sf.begin + ":" + sf.end);
  
          if (sf.getDescription() != null)
            }
          }
          tooltipText.append("\n");
 -
 -        index++;
        }
      }
  
      }
    }
  
 -  SequenceFeature[] findFeaturesAtRes(SequenceI sequence, int res)
 +  List<SequenceFeature> findFeaturesAtRes(SequenceI sequence, int res)
    {
 -    Vector tmp = new Vector();
 -    SequenceFeature[] features = sequence.getSequenceFeatures();
 -    if (features != null)
 -    {
 -      for (int i = 0; i < features.length; i++)
 -      {
 -        if (av.getFeaturesDisplayed() == null
 -                || !av.getFeaturesDisplayed().isVisible(
 -                        features[i].getType()))
 -        {
 -          continue;
 -        }
 -
 -        if (features[i].featureGroup != null
 -                && !seqCanvas.fr.checkGroupVisibility(
 -                        features[i].featureGroup, false))
 -        {
 -          continue;
 -        }
 -
 -        if ((features[i].getBegin() <= res)
 -                && (features[i].getEnd() >= res))
 -        {
 -          tmp.addElement(features[i]);
 -        }
 -      }
 -    }
 -
 -    features = new SequenceFeature[tmp.size()];
 -    tmp.copyInto(features);
 -
 -    return features;
 +    return seqCanvas.getFeatureRenderer().findFeaturesAtRes(sequence, res);
    }
  
    Tooltip tooltip;
      // DETECT RIGHT MOUSE BUTTON IN AWT
      if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
      {
 -      SequenceFeature[] allFeatures = findFeaturesAtRes(sequence,
 +      List<SequenceFeature> allFeatures = findFeaturesAtRes(sequence,
                sequence.findPosition(res));
  
        Vector<String> links = null;
 -      if (allFeatures != null)
 +      for (int i = 0; i < allFeatures.size(); i++)
        {
 -        for (int i = 0; i < allFeatures.length; i++)
 +        SequenceFeature sf = allFeatures.get(i);
 +        if (sf.links != null)
          {
 -          if (allFeatures[i].links != null)
 +          if (links == null)
            {
 -            if (links == null)
 -            {
 -              links = new Vector<>();
 -            }
 -            for (int j = 0; j < allFeatures[i].links.size(); j++)
 -            {
 -              links.addElement(allFeatures[i].links.elementAt(j));
 -            }
 +            links = new Vector<String>();
            }
 +          links.addAll(sf.links);
          }
        }
        APopupMenu popup = new APopupMenu(ap, null, links);
      }
    }
  
-   public void doMouseReleasedDefineMode(MouseEvent evt)
+   public void doMouseReleasedDefineMode(MouseEvent evt, boolean afterDrag)
    {
      if (stretchGroup == null)
      {
      // but defer colourscheme update until hidden sequences are passed in
      boolean vischange = stretchGroup.recalcConservation(true);
      // here we rely on stretchGroup == av.getSelection()
-     needOverviewUpdate |= vischange && av.isSelectionDefinedGroup();
+     needOverviewUpdate |= vischange && av.isSelectionDefinedGroup()
+             && afterDrag;
      if (stretchGroup.cs != null)
      {
        stretchGroup.cs.alignmentChanged(stretchGroup,
@@@ -84,16 -84,6 +84,16 @@@ public class SeqPanel extends JPanel im
    /** DOCUMENT ME!! */
    public AlignmentPanel ap;
  
 +  /*
 +   * last column position for mouseMoved event
 +   */
 +  private int lastMouseColumn;
 +
 +  /*
 +   * last sequence offset for mouseMoved event
 +   */
 +  private int lastMouseSeq;
 +
    protected int lastres;
  
    protected int startseq;
        ssm.addStructureViewerListener(this);
        ssm.addSelectionListener(this);
      }
 +
 +    lastMouseColumn = -1;
 +    lastMouseSeq = -1;
    }
  
    int startWrapBlock = -1;
    @Override
    public void mouseReleased(MouseEvent evt)
    {
+     boolean didDrag = mouseDragging; // did we come here after a drag
      mouseDragging = false;
      mouseWheelPressed = false;
  
  
      if (!editingSeqs)
      {
-       doMouseReleasedDefineMode(evt);
+       doMouseReleasedDefineMode(evt, didDrag);
        return;
      }
  
      {
        return;
      }
 +    if (column == lastMouseColumn && seq == lastMouseSeq)
 +    {
 +      /*
 +       * just a pixel move without change of residue
 +       */
 +      return;
 +    }
 +    lastMouseColumn = column;
 +    lastMouseSeq = seq;
  
      SequenceI sequence = av.getAlignment().getSequenceAt(seq);
  
      }
      else
      {
 -      if (lastTooltip == null
 -              || !lastTooltip.equals(tooltipText.toString()))
 +      String textString = tooltipText.toString();
 +      if (lastTooltip == null || !lastTooltip.equals(textString))
        {
          String formatedTooltipText = JvSwingUtils.wrapTooltip(true,
 -                tooltipText.toString());
 -        // String formatedTooltipText = tooltipText.toString();
 +                textString);
          setToolTipText(formatedTooltipText);
 -        lastTooltip = tooltipText.toString();
 +        lastTooltip = textString;
        }
 -
      }
 -
    }
  
    private Point lastp = null;
      List<SequenceFeature> allFeatures = ap.getFeatureRenderer()
              .findFeaturesAtRes(sequence.getDatasetSequence(),
                      sequence.findPosition(res));
-     List<String> links = new ArrayList<String>();
+     List<String> links = new ArrayList<>();
      for (SequenceFeature sf : allFeatures)
      {
        if (sf.links != null)
    }
  
    /**
-    * DOCUMENT ME!
+    * Update the display after mouse up on a selection or group
     * 
     * @param evt
-    *          DOCUMENT ME!
+    *          mouse released event details
+    * @param afterDrag
+    *          true if this event is happening after a mouse drag (rather than a
+    *          mouse down)
     */
-   public void doMouseReleasedDefineMode(MouseEvent evt)
+   public void doMouseReleasedDefineMode(MouseEvent evt, boolean afterDrag)
    {
      if (stretchGroup == null)
      {
      // always do this - annotation has own state
      // but defer colourscheme update until hidden sequences are passed in
      boolean vischange = stretchGroup.recalcConservation(true);
-     needOverviewUpdate |= vischange && av.isSelectionDefinedGroup();
+     needOverviewUpdate |= vischange && av.isSelectionDefinedGroup()
+             && afterDrag;
      if (stretchGroup.cs != null)
      {
        stretchGroup.cs.alignmentChanged(stretchGroup,
          ap.getCalculationDialog().validateCalcTypes();
        }
  
-       // process further ?
-       if (!av.followSelection)
-       {
-         return;
-       }
+       return;
+     }
+     // process further ?
+     if (!av.followSelection)
+     {
+       return;
      }
  
      /*