int getEndRes();
+ int getStartRes();
+
/**
* calculate the height for visible annotation, revalidating bounds where
* necessary ABSTRACT GUI METHOD
* @return search results or null
*/
SearchResultsI getSearchResults();
+
+ int getStartSeq();
+
+ int getEndSeq();
}
import jalview.renderer.ResidueShader;
import jalview.schemes.ColourSchemeProperty;
import jalview.schemes.UserColourScheme;
-import jalview.structure.CommandListener;
import jalview.structure.SelectionSource;
import jalview.structure.StructureSelectionManager;
import jalview.structure.VamsasSource;
import java.awt.Font;
public class AlignViewport extends AlignmentViewport implements
- SelectionSource, VamsasSource, CommandListener
+ SelectionSource
{
boolean cursorMode = false;
*/
package jalview.appletgui;
-import jalview.datamodel.AlignmentI;
+import jalview.viewmodel.OverviewDimensions;
import java.awt.Color;
import java.awt.Dimension;
public class OverviewPanel extends Panel implements Runnable,
MouseMotionListener, MouseListener
{
- Image miniMe;
+ private OverviewDimensions od;
- Image offscreen;
+ private Image miniMe;
- AlignViewport av;
+ private Image offscreen;
- AlignmentPanel ap;
+ private AlignViewport av;
- float scalew = 1f;
+ private AlignmentPanel ap;
- float scaleh = 1f;
+ private boolean resizing = false;
- public int width, sequencesHeight;
-
- int graphHeight = 20;
-
- int boxX = -1, boxY = -1, boxWidth = -1, boxHeight = -1;
-
- boolean resizing = false;
+ // This is set true if the user resizes whilst
+ // the overview is being calculated
+ private boolean resizeAgain = false;
// Can set different properties in this seqCanvas than
// main visible SeqCanvas
- SequenceRenderer sr;
+ private SequenceRenderer sr;
- FeatureRenderer fr;
+ private FeatureRenderer fr;
- Frame nullFrame;
+ private Frame nullFrame;
public OverviewPanel(AlignmentPanel ap)
{
sr.forOverview = true;
fr = new FeatureRenderer(av);
- // scale the initial size of overviewpanel to shape of alignment
- float initialScale = (float) av.getAlignment().getWidth()
- / (float) av.getAlignment().getHeight();
+ od = new OverviewDimensions(av);
- if (av.getSequenceConsensusHash() == null)
- {
- graphHeight = 0;
- }
-
- if (av.getAlignment().getWidth() > av.getAlignment().getHeight())
- {
- // wider
- width = 400;
- sequencesHeight = (int) (400f / initialScale);
- if (sequencesHeight < 40)
- {
- sequencesHeight = 40;
- }
- }
- else
- {
- // taller
- width = (int) (400f * initialScale);
- sequencesHeight = 300;
- if (width < 120)
- {
- width = 120;
- }
- }
-
- setSize(new Dimension(width, sequencesHeight + graphHeight));
+ setSize(new Dimension(od.getWidth(), od.getHeight()));
addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent evt)
{
- if (getSize().width != width
- || getSize().height != sequencesHeight + graphHeight)
+ if ((getWidth() != od.getWidth())
+ || (getHeight() != (od.getHeight())))
{
updateOverviewImage();
}
@Override
public void mousePressed(MouseEvent evt)
{
- boxX = evt.getX();
- boxY = evt.getY();
+ od.setBoxX(evt.getX());
+ od.setBoxY(evt.getY());
checkValid();
}
@Override
public void mouseReleased(MouseEvent evt)
{
- boxX = evt.getX();
- boxY = evt.getY();
+ od.setBoxX(evt.getX());
+ od.setBoxY(evt.getY());
checkValid();
}
@Override
public void mouseDragged(MouseEvent evt)
{
- boxX = evt.getX();
- boxY = evt.getY();
+ od.setBoxX(evt.getX());
+ od.setBoxY(evt.getY());
checkValid();
}
- void checkValid()
+ /**
+ * Check box dimensions and scroll positions and correct if necessary
+ */
+ private void checkValid()
{
- if (boxY < 0)
- {
- boxY = 0;
- }
-
- if (boxY > (sequencesHeight - boxHeight))
- {
- boxY = sequencesHeight - boxHeight + 1;
- }
-
- if (boxX < 0)
- {
- boxX = 0;
- }
-
- if (boxX > (width - boxWidth))
- {
- if (av.hasHiddenColumns())
- {
- // Try smallest possible box
- boxWidth = (int) ((av.endRes - av.startRes + 1) * av.getCharWidth() * scalew);
- }
- boxX = width - boxWidth;
- }
-
- int col = (int) (boxX / scalew / av.getCharWidth());
- int row = (int) (boxY / scaleh / av.getCharHeight());
-
- if (av.hasHiddenColumns())
- {
- if (!av.getColumnSelection().isVisible(col))
- {
- return;
- }
-
- col = av.getColumnSelection().findColumnPosition(col);
- }
-
- if (av.hasHiddenRows())
- {
- row = av.getAlignment().getHiddenSequences()
- .findIndexWithoutHiddenSeqs(row);
- }
-
- ap.setScrollValues(col, row);
+ od.checkValid();
+ ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
ap.paintAlignment(false);
}
resizing = true;
- if ((getSize().width > 0) && (getSize().height > 0))
+ if ((getWidth() > 0) && (getHeight() > 0))
{
- width = getSize().width;
- sequencesHeight = getSize().height - graphHeight;
+ od.setWidth(getWidth()); // width = getWidth();
+ od.setHeight(getHeight()); // sequencesHeight = getHeight() - graphHeight;
}
- setSize(new Dimension(width, sequencesHeight + graphHeight));
+ setSize(new Dimension(od.getWidth(), od.getHeight()));
Thread thread = new Thread(this);
thread.start();
repaint();
}
- // This is set true if the user resizes whilst
- // the overview is being calculated
- boolean resizeAgain = false;
-
@Override
public void run()
{
miniMe = null;
- int alwidth = av.getAlignment().getWidth();
- int alheight = av.getAlignment().getHeight()
- + av.getAlignment().getHiddenSequences().getSize();
if (av.isShowSequenceFeatures())
{
if (getSize().width > 0 && getSize().height > 0)
{
- width = getSize().width;
- sequencesHeight = getSize().height - graphHeight;
+ od.setWidth(getSize().width);
+ od.setHeight(getSize().height - od.getGraphHeight());
}
- setSize(new Dimension(width, sequencesHeight + graphHeight));
-
- int fullsizeWidth = alwidth * av.getCharWidth();
- int fullsizeHeight = alheight * av.getCharHeight();
+ setSize(new Dimension(od.getWidth(), od.getHeight()));
- scalew = (float) width / (float) fullsizeWidth;
- scaleh = (float) sequencesHeight / (float) fullsizeHeight;
-
- miniMe = nullFrame.createImage(width, sequencesHeight + graphHeight);
- offscreen = nullFrame.createImage(width, sequencesHeight + graphHeight);
+ miniMe = nullFrame.createImage(od.getWidth(), od.getHeight());
+ offscreen = nullFrame.createImage(od.getWidth(), od.getHeight());
Graphics mg = miniMe.getGraphics();
- float sampleCol = (float) alwidth / (float) width;
- float sampleRow = (float) alheight / (float) sequencesHeight;
- int lastcol = 0, lastrow = 0;
- int xstart = 0, ystart = 0;
- Color color = Color.yellow;
- int row, col, sameRow = 0, sameCol = 0;
- jalview.datamodel.SequenceI seq;
- final boolean hasHiddenRows = av.hasHiddenRows(), hasHiddenCols = av
- .hasHiddenColumns();
- boolean hiddenRow = false;
- AlignmentI alignment = av.getAlignment();
- for (row = 0; row <= sequencesHeight; row++)
- {
- if (resizeAgain)
- {
- break;
- }
- if ((int) (row * sampleRow) == lastrow)
- {
- sameRow++;
- continue;
- }
-
- hiddenRow = false;
- if (hasHiddenRows)
- {
- seq = alignment.getHiddenSequences().getHiddenSequence(lastrow);
- if (seq == null)
- {
- int index = alignment.getHiddenSequences()
- .findIndexWithoutHiddenSeqs(lastrow);
-
- seq = alignment.getSequenceAt(index);
- }
- else
- {
- hiddenRow = true;
- }
- }
- else
- {
- seq = alignment.getSequenceAt(lastrow);
- }
+ od.updateScales();
- for (col = 0; col < width; col++)
- {
- if ((int) (col * sampleCol) == lastcol
- && (int) (row * sampleRow) == lastrow)
- {
- sameCol++;
- continue;
- }
-
- lastcol = (int) (col * sampleCol);
-
- if (seq.getLength() > lastcol)
- {
- color = sr.getResidueBoxColour(seq, lastcol);
-
- if (av.isShowSequenceFeatures())
- {
- color = fr.findFeatureColour(color, seq, lastcol);
- }
- }
- else
- {
- color = Color.white; // White
- }
-
- if (hiddenRow
- || (hasHiddenCols && !av.getColumnSelection().isVisible(
- lastcol)))
- {
- color = color.darker().darker();
- }
-
- mg.setColor(color);
- if (sameCol == 1 && sameRow == 1)
- {
- mg.drawLine(xstart, ystart, xstart, ystart);
- }
- else
- {
- mg.fillRect(xstart, ystart, sameCol, sameRow);
- }
+ int alwidth = av.getAlignment().getWidth();
+ int alheight = av.getAlignment().getHeight()
+ + av.getAlignment().getHiddenSequences().getSize();
+ float sampleCol = alwidth / (float) od.getWidth();
+ float sampleRow = alheight / (float) od.getSequencesHeight();
- xstart = col;
- sameCol = 1;
- }
- lastrow = (int) (row * sampleRow);
- ystart = row;
- sameRow = 1;
- }
+ buildImage(sampleRow, sampleCol, mg);
if (av.getAlignmentConservationAnnotation() != null)
{
- for (col = 0; col < width; col++)
+ for (int col = 0; col < od.getWidth() && !resizeAgain; col++)
{
- if (resizeAgain)
- {
- break;
- }
- lastcol = (int) (col * sampleCol);
- {
- mg.translate(col, sequencesHeight);
- ap.annotationPanel.renderer.drawGraph(mg,
- av.getAlignmentConservationAnnotation(),
- av.getAlignmentConservationAnnotation().annotations,
- (int) (sampleCol) + 1, graphHeight,
- (int) (col * sampleCol), (int) (col * sampleCol) + 1);
- mg.translate(-col, -sequencesHeight);
- }
+ mg.translate(col, od.getSequencesHeight());
+ ap.annotationPanel.renderer.drawGraph(mg,
+ av.getAlignmentConservationAnnotation(),
+ av.getAlignmentConservationAnnotation().annotations,
+ (int) (sampleCol) + 1, od.getGraphHeight(),
+ (int) (col * sampleCol), (int) (col * sampleCol) + 1);
+ mg.translate(-col, -od.getSequencesHeight());
}
}
System.gc();
}
}
- public void setBoxPosition()
+ private void buildImage(float sampleRow, float sampleCol, Graphics mg)
{
- int fullsizeWidth = av.getAlignment().getWidth() * av.getCharWidth();
- int fullsizeHeight = (av.getAlignment().getHeight() + av.getAlignment()
- .getHiddenSequences().getSize())
- * av.getCharHeight();
-
- int startRes = av.getStartRes();
- int endRes = av.getEndRes();
-
- if (av.hasHiddenColumns())
- {
- startRes = av.getColumnSelection().adjustForHiddenColumns(startRes);
- endRes = av.getColumnSelection().adjustForHiddenColumns(endRes);
- }
+ int lastcol = 0;
+ int lastrow = 0;
+ int xstart = 0;
+ int ystart = 0;
+ Color color = Color.yellow;
+ int sameRow = 0;
+ int sameCol = 0;
- int startSeq = av.startSeq;
- int endSeq = av.endSeq;
+ jalview.datamodel.SequenceI seq = null;
+ final boolean hasHiddenRows = av.hasHiddenRows();
+ final boolean hasHiddenCols = av.hasHiddenColumns();
+ boolean hiddenRow = false;
- if (av.hasHiddenRows())
+ for (int row = 0; row <= od.getSequencesHeight() && !resizeAgain; row++)
{
- startSeq = av.getAlignment().getHiddenSequences()
- .adjustForHiddenSeqs(startSeq);
+ if ((int) (row * sampleRow) == lastrow)
+ {
+ sameRow++;
+ continue;
+ }
+ else
+ {
+ // this should largely be a method in Alignment
+ hiddenRow = false;
+ if (hasHiddenRows)
+ {
+ seq = av.getAlignment().getHiddenSequences()
+ .getHiddenSequence(lastrow);
+ if (seq == null)
+ {
+ int index = av.getAlignment().getHiddenSequences()
+ .findIndexWithoutHiddenSeqs(lastrow);
- endSeq = av.getAlignment().getHiddenSequences()
- .adjustForHiddenSeqs(endSeq);
+ seq = av.getAlignment().getSequenceAt(index);
+ }
+ else
+ {
+ hiddenRow = true;
+ }
+ }
+ else
+ {
+ seq = av.getAlignment().getSequenceAt(lastrow);
+ }
+ // end of Alignment method
+ for (int col = 0; col < od.getWidth(); col++)
+ {
+ if ((int) (col * sampleCol) == lastcol
+ && (int) (row * sampleRow) == lastrow)
+ {
+ sameCol++;
+ }
+ else
+ {
+ lastcol = (int) (col * sampleCol);
+
+ color = getColumnColourFromSequence(seq, hiddenRow,
+ hasHiddenCols, lastcol);
+
+ mg.setColor(color);
+ if (sameCol == 1 && sameRow == 1)
+ {
+ mg.drawLine(xstart, ystart, xstart, ystart);
+ }
+ else
+ {
+ mg.fillRect(xstart, ystart, sameCol, sameRow);
+ }
+
+ xstart = col;
+ sameCol = 1;
+ }
+ }
+ lastrow = (int) (row * sampleRow);
+ ystart = row;
+ sameRow = 1;
+ }
}
- scalew = (float) width / (float) fullsizeWidth;
- scaleh = (float) sequencesHeight / (float) fullsizeHeight;
-
- boxX = (int) (startRes * av.getCharWidth() * scalew);
- boxY = (int) (startSeq * av.getCharHeight() * scaleh);
+ }
- if (av.hasHiddenColumns())
+ /*
+ * Find the colour of a sequence at a specified column position
+ */
+ private Color getColumnColourFromSequence(
+ jalview.datamodel.SequenceI seq, boolean hiddenRow,
+ boolean hasHiddenCols, int lastcol)
+ {
+ Color color;
+ if (seq.getLength() > lastcol)
{
- boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
+ color = sr.getResidueBoxColour(seq, lastcol);
+
+ if (av.isShowSequenceFeatures())
+ {
+ color = fr.findFeatureColour(color, seq, lastcol);
+ }
}
else
{
- boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
+ color = Color.white; // White
}
- boxHeight = (int) ((endSeq - startSeq) * av.getCharHeight() * scaleh);
+ if (hiddenRow
+ || (hasHiddenCols && !av.getColumnSelection()
+ .isVisible(lastcol)))
+ {
+ color = color.darker().darker();
+ }
+ return color;
+ }
+ /**
+ * Update the overview panel box when the associated alignment panel is
+ * changed
+ *
+ */
+ public void setBoxPosition()
+ {
+ od.setBoxPosition();
repaint();
}
{
og.drawImage(miniMe, 0, 0, this);
og.setColor(Color.red);
- og.drawRect(boxX, boxY, boxWidth, boxHeight);
- og.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
+ og.drawRect(od.getBoxX(), od.getBoxY(), od.getBoxWidth(),
+ od.getBoxHeight());
+ og.drawRect(od.getBoxX() + 1, od.getBoxY() + 1, od.getBoxWidth() - 2,
+ od.getBoxHeight() - 2);
g.drawImage(offscreen, 0, 0, this);
}
}
import jalview.schemes.ColourSchemeProperty;
import jalview.schemes.ResidueColourScheme;
import jalview.schemes.UserColourScheme;
-import jalview.structure.CommandListener;
import jalview.structure.SelectionSource;
import jalview.structure.StructureSelectionManager;
import jalview.structure.VamsasSource;
* @version $Revision: 1.141 $
*/
public class AlignViewport extends AlignmentViewport implements
- SelectionSource, CommandListener
+ SelectionSource
{
Font font;
width = av.getColumnSelection().findColumnPosition(width);
}
- av.setEndRes((x + (getSeqPanel().seqCanvas.getWidth() / av
- .getCharWidth())) - 1);
-
hextent = getSeqPanel().seqCanvas.getWidth() / av.getCharWidth();
vextent = getSeqPanel().seqCanvas.getHeight() / av.getCharHeight();
x = 0;
}
+ av.setEndRes((x + (getSeqPanel().seqCanvas.getWidth() / av
+ .getCharWidth())) - 1);
+
/*
* each scroll adjustment triggers adjustmentValueChanged, which resets the
* 'do not scroll complement' flag; ensure it is the same for both
package jalview.gui;
import jalview.renderer.AnnotationRenderer;
+import jalview.viewmodel.OverviewDimensions;
import java.awt.Color;
import java.awt.Dimension;
*/
public class OverviewPanel extends JPanel implements Runnable
{
- BufferedImage miniMe;
+ private static final Color TRANS_GREY = new Color(100, 100, 100, 25);
- AlignViewport av;
+ private final AnnotationRenderer renderer = new AnnotationRenderer();
- AlignmentPanel ap;
+ private OverviewDimensions od;
- final AnnotationRenderer renderer = new AnnotationRenderer();
+ private BufferedImage miniMe;
- float scalew = 1f;
-
- float scaleh = 1f;
-
- int width;
-
- int sequencesHeight;
-
- int graphHeight = 20;
-
- int boxX = -1;
+ private BufferedImage lastMiniMe = null;
- int boxY = -1;
+ private AlignViewport av;
- int boxWidth = -1;
+ private AlignmentPanel ap;
- int boxHeight = -1;
+ //
+ private boolean resizing = false;
- boolean resizing = false;
+ // This is set true if the user resizes whilst
+ // the overview is being calculated
+ private boolean resizeAgain = false;
// Can set different properties in this seqCanvas than
// main visible SeqCanvas
- SequenceRenderer sr;
+ private SequenceRenderer sr;
- jalview.renderer.seqfeatures.FeatureRenderer fr;
+ private jalview.renderer.seqfeatures.FeatureRenderer fr;
/**
* Creates a new OverviewPanel object.
*
* @param ap
- * DOCUMENT ME!
+ * The alignment panel which is shown in the overview panel
*/
public OverviewPanel(AlignmentPanel ap)
{
sr.forOverview = true;
fr = new FeatureRenderer(ap);
- // scale the initial size of overviewpanel to shape of alignment
- float initialScale = (float) av.getAlignment().getWidth()
- / (float) av.getAlignment().getHeight();
-
- if (av.getAlignmentConservationAnnotation() == null)
- {
- graphHeight = 0;
- }
-
- if (av.getAlignment().getWidth() > av.getAlignment().getHeight())
- {
- // wider
- width = 400;
- sequencesHeight = (int) (400f / initialScale);
- if (sequencesHeight < 40)
- {
- sequencesHeight = 40;
- }
- }
- else
- {
- // taller
- width = (int) (400f * initialScale);
- sequencesHeight = 300;
-
- if (width < 120)
- {
- width = 120;
- }
- }
+ od = new OverviewDimensions(av);
addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent evt)
{
- if ((getWidth() != width)
- || (getHeight() != (sequencesHeight + graphHeight)))
+ if ((getWidth() != od.getWidth())
+ || (getHeight() != (od.getHeight())))
{
updateOverviewImage();
}
{
// TODO: feature: jv2.5 detect shift drag and update selection from
// it.
- boxX = evt.getX();
- boxY = evt.getY();
+ od.setBoxX(evt.getX());
+ od.setBoxY(evt.getY());
checkValid();
}
}
{
if (!av.getWrapAlignment())
{
- boxX = evt.getX();
- boxY = evt.getY();
+ od.setBoxX(evt.getX());
+ od.setBoxY(evt.getY());
checkValid();
}
}
}
/**
- * DOCUMENT ME!
+ * Check box dimensions and scroll positions and correct if necessary
*/
- void checkValid()
+ private void checkValid()
{
- if (boxY < 0)
- {
- boxY = 0;
- }
-
- if (boxY > (sequencesHeight - boxHeight))
- {
- boxY = sequencesHeight - boxHeight + 1;
- }
-
- if (boxX < 0)
- {
- boxX = 0;
- }
-
- if (boxX > (width - boxWidth))
- {
- if (av.hasHiddenColumns())
- {
- // Try smallest possible box
- boxWidth = (int) ((av.endRes - av.startRes + 1) * av.getCharWidth() * scalew);
- }
- boxX = width - boxWidth;
- }
-
- int col = (int) (boxX / scalew / av.getCharWidth());
- int row = (int) (boxY / scaleh / av.getCharHeight());
-
- if (av.hasHiddenColumns())
- {
- if (!av.getColumnSelection().isVisible(col))
- {
- return;
- }
-
- col = av.getColumnSelection().findColumnPosition(col);
- }
-
- if (av.hasHiddenRows())
- {
- row = av.getAlignment().getHiddenSequences()
- .findIndexWithoutHiddenSeqs(row);
- }
-
- ap.setScrollValues(col, row);
+ od.checkValid();
+ ap.setScrollValues(od.getScrollCol(), od.getScrollRow());
}
/**
- * DOCUMENT ME!
+ * Updates the overview image when the related alignment panel is updated
*/
public void updateOverviewImage()
{
if ((getWidth() > 0) && (getHeight() > 0))
{
- width = getWidth();
- sequencesHeight = getHeight() - graphHeight;
+ od.setWidth(getWidth()); // width = getWidth();
+ od.setHeight(getHeight()); // sequencesHeight = getHeight() - graphHeight;
}
- setPreferredSize(new Dimension(width, sequencesHeight + graphHeight));
+ setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
Thread thread = new Thread(this);
thread.start();
repaint();
}
- // This is set true if the user resizes whilst
- // the overview is being calculated
- boolean resizeAgain = false;
-
- /**
- * DOCUMENT ME!
- */
@Override
public void run()
{
fr.transferSettings(ap.getSeqPanel().seqCanvas.getFeatureRenderer());
}
+ // why do we need to set preferred size again? was set in
+ // updateOverviewImage
+ setPreferredSize(new Dimension(od.getWidth(), od.getHeight()));
+
+ miniMe = new BufferedImage(od.getWidth(), od.getHeight(),
+ BufferedImage.TYPE_INT_RGB);
+
+ Graphics mg = miniMe.getGraphics();
+ mg.setColor(Color.orange);
+ mg.fillRect(0, 0, od.getWidth(), miniMe.getHeight());
+
+ // calculate scale based on current alignment width and height
+ od.updateScales();
+
+ // calculate sampleCol and sampleRow
+ // alignment width is max number of residues/bases
+ // alignment height is number of sequences
int alwidth = av.getAlignment().getWidth();
int alheight = av.getAlignment().getHeight()
+ av.getAlignment().getHiddenSequences().getSize();
- setPreferredSize(new Dimension(width, sequencesHeight + graphHeight));
+ // sampleCol or sampleRow is the width/height allocated to each residue
+ // in particular, sometimes we may need more than one row/col of the
+ // BufferedImage allocated
+ // sampleCol is how much of a residue to assign to each pixel
+ // sampleRow is how many sequences to assign to each pixel
+ float sampleCol = alwidth / (float) od.getWidth();
+ float sampleRow = alheight / (float) od.getSequencesHeight();
+
+ buildImage(sampleRow, sampleCol);
- int fullsizeWidth = alwidth * av.getCharWidth();
- int fullsizeHeight = alheight * av.getCharHeight();
+ if (av.getAlignmentConservationAnnotation() != null)
+ {
+ renderer.updateFromAlignViewport(av);
+ for (int col = 0; col < od.getWidth() && !resizeAgain; col++)
+ {
+ mg.translate(col, od.getSequencesHeight());
+ renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(),
+ av.getAlignmentConservationAnnotation().annotations,
+ (int) (sampleCol) + 1, od.getGraphHeight(),
+ (int) (col * sampleCol), (int) (col * sampleCol) + 1);
+ mg.translate(-col, -od.getSequencesHeight());
- scalew = (float) width / (float) fullsizeWidth;
- scaleh = (float) sequencesHeight / (float) fullsizeHeight;
+ }
+ }
+ System.gc();
- miniMe = new BufferedImage(width, sequencesHeight + graphHeight,
- BufferedImage.TYPE_INT_RGB);
+ resizing = false;
- Graphics mg = miniMe.getGraphics();
- mg.setColor(Color.orange);
- mg.fillRect(0, 0, width, miniMe.getHeight());
+ if (resizeAgain)
+ {
+ resizeAgain = false;
+ updateOverviewImage();
+ }
+ else
+ {
+ lastMiniMe = miniMe;
+ }
- float sampleCol = (float) alwidth / (float) width;
- float sampleRow = (float) alheight / (float) sequencesHeight;
+ setBoxPosition();
+ }
- int lastcol = -1, lastrow = -1;
+ private void buildImage(float sampleRow, float sampleCol)
+ {
+ int lastcol = -1;
+ int lastrow = -1;
int color = Color.white.getRGB();
- int row, col;
- jalview.datamodel.SequenceI seq;
- final boolean hasHiddenRows = av.hasHiddenRows(), hasHiddenCols = av
- .hasHiddenColumns();
+
+ jalview.datamodel.SequenceI seq = null;
+ final boolean hasHiddenRows = av.hasHiddenRows();
+ final boolean hasHiddenCols = av.hasHiddenColumns();
boolean hiddenRow = false;
// get hidden row and hidden column map once at beginning.
// clone featureRenderer settings to avoid race conditions... if state is
// updated just need to refresh again
- for (row = 0; row < sequencesHeight; row++)
+ for (int row = 0; row < od.getSequencesHeight() && !resizeAgain; row++)
{
- if (resizeAgain)
+ boolean doCopy = true;
+ int currentrow = (int) (row * sampleRow);
+ if (currentrow != lastrow)
{
- break;
- }
- if ((int) (row * sampleRow) == lastrow)
- {
- // No need to recalculate the colours,
- // Just copy from the row above
- for (col = 0; col < width; col++)
- {
- if (resizeAgain)
- {
- break;
- }
- miniMe.setRGB(col, row, miniMe.getRGB(col, row - 1));
- }
- continue;
- }
+ doCopy = false;
- lastrow = (int) (row * sampleRow);
+ lastrow = currentrow;
- hiddenRow = false;
- if (hasHiddenRows)
- {
- seq = av.getAlignment().getHiddenSequences()
- .getHiddenSequence(lastrow);
- if (seq == null)
+ hiddenRow = false;
+ // should be method(s) in Alignment
+ if (hasHiddenRows)
{
- int index = av.getAlignment().getHiddenSequences()
- .findIndexWithoutHiddenSeqs(lastrow);
+ seq = av.getAlignment().getHiddenSequences()
+ .getHiddenSequence(lastrow);
+ if (seq == null)
+ {
+ int index = av.getAlignment().getHiddenSequences()
+ .findIndexWithoutHiddenSeqs(lastrow);
- seq = av.getAlignment().getSequenceAt(index);
+ seq = av.getAlignment().getSequenceAt(index);
+ }
+ else
+ {
+ hiddenRow = true;
+ }
}
else
{
- hiddenRow = true;
+ seq = av.getAlignment().getSequenceAt(lastrow);
}
- }
- else
- {
- seq = av.getAlignment().getSequenceAt(lastrow);
+ // end of Alignment method(s)
}
if (seq == null)
continue;
}
- for (col = 0; col < width; col++)
+ for (int col = 0; col < od.getWidth() && !resizeAgain; col++)
{
- if (resizeAgain)
- {
- break;
- }
- if ((int) (col * sampleCol) == lastcol
- && (int) (row * sampleRow) == lastrow)
+ if (doCopy)
{
- miniMe.setRGB(col, row, color);
- continue;
+ color = miniMe.getRGB(col, row - 1);
}
-
- lastcol = (int) (col * sampleCol);
-
- if (seq.getLength() > lastcol)
- {
- color = sr.getResidueBoxColour(seq, lastcol).getRGB();
-
- if (av.isShowSequenceFeatures())
- {
- color = fr.findFeatureColour(color, seq, lastcol);
- }
- }
- else
- {
- color = -1; // White
- }
-
- if (hiddenRow
- || (hasHiddenCols && !av.getColumnSelection().isVisible(
- lastcol)))
+ else if ((int) (col * sampleCol) != lastcol
+ || (int) (row * sampleRow) != lastrow)
{
- color = new Color(color).darker().darker().getRGB();
+ lastcol = (int) (col * sampleCol);
+ color = getColumnColourFromSequence(seq, hiddenRow, hasHiddenCols,
+ lastcol);
}
+ // else if ((int) (col * sampleCol) == lastcol && (int) (row *
+ // sampleRow) == lastrow))
+ // we just use the color we already have , so don't need to set it
miniMe.setRGB(col, row, color);
-
}
}
+ }
- if (av.getAlignmentConservationAnnotation() != null)
+ /*
+ * Find the colour of a sequence at a specified column position
+ */
+ private int getColumnColourFromSequence(jalview.datamodel.SequenceI seq,
+ boolean hiddenRow, boolean hasHiddenCols, int lastcol)
+ {
+ int color;
+
+ if (seq.getLength() > lastcol)
{
- renderer.updateFromAlignViewport(av);
- for (col = 0; col < width; col++)
+ color = sr.getResidueBoxColour(seq, lastcol).getRGB();
+
+ if (av.isShowSequenceFeatures())
{
- if (resizeAgain)
- {
- break;
- }
- lastcol = (int) (col * sampleCol);
- {
- mg.translate(col, sequencesHeight);
- renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(),
- av.getAlignmentConservationAnnotation().annotations,
- (int) (sampleCol) + 1, graphHeight,
- (int) (col * sampleCol), (int) (col * sampleCol) + 1);
- mg.translate(-col, -sequencesHeight);
- }
+ color = fr.findFeatureColour(color, seq, lastcol);
}
}
- System.gc();
-
- resizing = false;
-
- if (resizeAgain)
+ else
{
- resizeAgain = false;
- updateOverviewImage();
+ color = Color.white.getRGB(); // White
}
- else
+
+ if (hiddenRow
+ || (hasHiddenCols && !av.getColumnSelection()
+ .isVisible(lastcol)))
{
- lastMiniMe = miniMe;
+ color = new Color(color).darker().darker().getRGB();
}
- setBoxPosition();
+ return color;
}
/**
- * DOCUMENT ME!
+ * Update the overview panel box when the associated alignment panel is
+ * changed
+ *
*/
public void setBoxPosition()
{
- int fullsizeWidth = av.getAlignment().getWidth() * av.getCharWidth();
- int fullsizeHeight = (av.getAlignment().getHeight() + av.getAlignment()
- .getHiddenSequences().getSize())
- * av.getCharHeight();
-
- int startRes = av.getStartRes();
- int endRes = av.getEndRes();
-
- if (av.hasHiddenColumns())
- {
- startRes = av.getColumnSelection().adjustForHiddenColumns(startRes);
- endRes = av.getColumnSelection().adjustForHiddenColumns(endRes);
- }
-
- int startSeq = av.startSeq;
- int endSeq = av.endSeq;
-
- if (av.hasHiddenRows())
- {
- startSeq = av.getAlignment().getHiddenSequences()
- .adjustForHiddenSeqs(startSeq);
-
- endSeq = av.getAlignment().getHiddenSequences()
- .adjustForHiddenSeqs(endSeq);
-
- }
-
- scalew = (float) width / (float) fullsizeWidth;
- scaleh = (float) sequencesHeight / (float) fullsizeHeight;
-
- boxX = (int) (startRes * av.getCharWidth() * scalew);
- boxY = (int) (startSeq * av.getCharHeight() * scaleh);
-
- if (av.hasHiddenColumns())
- {
- boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
- }
- else
- {
- boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
- }
-
- boxHeight = (int) ((endSeq - startSeq) * av.getCharHeight() * scaleh);
-
+ od.setBoxPosition();
repaint();
}
- private BufferedImage lastMiniMe = null;
- /**
- * DOCUMENT ME!
- *
- * @param g
- * DOCUMENT ME!
- */
@Override
public void paintComponent(Graphics g)
{
{
g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this);
}
- g.setColor(new Color(100, 100, 100, 25));
+ g.setColor(TRANS_GREY);
g.fillRect(0, 0, getWidth(), getHeight());
}
else if (lastMiniMe != null)
g.drawImage(lastMiniMe, 0, 0, this);
if (lastMiniMe != miniMe)
{
- g.setColor(new Color(100, 100, 100, 25));
+ g.setColor(TRANS_GREY);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
// TODO: render selected regions
g.setColor(Color.red);
- g.drawRect(boxX, boxY, boxWidth, boxHeight);
- g.drawRect(boxX + 1, boxY + 1, boxWidth - 2, boxHeight - 2);
+ g.drawRect(od.getBoxX(), od.getBoxY(), od.getBoxWidth(),
+ od.getBoxHeight());
+ g.drawRect(od.getBoxX() + 1, od.getBoxY() + 1, od.getBoxWidth() - 2,
+ od.getBoxHeight() - 2);
}
}
this.followHighlight = b;
}
+ @Override
public int getStartRes()
{
return startRes;
return endRes;
}
+ @Override
public int getStartSeq()
{
return startSeq;
this.endSeq = seq;
}
+ @Override
public int getEndSeq()
{
return endSeq;
--- /dev/null
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.viewmodel;
+
+import jalview.api.AlignViewportI;
+
+public class OverviewDimensions
+{
+ // Default width and height values
+ private static final int DEFAULT_GRAPH_HEIGHT = 20;
+
+ private static final int MAX_WIDTH = 400;
+
+ private static final int MIN_WIDTH = 120;
+
+ private static final int MIN_SEQ_HEIGHT = 40;
+
+ private static final int MAX_SEQ_HEIGHT = 300;
+
+ private AlignViewportI av;
+
+ private float scalew = 1f;
+
+ private float scaleh = 1f;
+
+ // width of the overview panel
+ private int width;
+
+ // height of sequences part of the overview panel
+ private int sequencesHeight;
+
+ // height of the graphs part of the overview panel
+ private int graphHeight = DEFAULT_GRAPH_HEIGHT;
+
+ // dimensions of box outlining current extent of view in alignment panel
+ // location of left side of box
+ private int boxX = -1;
+
+ // location of bottom of box
+ private int boxY = -1;
+
+ // width of box
+ private int boxWidth = -1;
+
+ // height of box
+ private int boxHeight = -1;
+
+ private int scrollCol = -1;
+
+ private int scrollRow = -1;
+
+ public OverviewDimensions(AlignViewportI avi)
+ {
+ this.av = avi;
+
+ // scale the initial size of overviewpanel to shape of alignment
+ float initialScale = (float) av.getAlignment().getWidth()
+ / (float) av.getAlignment().getHeight();
+
+ // TODO: in applet this was getSequenceConsensusHash()
+ // check if it makes any functional difference
+ if (av.getAlignmentConservationAnnotation() == null)
+ {
+ graphHeight = 0;
+ }
+
+ if (av.getAlignment().getWidth() > av.getAlignment().getHeight())
+ {
+ // wider
+ width = MAX_WIDTH;
+ sequencesHeight = (int) (MAX_WIDTH / initialScale);
+ if (sequencesHeight < MIN_SEQ_HEIGHT)
+ {
+ sequencesHeight = MIN_SEQ_HEIGHT;
+ }
+ }
+ else
+ {
+ // taller
+ width = (int) (MAX_WIDTH * initialScale);
+ sequencesHeight = MAX_SEQ_HEIGHT;
+
+ if (width < MIN_WIDTH)
+ {
+ width = MIN_WIDTH;
+ }
+ }
+ }
+
+ /**
+ * Check box dimensions and scroll positions and correct if necessary
+ */
+ public void checkValid()
+ {
+ if (boxY < 0)
+ {
+ boxY = 0;
+ }
+
+ if (boxY > (sequencesHeight - boxHeight))
+ {
+ boxY = sequencesHeight - boxHeight + 1;
+ }
+
+ if (boxX < 0)
+ {
+ boxX = 0;
+ }
+
+ if (boxX > (width - boxWidth))
+ {
+ if (av.hasHiddenColumns())
+ {
+ // Try smallest possible box
+ boxWidth = (int) ((av.getEndRes() - av.getStartRes() + 1)
+ * av.getCharWidth() * scalew);
+ }
+ boxX = width - boxWidth;
+ }
+
+ scrollCol = (int) (boxX / scalew / av.getCharWidth());
+ scrollRow = (int) (boxY / scaleh / av.getCharHeight());
+
+ if (av.hasHiddenColumns())
+ {
+ if (!av.getColumnSelection().isVisible(scrollCol))
+ {
+ return;
+ }
+
+ scrollCol = av.getColumnSelection().findColumnPosition(scrollCol);
+ }
+
+ if (av.hasHiddenRows())
+ {
+ scrollRow = av.getAlignment().getHiddenSequences()
+ .findIndexWithoutHiddenSeqs(scrollRow);
+ }
+ }
+
+ /**
+ * Update the overview panel box when the associated alignment panel is
+ * changed
+ *
+ */
+ public void setBoxPosition()
+ {
+ updateScales();
+
+ int startRes = av.getStartRes();
+ int endRes = av.getEndRes();
+
+ if (av.hasHiddenColumns())
+ {
+ startRes = av.getColumnSelection().adjustForHiddenColumns(startRes);
+ endRes = av.getColumnSelection().adjustForHiddenColumns(endRes);
+ }
+
+ int startSeq = av.getStartSeq();
+ int endSeq = av.getEndSeq();
+
+ if (av.hasHiddenRows())
+ {
+ startSeq = av.getAlignment().getHiddenSequences()
+ .adjustForHiddenSeqs(startSeq);
+
+ endSeq = av.getAlignment().getHiddenSequences()
+ .adjustForHiddenSeqs(endSeq);
+
+ }
+
+ boxX = (int) (startRes * av.getCharWidth() * scalew);
+ boxY = (int) (startSeq * av.getCharHeight() * scaleh);
+
+ if (av.hasHiddenColumns())
+ {
+ boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
+ }
+ else
+ {
+ boxWidth = (int) ((endRes - startRes + 1) * av.getCharWidth() * scalew);
+ }
+
+ boxHeight = (int) ((endSeq - startSeq) * av.getCharHeight() * scaleh);
+ }
+
+ /**
+ * Update width and height scales in terms of the alignment width and height
+ */
+ public void updateScales()
+ {
+ int alwidth = av.getAlignment().getWidth();
+ int alheight = av.getAlignment().getHeight()
+ + av.getAlignment().getHiddenSequences().getSize();
+
+ int fullsizeWidth = alwidth * av.getCharWidth();
+ int fullsizeHeight = alheight * av.getCharHeight();
+
+ scalew = (float) width / fullsizeWidth;
+ scaleh = (float) sequencesHeight / fullsizeHeight;
+ }
+
+ // don't like this, scroll vals are separate from setting code
+ public int getScrollCol()
+ {
+ return scrollCol;
+ }
+
+ public int getScrollRow()
+ {
+ return scrollRow;
+ }
+
+ public int getBoxX()
+ {
+ return boxX;
+ }
+
+ public int getBoxY()
+ {
+ return boxY;
+ }
+
+ public int getBoxWidth()
+ {
+ return boxWidth;
+ }
+
+ public int getBoxHeight()
+ {
+ return boxHeight;
+ }
+
+ public void setBoxX(int x)
+ {
+ boxX = x;
+ }
+
+ public void setBoxY(int y)
+ {
+ boxY = y;
+ }
+
+ public void setWidth(int w)
+ {
+ width = w;
+ }
+
+ public void setHeight(int h)
+ {
+ sequencesHeight = h - graphHeight;
+ }
+
+ public int getWidth()
+ {
+ return width;
+ }
+
+ public int getHeight()
+ {
+ return sequencesHeight + graphHeight;
+ }
+
+ public int getSequencesHeight()
+ {
+ return sequencesHeight;
+ }
+
+ public int getGraphHeight()
+ {
+ return graphHeight;
+ }
+}
--- /dev/null
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.viewmodel;
+
+import static org.testng.Assert.assertEquals;
+
+import jalview.bin.Cache;
+import jalview.bin.Jalview;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignViewport;
+import jalview.gui.JvOptionPane;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class OverviewDimensionsTest {
+
+ boolean showConservationSetting;
+
+ SequenceI seq1 = new Sequence(
+ "Seq1",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq2 = new Sequence(
+ "Seq2",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq3 = new Sequence(
+ "Seq3",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq4 = new Sequence(
+ "Seq4",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq5 = new Sequence(
+ "Seq5",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq6 = new Sequence(
+ "Seq6",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq7 = new Sequence(
+ "Seq7",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq8 = new Sequence(
+ "Seq8",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq9 = new Sequence(
+ "Seq9",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq10 = new Sequence(
+ "Seq10",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq11 = new Sequence(
+ "Seq11",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq12 = new Sequence(
+ "Seq12",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq13 = new Sequence(
+ "Seq13",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq14 = new Sequence(
+ "Seq14",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq15 = new Sequence(
+ "Seq15",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq16 = new Sequence(
+ "Seq16",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq17 = new Sequence(
+ "Seq17",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq18 = new Sequence(
+ "Seq18",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq19 = new Sequence(
+ "Seq19",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq20 = new Sequence(
+ "Seq20",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq21 = new Sequence(
+ "Seq21",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq22 = new Sequence(
+ "Seq22",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"
+ + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"
+ + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ SequenceI seq23 = new Sequence(
+ "Seq23",
+ "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+
+ @BeforeClass(alwaysRun = true)
+ public void setUp()
+ {
+ JvOptionPane.setInteractiveMode(false);
+ JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+
+ Jalview.main(new String[] { "-nonews", "-props",
+ "test/jalview/testProps.jvprops" });
+
+ // get cached setting for showConservation
+ // reset it in AfterClass!
+ showConservationSetting = Cache.getDefault("SHOW_CONSERVATION", true);
+ }
+
+ @AfterClass(alwaysRun = true)
+ public void tearDown()
+ {
+ Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
+ Boolean.toString(showConservationSetting));
+ }
+
+ /**
+ * Test that the OverviewDimensions constructor sets width and height
+ * correctly
+ */
+ @Test(groups = { "Functional" })
+ public void testConstructor()
+ {
+ SequenceI seqa = new Sequence("Seq1", "ABC");
+ SequenceI seqb = new Sequence("Seq2", "ABC");
+ SequenceI seqc = new Sequence("Seq3", "ABC");
+ SequenceI seqd = new Sequence("Seq4", "ABC");
+ SequenceI seqe = new Sequence("Seq5",
+ "ABCABCABCABCABCABCABCABCBACBACBACBAC");
+
+ Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
+ Boolean.toString(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);
+
+ OverviewDimensions od = new OverviewDimensions(av1);
+ assertEquals(od.getGraphHeight(), 20);
+ assertEquals(od.getSequencesHeight(), 266);
+ assertEquals(od.getWidth(), 400);
+ assertEquals(od.getHeight(), 286);
+
+ // 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);
+
+ od = new OverviewDimensions(av2);
+ assertEquals(od.getGraphHeight(), 20);
+ assertEquals(od.getSequencesHeight(), 300);
+ assertEquals(od.getWidth(), 300);
+ assertEquals(od.getHeight(), 320);
+
+ // test for alignment with width > height and sequence height scaled below
+ // min value
+ SequenceI[] seqs3 = new SequenceI[] { seqe };
+ Alignment al3 = new Alignment(seqs3);
+ al3.setDataset(null);
+ AlignViewport av3 = new AlignViewport(al3);
+
+ od = new OverviewDimensions(av3);
+ assertEquals(od.getGraphHeight(), 20);
+ assertEquals(od.getSequencesHeight(), 40);
+ assertEquals(od.getWidth(), 400);
+ assertEquals(od.getHeight(), 60);
+
+ // test for alignment with width < height and width scaled below min value
+ 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);
+
+ od = new OverviewDimensions(av4);
+ assertEquals(od.getGraphHeight(), 20);
+ assertEquals(od.getSequencesHeight(), 300);
+ assertEquals(od.getWidth(), 120);
+ assertEquals(od.getHeight(), 320);
+
+ // test for alignment where no conservation annotation is shown
+ Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
+ Boolean.toString(false));
+
+ Alignment al5 = new Alignment(seqs4);
+ al5.setDataset(null);
+ AlignViewport av5 = new AlignViewport(al5);
+
+ od = new OverviewDimensions(av5);
+ assertEquals(od.getGraphHeight(), 0);
+ assertEquals(od.getSequencesHeight(), 300);
+ assertEquals(od.getWidth(), 120);
+ assertEquals(od.getHeight(), 300);
+ }
+
+ /**
+ * 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
+ */
+ @Test(groups = { "Functional" })
+ public void checkValidNoHidden()
+ {
+ seq23.setStart(386);
+ SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
+ seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
+ seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
+ Alignment al = new Alignment(seqs);
+ al.setDataset(null);
+ AlignViewport av = new AlignViewport(al);
+
+ // Initial box sizing - default path through code
+ OverviewDimensions od = new OverviewDimensions(av);
+ od.setBoxPosition();
+ od.checkValid();
+ assertEquals(od.getBoxX(), 0);
+ assertEquals(od.getBoxY(), 0);
+ assertEquals(od.getBoxWidth(), 399);
+ assertEquals(od.getScrollCol(), 0);
+ assertEquals(od.getScrollRow(), 0);
+
+ // negative boxX value reset to 0
+ od.setBoxX(-5);
+ od.checkValid();
+ assertEquals(od.getBoxX(), 0);
+
+ // negative boxY value reset to 0
+ od.setBoxY(-2);
+ od.checkValid();
+ assertEquals(od.getBoxY(), 0);
+
+ // overly large boxX value reset to width-boxWidth
+ od.setBoxX(100);
+ od.checkValid();
+ assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth());
+
+ // startRes non-zero
+ av.setStartRes(50);
+ OverviewDimensions od2 = new OverviewDimensions(av);
+ od2.setBoxPosition();
+ od2.checkValid();
+ assertEquals(od2.getBoxX(), 61);
+ assertEquals(od2.getScrollCol(), 49);
+ }
+
+ /**
+ * Test setting of the box position, when there are hidden cols at the start
+ * of the alignment
+ */
+ @Test(groups = { "Functional" })
+ public void testSetBoxPosWithHiddenColsAtStart()
+ {
+ seq23.setStart(386);
+ SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
+ seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
+ seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
+ Alignment al = new Alignment(seqs);
+ al.setDataset(null);
+ AlignViewport av = new AlignViewport(al);
+
+ av.setStartRes(50);
+ OverviewDimensions od = new OverviewDimensions(av);
+
+ // hiding columns before current position: changes boxX but not scrollCol or
+ // boxwidth
+
+ // do a reset
+ av.showAllHiddenColumns();
+ od.setBoxPosition();
+ od.checkValid();
+ int prevWidth = od.getBoxWidth();
+
+ // hide cols at start and check updated box position is correct
+ // changes boxX but not scrollCol or boxwidth
+ int lastHiddenCol = 50;
+ av.hideColumns(0, 50);
+ od.setBoxPosition();
+ assertEquals(od.getBoxX(), 124);
+ assertEquals(od.getScrollCol(), lastHiddenCol - 1);
+ assertEquals(od.getBoxWidth(), prevWidth);
+
+ // set the box position by moving viewport & check it goes to the right
+ // place
+
+ // update the box position via mouse and check it goes to the right place
+ }
+
+ @Test(groups = { "Functional" })
+ public void testSetBoxPosWithHiddenColsAtEnd()
+ {
+
+ }
+
+ @Test(groups = { "Functional" })
+ public void testSetBoxPosWithHiddenColsMiddle()
+ {
+ seq23.setStart(386);
+ SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
+ seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
+ seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
+ Alignment al = new Alignment(seqs);
+ al.setDataset(null);
+ AlignViewport av = new AlignViewport(al);
+
+ av.setStartRes(50);
+ OverviewDimensions od = new OverviewDimensions(av);
+
+ // hiding columns after current position: changes end position but not start
+ // so scrollCol and boxX do not change but boxWidth does
+ float scalew = od.getWidth() / al.getWidth();
+ int prevWidth = od.getBoxWidth();
+ int prevX = od.getBoxX();
+ av.hideColumns(108, 110);
+ od.setBoxPosition();
+ assertEquals(od.getBoxX(), prevX);
+ assertEquals(od.getScrollCol(), 49);
+ // assertEquals(od2.getBoxWidth(), prevWidth + ((int) 2 * av.getCharWidth()
+ // / scalew));
+ }
+
+ @Test(groups = { "Functional" })
+ public void testSetBoxPosWithHiddenRowsAtStart()
+ {
+ seq23.setStart(386);
+ SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
+ seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
+ seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
+ Alignment al = new Alignment(seqs);
+ al.setDataset(null);
+ AlignViewport av = new AlignViewport(al);
+
+ av.setStartRes(50);
+ OverviewDimensions od = new OverviewDimensions(av);
+
+ // account for hidden rows
+ SequenceI[] hidden = { seq2, seq3, seq4, seq5, seq6, seq7 };
+ av.showAllHiddenColumns();
+ av.hideSequence(hidden);
+ od.checkValid();
+ assertEquals(od.getBoxY(), 0);
+ assertEquals(od.getScrollRow(), 0);
+ }
+
+ /**
+ * Test that the box position is set correctly
+ */
+ @Test(groups = { "Functional" })
+ public void setBoxPosition()
+ {
+
+ SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
+ seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
+ seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
+ Alignment al = new Alignment(seqs);
+ al.setDataset(null);
+ AlignViewport av = new AlignViewport(al);
+
+ // Test box is in expected location when there are no hidden rows or columns
+
+ OverviewDimensions od = new OverviewDimensions(av);
+ od.setBoxPosition();
+
+ assertEquals(od.getBoxHeight(), 81);
+ assertEquals(od.getBoxWidth(), 400);
+ assertEquals(od.getBoxX(), 0);
+ assertEquals(od.getBoxY(), 0);
+
+ // Account for hidden rows
+ SequenceI[] hidden = { seq2, seq3, seq4 };
+ av.hideSequence(hidden);
+
+ OverviewDimensions od1 = new OverviewDimensions(av);
+ od1.setBoxPosition();
+
+ assertEquals(od1.getBoxHeight(), 80);
+ assertEquals(od1.getBoxWidth(), 400);
+ assertEquals(od1.getBoxX(), 0);
+ assertEquals(od1.getBoxY(), 0);
+
+ // Account for hidden columns
+ av.hideColumns(10, 15);
+ av.showAllHiddenSeqs();
+
+ OverviewDimensions od2 = new OverviewDimensions(av);
+ od2.setBoxPosition();
+
+ assertEquals(od2.getBoxHeight(), 81);
+ assertEquals(od2.getBoxWidth(), 422);
+ assertEquals(od2.getBoxX(), 0);
+ assertEquals(od2.getBoxY(), 0);
+
+ // Account for hidden rows and cols
+ av.hideSequence(hidden);
+ OverviewDimensions od3 = new OverviewDimensions(av);
+ od3.setBoxPosition();
+
+ assertEquals(od3.getBoxHeight(), 80);
+ assertEquals(od3.getBoxWidth(), 422);
+ assertEquals(od3.getBoxX(), 0);
+ assertEquals(od3.getBoxY(), 0);
+ }
+}