JAL-1668 further clean-up of popup menu and NPE check while transfering ResNum featur...
[jalview.git] / src / jalview / gui / AlignFrame.java
index 5438ce8..fc145ed 100644 (file)
@@ -96,6 +96,8 @@ import jalview.schemes.ZappoColourScheme;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
+import jalview.ws.DBRefFetcher;
+import jalview.ws.DBRefFetcher.FetchFinishedListenerI;
 import jalview.ws.SequenceFetcher;
 import jalview.ws.jws1.Discoverer;
 import jalview.ws.jws2.Jws2Discoverer;
@@ -4748,7 +4750,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 break;
               }
             }
-            Alignment al = makeCrossReferencesAlignment(
+            AlignmentI al = makeCrossReferencesAlignment(
                     alignment.getDataset(), xrefs);
 
             AlignFrame newFrame = new AlignFrame(al, DEFAULT_WIDTH,
@@ -4896,31 +4898,45 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
 
       /**
-       * Makes an alignment containing the given sequences; the sequences are
-       * added to the given alignment dataset, and the dataset is set on (shared
-       * by) the new alignment
+       * Makes an alignment containing the given sequences. If this is of the
+       * same type as the given dataset (nucleotide/protein), then the new
+       * alignment shares the same dataset, and its dataset sequences are added
+       * to it. Otherwise a new dataset sequence is created for the
+       * cross-references.
        * 
        * @param dataset
        * @param seqs
        * @return
        */
-      protected Alignment makeCrossReferencesAlignment(Alignment dataset,
-              Alignment seqs)
+      protected AlignmentI makeCrossReferencesAlignment(AlignmentI dataset,
+              AlignmentI seqs)
       {
+        boolean sameType = dataset.isNucleotide() == seqs.isNucleotide();
+
         SequenceI[] sprods = new SequenceI[seqs.getHeight()];
         for (int s = 0; s < sprods.length; s++)
         {
           sprods[s] = (seqs.getSequenceAt(s)).deriveSequence();
-          if (dataset.getSequences() == null
-                  || !dataset.getSequences().contains(
-                          sprods[s].getDatasetSequence()))
+          if (sameType)
           {
-            dataset.addSequence(sprods[s].getDatasetSequence());
+            if (dataset.getSequences() == null
+                    || !dataset.getSequences().contains(
+                            sprods[s].getDatasetSequence()))
+            {
+              dataset.addSequence(sprods[s].getDatasetSequence());
+            }
           }
           sprods[s].updatePDBIds();
         }
         Alignment al = new Alignment(sprods);
-        al.setDataset(dataset);
+        if (sameType)
+        {
+          al.setDataset((Alignment) dataset);
+        }
+        else
+        {
+          al.createDatasetAlignment();
+        }
         return al;
       }
 
@@ -5567,15 +5583,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         new Thread(new Runnable()
         {
-
           @Override
           public void run()
           {
-            boolean isNuclueotide = alignPanel.alignFrame.getViewport()
+            boolean isNucleotide = alignPanel.alignFrame.getViewport()
                     .getAlignment().isNucleotide();
-            new jalview.ws.DBRefFetcher(alignPanel.av
+            DBRefFetcher dbRefFetcher = new DBRefFetcher(alignPanel.av
                     .getSequenceSelection(), alignPanel.alignFrame, null,
-                    alignPanel.alignFrame.featureSettings, isNuclueotide)
+                    alignPanel.alignFrame.featureSettings, isNucleotide);
+            dbRefFetcher.addListener(new FetchFinishedListenerI()
+            {
+              @Override
+              public void finished()
+              {
+                AlignFrame.this.setMenusForViewport();
+              }
+            });
+            dbRefFetcher
                     .fetchDBRefs(false);
           }
         }).start();
@@ -5644,14 +5668,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                       @Override
                       public void run()
                       {
-                        boolean isNuclueotide = alignPanel.alignFrame
+                        boolean isNucleotide = alignPanel.alignFrame
                                 .getViewport().getAlignment()
                                 .isNucleotide();
-                        new jalview.ws.DBRefFetcher(alignPanel.av
-                                .getSequenceSelection(),
+                        DBRefFetcher dbRefFetcher = new DBRefFetcher(
+                                alignPanel.av.getSequenceSelection(),
                                 alignPanel.alignFrame, dassource,
                                 alignPanel.alignFrame.featureSettings,
-                                isNuclueotide).fetchDBRefs(false);
+                                isNucleotide);
+                        dbRefFetcher
+                                .addListener(new FetchFinishedListenerI()
+                                {
+                                  @Override
+                                  public void finished()
+                                  {
+                                    AlignFrame.this.setMenusForViewport();
+                                  }
+                                });
+                        dbRefFetcher.fetchDBRefs(false);
                       }
                     }).start();
                   }
@@ -5684,14 +5718,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                       @Override
                       public void run()
                       {
-                        boolean isNuclueotide = alignPanel.alignFrame
+                        boolean isNucleotide = alignPanel.alignFrame
                                 .getViewport().getAlignment()
                                 .isNucleotide();
-                        new jalview.ws.DBRefFetcher(alignPanel.av
-                                .getSequenceSelection(),
+                        DBRefFetcher dbRefFetcher = new DBRefFetcher(
+                                alignPanel.av.getSequenceSelection(),
                                 alignPanel.alignFrame, dassource,
                                 alignPanel.alignFrame.featureSettings,
-                                isNuclueotide).fetchDBRefs(false);
+                                isNucleotide);
+                        dbRefFetcher
+                                .addListener(new FetchFinishedListenerI()
+                                {
+                                  @Override
+                                  public void finished()
+                                  {
+                                    AlignFrame.this.setMenusForViewport();
+                                  }
+                                });
+                        dbRefFetcher.fetchDBRefs(false);
                       }
                     }).start();
                   }
@@ -5739,14 +5783,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         @Override
                         public void run()
                         {
-                          boolean isNuclueotide = alignPanel.alignFrame
+                          boolean isNucleotide = alignPanel.alignFrame
                                   .getViewport().getAlignment()
                                   .isNucleotide();
-                          new jalview.ws.DBRefFetcher(alignPanel.av
-                                  .getSequenceSelection(),
+                          DBRefFetcher dbRefFetcher = new DBRefFetcher(
+                                  alignPanel.av.getSequenceSelection(),
                                   alignPanel.alignFrame, dassrc,
                                   alignPanel.alignFrame.featureSettings,
-                                  isNuclueotide).fetchDBRefs(false);
+                                  isNucleotide);
+                          dbRefFetcher
+                                  .addListener(new FetchFinishedListenerI()
+                                  {
+                                    @Override
+                                    public void finished()
+                                    {
+                                      AlignFrame.this.setMenusForViewport();
+                                    }
+                                  });
+                          dbRefFetcher.fetchDBRefs(false);
                         }
                       }).start();
                     }