JAL-2385 more tests/bug fixes mostly for gui.SliderPanel and some
[jalview.git] / src / jalview / gui / AlignFrame.java
index 4687913..cf6a901 100644 (file)
@@ -59,6 +59,7 @@ import jalview.datamodel.SeqCigar;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.gui.ColourMenuHelper.ColourChangeListener;
 import jalview.gui.ViewSelectionMenu.ViewSetProvider;
 import jalview.io.AlignmentProperties;
 import jalview.io.AnnotationFile;
@@ -66,6 +67,7 @@ import jalview.io.BioJsHTMLOutput;
 import jalview.io.DataSourceType;
 import jalview.io.FileFormat;
 import jalview.io.FileFormatI;
+import jalview.io.FileFormats;
 import jalview.io.FileLoader;
 import jalview.io.FormatAdapter;
 import jalview.io.HtmlSvgOutput;
@@ -78,12 +80,10 @@ import jalview.io.NewickFile;
 import jalview.io.TCoffeeScoreFile;
 import jalview.jbgui.GAlignFrame;
 import jalview.schemes.ColourSchemeI;
-import jalview.schemes.ColourSchemeProperty;
 import jalview.schemes.ColourSchemes;
 import jalview.schemes.ResidueColourScheme;
 import jalview.schemes.ResidueProperties;
 import jalview.schemes.TCoffeeColourScheme;
-import jalview.schemes.UserColourScheme;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.DBRefFetcher;
@@ -114,12 +114,13 @@ import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.print.PageFormat;
 import java.awt.print.PrinterJob;
 import java.beans.PropertyChangeEvent;
 import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -129,14 +130,12 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Vector;
 
-import javax.swing.ButtonGroup;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JEditorPane;
 import javax.swing.JInternalFrame;
 import javax.swing.JLayeredPane;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
-import javax.swing.JRadioButtonMenuItem;
 import javax.swing.JScrollPane;
 import javax.swing.SwingUtilities;
 
@@ -147,7 +146,7 @@ import javax.swing.SwingUtilities;
  * @version $Revision$
  */
 public class AlignFrame extends GAlignFrame implements DropTargetListener,
-        IProgressIndicator, AlignViewControllerGuiI
+        IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener
 {
 
   public static final int DEFAULT_WIDTH = 700;
@@ -839,46 +838,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public void setGUINucleotide()
   {
-    boolean nucleotide = viewport.getAlignment().isNucleotide();
+    AlignmentI al = getViewport().getAlignment();
+    boolean nucleotide = al.isNucleotide();
 
     showTranslation.setVisible(nucleotide);
     showReverse.setVisible(nucleotide);
     showReverseComplement.setVisible(nucleotide);
     conservationMenuItem.setEnabled(!nucleotide);
-    modifyConservation.setEnabled(!nucleotide);
+    modifyConservation.setEnabled(!nucleotide
+            && conservationMenuItem.isSelected());
     showGroupConservation.setEnabled(!nucleotide);
 
-    AlignmentI al = getViewport().getAlignment();
-
-    /*
-     * enable / disable colour schemes by querying whether they
-     * are applicable to the alignment data (for example, peptide or
-     * nucleotide specific, or require certain annotation present)
-     */
-    for (Component menuItem : colourMenu.getMenuComponents())
-    {
-      if (menuItem instanceof JRadioButtonMenuItem)
-      {
-        String colourName = ((JRadioButtonMenuItem) menuItem).getName();
-        ColourSchemeI cs = ColourSchemes.getInstance().getColourScheme(
-                colourName, viewport);
-        if (cs != null)
-        {
-          ((JRadioButtonMenuItem) menuItem).setEnabled(cs
-                  .isApplicableTo(al));
-        }
-      }
-    }
-
     showComplementMenuItem.setText(nucleotide ? MessageManager
             .getString("label.protein") : MessageManager
             .getString("label.nucleotide"));
-
-    String selectedColourScheme = Cache.getDefault(
-            nucleotide ? Preferences.DEFAULT_COLOUR_NUC
-                    : Preferences.DEFAULT_COLOUR_PROT,
-            ResidueColourScheme.NONE);
-    setColourSelected(selectedColourScheme);
   }
 
   /**
@@ -904,7 +877,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     padGapsMenuitem.setSelected(av.isPadGaps());
     colourTextMenuItem.setSelected(av.isShowColourText());
     abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
+    modifyPID.setEnabled(abovePIDThreshold.isSelected());
     conservationMenuItem.setSelected(av.getConservationSelected());
+    modifyConservation.setEnabled(conservationMenuItem.isSelected());
     seqLimits.setSelected(av.getShowJVSuffix());
     idRightAlign.setSelected(av.isRightAlignIds());
     centreColumnLabelsMenuItem.setState(av.isCentreColumnLabels());
@@ -930,8 +905,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     showSequenceLogo.setSelected(av.isShowSequenceLogo());
     normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());
 
-    setColourSelected(ColourSchemeProperty.getColourName(av
-            .getGlobalColourScheme()));
+    ColourMenuHelper.setColourSelected(colourMenu,
+            av.getGlobalColourScheme());
 
     showSeqFeatures.setSelected(av.isShowSequenceFeatures());
     hiddenMarkers.setState(av.getShowHiddenMarkers());
@@ -1125,7 +1100,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   public void saveAs_actionPerformed(ActionEvent e)
   {
     String format = currentFileFormat == null ? null : currentFileFormat
-            .toString();
+            .getName();
     JalviewFileChooser chooser = JalviewFileChooser.forWrite(
             Cache.getProperty("LAST_DIRECTORY"), format);
 
@@ -1159,8 +1134,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
       fileName = chooser.getSelectedFile().getPath();
 
-      Cache.setProperty("DEFAULT_FILE_FORMAT",
-              currentFileFormat.toString());
+      Cache.setProperty("DEFAULT_FILE_FORMAT", currentFileFormat.getName());
 
       Cache.setProperty("LAST_DIRECTORY", fileName);
       saveAlignment(fileName, currentFileFormat);
@@ -1190,17 +1164,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
     else
     {
-      // if (!jalview.io.AppletFormatAdapter.isValidFormat(format, true))
-      // {
-      // warningMessage("Cannot save file " + fileName + " using format "
-      // + format, "Alignment output format not supported");
-      // if (!Jalview.isHeadlessMode())
-      // {
-      // saveAs_actionPerformed(null);
-      // }
-      // return false;
-      // }
-
       AlignmentExportData exportData = getAlignmentForExport(format,
               viewport, null);
       if (exportData.getSettings().isCancelled())
@@ -1225,15 +1188,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         try
         {
-          java.io.PrintWriter out = new java.io.PrintWriter(
-                  new java.io.FileWriter(file));
+          PrintWriter out = new PrintWriter(new FileWriter(file));
 
           out.print(output);
           out.close();
           this.setTitle(file);
           statusBar.setText(MessageManager.formatMessage(
                   "label.successfully_saved_to_file_in_format",
-                  new Object[] { fileName, format }));
+                  new Object[] { fileName, format.getName() }));
         } catch (Exception ex)
         {
           success = false;
@@ -1278,8 +1240,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   protected void outputText_actionPerformed(ActionEvent e)
   {
-
-    FileFormatI fileFormat = FileFormat.forName(e.getActionCommand());
+    FileFormatI fileFormat = FileFormats.getInstance().forName(
+            e.getActionCommand());
     AlignmentExportData exportData = getAlignmentForExport(fileFormat,
             viewport, null);
     if (exportData.getSettings().isCancelled())
@@ -1292,8 +1254,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       FileFormatI format = fileFormat;
       cap.setText(new FormatAdapter(alignPanel, exportData.getSettings())
-              .formatSequences(format,
-                      exportData.getAlignment(),
+              .formatSequences(format, exportData.getAlignment(),
                       exportData.getOmitHidden(),
                       exportData.getStartEndPostions(),
                       viewport.getColumnSelection()));
@@ -1884,8 +1845,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     String output = new FormatAdapter().formatSequences(FileFormat.Fasta,
-            seqs,
-            omitHidden, null);
+            seqs, omitHidden, null);
 
     StringSelection ss = new StringSelection(output);
 
@@ -3315,18 +3275,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     new TextColourChooser().chooseColour(alignPanel, null);
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
-   */
-  @Override
-  protected void noColourmenuItem_actionPerformed()
-  {
-    changeColour(null);
-  }
-
   /*
    * public void covariationColour_actionPerformed() {
    * changeColour(new
@@ -3350,11 +3298,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    * colour scheme to all groups. If unchecked, groups may have their own
    * independent colour schemes.
    * 
+   * @param selected
    */
   @Override
-  protected void applyToAllGroups_actionPerformed()
+  public void applyToAllGroups_actionPerformed(boolean selected)
   {
-    viewport.setColourAppliesToAllGroups(applyToAllGroups.isSelected());
+    viewport.setColourAppliesToAllGroups(selected);
   }
 
   /**
@@ -3363,10 +3312,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    * @param name
    *          the name (not the menu item label!) of the colour scheme
    */
+  @Override
   public void changeColour_actionPerformed(String name)
   {
+    /*
+     * 'User Defined' opens a panel to configure or load a
+     * user-defined colour scheme
+     */
+    if (ResidueColourScheme.USER_DEFINED.equals(name))
+    {
+      new UserDefinedColours(alignPanel, null);
+      return;
+    }
+
+    /*
+     * otherwise set the chosen colour scheme (or null for 'None')
+     */
     ColourSchemeI cs = ColourSchemes.getInstance().getColourScheme(name,
-            viewport);
+            viewport.getAlignment(), viewport.getHiddenRepSequences());
     changeColour(cs);
   }
 
@@ -3381,20 +3344,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     // TODO: pull up to controller method
     if (cs != null)
     {
-      setColourSelected(cs.getSchemeName());
-      // Make sure viewport is up to date w.r.t. any sliders
-      if (viewport.getAbovePIDThreshold())
-      {
-        int threshold = SliderPanel.setPIDSliderSource(alignPanel, cs,
-                "Background");
-        viewport.setThreshold(threshold);
-      }
-
-      if (viewport.getConservationSelected())
-      {
-        cs.setConservationInc(SliderPanel.setConservationSlider(alignPanel,
-                cs, "Background"));
-      }
+      ColourMenuHelper.setColourSelected(colourMenu, cs.getSchemeName());
     }
 
     viewport.setGlobalColourScheme(cs);
@@ -3403,89 +3353,71 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Show the PID threshold slider panel
    */
   @Override
   protected void modifyPID_actionPerformed()
   {
-    if (viewport.getAbovePIDThreshold()
-            && viewport.getGlobalColourScheme() != null)
-    {
-      SliderPanel.setPIDSliderSource(alignPanel,
-              viewport.getGlobalColourScheme(), "Background");
-      SliderPanel.showPIDSlider();
-    }
+    SliderPanel.setPIDSliderSource(alignPanel,
+            viewport.getViewportColourScheme(), alignPanel.getViewName());
+    SliderPanel.showPIDSlider();
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Show the Conservation slider panel
    */
   @Override
   protected void modifyConservation_actionPerformed()
   {
-    if (viewport.getConservationSelected()
-            && viewport.getGlobalColourScheme() != null)
-    {
-      SliderPanel.setConservationSlider(alignPanel,
-              viewport.getGlobalColourScheme(), "Background");
-      SliderPanel.showConservationSlider();
-    }
+    SliderPanel.setConservationSlider(alignPanel,
+            viewport.getViewportColourScheme(), alignPanel.getViewName());
+    SliderPanel.showConservationSlider();
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Action on selecting or deselecting (Colour) By Conservation
    */
   @Override
-  protected void conservationMenuItem_actionPerformed()
+  public void conservationMenuItem_actionPerformed(boolean selected)
   {
-    viewport.setConservationSelected(conservationMenuItem.isSelected());
-
-    viewport.setAbovePIDThreshold(false);
-    abovePIDThreshold.setSelected(false);
+    modifyConservation.setEnabled(selected);
+    viewport.setConservationSelected(selected);
+    viewport.getViewportColourScheme().setConservationApplied(selected);
 
     changeColour(viewport.getGlobalColourScheme());
-
-    modifyConservation_actionPerformed();
+    if (selected)
+    {
+      modifyConservation_actionPerformed();
+    }
+    else
+    {
+      SliderPanel.hideConservationSlider();
+    }
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Action on selecting or deselecting (Colour) Above PID Threshold
    */
   @Override
-  public void abovePIDThreshold_actionPerformed()
+  public void abovePIDThreshold_actionPerformed(boolean selected)
   {
-    viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
-
-    conservationMenuItem.setSelected(false);
-    viewport.setConservationSelected(false);
+    modifyPID.setEnabled(selected);
+    viewport.setAbovePIDThreshold(selected);
+    if (!selected)
+    {
+      viewport.getViewportColourScheme().setThreshold(0,
+              viewport.isIgnoreGapsConsensus());
+    }
 
     changeColour(viewport.getGlobalColourScheme());
-
-    modifyPID_actionPerformed();
-  }
-
-  /**
-   * Action on the user selecting the option "User Defined" to create or load a
-   * new colour scheme
-   * 
-   * @param e
-   */
-  @Override
-  public void userDefinedColour_actionPerformed(ActionEvent e)
-  {
-    new UserDefinedColours(alignPanel, null);
+    if (selected)
+    {
+      modifyPID_actionPerformed();
+    }
+    else
+    {
+      SliderPanel.hidePIDSlider();
+    }
   }
 
   /**
@@ -4787,17 +4719,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           {
             if (tcf.annotateAlignment(viewport.getAlignment(), true))
             {
-              // tcoffeeColour.setEnabled(true);
-              // tcoffeeColour.setSelected(true);
-              for (Component menuItem : colourMenu.getMenuComponents())
-              {
-                if (menuItem instanceof JRadioButtonMenuItem
-                        && ((JRadioButtonMenuItem) menuItem).getText()
-                                .equals("T-Coffee Scores"))
-                {
-                  ((JRadioButtonMenuItem) menuItem).setSelected(true);
-                }
-              }
               buildColourMenu();
               changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
               isAnnotation = true;
@@ -4842,8 +4763,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           if (FileFormat.Jnet.equals(format))
           {
-            JPredFile predictions = new JPredFile(
-                    file, sourceType);
+            JPredFile predictions = new JPredFile(file, sourceType);
             new JnetAnnotationMaker();
             JnetAnnotationMaker.add_annotation(predictions,
                     viewport.getAlignment(), 0, false);
@@ -4913,6 +4833,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     /*
+     * 'focus' any colour slider that is open to the selected viewport
+     */
+    if (viewport.getConservationSelected())
+    {
+      SliderPanel.setConservationSlider(alignPanel,
+              viewport.getViewportColourScheme(), alignPanel.getViewName());
+    }
+    else
+    {
+      SliderPanel.hideConservationSlider();
+    }
+    if (viewport.getAbovePIDThreshold())
+    {
+      SliderPanel.setPIDSliderSource(alignPanel,
+              viewport.getViewportColourScheme(), alignPanel.getViewName());
+    }
+    else
+    {
+      SliderPanel.hidePIDSlider();
+    }
+
+    /*
      * If there is a frame linked to this one in a SplitPane, switch it to the
      * same view tab index. No infinite recursion of calls should happen, since
      * tabSelectionChanged() should not get invoked on setting the selected
@@ -5737,102 +5679,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     colourMenu.removeAll();
 
-    /*
-     * ButtonGroup groups those items whose 
-     * selection is mutually exclusive
-     */
-    ButtonGroup colours = new ButtonGroup();
-
     colourMenu.add(applyToAllGroups);
     colourMenu.add(textColour);
     colourMenu.addSeparator();
-    colourMenu.add(noColourmenuItem);
-    colours.add(noColourmenuItem);
-
-    /*
-     * scan registered colour schemes (built-in or user-defined
-     * and add them to the menu (in the order they were added)
-     */
-    Iterable<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
-            .getColourSchemes();
-    for (ColourSchemeI scheme : colourSchemes)
-    {
-      /*
-       * button text is i18n'd but the name is the canonical name of
-       * the colour scheme (inspected in changeColour_actionPerformed)
-       */
-      final String name = scheme.getSchemeName();
-      String label = MessageManager.getString("label.colourScheme_"
-              + name.toLowerCase().replace(" ", "_"));
-      final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(label);
-      radioItem.setName(name);
-      if (scheme instanceof UserColourScheme)
-      {
-        /*
-         * user-defined colour scheme loaded on startup or during the
-         * Jalview session; right-click on this offers the option to
-         * remove it as a colour choice
-         */
-        radioItem.setText(((UserColourScheme) scheme).getName());
-        radioItem.addMouseListener(new MouseAdapter()
-        {
-          @Override
-          public void mousePressed(MouseEvent evt)
-          {
-            if (evt.isPopupTrigger()) // Mac
-            {
-              offerRemoval();
-            }
-          }
-
-          @Override
-          public void mouseReleased(MouseEvent evt)
-          {
-            if (evt.isPopupTrigger()) // Windows
-            {
-              offerRemoval();
-            }
-          }
-
-          void offerRemoval()
-          {
-            ActionListener al = radioItem.getActionListeners()[0];
-            radioItem.removeActionListener(al);
-            int option = JvOptionPane.showInternalConfirmDialog(
-                    Desktop.desktop, MessageManager
-                            .getString("label.remove_from_default_list"),
-                    MessageManager
-                            .getString("label.remove_user_defined_colour"),
-                    JvOptionPane.YES_NO_OPTION);
-            if (option == JvOptionPane.YES_OPTION)
-            {
-              UserDefinedColours.removeColourFromDefaults(radioItem
-                      .getName());
-              ColourSchemes.getInstance().removeColourScheme(
-                      radioItem.getName());
-              colourMenu.remove(radioItem);
-            }
-            else
-            {
-              radioItem.addActionListener(al);
-            }
-          }
-        });
-      }
-      radioItem.addActionListener(new ActionListener()
-      {
-        @Override
-        public void actionPerformed(ActionEvent evt)
-        {
-          changeColour_actionPerformed(name);
-        }
-      });
-      colourMenu.add(radioItem);
-      colours.add(radioItem);
-    }
 
-    colourMenu.add(userDefinedColour);
-    colours.add(userDefinedColour);
+    ColourMenuHelper.addMenuItems(colourMenu, this,
+            viewport.getAlignment(), false);
 
     colourMenu.addSeparator();
     colourMenu.add(conservationMenuItem);
@@ -5841,10 +5693,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     colourMenu.add(modifyPID);
     colourMenu.add(annotationColour);
 
-    setColourSelected(Cache.getDefault(Preferences.DEFAULT_COLOUR,
-            ResidueColourScheme.NONE));
+    ColourSchemeI colourScheme = viewport.getGlobalColourScheme();
+    String schemeName = colourScheme == null ? null : colourScheme
+            .getSchemeName();
 
-    setGUINucleotide();
+    ColourMenuHelper.setColourSelected(colourMenu, schemeName);
   }
 }