import java.awt.BorderLayout;
import java.awt.CheckboxMenuItem;
+import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Panel;
import java.awt.PopupMenu;
private boolean updateRunning = false;
+ private boolean draggingBox = false;
+
public OverviewPanel(AlignmentPanel alPanel)
{
this.av = alPanel.av;
@Override
public void mouseMoved(MouseEvent evt)
{
+ if (od.isPositionInBox(evt.getX(), evt.getY()))
+ {
+ // display drag cursor at mouse position
+ setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+ }
+ else
+ {
+ // reset cursor
+ setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ }
}
@Override
public void mousePressed(MouseEvent evt)
{
- mouseAction(evt);
+ if ((evt.getModifiers()
+ & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
+ {
+ if (!Platform.isAMac())
+ {
+ showPopupMenu(evt);
+ }
+ }
+ else
+ {
+ if (!od.isPositionInBox(evt.getX(), evt.getY()))
+ {
+ // don't do anything if the mouse press is in the overview's box
+ // (wait to see if it's a drag instead)
+ // otherwise update the viewport
+ od.updateViewportFromMouse(evt.getX(), evt.getY(),
+ av.getAlignment().getHiddenSequences(),
+ av.getAlignment().getHiddenColumns());
+ }
+ else
+ {
+ draggingBox = true;
+ od.setDragPoint(evt.getX(), evt.getY(),
+ av.getAlignment().getHiddenSequences(),
+ av.getAlignment().getHiddenColumns());
+ }
+ }
}
@Override
public void mouseReleased(MouseEvent evt)
{
- mouseAction(evt);
+ if (draggingBox)
+ {
+ draggingBox = false;
+ }
}
@Override
public void mouseDragged(MouseEvent evt)
{
- mouseAction(evt);
- }
-
- private void mouseAction(MouseEvent evt)
- {
if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
{
if (!Platform.isAMac())
}
else
{
- od.updateViewportFromMouse(evt.getX(), evt.getY(), av.getAlignment()
- .getHiddenSequences(), av.getAlignment().getHiddenColumns());
+ if (draggingBox)
+ {
+ // set the mouse position as a fixed point in the box
+ // and drag relative to that position
+ od.adjustViewportFromMouse(evt.getX(), evt.getY(),
+ av.getAlignment().getHiddenSequences(),
+ av.getAlignment().getHiddenColumns());
+ }
+ else
+ {
+ od.updateViewportFromMouse(evt.getX(), evt.getY(),
+ av.getAlignment().getHiddenSequences(),
+ av.getAlignment().getHiddenColumns());
+ }
ap.paintAlignment(false);
}
}
int xAsRes = getLeftXFromCentreX(mousex, hiddenCols);
int yAsSeq = getTopYFromCentreY(mousey, hiddenSeqs);
- updateViewportFromTopLeft(xAsRes, yAsSeq, hiddenSeqs, hiddenCols);
+ int visXAsRes = hiddenCols.findColumnPosition(xAsRes);
+ yAsSeq = hiddenSeqs.adjustForHiddenSeqs(
+ hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq));
+ int visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq);
+
+ updateViewportFromTopLeft(visXAsRes, visYAsSeq, hiddenSeqs, hiddenCols);
}
@Override
// coords,
// convert back to pixel coords
int vpx = Math.round((float) mousex * alwidth / width);
- // int visXAsRes = hiddenCols.findColumnPosition(vpx);
+ int visXAsRes = hiddenCols.findColumnPosition(vpx) + fixedX;
int vpy = Math.round((float) mousey * alheight / sequencesHeight);
- // int visYAsRes = hiddenSeqs.findIndexWithoutHiddenSeqs(vpy);
-
- System.out.println("vpx: " + vpx);
- // System.out.println("VisXAsRes: " + visXAsRes);
- System.out.println("transX: " + transX);
- // updateViewportFromTopLeft(vpx + transX, vpy + transY,
- // hiddenSeqs,
- // hiddenCols);
-
- int xAsRes = vpx + transX;
- int yAsSeq = vpy + transY;
-
- resetAlignmentDims();
-
- if (xAsRes < 0)
- {
- xAsRes = 0;
- }
-
- if (yAsSeq < 0)
- {
- yAsSeq = 0;
- }
-
- //
- // Convert x value to residue position
- //
-
- // need to determine where scrollCol should be, given x
- // to do this also need to know width of viewport, and some hidden column
- // correction
-
- // convert x to residues - this is an absolute position
- // int xAsRes = Math.round((float) x * alwidth / width);
-
- // get viewport width in residues
- int vpwidth = ranges.getViewportWidth();
-
- // get where x should be when accounting for hidden cols
- // if x is in a hidden col region, shift to left - but we still need
- // absolute position
- // so convert back after getting visible region position
- // int visXAsRes = hiddenCols.findColumnPosition(xAsRes);
- int visXAsRes = xAsRes;
-
- // check in case we went off the edge of the alignment
- int visAlignWidth = hiddenCols.findColumnPosition(alwidth - 1);
- /* if (visXAsRes + vpwidth - 1 > visAlignWidth)
- {
- // went past the end of the alignment, adjust backwards
-
- // if last position was before the end of the alignment, need to update
- if (ranges.getEndRes() < visAlignWidth)
- {
- visXAsRes = hiddenCols.findColumnPosition(hiddenCols
- .subtractVisibleColumns(vpwidth - 1, alwidth - 1));
- }
- else
- {
- visXAsRes = ranges.getStartRes();
- }
- }*/
-
- //
- // Convert y value to sequence position
- //
-
- // convert y to residues
- // int yAsSeq = Math.round((float) y * alheight / sequencesHeight);
-
- // get viewport height in sequences
- int vpheight = ranges.getViewportHeight();
-
- // get where y should be when accounting for hidden rows
- // if y is in a hidden row region, shift up - but we still need absolute
- // position,
- // so convert back after getting visible region position
- yAsSeq = hiddenSeqs.adjustForHiddenSeqs(
- hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq));
-
- // check in case we went off the edge of the alignment
- int visAlignHeight = hiddenSeqs.findIndexWithoutHiddenSeqs(alheight);
- int visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq);
- if (visYAsSeq + vpheight - 1 > visAlignHeight)
- {
- // went past the end of the alignment, adjust backwards
- if (ranges.getEndSeq() < visAlignHeight)
- {
- visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(
- hiddenSeqs.subtractVisibleRows(vpheight - 1, alheight - 1));
- }
- else
- {
- visYAsSeq = ranges.getStartSeq();
- }
- }
+ int visYAsRes = hiddenSeqs.findIndexWithoutHiddenSeqs(vpy) + fixedY;
- // update viewport
- ranges.setStartRes(visXAsRes);
- ranges.setStartSeq(visYAsSeq);
+ updateViewportFromTopLeft(visXAsRes, visYAsRes,
+ hiddenSeqs,
+ hiddenCols);
}
@Override
- protected void updateViewportFromTopLeft(int xAsRes, int yAsSeq,
+ protected void updateViewportFromTopLeft(int visXAsRes, int visYAsSeq,
HiddenSequences hiddenSeqs, HiddenColumns hiddenCols)
{
resetAlignmentDims();
- if (xAsRes < 0)
+ if (visXAsRes < 0)
{
- xAsRes = 0;
+ visXAsRes = 0;
}
- if (yAsSeq < 0)
+ if (visYAsSeq < 0)
{
- yAsSeq = 0;
+ visYAsSeq = 0;
}
//
// if x is in a hidden col region, shift to left - but we still need
// absolute position
// so convert back after getting visible region position
- int visXAsRes = hiddenCols.findColumnPosition(xAsRes);
+
// check in case we went off the edge of the alignment
int visAlignWidth = hiddenCols.findColumnPosition(alwidth - 1);
// if y is in a hidden row region, shift up - but we still need absolute
// position,
// so convert back after getting visible region position
- yAsSeq = hiddenSeqs.adjustForHiddenSeqs(hiddenSeqs
- .findIndexWithoutHiddenSeqs(yAsSeq));
+
// check in case we went off the edge of the alignment
int visAlignHeight = hiddenSeqs.findIndexWithoutHiddenSeqs(alheight);
- int visYAsSeq = hiddenSeqs.findIndexWithoutHiddenSeqs(yAsSeq);
+
if (visYAsSeq + vpheight - 1 > visAlignHeight)
{
// went past the end of the alignment, adjust backwards
int startSeq = hiddenSeqs.adjustForHiddenSeqs(ranges.getStartSeq());
int endSeq = hiddenSeqs.adjustForHiddenSeqs(ranges.getEndSeq());
+ System.out.println("Update box: startres: " + startRes);
+
setBoxPosition(startRes, startSeq, endRes - startRes + 1, endSeq
- startSeq + 1);
}
{
// get alignment position of x and box (can get directly from vpranges) and calc difference
int vpx = Math.round((float) x * alwidth / width);
- int visXAsRes = hiddenCols.findColumnPosition(vpx);
-
- int vpy = Math.round((float) y * alheight / sequencesHeight);
- int visYAsRes = hiddenSeqs.findIndexWithoutHiddenSeqs(vpy);
+ fixedX = ranges.getStartRes() - hiddenCols.findColumnPosition(vpx);
- transX = ranges.getStartRes() - visXAsRes;
- transY = ranges.getStartSeq() - visYAsRes;
+ int vpy = Math.round((float) y * alheight / sequencesHeight);
+ fixedY = ranges.getStartSeq()
+ - hiddenSeqs.findIndexWithoutHiddenSeqs(vpy);
}
}