Merge branch 'develop' into features/JAL-2360colourSchemeApplicability
[jalview.git] / src / jalview / gui / AlignFrame.java
index 5127342..40ab6bb 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())
@@ -3315,18 +3277,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
@@ -3363,10 +3313,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,7 +3345,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     // TODO: pull up to controller method
     if (cs != null)
     {
-      setColourSelected(cs.getSchemeName());
+      ColourMenuHelper.setColourSelected(colourMenu, cs.getSchemeName());
       // Make sure viewport is up to date w.r.t. any sliders
       if (viewport.getAbovePIDThreshold())
       {
@@ -3439,53 +3403,45 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Action on selecting or deselecting (Colour) By Conservation
    */
   @Override
   protected void conservationMenuItem_actionPerformed()
   {
-    viewport.setConservationSelected(conservationMenuItem.isSelected());
-
-    viewport.setAbovePIDThreshold(false);
-    abovePIDThreshold.setSelected(false);
+    boolean selected = conservationMenuItem.isSelected();
+    modifyConservation.setEnabled(selected);
+    viewport.setConservationSelected(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()
   {
-    viewport.setAbovePIDThreshold(abovePIDThreshold.isSelected());
-
-    conservationMenuItem.setSelected(false);
-    viewport.setConservationSelected(false);
+    boolean selected = abovePIDThreshold.isSelected();
+    modifyPID.setEnabled(selected);
+    viewport.setAbovePIDThreshold(selected);
 
     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 +4743,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;
@@ -5737,101 +5682,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.getStringOrReturn("label.colourScheme_"
-              + name.toLowerCase().replace(" ", "_"), name);
-      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.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);
@@ -5840,10 +5696,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     colourMenu.add(modifyPID);
     colourMenu.add(annotationColour);
 
-    setColourSelected(Cache.getDefault(Preferences.DEFAULT_COLOUR,
-            ResidueColourScheme.NONE));
+    /*
+     * select the default colour for the alignment (this may be
+     * overridden later)
+     */
+    boolean nucleotide = viewport.getAlignment().isNucleotide();
+    String defaultColourScheme = Cache.getDefault(
+            nucleotide ? Preferences.DEFAULT_COLOUR_NUC
+                    : Preferences.DEFAULT_COLOUR_PROT,
+            ResidueColourScheme.NONE);
 
-    setGUINucleotide();
+    ColourMenuHelper.setColourSelected(colourMenu, defaultColourScheme);
   }
 }