From e81459b192f4d635c1cd96befa7b14992d12ee5e Mon Sep 17 00:00:00 2001 From: gmungoc Date: Thu, 27 Aug 2015 15:26:58 +0100 Subject: [PATCH] JAL-1830 refactored so no jalview.gui references from jalview.structure --- src/jalview/gui/AlignViewport.java | 63 +++++++++- src/jalview/gui/AlignmentPanel.java | 2 +- .../structure/StructureSelectionManager.java | 54 +-------- test/jalview/gui/AlignViewportTest.java | 128 ++++++++++++++++++++ 4 files changed, 189 insertions(+), 58 deletions(-) diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index 997fd52..579b476 100644 --- a/src/jalview/gui/AlignViewport.java +++ b/src/jalview/gui/AlignViewport.java @@ -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 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; + } + } diff --git a/src/jalview/gui/AlignmentPanel.java b/src/jalview/gui/AlignmentPanel.java index d88e207..e29a0e2 100644 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@ -1613,7 +1613,7 @@ public class AlignmentPanel extends GAlignmentPanel implements @Override public AlignmentI getAlignment() { - return av.getAlignment(); + return av == null ? null : av.getAlignment(); } diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java index 9dd730c..4359877 100644 --- a/src/jalview/structure/StructureSelectionManager.java +++ b/src/jalview/structure/StructureSelectionManager.java @@ -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 seqmappings = new LinkedHashSet(); + public Set seqmappings = new LinkedHashSet(); private List commandListeners = new ArrayList(); @@ -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 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 diff --git a/test/jalview/gui/AlignViewportTest.java b/test/jalview/gui/AlignViewportTest.java index 4c55386..6f51487 100644 --- a/test/jalview/gui/AlignViewportTest.java +++ b/test/jalview/gui/AlignViewportTest.java @@ -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 mappings = new LinkedHashSet(); + 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 mappings = new LinkedHashSet(); + 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 mappings = new LinkedHashSet(); + 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()); + } } -- 1.7.10.2