Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / gui / FeatureSettings.java
index bb15b55..6d84574 100644 (file)
@@ -20,8 +20,6 @@
  */
 package jalview.gui;
 
-import java.util.Locale;
-
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
@@ -47,6 +45,7 @@ import java.io.FileOutputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.io.Reader;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -54,6 +53,7 @@ import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
@@ -63,7 +63,6 @@ import javax.swing.BorderFactory;
 import javax.swing.Icon;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
-import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JInternalFrame;
 import javax.swing.JLabel;
 import javax.swing.JLayeredPane;
@@ -105,6 +104,8 @@ import jalview.datamodel.features.FeatureMatcherSet;
 import jalview.datamodel.features.FeatureMatcherSetI;
 import jalview.gui.Help.HelpId;
 import jalview.gui.JalviewColourChooser.ColourChooserListener;
+import jalview.io.DataSourceType;
+import jalview.io.FileParse;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
 import jalview.schemes.FeatureColour;
@@ -413,6 +414,7 @@ public class FeatureSettings extends JPanel
     {
       frame = new JInternalFrame();
       frame.setContentPane(this);
+      frame.setFrameIcon(null);
       Rectangle bounds = af.getFeatureSettingsGeometry();
       String title;
       if (af.getAlignPanels().size() > 1 || Desktop.getAlignmentPanels(
@@ -949,16 +951,70 @@ public class FeatureSettings extends JPanel
     chooser.setDialogTitle(
             MessageManager.getString("label.load_feature_colours"));
     chooser.setToolTipText(MessageManager.getString("action.load"));
-    chooser.setResponseHandler(0, new Runnable()
+    chooser.setResponseHandler(0, () -> {
+      File file = chooser.getSelectedFile();
+      load(file);
+    });
+    chooser.showOpenDialog(this);
+  }
+
+  public static boolean loadFeatureSettingsFile(FeatureRenderer fr,
+          File file) throws Exception
+  {
+    InputStreamReader in = new InputStreamReader(new FileInputStream(file),
+            "UTF-8");
+    return loadFeatureSettingsFile(fr, in);
+  }
+
+  public static void loadFeatureSettingsFile(
+          FeatureRenderer featureRenderer, Object fileObject,
+          DataSourceType sourceType) throws Exception
+  {
+    FileParse fp = new FileParse(fileObject, sourceType);
+    loadFeatureSettingsFile(featureRenderer, fp.getReader());
+  }
+
+  private static boolean loadFeatureSettingsFile(FeatureRenderer fr,
+          Reader in) throws Exception
+  {
+    JAXBContext jc = JAXBContext.newInstance("jalview.xml.binding.jalview");
+    javax.xml.bind.Unmarshaller um = jc.createUnmarshaller();
+    XMLStreamReader streamReader = XMLInputFactory.newInstance()
+            .createXMLStreamReader(in);
+    JAXBElement<JalviewUserColours> jbe = um.unmarshal(streamReader,
+            JalviewUserColours.class);
+    JalviewUserColours jucs = jbe.getValue();
+
+    // JalviewUserColours jucs = JalviewUserColours.unmarshal(in);
+
+    /*
+     * load feature colours
+     */
+    for (int i = jucs.getColour().size() - 1; i >= 0; i--)
     {
-      @Override
-      public void run()
+      Colour newcol = jucs.getColour().get(i);
+      FeatureColourI colour = jalview.project.Jalview2XML
+              .parseColour(newcol);
+      fr.setColour(newcol.getName(), colour);
+      fr.setOrder(newcol.getName(), i / (float) jucs.getColour().size());
+    }
+
+    /*
+     * load feature filters; loaded filters will replace any that are
+     * currently defined, other defined filters are left unchanged 
+     */
+    for (int i = 0; i < jucs.getFilter().size(); i++)
+    {
+      Filter filterModel = jucs.getFilter().get(i);
+      String featureType = filterModel.getFeatureType();
+      FeatureMatcherSetI filter = jalview.project.Jalview2XML
+              .parseFilter(featureType, filterModel.getMatcherSet());
+      if (!filter.isEmpty())
       {
-        File file = chooser.getSelectedFile();
-        load(file);
+        fr.setFeatureFilter(featureType, filter);
       }
-    });
-    chooser.showOpenDialog(this);
+    }
+    return true;
   }
 
   /**
@@ -968,50 +1024,21 @@ public class FeatureSettings extends JPanel
    */
   void load(File file)
   {
+    load(file, DataSourceType.FILE);
+  }
+
+  /**
+   * Loads feature colours and filters from XML at a specified source
+   * 
+   * @param file
+   *          - string or file or other object that allows FileParse to be
+   *          created
+   */
+  void load(Object file, DataSourceType sourceType)
+  {
     try
     {
-      InputStreamReader in = new InputStreamReader(
-              new FileInputStream(file), "UTF-8");
-
-      JAXBContext jc = JAXBContext
-              .newInstance("jalview.xml.binding.jalview");
-      javax.xml.bind.Unmarshaller um = jc.createUnmarshaller();
-      XMLStreamReader streamReader = XMLInputFactory.newInstance()
-              .createXMLStreamReader(in);
-      JAXBElement<JalviewUserColours> jbe = um.unmarshal(streamReader,
-              JalviewUserColours.class);
-      JalviewUserColours jucs = jbe.getValue();
-
-      // JalviewUserColours jucs = JalviewUserColours.unmarshal(in);
-
-      /*
-       * load feature colours
-       */
-      for (int i = jucs.getColour().size() - 1; i >= 0; i--)
-      {
-        Colour newcol = jucs.getColour().get(i);
-        FeatureColourI colour = jalview.project.Jalview2XML
-                .parseColour(newcol);
-        fr.setColour(newcol.getName(), colour);
-        fr.setOrder(newcol.getName(), i / (float) jucs.getColour().size());
-      }
-
-      /*
-       * load feature filters; loaded filters will replace any that are
-       * currently defined, other defined filters are left unchanged 
-       */
-      for (int i = 0; i < jucs.getFilter().size(); i++)
-      {
-        Filter filterModel = jucs.getFilter().get(i);
-        String featureType = filterModel.getFeatureType();
-        FeatureMatcherSetI filter = jalview.project.Jalview2XML
-                .parseFilter(featureType, filterModel.getMatcherSet());
-        if (!filter.isEmpty())
-        {
-          fr.setFeatureFilter(featureType, filter);
-        }
-      }
-
+      loadFeatureSettingsFile(fr, file, sourceType);
       /*
        * update feature settings table
        */
@@ -1025,7 +1052,8 @@ public class FeatureSettings extends JPanel
       }
     } catch (Exception ex)
     {
-      System.out.println("Error loading User Colour File\n" + ex);
+      jalview.bin.Console
+              .outPrintln("Error loading User Colour File\n" + ex);
     }
   }
 
@@ -1614,7 +1642,7 @@ public class FeatureSettings extends JPanel
     {
       Color newColor = gcol.getMaxColour();
       comp.setBackground(newColor);
-      // System.err.println("Width is " + w / 2);
+      // jalview.bin.Console.errPrintln("Width is " + w / 2);
       Icon ficon = new FeatureIcon(gcol, comp.getBackground(), w, h, thr);
       comp.setIcon(ficon);
       // tt+="RGB value: Max (" + newColor.getRed() + ", "
@@ -1793,11 +1821,15 @@ public class FeatureSettings extends JPanel
     {
       FeatureMatcherSetI theFilter = (FeatureMatcherSetI) filter;
       setOpaque(true);
-      String asText = theFilter.toString();
       setBackground(tbl.getBackground());
-      this.setText(asText);
       this.setIcon(null);
 
+      if (theFilter != null)
+      {
+        String asText = theFilter.toString();
+        this.setText(asText);
+      }
+
       if (isSelected)
       {
         if (selectedBorder == null)
@@ -1887,6 +1919,9 @@ public class FeatureSettings extends JPanel
            */
           String ttl = MessageManager
                   .formatMessage("label.select_colour_for", type);
+          Object last = (Boolean) table.getValueAt(selectedRow,
+                  SHOW_COLUMN);
+          table.setValueAt(Boolean.TRUE, selectedRow, SHOW_COLUMN);
           ColourChooserListener listener = new ColourChooserListener()
           {
             @Override
@@ -1894,12 +1929,14 @@ public class FeatureSettings extends JPanel
             {
               currentColor = new FeatureColour(c);
               table.setValueAt(currentColor, rowSelected, COLOUR_COLUMN);
+              table.setValueAt(Boolean.TRUE, selectedRow, SHOW_COLUMN);
               fireEditingStopped();
             }
 
             @Override
             public void cancel()
             {
+              table.setValueAt(last, selectedRow, SHOW_COLUMN);
               fireEditingStopped();
             }
           };
@@ -1911,7 +1948,10 @@ public class FeatureSettings extends JPanel
           /*
            * variable colour and filters dialog
            */
-          chooser = new FeatureTypeSettings(fr, type);
+          boolean last = (Boolean) table.getValueAt(selectedRow,
+                  SHOW_COLUMN);
+          table.setValueAt(Boolean.TRUE, selectedRow, SHOW_COLUMN);
+          chooser = new FeatureTypeSettings(fr, type, last);
           if (!Platform.isJS())
           /**
            * Java only
@@ -2037,7 +2077,11 @@ public class FeatureSettings extends JPanel
     {
       if (button == e.getSource())
       {
-        FeatureTypeSettings chooser = new FeatureTypeSettings(fr, type);
+        boolean last = fr.getFeaturesDisplayed().isVisible(type);
+        ((FeatureTableModel) table.getModel()).setValueAt(Boolean.TRUE,
+                rowSelected, SHOW_COLUMN);
+        FeatureTypeSettings chooser = new FeatureTypeSettings(fr, type,
+                last);
         chooser.addActionListener(this);
         chooser.setRequestFocusEnabled(true);
         chooser.requestFocus();
@@ -2069,6 +2113,8 @@ public class FeatureSettings extends JPanel
                 .getData()[rowSelected];
         data[COLOUR_COLUMN] = currentColor;
         data[FILTER_COLUMN] = currentFilter;
+        data[SHOW_COLUMN] = fr.getFeaturesDisplayed().isVisible(type);
+
         fireEditingStopped();
         // SwingJS needs an explicit repaint() here,
         // rather than relying upon no validation having