JAL-1760 JAL-1641 Serialisation of Hidden Seqs and Cols in JSON output. Added ability...
[jalview.git] / src / jalview / gui / AlignFrame.java
index 553ddd2..ad2bbc3 100644 (file)
  */
 package jalview.gui;
 
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+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.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Deque;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+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.JOptionPane;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+
 import jalview.analysis.AAFrequency;
 import jalview.analysis.AlignmentSorter;
 import jalview.analysis.AlignmentUtils;
@@ -51,6 +97,7 @@ import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.AlignmentView;
 import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.HiddenSequences;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SeqCigar;
 import jalview.datamodel.Sequence;
@@ -97,52 +144,6 @@ import jalview.ws.jws2.Jws2Discoverer;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
 import jalview.ws.seqfetcher.DbSourceProxy;
 
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.awt.dnd.DropTargetDragEvent;
-import java.awt.dnd.DropTargetDropEvent;
-import java.awt.dnd.DropTargetEvent;
-import java.awt.dnd.DropTargetListener;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-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.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Deque;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-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.JOptionPane;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.JScrollPane;
-import javax.swing.SwingUtilities;
-
 /**
  * DOCUMENT ME!
  * 
@@ -1120,32 +1121,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         return false;
       }
 
-      String[] omitHidden = null;
-
-      if (viewport.hasHiddenColumns())
-      {
-        int reply = JOptionPane
-                .showInternalConfirmDialog(
-                        Desktop.desktop,
-                        MessageManager
-                                .getString("label.alignment_contains_hidden_columns"),
-                        MessageManager
-                                .getString("action.save_omit_hidden_columns"),
-                        JOptionPane.YES_NO_OPTION,
-                        JOptionPane.QUESTION_MESSAGE);
-
-        if (reply == JOptionPane.YES_OPTION)
-        {
-          omitHidden = viewport.getViewAsString(false);
-        }
-      }
-      FeatureRenderer fr = new FeatureRenderer(this.alignPanel);
-      viewport.setFeatureRenderer(fr);
+      ExportData exportData = getAlignmentForExport();
       FormatAdapter f = new FormatAdapter(viewport);
       String output = f.formatSequences(format,
-              viewport.getAlignment(), // class cast exceptions will
+              exportData.getAlignment(), // class cast exceptions will
               // occur in the distant future
-              omitHidden, f.getCacheSuffixDefault(format),
+              exportData.getOmitHidden(), f.getCacheSuffixDefault(format),
               viewport.getColumnSelection());
 
       if (output == null)
@@ -1186,6 +1167,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     return success;
   }
 
+
   private void warningMessage(String warning, String title)
   {
     if (new jalview.util.Platform().isHeadless())
@@ -1210,10 +1192,38 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   protected void outputText_actionPerformed(ActionEvent e)
   {
+
+    ExportData exportData = getAlignmentForExport();
+    CutAndPasteTransfer cap = new CutAndPasteTransfer();
+    cap.setForInput(null);
+
+    try
+    {
+      cap.setText(new FormatAdapter(viewport).formatSequences(
+              e.getActionCommand(),
+ exportData.getAlignment(),
+              exportData.getOmitHidden(),
+              viewport.getColumnSelection()));
+      Desktop.addInternalFrame(cap, MessageManager.formatMessage(
+              "label.alignment_output_command", new Object[]
+              { e.getActionCommand() }), 600, 500);
+    } catch (OutOfMemoryError oom)
+    {
+      new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom);
+      cap.dispose();
+    }
+
+  }
+
+  public ExportData getAlignmentForExport()
+  {
+    AlignmentI alignmentToExport = null;
     String[] omitHidden = null;
     FeatureRenderer fr = new FeatureRenderer(this.alignPanel);
     viewport.setFeatureRenderer(fr);
-    if (viewport.hasHiddenColumns())
+    HiddenSequences hiddenSeqs = viewport.getAlignment()
+            .getHiddenSequences();
+    if (viewport.hasHiddenColumns() || hiddenSeqs.getSize() > 0)
     {
       int reply = JOptionPane
               .showInternalConfirmDialog(
@@ -1229,26 +1239,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         omitHidden = viewport.getViewAsString(false);
       }
+      else
+      {
+        alignmentToExport = viewport.getAlignment().getHiddenSequences()
+                .getFullAlignment();
+      }
     }
-
-    CutAndPasteTransfer cap = new CutAndPasteTransfer();
-    cap.setForInput(null);
-
-    try
+    if (alignmentToExport == null)
     {
-      cap.setText(new FormatAdapter(viewport).formatSequences(
-              e.getActionCommand(),
-              viewport.getAlignment(), omitHidden,
-              viewport.getColumnSelection()));
-      Desktop.addInternalFrame(cap, MessageManager.formatMessage(
-              "label.alignment_output_command", new Object[]
-              { e.getActionCommand() }), 600, 500);
-    } catch (OutOfMemoryError oom)
-    {
-      new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom);
-      cap.dispose();
+      alignmentToExport = viewport.getAlignment();
     }
-
+    return new ExportData(alignmentToExport, omitHidden);
   }
 
   /**
@@ -5993,6 +5994,64 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       sf.setComplementVisible(this, show);
     }
   }
+
+  public class ExportData
+  {
+    private AlignmentI alignment;
+
+    private String[] omitHidden;
+
+    public ExportData(AlignmentI align, String[] ommit)
+    {
+      this.alignment = align;
+      this.omitHidden = ommit;
+      System.out.println();
+    }
+
+    public AlignmentI getAlignment()
+    {
+      return alignment;
+    }
+
+    public void setAlignment(AlignmentI alignment)
+    {
+      this.alignment = alignment;
+    }
+
+    public String[] getOmitHidden()
+    {
+      return omitHidden;
+    }
+
+    public void setOmitHidden(String[] omitHidden)
+    {
+      this.omitHidden = omitHidden;
+    }
+  }
+
+  @Override
+  public void hideColumns(List<int[]> colsToHide)
+  {
+    for (int[] colRange : colsToHide)
+    {
+      viewport.hideColumns(colRange[0], colRange[1]);
+    }
+
+  }
+
+  @Override
+  public void syncHiddenSequences()
+  {
+    AlignmentI al = viewport.getAlignment();
+    HiddenSequences hiddenSeqs = al.getHiddenSequences();
+    for (SequenceI seq : al.getSequencesArray())
+      {
+        if (seq.isHidden())
+        {
+        hiddenSeqs.hideSequence(seq);
+        }
+      }
+  }
 }
 
 class PrintThread extends Thread