Merge branch 'Release_2_8_1_Branch' into JAL-1372_referenceseq
authorJim Procter <jprocter@dundee.ac.uk>
Fri, 2 May 2014 10:10:28 +0000 (11:10 +0100)
committerJim Procter <jprocter@dundee.ac.uk>
Fri, 2 May 2014 10:10:28 +0000 (11:10 +0100)
Conflicts:
src/jalview/appletgui/APopupMenu.java
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/SequenceCollectionI.java
src/jalview/gui/AlignFrame.java

resolved without functionality change

12 files changed:
resources/lang/Messages.properties
src/jalview/api/AlignViewportI.java
src/jalview/appletgui/APopupMenu.java
src/jalview/appletgui/IdCanvas.java
src/jalview/appletgui/SequenceRenderer.java
src/jalview/datamodel/Alignment.java
src/jalview/datamodel/SequenceCollectionI.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/IdCanvas.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/SequenceRenderer.java
src/jalview/viewmodel/AlignmentViewport.java

index 906db68..7edc787 100644 (file)
@@ -57,6 +57,8 @@ action.by_pairwise_id = by Pairwise Identity
 action.by_id = by Id\r
 action.by_length = by Length\r
 action.by_group = by Group\r
+action.unmark_as_reference = Unmark as Reference \r
+action.set_as_reference = Set as Reference \r
 action.remove = Remove\r
 action.remove_redundancy = Remove Redundancy...\r
 action.pairwise_alignment = Pairwise Alignments...\r
index 44fef0e..74466a1 100644 (file)
@@ -160,6 +160,29 @@ public interface AlignViewportI
    */
   void updateGroupAnnotationSettings(boolean applyGlobalSettings,
           boolean preserveNewGroupSettings);
+  
+  /**
+   * @return true if a reference sequence is set and should be displayed
+   */
+  public boolean isDisplayReferenceSeq();
+
+  /**
+   * @return set the flag for displaying reference sequences when they are
+   *         available
+   */
+  public void setDisplayReferenceSeq(boolean displayReferenceSeq);
+
+  /**
+   * @return true if colourschemes should render according to reference sequence
+   *         rather than consensus if available
+   */
+  public boolean isColourByReferenceSeq();
+
+  /**
+   * @return true set flag for deciding if colourschemes should render according
+   *         to reference sequence rather than consensus if available
+   */
+  public void setColourByReferenceSeq(boolean colourByReferenceSeq);
 
   void setSequenceColour(SequenceI seq, Color col);
 
index 13dcd05..75cb494 100644 (file)
@@ -19,7 +19,6 @@
 package jalview.appletgui;
 
 import java.util.*;
-
 import java.awt.*;
 import java.awt.event.*;
 
@@ -117,6 +116,8 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   MenuItem selSeqDetails = new MenuItem(MessageManager.getString("label.sequence_details") + "...");
 
+  MenuItem makeReferenceSeq = new MenuItem();
+  
   Sequence seq;
 
   MenuItem revealAll = new MenuItem();
@@ -308,6 +309,12 @@ public class APopupMenu extends java.awt.PopupMenu implements
     if (seq != null)
     {
       seqMenu.setLabel(seq.getName());
+      if (seq == ap.av.getAlignment().getSeqrep())
+      {
+        makeReferenceSeq.setLabel(MessageManager.getString("action.unmark_as_reference"));// Unmark representative");
+      } else {
+        makeReferenceSeq.setLabel(MessageManager.getString("action.set_as_reference")); // );
+      }
       repGroup.setLabel(MessageManager.formatMessage("label.represent_group_with", new String[]{seq.getName()}));
     }
     else
@@ -474,6 +481,10 @@ public class APopupMenu extends java.awt.PopupMenu implements
     {
       editName();
     }
+    else if (source == makeReferenceSeq)
+    {
+      makeReferenceSeq_actionPerformed();
+    }
     else if (source == sequenceDetails)
     {
       showSequenceDetails();
@@ -851,6 +862,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     toLower.addActionListener(this);
     editMenu.add(toggleCase);
     seqMenu.add(sequenceName);
+    seqMenu.add(makeReferenceSeq);
     // seqMenu.add(sequenceDetails);
 
     if (!ap.av.applet.useXtrnalSviewer)
@@ -870,6 +882,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     repGroup.addActionListener(this);
     revealAll.addActionListener(this);
     revealSeq.addActionListener(this);
+    makeReferenceSeq.addActionListener(this);
   }
 
   void refresh()
@@ -1059,6 +1072,28 @@ public class APopupMenu extends java.awt.PopupMenu implements
     getGroup().setDisplayText(showText.getState());
     refresh();
   }
+  public void makeReferenceSeq_actionPerformed()
+  {
+    if (!ap.av.getAlignment().hasSeqrep())
+    {
+      // initialise the display flags so the user sees something happen
+      ap.av.setDisplayReferenceSeq(true);
+      ap.av.setColourByReferenceSeq(true);
+      ap.av.getAlignment().setSeqrep(seq);
+    }
+    else
+    {
+      if (ap.av.getAlignment().getSeqrep() == seq)
+      {
+        ap.av.getAlignment().setSeqrep(null);
+      }
+      else
+      {
+        ap.av.getAlignment().setSeqrep(seq);
+      }
+    }
+    refresh();
+  }
 
   public void showNonconserved_itemStateChanged()
   {
index 140f5f9..ca0c7d1 100755 (executable)
@@ -225,7 +225,7 @@ public class IdCanvas extends Panel
 
           SequenceI s = av.getAlignment().getSequenceAt(i);
           gg.setFont(italic);
-          if (av.hasHiddenRows())
+          if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
           {
             setHiddenFont(s);
           }
@@ -255,7 +255,7 @@ public class IdCanvas extends Panel
         }
         gg.setFont(italic);
         // boolean isrep=false;
-        if (av.hasHiddenRows())
+        if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
         {
           // isrep =
           setHiddenFont(seq);
@@ -364,8 +364,7 @@ public class IdCanvas extends Panel
     Font bold = new Font(av.getFont().getName(), Font.BOLD, av.getFont()
             .getSize());
 
-    if (av.getHiddenRepSequences() != null
-            && av.getHiddenRepSequences().containsKey(seq))
+    if (av.isHiddenRepSequence(seq))
     {
       gg.setFont(bold);
       return true;
index 154bea4..862dd82 100755 (executable)
@@ -202,7 +202,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
     }
 
     char s = ' ';
-
+    boolean srep = av.isDisplayReferenceSeq();
     for (int i = start; i <= end; i++)
     {
       graphics.setColor(Color.black);
@@ -227,9 +227,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
         }
         if (currentSequenceGroup.getShowNonconserved())
         {
-          // cheat - use this if we have a consensus for each group: s =
-          // getDisplayChar(currentSequenceGroup.getConsensus(), i, s, '.');
-          s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+          s = getDisplayChar(srep, i, s,
                   '.');
         }
       }
@@ -254,7 +252,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
         }
         if (av.getShowUnconserved())
         {
-          s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+          s = getDisplayChar(srep, i, s,
                   '.');
 
         }
@@ -287,10 +285,12 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
 
   }
 
-  private char getDisplayChar(AlignmentAnnotation consensus, int position,
+  private char getDisplayChar(final boolean usesrep, int position,
           char s, char c)
   {
-    char conschar = consensus.annotations[position].displayCharacter
+    // TODO - use currentSequenceGroup rather than alignemnt 
+    // currentSequenceGroup.getConsensus()
+    char conschar = (usesrep) ? av.getAlignment().getSeqrep().getCharAt(position) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
             .charAt(0);
     if (conschar != '-' && s == conschar)
     {
index 35efe4f..9cd44c3 100755 (executable)
@@ -1493,6 +1493,39 @@ public class Alignment implements AlignmentI
      hasRNAStructure = true;
    }
  }
+
+ private SequenceI seqrep=null;
+
+ /**
+  * 
+  * @return the representative sequence for this group
+  */
+ public SequenceI getSeqrep()
+ {
+   return seqrep;
+ }
+
+ /**
+  * set the representative sequence for this group. Note - this affects the
+  * interpretation of the Hidereps attribute.
+  * 
+  * @param seqrep
+  *          the seqrep to set (null means no sequence representative)
+  */
+ public void setSeqrep(SequenceI seqrep)
+ {
+   this.seqrep = seqrep;
+ }
+
+ /**
+  * 
+  * @return true if group has a sequence representative
+  */
+ public boolean hasSeqrep()
+ {
+   return seqrep != null;
+ }
+
  @Override
 public int getEndRes()
 {
@@ -1512,4 +1545,5 @@ public AnnotatedCollectionI getContext()
 {
   return dataset;
 }
+
 }
index 11e8c67..c251df0 100644 (file)
@@ -27,8 +27,23 @@ public interface SequenceCollectionI
 
   List<SequenceI> getSequences(
           Map<SequenceI, SequenceCollectionI> hiddenReps);
-
   int getWidth();
+  /**
+   * 
+   * @return true if getSeqrep doesn't return null
+   */
+  boolean hasSeqrep();
+  /**
+   * get the reference or representative sequence within this collection
+   * @return null or the current reference sequence
+   */
+  SequenceI getSeqrep();
+  /**
+   * set the reference or representative sequence for this collection. 
+   * Reference is assumed to be present within the collection.
+   * @return
+   */
+  void setSeqrep(SequenceI refseq);
 
   /** 
   * @return the first column included in this collection. Runs from 0<=i<N_cols
index d475c91..a494708 100644 (file)
@@ -5544,6 +5544,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       alignPanel.paintAlignment(true);
     }
   }
+  public void clearAlignmentSeqRep()
+  {
+    // TODO refactor alignmentseqrep to controller
+    if (viewport.getAlignment().hasSeqrep()) {
+      viewport.getAlignment().setSeqrep(null);
+      PaintRefresher.Refresh(this, viewport.getSequenceSetId());
+      alignPanel.updateAnnotation();
+      alignPanel.paintAlignment(true);
+    }
+  }
 
   @Override
   protected void createGroup_actionPerformed(ActionEvent e)
index c4c68c2..451f8db 100755 (executable)
@@ -308,7 +308,7 @@ public class IdCanvas extends JPanel
         for (int i = starty; i < alheight; i++)
         {
           SequenceI s = av.getAlignment().getSequenceAt(i);
-          if (av.hasHiddenRows())
+          if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
           {
             setHiddenFont(s);
           }
@@ -348,7 +348,7 @@ public class IdCanvas extends JPanel
           continue;
         }
 
-        if (av.hasHiddenRows())
+        if (av.isDisplayReferenceSeq() || av.hasHiddenRows())
         {
           setHiddenFont(sequence);
         }
index 66cafc5..71fb2bd 100644 (file)
@@ -19,7 +19,6 @@
 package jalview.gui;
 
 import java.util.*;
-
 import java.awt.*;
 import java.awt.event.*;
 
@@ -89,6 +88,8 @@ public class PopupMenu extends JPopupMenu
   JMenuItem sequenceDetails = new JMenuItem();
 
   JMenuItem sequenceSelDetails = new JMenuItem();
+  
+  JMenuItem makeReferenceSeq = new JMenuItem();
 
   SequenceI sequence;
   JMenuItem createGroupMenuItem = new JMenuItem();
@@ -224,6 +225,12 @@ public class PopupMenu extends JPopupMenu
     if (seq != null)
     {
       sequenceMenu.setText(sequence.getName());
+      if (seq == ap.av.getAlignment().getSeqrep())
+      {
+        makeReferenceSeq.setText("Unmark representative");
+      } else {
+        makeReferenceSeq.setText("Mark as representative");
+      }
 
       if (seq.getDatasetSequence().getPDBId() != null
               && seq.getDatasetSequence().getPDBId().size() > 0)
@@ -268,7 +275,6 @@ public class PopupMenu extends JPopupMenu
         }
         // structureMenu.remove(colStructureMenu);
       }
-
       if (ap.av.getAlignment().isNucleotide() == true)
       {
         AlignmentAnnotation[] aa = ap.av.getAlignment()
@@ -321,7 +327,6 @@ public class PopupMenu extends JPopupMenu
             }
           }
         }
-
       }
 
       menuItem = new JMenuItem(MessageManager.getString("action.hide_sequences"));\r
@@ -1106,7 +1111,17 @@ public class PopupMenu extends JPopupMenu
         editSequence_actionPerformed(actionEvent);
       }
     });
-
+    makeReferenceSeq.setText("Mark as representative");
+    makeReferenceSeq.addActionListener(new ActionListener()
+    {
+      
+      @Override
+      public void actionPerformed(ActionEvent actionEvent)
+      {
+        makeReferenceSeq_actionPerformed(actionEvent);
+        
+      }
+    });
     /*
      * annotationMenuItem.setText("By Annotation");
      * annotationMenuItem.addActionListener(new ActionListener() { public void
@@ -1125,6 +1140,7 @@ public class PopupMenu extends JPopupMenu
     groupMenu.add(jMenu1);
     sequenceMenu.add(sequenceName);
     sequenceMenu.add(sequenceDetails);
+    sequenceMenu.add(makeReferenceSeq);
     colourMenu.add(textColour);
     colourMenu.add(noColourmenuItem);
     colourMenu.add(clustalColour);
@@ -1319,6 +1335,29 @@ public class PopupMenu extends JPopupMenu
             });
   }
 
+  protected void makeReferenceSeq_actionPerformed(ActionEvent actionEvent)
+  {
+    if (!ap.av.getAlignment().hasSeqrep())
+    {
+      // initialise the display flags so the user sees something happen
+      ap.av.setDisplayReferenceSeq(true);
+      ap.av.setColourByReferenceSeq(true);
+      ap.av.getAlignment().setSeqrep(sequence);
+    }
+    else
+    {
+      if (ap.av.getAlignment().getSeqrep() == sequence)
+      {
+        ap.av.getAlignment().setSeqrep(null);
+      }
+      else
+      {
+        ap.av.getAlignment().setSeqrep(sequence);
+      }
+    }
+    refresh();
+  }
+
   protected void sequenceSelectionDetails_actionPerformed()
   {
     createSequenceDetailsReport(ap.av.getSequenceSelection());
index 9023c4e..1c22465 100755 (executable)
@@ -288,6 +288,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
     }
     else
     {
+      boolean srep = av.isDisplayReferenceSeq();
       boolean getboxColour = false;
       for (int i = start; i <= end; i++)
       {
@@ -333,7 +334,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
           if (currentSequenceGroup.getShowNonconserved()) // todo optimize
           {
             // todo - use sequence group consensus
-            s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+            s = getDisplayChar(srep, i, s,
                     '.');
 
           }
@@ -376,7 +377,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
           }
           if (av.getShowUnconserved())
           {
-            s = getDisplayChar(av.getAlignmentConsensusAnnotation(), i, s,
+            s = getDisplayChar(srep, i, s,
                     '.');
 
           }
@@ -391,10 +392,12 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer
     }
   }
 
-  private char getDisplayChar(AlignmentAnnotation consensus, int position,
+  private char getDisplayChar(final boolean usesrep, int position,
           char s, char c)
   {
-    char conschar = consensus.annotations[position].displayCharacter
+    // TODO - use currentSequenceGroup rather than alignemnt 
+    // currentSequenceGroup.getConsensus()
+    char conschar = (usesrep) ? av.getAlignment().getSeqrep().getCharAt(position) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter
             .charAt(0);
     if (conschar != '-' && s == conschar)
     {
index 44ecf76..eb45fa4 100644 (file)
@@ -998,8 +998,8 @@ public abstract class AlignmentViewport implements AlignViewportI
 
   public boolean isHiddenRepSequence(SequenceI seq)
   {
-    return hiddenRepSequences != null
-            && hiddenRepSequences.containsKey(seq);
+    return alignment.getSeqrep()==seq || (hiddenRepSequences != null
+            && hiddenRepSequences.containsKey(seq));
   }
 
   public SequenceGroup getRepresentedSequences(SequenceI seq)
@@ -1548,6 +1548,34 @@ public abstract class AlignmentViewport implements AlignViewportI
     }
     oldrfs.clear();
   }
+  /**
+   * show the reference sequence in the alignment view
+   */
+  private boolean displayReferenceSeq=false;
+  /**
+   * colour according to the reference sequence defined on the alignment
+   */
+  private boolean colourByReferenceSeq=false;
+
+  public boolean isDisplayReferenceSeq()
+  {
+    return alignment.hasSeqrep() && displayReferenceSeq;
+  }
+
+  public void setDisplayReferenceSeq(boolean displayReferenceSeq)
+  {
+    this.displayReferenceSeq = displayReferenceSeq;
+  }
+
+  public boolean isColourByReferenceSeq()
+  {
+    return alignment.hasSeqrep() && colourByReferenceSeq;
+  }
+
+  public void setColourByReferenceSeq(boolean colourByReferenceSeq)
+  {
+    this.colourByReferenceSeq = colourByReferenceSeq;
+  }
 
   @Override
   public Color getSequenceColour(SequenceI seq)