JAL-3048 openLinkedAlignment refactor to use dialogRunner plus a conditional callback...
[jalview.git] / src / jalview / gui / AlignViewport.java
index 4d09084..35a0cd3 100644 (file)
@@ -22,7 +22,6 @@ package jalview.gui;
 
 import jalview.analysis.AlignmentUtils;
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
-import jalview.analysis.TreeModel;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureColourI;
@@ -36,7 +35,6 @@ import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenColumns;
-import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SearchResults;
 import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceGroup;
@@ -50,6 +48,7 @@ import jalview.structure.SelectionSource;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasSource;
 import jalview.util.MessageManager;
+import jalview.util.dialogrunner.RunResponse;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.params.AutoCalcSetting;
 
@@ -58,10 +57,9 @@ import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.FontMetrics;
 import java.awt.Rectangle;
-import java.util.ArrayList;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.List;
-import java.util.Vector;
 
 import javax.swing.JInternalFrame;
 
@@ -453,10 +451,10 @@ public class AlignViewport extends AlignmentViewport
    *          area
    * @return
    */
-  public int[] getViewAsVisibleContigs(boolean selectedRegionOnly)
+  public Iterator<int[]> getViewAsVisibleContigs(boolean selectedRegionOnly)
   {
-    int[] viscontigs = null;
-    int start = 0, end = 0;
+    int start = 0;
+    int end = 0;
     if (selectedRegionOnly && selectionGroup != null)
     {
       start = selectionGroup.getStartRes();
@@ -466,8 +464,8 @@ public class AlignViewport extends AlignmentViewport
     {
       end = alignment.getWidth();
     }
-    viscontigs = alignment.getHiddenColumns().getVisibleContigs(start, end);
-    return viscontigs;
+    return (alignment.getHiddenColumns().getVisContigsIterator(start, end,
+            false));
   }
 
   /**
@@ -604,7 +602,7 @@ public class AlignViewport extends AlignmentViewport
     return validCharWidth;
   }
 
-  private Hashtable<String, AutoCalcSetting> calcIdParams = new Hashtable<String, AutoCalcSetting>();
+  private Hashtable<String, AutoCalcSetting> calcIdParams = new Hashtable<>();
 
   public AutoCalcSetting getCalcIdSettingsFor(String calcId)
   {
@@ -710,13 +708,15 @@ public class AlignViewport extends AlignmentViewport
     {
       if (AlignmentUtils.isMappable(toAdd, getAlignment()))
       {
-        if (openLinkedAlignment(toAdd, title))
-        {
-          return;
-        }
+        openLinkedAlignment(toAdd, title);
+        return;
       }
     }
+    alignmentDataAdded(toAdd);
+  }
 
+  private void alignmentDataAdded(AlignmentI toAdd)
+  {
     /*
      * No mappings, or offer declined - add sequences to this alignment
      */
@@ -754,30 +754,51 @@ public class AlignViewport extends AlignmentViewport
    * @param al
    * @param title
    */
-  protected boolean openLinkedAlignment(AlignmentI al, String title)
+  protected void openLinkedAlignment(AlignmentI al, String title)
   {
     String[] options = new String[] { MessageManager.getString("action.no"),
         MessageManager.getString("label.split_window"),
         MessageManager.getString("label.new_window"), };
     final String question = JvSwingUtils.wrapTooltip(true,
             MessageManager.getString("label.open_split_window?"));
-    int response = JvOptionPane.showOptionDialog(Desktop.desktop, question,
+    final AlignViewport us = this;
+    JvOptionPane.newOptionDialog(Desktop.desktop)
+            .response(new RunResponse(1)
+            {
+              @Override
+              public void run()
+              {
+                us.openLinkedAlignmentAs(al, title, true);
+              }
+            }).response(new RunResponse(2)
+            {
+              @Override
+              public void run()
+              {
+                us.openLinkedAlignmentAs(al, title, false);
+              }
+            }).defaultResponse(new Runnable()
+            {
+              @Override
+              public void run()
+              {
+                alignmentDataAdded(al);
+              }
+            }).showDialog(question,
             MessageManager.getString("label.open_split_window"),
             JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
             options, options[0]);
+  }
 
-    if (response != 1 && response != 2)
+  protected void openLinkedAlignmentAs(AlignmentI al, String title,
+          boolean newWindowOrSplitPane)
     {
-      return false;
-    }
-    final boolean openSplitPane = (response == 1);
-    final boolean openInNewWindow = (response == 2);
-
     /*
      * Identify protein and dna alignments. Make a copy of this one if opening
      * in a new split pane.
      */
-    AlignmentI thisAlignment = openSplitPane ? new Alignment(getAlignment())
+    AlignmentI thisAlignment = newWindowOrSplitPane
+            ? new Alignment(getAlignment())
             : getAlignment();
     AlignmentI protein = al.isNucleotide() ? thisAlignment : al;
     final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
@@ -809,7 +830,7 @@ public class AlignViewport extends AlignmentViewport
     // alignFrame.setFileName(file, format);
     // }
 
-    if (openInNewWindow)
+    if (!newWindowOrSplitPane)
     {
       Desktop.addInternalFrame(newAlignFrame, title,
               AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
@@ -823,13 +844,11 @@ public class AlignViewport extends AlignmentViewport
     {
     }
 
-    if (openSplitPane)
+    if (newWindowOrSplitPane)
     {
       al.alignAs(thisAlignment);
       protein = openSplitFrame(newAlignFrame, thisAlignment);
     }
-
-    return true;
   }
 
   /**