Merge branch 'bug/JAL-2034_fix' into develop
authorJim Procter <jprocter@issues.jalview.org>
Thu, 1 Sep 2016 17:44:26 +0000 (18:44 +0100)
committerJim Procter <jprocter@issues.jalview.org>
Thu, 1 Sep 2016 17:44:26 +0000 (18:44 +0100)
1  2 
src/jalview/gui/IdPanel.java
src/jalview/gui/SeqPanel.java

@@@ -26,7 -26,6 +26,7 @@@ import jalview.datamodel.SequenceGroup
  import jalview.datamodel.SequenceI;
  import jalview.io.SequenceAnnotationReport;
  import jalview.util.MessageManager;
 +import jalview.util.Platform;
  import jalview.util.UrlLink;
  import jalview.viewmodel.AlignmentViewport;
  
@@@ -317,22 -316,39 +317,22 @@@ public class IdPanel extends JPanel imp
        return;
      }
  
 -    int seq = alignPanel.getSeqPanel().findSeq(e);
 -
 -    if (e.isPopupTrigger())
 +    if (e.isPopupTrigger()) // Mac reports this in mousePressed
      {
 -      Sequence sq = (Sequence) av.getAlignment().getSequenceAt(seq);
 -      // build a new links menu based on the current links + any non-positional
 -      // features
 -      Vector<String> nlinks = new Vector<String>(
 -              Preferences.sequenceURLLinks);
 -      SequenceFeature sfs[] = sq == null ? null : sq.getSequenceFeatures();
 -      if (sfs != null)
 -      {
 -        for (SequenceFeature sf : sfs)
 -        {
 -          if (sf.begin == sf.end && sf.begin == 0)
 -          {
 -            if (sf.links != null && sf.links.size() > 0)
 -            {
 -              for (int l = 0, lSize = sf.links.size(); l < lSize; l++)
 -              {
 -                nlinks.addElement(sf.links.elementAt(l));
 -              }
 -            }
 -          }
 -        }
 -      }
 -
 -      PopupMenu pop = new PopupMenu(alignPanel, sq, nlinks,
 -              Preferences.getGroupURLLinks());
 -      pop.show(this, e.getX(), e.getY());
 +      showPopupMenu(e);
 +      return;
 +    }
  
 +    /*
 +     * defer right-mouse click handling to mouseReleased on Windows
 +     * (where isPopupTrigger() will answer true)
 +     * NB isRightMouseButton is also true for Cmd-click on Mac
 +     */
 +    if (SwingUtilities.isRightMouseButton(e) && !Platform.isAMac())
 +    {
        return;
      }
 +
      if ((av.getSelectionGroup() == null)
              || (!jalview.util.Platform.isControlDown(e)
                      && !e.isShiftDown() && av.getSelectionGroup() != null))
        av.getSelectionGroup().setEndRes(av.getAlignment().getWidth() - 1);
      }
  
 +    int seq = alignPanel.getSeqPanel().findSeq(e);
      if (e.isShiftDown() && (lastid != -1))
      {
        selectSeqs(lastid, seq);
      {
        selectSeq(seq);
      }
-     // TODO is this addition ok here?
      av.isSelectionGroupChanged(true);
  
      alignPanel.paintAlignment(true);
    }
  
    /**
 +   * Build and show the popup-menu at the right-click mouse position
 +   * 
 +   * @param e
 +   */
 +  void showPopupMenu(MouseEvent e)
 +  {
 +    int seq2 = alignPanel.getSeqPanel().findSeq(e);
 +    Sequence sq = (Sequence) av.getAlignment().getSequenceAt(seq2);
 +    // build a new links menu based on the current links + any non-positional
 +    // features
 +    Vector<String> nlinks = new Vector<String>(
 +            Preferences.sequenceURLLinks);
 +    SequenceFeature sfs[] = sq == null ? null : sq.getSequenceFeatures();
 +    if (sfs != null)
 +    {
 +      for (SequenceFeature sf : sfs)
 +      {
 +        if (sf.begin == sf.end && sf.begin == 0)
 +        {
 +          if (sf.links != null && sf.links.size() > 0)
 +          {
 +            for (int l = 0, lSize = sf.links.size(); l < lSize; l++)
 +            {
 +              nlinks.addElement(sf.links.elementAt(l));
 +            }
 +          }
 +        }
 +      }
 +    }
 +
 +    PopupMenu pop = new PopupMenu(alignPanel, sq, nlinks,
 +            Preferences.getGroupURLLinks());
 +    pop.show(this, e.getX(), e.getY());
 +  }
 +
 +  /**
     * Toggle whether the sequence is part of the current selection group.
     * 
     * @param seq
      PaintRefresher.Refresh(this, av.getSequenceSetId());
      // always send selection message when mouse is released
      av.sendSelection();
 +
 +    if (e.isPopupTrigger()) // Windows reports this in mouseReleased
 +    {
 +      showPopupMenu(e);
 +    }
    }
  
    /**
@@@ -43,7 -43,6 +43,7 @@@ import jalview.structure.VamsasSource
  import jalview.util.Comparison;
  import jalview.util.MappingUtils;
  import jalview.util.MessageManager;
 +import jalview.util.Platform;
  import jalview.viewmodel.AlignmentViewport;
  
  import java.awt.BorderLayout;
@@@ -583,13 -582,6 +583,13 @@@ public class SeqPanel extends JPanel im
      mouseDragging = false;
      mouseWheelPressed = false;
  
 +    if (evt.isPopupTrigger()) // Windows: mouseReleased
 +    {
 +      showPopupMenu(evt);
 +      evt.consume();
 +      return;
 +    }
 +
      if (!editingSeqs)
      {
        doMouseReleasedDefineMode(evt);
     * set if av.getSelectionGroup() refers to a group that is defined on the
     * alignment view, rather than a transient selection
     */
-   private boolean editingDefinedGroup = false;  // TODO: refactor to avcontroller or viewModel
+   // private boolean editingDefinedGroup = false; // TODO: refactor to
+   // avcontroller or viewModel
  
    /**
     * Set status message in alignment panel
     */
    public void doMousePressedDefineMode(MouseEvent evt)
    {
 -    int res = findRes(evt);
 -    int seq = findSeq(evt);
 +    final int res = findRes(evt);
 +    final int seq = findSeq(evt);
      oldSeq = seq;
+     needOverviewUpdate = false;
  
      startWrapBlock = wrappedBlock;
  
                && (res < stretchGroup.getEndRes()))
        {
          av.setSelectionGroup(stretchGroup);
-         editingDefinedGroup = true;
        }
        else
        {
          stretchGroup = null;
-         editingDefinedGroup = false;
        }
      }
      else if (!stretchGroup.getSequences(null).contains(sequence)
                    && (allGroups[i].getEndRes() >= res))
            {
              stretchGroup = allGroups[i];
-             editingDefinedGroup = true;
              break;
            }
          }
        }
  
        av.setSelectionGroup(stretchGroup);
      }
  
 -    if (evt.isPopupTrigger())
 +    if (evt.isPopupTrigger()) // Mac: mousePressed
      {
 -      List<SequenceFeature> allFeatures = ap.getFeatureRenderer()
 -              .findFeaturesAtRes(sequence.getDatasetSequence(),
 -                      sequence.findPosition(res));
 -      List<String> links = new ArrayList<String>();
 -      for (SequenceFeature sf : allFeatures)
 -      {
 -        if (sf.links != null)
 -        {
 -          for (String link : sf.links)
 -          {
 -            links.add(link);
 -          }
 -        }
 -      }
 +      showPopupMenu(evt);
 +      return;
 +    }
  
 -      PopupMenu pop = new PopupMenu(ap, null, links);
 -      pop.show(this, evt.getX(), evt.getY());
 +    /*
 +     * defer right-mouse click handling to mouseReleased on Windows
 +     * (where isPopupTrigger() will answer true)
 +     * NB isRightMouseButton is also true for Cmd-click on Mac
 +     */
 +    if (SwingUtilities.isRightMouseButton(evt) && !Platform.isAMac())
 +    {
        return;
      }
  
        sg.setEndRes(res);
        sg.addSequence(sequence, false);
        av.setSelectionGroup(sg);
-       editingDefinedGroup = false;
        stretchGroup = sg;
  
        if (av.getConservationSelected())
    }
  
    /**
 +   * Build and show a pop-up menu at the right-click mouse position
 +   * 
 +   * @param evt
 +   * @param res
 +   * @param sequence
 +   */
 +  void showPopupMenu(MouseEvent evt)
 +  {
 +    final int res = findRes(evt);
 +    final int seq = findSeq(evt);
 +    SequenceI sequence = av.getAlignment().getSequenceAt(seq);
 +    List<SequenceFeature> allFeatures = ap.getFeatureRenderer()
 +            .findFeaturesAtRes(sequence.getDatasetSequence(),
 +                    sequence.findPosition(res));
 +    List<String> links = new ArrayList<String>();
 +    for (SequenceFeature sf : allFeatures)
 +    {
 +      if (sf.links != null)
 +      {
 +        for (String link : sf.links)
 +        {
 +          links.add(link);
 +        }
 +      }
 +    }
 +
 +    PopupMenu pop = new PopupMenu(ap, null, links);
 +    pop.show(this, evt.getX(), evt.getY());
 +  }
 +
 +  /**
     * DOCUMENT ME!
     * 
     * @param evt
      // always do this - annotation has own state
      // but defer colourscheme update until hidden sequences are passed in
      boolean vischange = stretchGroup.recalcConservation(true);
-     needOverviewUpdate |= vischange && editingDefinedGroup;
+     needOverviewUpdate |= vischange && av.isSelectionDefinedGroup();
      if (stretchGroup.cs != null)
      {
        stretchGroup.cs.alignmentChanged(stretchGroup,
      PaintRefresher.Refresh(this, av.getSequenceSetId());
      ap.paintAlignment(needOverviewUpdate);
      needOverviewUpdate =false;
-     editingDefinedGroup = false;
      changeEndRes = false;
      changeStartRes = false;
      stretchGroup = null;
        if (res > (stretchGroup.getStartRes() - 1))
        {
          stretchGroup.setEndRes(res);
-         needOverviewUpdate |= editingDefinedGroup;
+         needOverviewUpdate |= av.isSelectionDefinedGroup();
        }
      }
      else if (changeStartRes)
        if (res < (stretchGroup.getEndRes() + 1))
        {
          stretchGroup.setStartRes(res);
-         needOverviewUpdate |= editingDefinedGroup;
+         needOverviewUpdate |= av.isSelectionDefinedGroup();
        }
      }
  
        if (stretchGroup.getSequences(null).contains(nextSeq))
        {
          stretchGroup.deleteSequence(seq, false);
-         needOverviewUpdate |= editingDefinedGroup;
+         needOverviewUpdate |= av.isSelectionDefinedGroup();
        }
        else
        {
          }
  
          stretchGroup.addSequence(nextSeq, false);
-         needOverviewUpdate |= editingDefinedGroup;
+         needOverviewUpdate |= av.isSelectionDefinedGroup();
        }
      }