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;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
+import java.util.Set;
import java.util.Vector;
import javax.swing.JInternalFrame;
*/
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());
}
}
}
+ 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!
*
}
}
+ /**
+ * 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;
+ }
+
}
package jalview.structure;
import jalview.analysis.AlignSeq;
-import jalview.api.AlignmentViewPanel;
import jalview.api.StructureSelectionManagerProvider;
import jalview.commands.CommandI;
import jalview.commands.EditCommand;
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;
/*
* 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>();
}
/**
- * 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())
}
/**
- * 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
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;
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()
{
// 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());
+ }
}