import static org.testng.Assert.assertEquals;
import jalview.analysis.AlignmentGenerator;
-import jalview.bin.Jalview;
import jalview.datamodel.Alignment;
import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceCollectionI;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
-import jalview.gui.AlignFrame;
-import jalview.gui.AlignViewport;
-import jalview.gui.Desktop;
-import jalview.gui.JvOptionPane;
-import jalview.io.DataSourceType;
-import jalview.io.FileLoader;
-import java.util.List;
+import java.util.Hashtable;
import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
"Seq5",
"ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
- AlignFrame af;
- AlignViewport av;
AlignmentI al;
OverviewDimensions od;
int alheight;
int alwidth;
+ ViewportPositionProps posProps;
+
+ Hashtable<SequenceI, SequenceCollectionI> hiddenRepSequences = new Hashtable<SequenceI, SequenceCollectionI>();
+
+ ColumnSelection hiddenCols = new ColumnSelection();
+
@BeforeClass(alwaysRun = true)
public void setUpJvOptionPane()
{
- JvOptionPane.setInteractiveMode(false);
- JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
-
// create random alignment
AlignmentGenerator gen = new AlignmentGenerator(false);
al = gen.generate(157, 525, 123, 5, 5);
@BeforeMethod(alwaysRun = true)
public void setUp()
{
- Jalview.main(new String[] { "-nonews", "-props",
- "test/jalview/testProps.jvprops" });
-
- af = new FileLoader().LoadFileWaitTillLoaded(al.toString(),
- DataSourceType.PASTE);
-
- /*
- * wait for Consensus thread to complete
- */
- synchronized (this)
+ if (!hiddenRepSequences.isEmpty())
{
- while (af.getViewport().getConsensusSeq() == null)
- {
- try
- {
- wait(50);
- } catch (InterruptedException e)
- {
- }
- }
+ al.getHiddenSequences().showAll(hiddenRepSequences);
}
+ hiddenCols.revealAllHiddenColumns();
- av = af.getViewport();
-
+ posProps = new ViewportPositionProps(al);
+ posProps.setStartRes(0);
+ posProps.setEndRes(62);
+ posProps.setStartSeq(0);
+ posProps.setEndSeq(17);
+ viewHeight = posProps.getEndSeq() - posProps.getStartSeq() + 1;
+ viewWidth = posProps.getEndRes() - posProps.getStartRes() + 1;
- while (av.isCalcInProgress())
- {
- try
- {
- Thread.sleep(50);
- } catch (InterruptedException e)
- {
-
- }
- }
-
- av.showAllHiddenColumns();
- av.showAllHiddenSeqs();
- av.setSelectionGroup(null);
- // o/w hidden seqs retain selection group, causes problems later when hiding
- // sequences
-
- // wait for conservation calc to complete again
- while (av.isCalcInProgress())
- {
- try
- {
- Thread.sleep(50);
- } catch (InterruptedException e)
- {
-
- }
- }
-
- viewHeight = av.getEndSeq() - av.getStartSeq() + 1;
- viewWidth = av.getEndRes() - av.getStartRes() + 1;
-
- // wait for gui to get set up
- // this does actually appear to be necessary
- while (viewHeight != 18 || viewWidth != 63)
- {
- try
- {
- Thread.sleep(50);
- av.getAlignPanel().setScrollValues(0, 1);
- av.getAlignPanel().setScrollValues(1, 0);
- viewHeight = av.getEndSeq() - av.getStartSeq() + 1;
- viewWidth = av.getEndRes() - av.getStartRes() + 1;
- } catch (InterruptedException e)
- {
-
- }
- }
+ ColumnSelection hiddenCols = new ColumnSelection();
- od = new OverviewDimensions(av.getPosProps(), true);
+ od = new OverviewDimensions(posProps, true);
// Initial box sizing - default path through code
- od.setBoxPosition(av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
mouseClick(od, 0, 0);
moveViewport(0, 0);
// calculate before hidden columns so we get absolute values
- alheight = av.getAlignment().getHeight();
- alwidth = av.getAlignment().getWidth();
+ alheight = posProps.getAbsoluteAlignmentHeight();
+ alwidth = posProps.getAbsoluteAlignmentWidth();
- boxWidth = Math.round((float) (av.getEndRes() - av.getStartRes() + 1)
+ boxWidth = Math.round((float) (posProps.getEndRes()
+ - posProps.getStartRes() + 1)
* od.getWidth() / alwidth);
- boxHeight = Math.round((float) (av.getEndSeq() - av.getStartSeq() + 1)
+ boxHeight = Math.round((float) (posProps.getEndSeq()
+ - posProps.getStartSeq() + 1)
* od.getSequencesHeight() / alheight);
- System.out.println(boxHeight);
-
- }
-
- @AfterMethod(alwaysRun = true)
- public void tearDown()
- {
- af = null;
- av = null;
- Desktop.instance.closeAll_actionPerformed(null);
}
@AfterClass(alwaysRun = true)
// test for alignment with width > height
SequenceI[] seqs1 = new SequenceI[] { seqa, seqb };
Alignment al1 = new Alignment(seqs1);
- al1.setDataset(null);
- AlignViewport av1 = new AlignViewport(al1);
+ ViewportPositionProps props = new ViewportPositionProps(al1);
- OverviewDimensions od = new OverviewDimensions(av1.getPosProps(), true);
+ OverviewDimensions od = new OverviewDimensions(props, true);
int scaledHeight = 266;
assertEquals(od.getGraphHeight(), defaultGraphHeight);
assertEquals(od.getSequencesHeight(), scaledHeight);
// test for alignment with width < height
SequenceI[] seqs2 = new SequenceI[] { seqa, seqb, seqc, seqd };
Alignment al2 = new Alignment(seqs2);
- al2.setDataset(null);
- AlignViewport av2 = new AlignViewport(al2);
+ props = new ViewportPositionProps(al2);
- od = new OverviewDimensions(av2.getPosProps(), true);
+ od = new OverviewDimensions(props, true);
int scaledWidth = 300;
assertEquals(od.getGraphHeight(), defaultGraphHeight);
assertEquals(od.getSequencesHeight(), maxSeqHeight);
// min value
SequenceI[] seqs3 = new SequenceI[] { seqe };
Alignment al3 = new Alignment(seqs3);
- al3.setDataset(null);
- AlignViewport av3 = new AlignViewport(al3);
+ props = new ViewportPositionProps(al3);
- od = new OverviewDimensions(av3.getPosProps(), true);
+ od = new OverviewDimensions(props, true);
assertEquals(od.getGraphHeight(), defaultGraphHeight);
assertEquals(od.getSequencesHeight(), minSeqHeight);
assertEquals(od.getWidth(), maxWidth);
SequenceI[] seqs4 = new SequenceI[] { seqa, seqb, seqc, seqd, seqa,
seqb, seqc, seqd, seqa, seqb, seqc, seqd, seqa, seqb, seqc, seqd };
Alignment al4 = new Alignment(seqs4);
- al4.setDataset(null);
- AlignViewport av4 = new AlignViewport(al4);
+ props = new ViewportPositionProps(al4);
- od = new OverviewDimensions(av4.getPosProps(), true);
+ od = new OverviewDimensions(props, true);
assertEquals(od.getGraphHeight(), defaultGraphHeight);
assertEquals(od.getSequencesHeight(), maxSeqHeight);
assertEquals(od.getWidth(), minWidth);
assertEquals(od.getHeight(), maxSeqHeight + defaultGraphHeight);
Alignment al5 = new Alignment(seqs4);
- al5.setDataset(null);
- AlignViewport av5 = new AlignViewport(al5);
+ props = new ViewportPositionProps(al5);
- od = new OverviewDimensions(av5.getPosProps(), false);
+ od = new OverviewDimensions(props, false);
assertEquals(od.getGraphHeight(), 0);
assertEquals(od.getSequencesHeight(), maxSeqHeight);
assertEquals(od.getWidth(), minWidth);
* Test that validation after mouse adjustments to boxX and boxY sets box
* dimensions and scroll values correctly, when there are no hidden rows or
* columns.
- *
- * The current implementation uses multiple transformations between coordinate
- * systems which often involve casting to int, which causes values to be
- * truncated. As a result we can lose accuracy. The tests below use
- * approximate test values where appropriate.
*/
@Test(groups = { "Functional" })
public void testSetBoxFromMouseClick()
{
- od.updateViewportFromMouse(0, 0,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols,
+ posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
@Test(groups = { "Functional" })
public void testFromMouseWithHiddenColsAtStart()
{
- od.updateViewportFromMouse(0, 0,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols,
+ posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
// hide cols at start and check updated box position is correct
// changes boxX but not boxwidth
int lastHiddenCol = 30;
- hideColumns(0, lastHiddenCol);
+ hiddenCols.hideColumns(0, lastHiddenCol);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
assertEquals(od.getBoxX(),
Math.round((float) (lastHiddenCol + 1) * od.getWidth()
/ alwidth));
@Test(groups = { "Functional" })
public void testFromMouseWithHiddenColsInMiddle()
{
- od.updateViewportFromMouse(0, 0,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols,
+ posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
// hide columns 63-73, no change to box position or dimensions
int firstHidden = 63;
int lastHidden = 73;
- hideColumns(firstHidden, lastHidden);
+ hiddenCols.hideColumns(firstHidden, lastHidden);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
@Test(groups = { "Functional" })
public void testFromMouseWithHiddenColsAtEnd()
{
- od.updateViewportFromMouse(0, 0,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols,
+ posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
// hide columns 140-164, no change to box position or dimensions
int firstHidden = 140;
int lastHidden = 164;
- hideColumns(firstHidden, lastHidden);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ hiddenCols.hideColumns(firstHidden, lastHidden);
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
{
int firstHidden = 0;
int lastHidden = 20;
- hideColumns(firstHidden, lastHidden);
+ hiddenCols.hideColumns(firstHidden, lastHidden);
// move viewport to start of alignment
moveViewport(0, 0);
{
int firstHidden = 68;
int lastHidden = 78;
- hideColumns(firstHidden, lastHidden);
+ hiddenCols.hideColumns(firstHidden, lastHidden);
// move viewport before hidden columns
moveViewport(3, 0);
{
int firstHidden = 152;
int lastHidden = 164;
- hideColumns(firstHidden, lastHidden);
+ hiddenCols.hideColumns(firstHidden, lastHidden);
// move viewport before hidden columns
moveViewport(3, 0);
{
int firstHidden = 0;
int lastHidden = 20;
- hideSequences(firstHidden, lastHidden + 1, lastHidden + 1);
+ hideSequences(firstHidden, lastHidden);
// move viewport to start of alignment:
// box moves to below hidden rows, height remains same
{
int firstHidden = 200;
int lastHidden = 210;
- hideSequences(firstHidden, lastHidden + 1, lastHidden + 1);
+ hideSequences(firstHidden, lastHidden);
// move viewport to start of alignment:
// box, height etc as in non-hidden case
{
int firstHidden = 500;
int lastHidden = 524;
- hideSequences(firstHidden - 1, lastHidden, firstHidden - 1);
+ hideSequences(firstHidden, lastHidden);
// move viewport to start of alignment:
// box, height etc as in non-hidden case
@Test(groups = { "Functional" })
public void testFromMouseWithHiddenRowsAtStart()
{
- od.updateViewportFromMouse(0, 0,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols,
+ posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxHeight(), boxHeight);
// hide rows at start and check updated box position is correct
// changes boxY but not boxheight
int lastHiddenRow = 30;
- hideSequences(0, lastHiddenRow + 1, lastHiddenRow + 1);
+ hideSequences(0, lastHiddenRow);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(),
Math.round((float) (lastHiddenRow + 1)
@Test(groups = { "Functional" })
public void testFromMouseWithHiddenRowsInMiddle()
{
- od.updateViewportFromMouse(0, 0,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols,
+ posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
// no changes
int firstHiddenRow = 50;
int lastHiddenRow = 60;
- hideSequences(firstHiddenRow, lastHiddenRow + 1, lastHiddenRow + 1);
+ hideSequences(firstHiddenRow, lastHiddenRow);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
@Test(groups = { "Functional" })
public void testFromMouseWithHiddenRowsAtEnd()
{
- od.updateViewportFromMouse(0, 0,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(0, 0, al.getHiddenSequences(), hiddenCols,
+ posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
// no changes
int firstHidden = 500;
int lastHidden = 524;
- hideSequences(firstHidden - 1, lastHidden, firstHidden - 1);
+ hideSequences(firstHidden, lastHidden);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
assertEquals(od.getBoxX(), 0);
assertEquals(od.getBoxY(), 0);
assertEquals(od.getBoxWidth(), boxWidth);
*/
private void moveViewportH(int startRes)
{
- av.setStartRes(startRes);
- av.setEndRes(startRes + viewWidth - 1);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ posProps.setStartRes(startRes);
+ posProps.setEndRes(startRes + viewWidth - 1);
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
}
/*
*/
private void moveViewportV(int startSeq)
{
- av.setStartSeq(startSeq);
- av.setEndSeq(startSeq + viewHeight - 1);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ posProps.setStartSeq(startSeq);
+ posProps.setEndSeq(startSeq + viewHeight - 1);
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
}
/*
*/
private void moveViewport(int startRes, int startSeq)
{
- av.setStartRes(startRes);
- av.setEndRes(startRes + viewWidth - 1);
- av.setStartSeq(startSeq);
- av.setEndSeq(startSeq + viewHeight - 1);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+ posProps.setStartRes(startRes);
+ posProps.setEndRes(startRes + viewWidth - 1);
+ posProps.setStartSeq(startSeq);
+ posProps.setEndSeq(startSeq + viewHeight - 1);
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
}
/*
*/
private void mouseClick(OverviewDimensions od, int x, int y)
{
- od.updateViewportFromMouse(x, y,
- av.getAlignment().getHiddenSequences(),
- av.getColumnSelection(), av.getPosProps());
+ od.updateViewportFromMouse(x, y, al.getHiddenSequences(), hiddenCols,
+ posProps);
+
// updates require an OverviewPanel to exist which it doesn't here
// so call setBoxPosition() as it would be called by the AlignmentPanel
// normally
- // int width = av.getEndRes() - av.getStartRes();
- // int height = av.getEndSeq() - av.getStartSeq();
- av.setStartRes(od.getScrollCol());
- av.setEndRes(od.getScrollCol() + viewWidth - 1);
- av.setStartSeq(od.getScrollRow());
- av.setEndSeq(od.getScrollRow() + viewHeight - 1);
- od.setBoxPosition(av.getAlignment()
- .getHiddenSequences(), av.getColumnSelection(), av.getPosProps());
+
+ posProps.setStartRes(od.getScrollCol());
+ posProps.setEndRes(od.getScrollCol() + viewWidth - 1);
+ posProps.setStartSeq(od.getScrollRow());
+ posProps.setEndSeq(od.getScrollRow() + viewHeight - 1);
+ od.setBoxPosition(al.getHiddenSequences(), hiddenCols, posProps);
}
+ /*
+ * Test that the box is positioned with the top left corner at xpos, ypos
+ * and with the original width and height
+ */
private void testBoxIsAtClickPoint(int xpos, int ypos)
{
mouseClick(od, xpos, ypos);
}
/*
- * Hide sequences between start and end, using hideseq to do the hiding
- * (start <= hideseq <= end. Sequence hideseq is not hidden but the others are
+ * Hide sequences between start and end
*/
- private void hideSequences(int start, int end, int hideseq)
+ private void hideSequences(int start, int end)
{
- SequenceGroup sg = new SequenceGroup();
- List<SequenceI> allseqs = av.getAlignment().getSequences();
- for (int i = start; i <= end; ++i)
- {
- sg.addSequence(allseqs.get(i), false);
- }
- av.setSelectionGroup(sg);
-
- /*
- * hide group
- */
- av.hideSequences(allseqs.get(hideseq), true);
-
- while (av.isCalcInProgress())
+ SequenceI[] allseqs = al.getSequencesArray();
+ SequenceGroup theseSeqs = new SequenceGroup();
+
+ for (int i = start; i <= end; i++)
{
- try
- {
- Thread.sleep(50);
- } catch (InterruptedException e)
- {
- System.out.println("Hiding seqs interruption");
- }
+ theseSeqs.addSequence(allseqs[i], false);
+ al.getHiddenSequences().hideSequence(allseqs[i]);
}
- }
- private void hideColumns(int firstHidden, int lastHidden)
- {
- av.hideColumns(firstHidden, lastHidden);
-
- while (av.isCalcInProgress())
- {
- try
- {
- Thread.sleep(50);
- } catch (InterruptedException e)
- {
- System.out.println("Hiding cols interruption");
- }
- }
+ hiddenRepSequences.put(allseqs[start], theseSeqs);
}
}