JAL-1830 refactored so no jalview.gui references from jalview.structure
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 27 Aug 2015 14:26:58 +0000 (15:26 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Thu, 27 Aug 2015 14:26:58 +0000 (15:26 +0100)
src/jalview/gui/AlignViewport.java
src/jalview/gui/AlignmentPanel.java
src/jalview/structure/StructureSelectionManager.java
test/jalview/gui/AlignViewportTest.java

index 997fd52..579b476 100644 (file)
@@ -42,9 +42,11 @@ import jalview.analysis.AlignmentUtils;
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
+import jalview.api.AlignmentViewPanel;
 import jalview.api.ViewStyleI;
 import jalview.bin.Cache;
 import jalview.commands.CommandI;
+import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
@@ -70,6 +72,7 @@ import java.awt.Rectangle;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Set;
 import java.util.Vector;
 
 import javax.swing.JInternalFrame;
@@ -426,22 +429,19 @@ public class AlignViewport extends AlignmentViewport implements
    */
   public void replaceMappings(AlignmentI align)
   {
-    StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance);
 
     /*
      * Deregister current mappings (if any)
      */
-    if (alignment != null)
-    {
-      ssm.deregisterMappings(alignment.getCodonFrames());
-    }
+    deregisterMappings();
 
     /*
      * Register new mappings (if any)
      */
     if (align != null)
     {
+      StructureSelectionManager ssm = StructureSelectionManager
+              .getStructureSelectionManager(Desktop.instance);
       ssm.registerMappings(align.getCodonFrames());
     }
 
@@ -454,6 +454,27 @@ public class AlignViewport extends AlignmentViewport implements
     }
   }
 
+  protected void deregisterMappings()
+  {
+    AlignmentI al = getAlignment();
+    if (al != null)
+    {
+      Set<AlignedCodonFrame> mappings = al.getCodonFrames();
+      if (mappings != null)
+      {
+        StructureSelectionManager ssm = StructureSelectionManager
+                .getStructureSelectionManager(Desktop.instance);
+        for (AlignedCodonFrame acf : mappings)
+        {
+          if (noReferencesTo(acf))
+          {
+            ssm.deregisterMapping(acf);
+          }
+        }
+      }
+    }
+  }
+
   /**
    * DOCUMENT ME!
    * 
@@ -1059,4 +1080,34 @@ public class AlignViewport extends AlignmentViewport implements
     }
   }
 
+  /**
+   * Answers true if no alignment holds a reference to the given mapping
+   * 
+   * @param acf
+   * @return
+   */
+  protected boolean noReferencesTo(AlignedCodonFrame acf)
+  {
+    AlignFrame[] frames = Desktop.getAlignFrames();
+    if (frames == null)
+    {
+      return true;
+    }
+    for (AlignFrame af : frames)
+    {
+      if (!af.isClosed())
+      {
+        for (AlignmentViewPanel ap : af.getAlignPanels())
+        {
+          AlignmentI al = ap.getAlignment();
+          if (al != null && al.getCodonFrames().contains(acf))
+          {
+            return false;
+          }
+        }
+      }
+    }
+    return true;
+  }
+
 }
index d88e207..e29a0e2 100644 (file)
@@ -1613,7 +1613,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
   @Override
   public AlignmentI getAlignment()
   {
-    return av.getAlignment();
+    return av == null ? null : av.getAlignment();
   }
 
 
index 9dd730c..4359877 100644 (file)
@@ -21,7 +21,6 @@
 package jalview.structure;
 
 import jalview.analysis.AlignSeq;
-import jalview.api.AlignmentViewPanel;
 import jalview.api.StructureSelectionManagerProvider;
 import jalview.commands.CommandI;
 import jalview.commands.EditCommand;
@@ -33,8 +32,6 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.SearchResults;
 import jalview.datamodel.SequenceI;
-import jalview.gui.AlignFrame;
-import jalview.gui.Desktop;
 import jalview.io.AppletFormatAdapter;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
@@ -73,7 +70,7 @@ public class StructureSelectionManager
   /*
    * Set of any registered mappings between (dataset) sequences.
    */
-  Set<AlignedCodonFrame> seqmappings = new LinkedHashSet<AlignedCodonFrame>();
+  public Set<AlignedCodonFrame> seqmappings = new LinkedHashSet<AlignedCodonFrame>();
 
   private List<CommandListener> commandListeners = new ArrayList<CommandListener>();
 
@@ -912,31 +909,13 @@ public class StructureSelectionManager
   }
 
   /**
-   * Deregister each mapping in the set, unless there is still an alignment that
-   * holds a reference to it. Note we do not update the set itself, as it may be
-   * shared with an alignment view which is still open.
-   * 
-   * @param set
-   */
-  public void deregisterMappings(Set<AlignedCodonFrame> set)
-  {
-    if (set != null)
-    {
-      for (AlignedCodonFrame acf : set)
-      {
-        deregisterMapping(acf);
-      }
-    }
-  }
-
-  /**
-   * Remove the given mapping provided no alignment holds a reference to it
+   * Remove the given mapping
    * 
    * @param acf
    */
   public void deregisterMapping(AlignedCodonFrame acf)
   {
-    if (noReferencesTo(acf))
+    if (acf != null)
     {
       boolean removed = seqmappings.remove(acf);
       if (removed && seqmappings.isEmpty())
@@ -947,33 +926,6 @@ public class StructureSelectionManager
   }
 
   /**
-   * Answers true if no alignment holds a reference to the given mapping
-   * 
-   * @param acf
-   * @return
-   */
-  protected boolean noReferencesTo(AlignedCodonFrame acf)
-  {
-    AlignFrame[] frames = Desktop.getAlignFrames();
-    if (frames == null)
-    {
-      return true;
-    }
-    for (AlignFrame af : frames)
-    {
-      for (AlignmentViewPanel ap : af.getAlignPanels())
-      {
-        AlignmentI al = ap.getAlignment();
-        if (al != null && al.getCodonFrames().contains(acf))
-        {
-          return false;
-        }
-      }
-    }
-    return true;
-  }
-
-  /**
    * Add each of the given codonFrames to the stored set, if not aready present.
    * 
    * @param set
index 4c55386..6f51487 100644 (file)
@@ -1,15 +1,25 @@
 package jalview.gui;
 
 import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertNotNull;
 import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertTrue;
 
+import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.PDBEntry;
 import jalview.datamodel.PDBEntry.Type;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
+import jalview.io.FileLoader;
+import jalview.io.FormatAdapter;
+import jalview.structure.StructureSelectionManager;
 
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -19,6 +29,13 @@ public class AlignViewportTest
   AlignmentI al;
   AlignViewport testee;
 
+  @BeforeClass(alwaysRun = true)
+  public static void setUpBeforeClass() throws Exception
+  {
+    jalview.bin.Jalview.main(new String[] { "-props",
+        "test/jalview/testProps.jvprops" });
+  }
+
  @BeforeMethod(alwaysRun = true)
   public void setUp()
   {
@@ -84,4 +101,115 @@ public class AlignViewportTest
     // no sequence refers to PDBEntry[2]
     assertEquals(0, seqs[2].length);
   }
+
+  /**
+   * Test that a mapping is not deregistered when a second view is closed but
+   * the first still holds a reference to the mapping
+   */
+  @Test(groups ={ "Functional" })
+  public void testDeregisterMapping_onCloseView()
+  {
+    /*
+     * alignment with reference to mappings
+     */
+    AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded(
+            ">Seq1\nCAGT\n", FormatAdapter.PASTE);
+  
+    AlignedCodonFrame acf1 = new AlignedCodonFrame();
+    AlignedCodonFrame acf2 = new AlignedCodonFrame();
+  
+    Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
+    mappings.add(acf1);
+    mappings.add(acf2);
+    af1.getViewport().getAlignment().setCodonFrames(mappings);
+    af1.newView_actionPerformed(null);
+  
+    /*
+     * Verify that creating the alignment for the new View has registered the
+     * mappings
+     */
+    StructureSelectionManager ssm = StructureSelectionManager
+            .getStructureSelectionManager(Desktop.instance);
+    assertEquals(2, ssm.seqmappings.size());
+    assertTrue(ssm.seqmappings.contains(acf1));
+    assertTrue(ssm.seqmappings.contains(acf2));
+  
+    /*
+     * Close the second view. Verify that mappings are not removed as the first
+     * view still holds a reference to them.
+     */
+    af1.closeMenuItem_actionPerformed(false);
+    assertEquals(2, ssm.seqmappings.size());
+    assertTrue(ssm.seqmappings.contains(acf1));
+    assertTrue(ssm.seqmappings.contains(acf2));
+  }
+
+  /**
+   * Test that a mapping is not deregistered if an alignment holds a reference
+   * to it
+   */
+  @Test(groups ={ "Functional" })
+  public void testDeregisterMapping_withAlignmentReference()
+  {
+    Desktop d = Desktop.instance;
+    assertNotNull(d);
+  
+    /*
+     * alignment with reference to mappings
+     */
+    AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded(
+            ">Seq1\nCAGT\n", FormatAdapter.PASTE);
+  
+    AlignedCodonFrame acf1 = new AlignedCodonFrame();
+    AlignedCodonFrame acf2 = new AlignedCodonFrame();
+  
+    Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
+    mappings.add(acf1);
+    mappings.add(acf2);
+    af1.getViewport().getAlignment().setCodonFrames(mappings);
+    StructureSelectionManager ssm = StructureSelectionManager
+            .getStructureSelectionManager(Desktop.instance);
+
+    /*
+     * Add one and remove it.
+     */
+    ssm.registerMapping(acf1);
+    ssm.deregisterMapping(acf1);
+    assertEquals(1, ssm.seqmappings.size());
+    assertTrue(ssm.seqmappings.contains(acf1));
+  }
+
+  /**
+   * Test that a mapping is deregistered if no alignment holds a reference to it
+   */
+  @Test(groups ={ "Functional" })
+  public void testDeregisterMapping_withNoReference()
+  {
+    Desktop d = Desktop.instance;
+    assertNotNull(d);
+  
+    /*
+     * alignment with reference to mappings
+     */
+    AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded(
+            ">Seq1\nCAGT\n", FormatAdapter.PASTE);
+  
+    AlignedCodonFrame acf1 = new AlignedCodonFrame();
+    AlignedCodonFrame acf2 = new AlignedCodonFrame();
+  
+    Set<AlignedCodonFrame> mappings = new LinkedHashSet<AlignedCodonFrame>();
+    mappings.add(acf2);
+    af1.getViewport().getAlignment().setCodonFrames(mappings);
+    StructureSelectionManager ssm = StructureSelectionManager
+            .getStructureSelectionManager(Desktop.instance);
+  
+    /*
+     * Add one and remove it.
+     */
+    ssm.registerMapping(acf1);
+    assertEquals(1, ssm.seqmappings.size());
+    assertTrue(ssm.seqmappings.contains(acf1));
+    ssm.deregisterMapping(acf1);
+    assertEquals(0, ssm.seqmappings.size());
+  }
 }