JAL-1556 initial implementation - no tests as yet but ‘works’
authorJames Procter <j.procter@dundee.ac.uk>
Fri, 26 May 2023 11:52:58 +0000 (12:52 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Fri, 26 May 2023 11:52:58 +0000 (12:52 +0100)
src/jalview/gui/AnnotationColourChooser.java
src/jalview/gui/AnnotationColumnChooser.java
src/jalview/gui/AnnotationLabels.java

index a0ab709..e582072 100644 (file)
@@ -41,12 +41,14 @@ import javax.swing.JPanel;
 
 import jalview.bin.Cache;
 import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
 import jalview.datamodel.GraphLine;
 import jalview.datamodel.SequenceGroup;
 import jalview.gui.JalviewColourChooser.ColourChooserListener;
 import jalview.schemes.AnnotationColourGradient;
 import jalview.schemes.ColourSchemeI;
 import jalview.util.MessageManager;
+import net.bytebuddy.dynamic.DynamicType.Builder.MethodDefinition.ParameterDefinition.Initial;
 import net.miginfocom.swing.MigLayout;
 
 @SuppressWarnings("serial")
@@ -72,6 +74,10 @@ public class AnnotationColourChooser extends AnnotationRowFilter
 
   public AnnotationColourChooser(AlignViewport av, final AlignmentPanel ap)
   {
+    this(av,ap,null);
+  }
+  public AnnotationColourChooser(AlignViewport av, final AlignmentPanel ap,AnnotationColourGradient initSettings)
+  {
     super(av, ap);
     oldcs = av.getGlobalColourScheme();
     if (av.getAlignment().getGroups() != null)
@@ -105,11 +111,28 @@ public class AnnotationColourChooser extends AnnotationRowFilter
     setDefaultMinMax();
 
     adjusting = true;
-    if (oldcs instanceof AnnotationColourGradient)
+    if (oldcs instanceof AnnotationColourGradient && initSettings==null)
+    {
+      // init from oldcs
+      initialiseFrom((AnnotationColourGradient) oldcs);
+    } else {
+      // use initial colour gradient - if any..
+      initialiseFrom(initSettings);
+    }
+    
+    jbInit();
+    adjusting = false;
+
+    updateView();
+    frame.invalidate();
+    frame.pack();
+  }
+  private void initialiseFrom(AnnotationColourGradient acg)
+  {
+    if (acg!=null)
     {
-      AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
       useOriginalColours.setSelected(
-              acg.isPredefinedColours() || acg.getBaseColour() != null);
+            acg.isPredefinedColours() || acg.getBaseColour() != null);
       if (!acg.isPredefinedColours() && acg.getBaseColour() == null)
       {
         minColour.setBackground(acg.getMinColour());
@@ -124,10 +147,14 @@ public class AnnotationColourChooser extends AnnotationRowFilter
 
     populateThresholdComboBox(threshold);
 
-    if (oldcs instanceof AnnotationColourGradient)
+    if (acg!=null)
     {
-      AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
       String label = getAnnotationMenuLabel(acg.getAnnotation());
+      // TODO: workaround below shouldn't be necessary - there's a bug in getAnnotationMenuLabel!
+      if (acg.isSeqAssociated())
+      {
+        label = acg.getAnnotation().label;
+      }
       annotations.setSelectedItem(label);
       switch (acg.getAboveThreshold())
       {
@@ -147,13 +174,6 @@ public class AnnotationColourChooser extends AnnotationRowFilter
       thresholdIsMin.setSelected(acg.isThresholdIsMinMax());
       thresholdValue.setText(String.valueOf(acg.getAnnotationThreshold()));
     }
-
-    jbInit();
-    adjusting = false;
-
-    updateView();
-    frame.invalidate();
-    frame.pack();
   }
 
   @Override
@@ -356,9 +376,11 @@ public class AnnotationColourChooser extends AnnotationRowFilter
       return;
     }
 
+    int selIndex = annotations
+            .getSelectedIndex();
+    int annIndex = annmap[selIndex];
     setCurrentAnnotation(
-            av.getAlignment().getAlignmentAnnotation()[annmap[annotations
-                    .getSelectedIndex()]]);
+            av.getAlignment().getAlignmentAnnotation()[annIndex]);
 
     int selectedThresholdItem = getSelectedThresholdItem(
             getThreshold().getSelectedIndex());
@@ -447,4 +469,33 @@ public class AnnotationColourChooser extends AnnotationRowFilter
     super.sliderDragReleased();
     ap.paintAlignment(true, true);
   }
+
+  /**
+   * construct and display a colourchooser for a given annotation row
+   * 
+   * @param av
+   * @param ap
+   * @param alignmentAnnotation
+   * @param perseq - when true, enable per-sequence if alignment annotation is per sequence 
+   */
+  public static void displayFor(AlignViewport av, AlignmentPanel ap,
+          AlignmentAnnotation alignmentAnnotation, boolean perSeq)
+  {
+    ColourSchemeI global = av.getGlobalColourScheme();
+    AnnotationColourGradient newCS = new AnnotationColourGradient(alignmentAnnotation, global, alignmentAnnotation.threshold!=null ? AnnotationColourGradient.ABOVE_THRESHOLD:AnnotationColourGradient.NO_THRESHOLD);
+    if (alignmentAnnotation.sequenceRef!=null)
+    {
+      newCS.setSeqAssociated(perSeq);
+    }
+    for (int i=0;i<alignmentAnnotation.annotations.length;i++)
+    {
+      Annotation ann = alignmentAnnotation.annotations[i];
+      if (ann!=null && ann.colour!=null && !ann.colour.equals(Color.white))
+      {
+        newCS.setPredefinedColours(true);
+        break;
+      }
+    }
+    AnnotationColourChooser achooser = new AnnotationColourChooser(av,ap,newCS);
+  }
 }
index c6c0e10..0483aa6 100644 (file)
@@ -42,6 +42,7 @@ import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 import javax.swing.border.TitledBorder;
 
+import jalview.bin.Console;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.HiddenColumns;
 import jalview.io.cache.JvCacheableInputBox;
@@ -95,6 +96,10 @@ public class AnnotationColumnChooser extends AnnotationRowFilter
 
   public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap)
   {
+    this(av,ap,null);
+  }
+  public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap, AlignmentAnnotation selectedAnnotation)
+  {
     super(av, ap);
     frame = new JInternalFrame();
     frame.setFrameIcon(null);
@@ -115,7 +120,7 @@ public class AnnotationColumnChooser extends AnnotationRowFilter
     }
     setOldHiddenColumns(av.getAlignment().getHiddenColumns());
     adjusting = true;
-
+    
     setAnnotations(new JComboBox<>(getAnnotationItems(false)));
     populateThresholdComboBox(threshold);
     AnnotationColumnChooser lastChooser = av
@@ -134,6 +139,16 @@ public class AnnotationColumnChooser extends AnnotationRowFilter
       percentThreshold
               .setSelected(lastChooser.percentThreshold.isSelected());
     }
+    if (selectedAnnotation!=null)
+    {
+      try {
+        setCurrentAnnotation(selectedAnnotation);
+        annotations.setSelectedItem(getAnnotationMenuLabel(selectedAnnotation));
+      } catch (Exception x)
+      {
+        Console.error("Couldn't select annotation in column chooser",x);
+      }
+    }
 
     try
     {
@@ -850,4 +865,10 @@ public class AnnotationColumnChooser extends AnnotationRowFilter
     gSearchPanel.searchBox.updateCache();
     ngSearchPanel.searchBox.updateCache();
   }
+
+  public static void displayFor(AlignViewport av, AlignmentPanel ap,
+          AlignmentAnnotation alignmentAnnotation)
+  {
+    AnnotationColumnChooser colchooser = new AnnotationColumnChooser(av, ap, alignmentAnnotation);    
+  }
 }
index f4c37fd..8930629 100755 (executable)
@@ -66,6 +66,7 @@ import jalview.io.DataSourceType;
 import jalview.io.FileFormat;
 import jalview.io.FormatAdapter;
 import jalview.io.NewickFile;
+import jalview.schemes.AnnotationColourGradient;
 import jalview.util.Comparison;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
@@ -424,82 +425,131 @@ public class AnnotationLabels extends JPanel
         consclipbrd.addActionListener(this);
         pop.add(consclipbrd);
       }
+
+      addColourOrFilterByOptions(ap,aa[selectedRow],pop);
+      
       if (aa[selectedRow].graph == AlignmentAnnotation.CONTACT_MAP)
       {
-        
-        final ContactMatrixI cm = av.getContactMatrix(aa[selectedRow]);
-        if (cm != null)
+        addContactMatrixOptions(ap,aa[selectedRow],pop);
+          // Set/adjust threshold for grouping ?
+          // colour alignment by this [type]
+          // select/hide columns by this row
+          
+        }
+      }
+    
+    pop.show(this, evt.getX(), evt.getY());
+  }
+
+  static void addColourOrFilterByOptions(final AlignmentPanel ap,
+          final AlignmentAnnotation alignmentAnnotation, final JPopupMenu pop)
+  {
+    JMenuItem item;
+    item = new JMenuItem(MessageManager.getString("label.colour_by_annotation"));
+    item.addActionListener(new ActionListener()
+    {
+      
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        AnnotationColourChooser.displayFor(ap.av, ap,alignmentAnnotation,false);
+      };
+    });
+    pop.add(item);
+    if (alignmentAnnotation.sequenceRef!=null)
+    {
+      item = new JMenuItem(MessageManager.getString("label.colour_by_annotation")+" ("+MessageManager.getString("label.per_seq")+")");
+      item.addActionListener(new ActionListener()
+      {
+        @Override
+        public void actionPerformed(ActionEvent e)
         {
-          pop.addSeparator();
+          AnnotationColourChooser.displayFor(ap.av, ap,alignmentAnnotation,true);
+        };
+      });
+      pop.add(item);
+    }
+    item = new JMenuItem(MessageManager.getString("action.select_by_annotation"));
+    item.addActionListener(new ActionListener()
+    {
+      
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        AnnotationColumnChooser.displayFor(ap.av,ap,alignmentAnnotation);
+      };
+    });
+    pop.add(item);
+  }
+  static void addContactMatrixOptions(final AlignmentPanel ap,
+          final AlignmentAnnotation alignmentAnnotation, final JPopupMenu pop)
+  {
+    
+    final ContactMatrixI cm = ap.av.getContactMatrix(alignmentAnnotation);
+    JMenuItem item;
+    if (cm != null)
+    {
+      pop.addSeparator();
 
-          if (cm.hasGroups())
-          {
-            JCheckBoxMenuItem chitem = new JCheckBoxMenuItem("Show Groups on Matrix");
-            boolean showGroups = aa[selectedRow].isShowGroupsForContactMatrix();
-            final AlignmentAnnotation sel_row=aa[selectedRow];
-            chitem.setState(showGroups);
-            chitem.addActionListener(new ActionListener()
-            {
+      if (cm.hasGroups())
+      {
+        JCheckBoxMenuItem chitem = new JCheckBoxMenuItem("Show Groups on Matrix");
+        boolean showGroups = alignmentAnnotation.isShowGroupsForContactMatrix();
+        final AlignmentAnnotation sel_row=alignmentAnnotation;
+        chitem.setState(showGroups);
+        chitem.addActionListener(new ActionListener()
+        {
 
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                sel_row.setShowGroupsForContactMatrix(chitem.getState());
-                ap.getAnnotationPanel()
-                .paint(ap.getAnnotationPanel().getGraphics());
-              }
-            });
-            pop.add(chitem);
-          }
-          if (cm.hasTree())
+          @Override
+          public void actionPerformed(ActionEvent e)
           {
-            item = new JMenuItem("Show Tree for Matrix");
-            item.addActionListener(new ActionListener()
-            {
+            sel_row.setShowGroupsForContactMatrix(chitem.getState());
+            ap.getAnnotationPanel()
+            .paint(ap.getAnnotationPanel().getGraphics());
+          }
+        });
+        pop.add(chitem);
+      }
+      if (cm.hasTree())
+      {
+        item = new JMenuItem("Show Tree for Matrix");
+        item.addActionListener(new ActionListener()
+        {
 
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
+          @Override
+          public void actionPerformed(ActionEvent e)
+          {
 
-                ap.alignFrame.showContactMapTree(aa[selectedRow], cm);
+            ap.alignFrame.showContactMapTree(alignmentAnnotation, cm);
 
-              }
-            });
-            pop.add(item);
           }
-          else
+        });
+        pop.add(item);
+      }
+      else
+      {
+        item = new JMenuItem("Calculate Tree for Matrix");
+        item.addActionListener(new ActionListener()
+        {
+          // TODO - refactor to analysis background thread
+          @Override
+          public void actionPerformed(ActionEvent e)
           {
-            item = new JMenuItem("Calculate Tree for Matrix");
-            item.addActionListener(new ActionListener()
+            new Thread(new Runnable()
             {
-              // TODO - refactor to analysis background thread
               @Override
-              public void actionPerformed(ActionEvent e)
+              public void run()
               {
-                new Thread(new Runnable()
-                {
-                  @Override
-                  public void run()
-                  {
-                    AlignmentAnnotation alan = aa[selectedRow];
-                    cm.setGroupSet(GroupSet.makeGroups(cm, 5f, true));
-                    ap.alignFrame.showContactMapTree(alan, cm);
-                  }
-                }).start();
+                AlignmentAnnotation alan = alignmentAnnotation;
+                cm.setGroupSet(GroupSet.makeGroups(cm, 5f, true));
+                ap.alignFrame.showContactMapTree(alan, cm);
               }
-            });
-            pop.add(item);
-
+            }).start();
           }
-          // Show/Hide group shading on matrix view
-          // Set/adjust threshold for grouping ?
-          // colour alignment by this [type]
-          // select/hide columns by this row
-          
-        }
+        });
+        pop.add(item);
       }
     }
-    pop.show(this, evt.getX(), evt.getY());
   }
 
   /**