import jalview.util.MappingUtils;
import jalview.util.MessageManager;
import jalview.viewmodel.AlignmentViewport;
-import jalview.viewmodel.ViewportRanges;
import java.awt.BorderLayout;
import java.awt.Font;
if (editCommand != null && editCommand.getSize() > 0)
{
ap.alignFrame.addHistoryItem(editCommand);
- av.firePropertyChange("alignment", null, av.getAlignment()
- .getSequences());
+ av.firePropertyChange("alignment", null,
+ av.getAlignment().getSequences());
}
startseq = -1;
void setCursorRow()
{
seqCanvas.cursorY = getKeyboardNo1() - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
void setCursorColumn()
{
seqCanvas.cursorX = getKeyboardNo1() - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
void setCursorRowAndColumn()
{
seqCanvas.cursorX = getKeyboardNo1() - 1;
seqCanvas.cursorY = getKeyboardNo2() - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
}
SequenceI sequence = av.getAlignment().getSequenceAt(seqCanvas.cursorY);
seqCanvas.cursorX = sequence.findIndex(getKeyboardNo1()) - 1;
- scrollToVisible();
+ scrollToVisible(true);
}
void moveCursor(int dx, int dy)
{
seqCanvas.cursorX += dx;
seqCanvas.cursorY += dy;
- if (av.hasHiddenColumns()
- && !av.getAlignment().getHiddenColumns()
- .isVisible(seqCanvas.cursorX))
+ if (av.hasHiddenColumns() && !av.getAlignment().getHiddenColumns()
+ .isVisible(seqCanvas.cursorX))
{
int original = seqCanvas.cursorX - dx;
int maxWidth = av.getAlignment().getWidth();
while (!av.getAlignment().getHiddenColumns()
- .isVisible(seqCanvas.cursorX)
- && seqCanvas.cursorX < maxWidth && seqCanvas.cursorX > 0)
+ .isVisible(seqCanvas.cursorX) && seqCanvas.cursorX < maxWidth
+ && seqCanvas.cursorX > 0)
{
seqCanvas.cursorX += dx;
}
- if (seqCanvas.cursorX >= maxWidth
- || !av.getAlignment().getHiddenColumns()
- .isVisible(seqCanvas.cursorX))
+ if (seqCanvas.cursorX >= maxWidth || !av.getAlignment()
+ .getHiddenColumns().isVisible(seqCanvas.cursorX))
{
seqCanvas.cursorX = original;
}
}
- scrollToVisible();
+ scrollToVisible(false);
}
- void scrollToVisible()
+ /**
+ * Scroll to make the cursor visible in the viewport.
+ *
+ * @param jump
+ * just jump to the location rather than scrolling
+ */
+ void scrollToVisible(boolean jump)
{
if (seqCanvas.cursorX < 0)
{
}
endEditing();
- if (av.getWrapAlignment())
+
+ boolean repaintNeeded = true;
+ if (jump)
{
- av.getRanges().scrollToWrappedVisible(seqCanvas.cursorX);
+ // only need to repaint if the viewport did not move, as otherwise it will
+ // get a repaint
+ repaintNeeded = !av.getRanges().setViewportLocation(seqCanvas.cursorX,
+ seqCanvas.cursorY);
}
else
{
- ViewportRanges ranges = av.getRanges();
- HiddenColumns hidden = av.getAlignment().getHiddenColumns();
- while (seqCanvas.cursorY < ranges.getStartSeq())
+ if (av.getWrapAlignment())
{
- ranges.scrollUp(true);
+ av.getRanges().scrollToWrappedVisible(seqCanvas.cursorX);
}
- while (seqCanvas.cursorY > ranges.getEndSeq())
+ else
{
- ranges.scrollUp(false);
- }
- while (seqCanvas.cursorX < hidden.adjustForHiddenColumns(ranges
- .getStartRes()))
- {
-
- if (!ranges.scrollRight(false))
- {
- break;
- }
- }
- while (seqCanvas.cursorX > hidden.adjustForHiddenColumns(ranges
- .getEndRes()))
- {
- if (!ranges.scrollRight(true))
- {
- break;
- }
+ av.getRanges().scrollToVisible(seqCanvas.cursorX,
+ seqCanvas.cursorY);
}
}
setStatusMessage(av.getAlignment().getSequenceAt(seqCanvas.cursorY),
seqCanvas.cursorX, seqCanvas.cursorY);
- seqCanvas.repaint();
+ if (repaintNeeded)
+ {
+ seqCanvas.repaint();
+ }
}
void setSelectionAreaAtCursor(boolean topLeft)
sg.addSequence(sequence, false);
av.setSelectionGroup(sg);
}
- ap.paintAlignment(false);
+ ap.paintAlignment(false, false);
av.sendSelection();
}
* alignment column
* @param seq
* index of sequence in alignment
- * @return position of column in sequence or -1 if at gap
*/
void setStatusMessage(SequenceI sequence, int column, int seq)
{
}
else
{
- residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*"
- .equals(displayChar) ? "STOP" : ResidueProperties.aa2Triplet
- .get(displayChar));
+ residue = "X".equalsIgnoreCase(displayChar) ? "X"
+ : ("*".equals(displayChar) ? "STOP"
+ : ResidueProperties.aa2Triplet.get(displayChar));
if (residue != null)
{
text.append(" Residue: ").append(residue);
// For now, ignore the mouseWheel font resizing on Macs
// As the Button2_mask always seems to be true
- if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK
+ if ((evt.getModifiersEx()
+ & InputEvent.BUTTON2_DOWN_MASK) == InputEvent.BUTTON2_DOWN_MASK
&& !av.MAC)
{
mouseWheelPressed = true;
if (!features.isEmpty())
{
SearchResultsI highlight = new SearchResults();
- highlight.addResult(sequence, features.get(0).getBegin(), features
- .get(0).getEnd());
+ highlight.addResult(sequence, features.get(0).getBegin(),
+ features.get(0).getEnd());
seqCanvas.highlightSearchResults(highlight);
seqCanvas.getFeatureRenderer().amendFeatures(
Collections.singletonList(sequence), features, false, ap);
- seqCanvas.highlightSearchResults(null);
+ av.setSearchResults(null); // clear highlighting
+ seqCanvas.repaint(); // draw new/amended features
}
}
}
int res = 0;
int x = evt.getX();
+ int startRes = av.getRanges().getStartRes();
if (av.getWrapAlignment())
{
int y = evt.getY();
y -= hgap;
- x -= seqCanvas.LABEL_WEST;
+ x = Math.max(0, x - seqCanvas.LABEL_WEST);
int cwidth = seqCanvas.getWrappedCanvasWidth(getSize().width);
if (cwidth < 1)
}
wrappedBlock = y / cHeight;
- wrappedBlock += av.getRanges().getStartRes() / cwidth;
-
- res = wrappedBlock * cwidth + x / av.getCharWidth();
-
+ wrappedBlock += startRes / cwidth;
+ int startOffset = startRes % cwidth; // in case start is scrolled right
+ // from 0
+ res = wrappedBlock * cwidth + startOffset
+ + +Math.min(cwidth - 1, x / av.getCharWidth());
}
else
{
- res = (x / av.getCharWidth()) + av.getRanges().getStartRes();
+ res = (x / av.getCharWidth()) + startRes;
}
if (av.hasHiddenColumns())
{
res = av.getAlignment().getHiddenColumns()
- .adjustForHiddenColumns(res);
+ .visibleToAbsoluteColumn(res);
}
return res;
y -= hgap;
- seq = Math.min((y % cHeight) / av.getCharHeight(), av.getAlignment()
- .getHeight() - 1);
+ seq = Math.min((y % cHeight) / av.getCharHeight(),
+ av.getAlignment().getHeight() - 1);
if (seq < 0)
{
seq = -1;
}
else
{
- seq = Math.min((y / av.getCharHeight())
- + av.getRanges().getStartSeq(),
- av
- .getAlignment().getHeight() - 1);
+ seq = Math.min(
+ (y / av.getCharHeight()) + av.getRanges().getStartSeq(),
+ av.getAlignment().getHeight() - 1);
if (seq < 0)
{
seq = -1;
else
{
String residue = (ch == 'x' || ch == 'X') ? "X"
- : ResidueProperties.aa2Triplet
- .get(String.valueOf(ch));
+ : ResidueProperties.aa2Triplet.get(String.valueOf(ch));
text.append(" Residue: ").append(residue == null ? ch : residue);
}
text.append(" (").append(Integer.toString(respos)).append(")");
{
for (int g = 0; g < groups.length; g++)
{
- if (groups[g].getStartRes() <= column && groups[g].getEndRes() >= column)
+ if (groups[g].getStartRes() <= column
+ && groups[g].getEndRes() >= column)
{
if (!groups[g].getName().startsWith("JTreeGroup")
&& !groups[g].getName().startsWith("JGroup"))
int oldWidth = av.getCharWidth();
// Which is bigger, left-right or up-down?
- if (Math.abs(evt.getY() - lastMousePress.y) > Math.abs(evt.getX()
- - lastMousePress.x))
+ if (Math.abs(evt.getY() - lastMousePress.y) > Math
+ .abs(evt.getX() - lastMousePress.x))
{
int fontSize = av.font.getSize();
lastMousePress = evt.getPoint();
- ap.paintAlignment(false);
+ ap.paintAlignment(false, false);
ap.annotationPanel.image = null;
return;
}
StringBuffer message = new StringBuffer();
if (groupEditing)
{
- message.append(MessageManager.getString("action.edit_group")).append(
- ":");
+ message.append(MessageManager.getString("action.edit_group"))
+ .append(":");
if (editCommand == null)
{
editCommand = new EditCommand(
}
if (editCommand == null)
{
- editCommand = new EditCommand(MessageManager.formatMessage(
- "label.edit_params", new String[] { label }));
+ editCommand = new EditCommand(MessageManager
+ .formatMessage("label.edit_params", new String[]
+ { label }));
}
}
ap.alignFrame.statusBar.setText(message.toString());
// Are we editing within a selection group?
- if (groupEditing
- || (sg != null && sg.getSequences(av.getHiddenRepSequences())
- .contains(seq)))
+ if (groupEditing || (sg != null
+ && sg.getSequences(av.getHiddenRepSequences()).contains(seq)))
{
fixedColumns = true;
{
fixedColumns = true;
int y1 = av.getAlignment().getHiddenColumns()
- .getHiddenBoundaryLeft(startres);
+ .getNextHiddenBoundary(true, startres);
int y2 = av.getAlignment().getHiddenColumns()
- .getHiddenBoundaryRight(startres);
+ .getNextHiddenBoundary(false, startres);
if ((insertGap && startres > y1 && lastres < y1)
|| (!insertGap && startres < y2 && lastres > y2))
// Find the next gap before the end
// of the visible region boundary
boolean blank = false;
- for (fixedRight = fixedRight; fixedRight > lastres; fixedRight--)
+ for (; fixedRight > lastres; fixedRight--)
{
blank = true;
{
for (int j = 0; j < startres - lastres; j++)
{
- if (!jalview.util.Comparison.isGap(gs.getCharAt(fixedRight
- - j)))
+ if (!jalview.util.Comparison
+ .isGap(gs.getCharAt(fixedRight - j)))
{
blank = false;
break;
if (sg.getSize() == av.getAlignment().getHeight())
{
if ((av.hasHiddenColumns() && startres < av.getAlignment()
- .getHiddenColumns().getHiddenBoundaryRight(startres)))
+ .getHiddenColumns()
+ .getNextHiddenBoundary(false, startres)))
{
endEditing();
return;
}
else
{
- editCommand.appendEdit(Action.INSERT_GAP,
- new SequenceI[] { seq }, lastres, startres - lastres,
- av.getAlignment(), true);
+ editCommand.appendEdit(Action.INSERT_GAP, new SequenceI[] { seq },
+ lastres, startres - lastres, av.getAlignment(), true);
}
}
else
if (max > 0)
{
editCommand.appendEdit(Action.DELETE_GAP,
- new SequenceI[] { seq }, startres, max,
- av.getAlignment(), true);
+ new SequenceI[]
+ { seq }, startres, max, av.getAlignment(), true);
}
}
}
{
if (scrollThread != null)
{
- scrollThread.running = false;
+ scrollThread.threadRunning = false;
scrollThread = null;
}
}
// DETECT RIGHT MOUSE BUTTON IN AWT
- if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
+ if ((evt.getModifiersEx()
+ & InputEvent.BUTTON3_DOWN_MASK) == InputEvent.BUTTON3_DOWN_MASK)
{
List<SequenceFeature> allFeatures = findFeaturesAtColumn(sequence,
sequence.findPosition(column + 1));
{
if (links == null)
{
- links = new Vector<String>();
+ links = new Vector<>();
}
links.addAll(sf.links);
}
}
}
PaintRefresher.Refresh(ap, av.getSequenceSetId());
- ap.paintAlignment(needOverviewUpdate);
+ ap.paintAlignment(needOverviewUpdate, needOverviewUpdate);
needOverviewUpdate = false;
changeEndRes = false;
changeStartRes = false;
mouseExited(evt);
}
- if (scrollThread != null)
+ if ((scrollThread != null) && (scrollThread.isRunning()))
{
scrollThread.setEvent(evt);
}
oldSeq = 0;
}
- if (scrollThread != null)
+ if ((scrollThread != null) && (scrollThread.isRunning()))
{
- scrollThread.running = false;
+ scrollThread.stopScrolling();
scrollThread = null;
}
}
{
if (evt == null)
{
- if (scrollThread != null)
+ if ((scrollThread != null) && (scrollThread.isRunning()))
{
- scrollThread.running = false;
+ scrollThread.stopScrolling();
scrollThread = null;
}
mouseDragging = false;
{
MouseEvent evt;
- boolean running = false;
+ private volatile boolean threadRunning = true;
public ScrollThread()
{
public void stopScrolling()
{
- running = false;
+ threadRunning = false;
+ }
+
+ public boolean isRunning()
+ {
+ return threadRunning;
}
@Override
public void run()
{
- running = true;
- while (running)
+ while (threadRunning)
{
if (evt != null)
if (mouseDragging && evt.getY() < 0
&& av.getRanges().getStartSeq() > 0)
{
- running = av.getRanges().scrollUp(true);
+ av.getRanges().scrollUp(true);
}
- if (mouseDragging && evt.getY() >= getSize().height
- && av.getAlignment().getHeight() > av.getRanges()
- .getEndSeq())
+ if (mouseDragging && evt.getY() >= getSize().height && av
+ .getAlignment().getHeight() > av.getRanges().getEndSeq())
{
- running = av.getRanges().scrollUp(false);
+ av.getRanges().scrollUp(false);
}
if (mouseDragging && evt.getX() < 0)
{
- running = av.getRanges().scrollRight(false);
+ av.getRanges().scrollRight(false);
}
else if (mouseDragging && evt.getX() >= getSize().width)
{
- running = av.getRanges().scrollRight(true);
+ av.getRanges().scrollRight(true);
}
}
// handles selection messages...
// TODO: extend config options to allow user to control if selections may be
// shared between viewports.
- if (av != null
- && (av == source || !av.followSelection || (source instanceof AlignViewport && ((AlignmentViewport) source)
- .getSequenceSetId().equals(av.getSequenceSetId()))))
+ if (av != null && (av == source || !av.followSelection
+ || (source instanceof AlignViewport
+ && ((AlignmentViewport) source).getSequenceSetId()
+ .equals(av.getSequenceSetId()))))
{
return;
}
{
if (av.getAlignment() == null)
{
- System.out
- .println("Selection message: alignviewport av SeqSetId="
- + av.getSequenceSetId() + " ViewId="
- + av.getViewId()
- + " 's alignment is NULL! returning immediatly.");
+ System.out.println("Selection message: alignviewport av SeqSetId="
+ + av.getSequenceSetId() + " ViewId=" + av.getViewId()
+ + " 's alignment is NULL! returning immediatly.");
return;
}
sgroup = seqsel.intersect(av.getAlignment(),
}
repaint = av.isSelectionGroupChanged(true);
}
- if (copycolsel
- && (av.getColumnSelection() == null || !av
- .isColSelChanged(true)))
+ if (copycolsel && (av.getColumnSelection() == null
+ || !av.isColSelChanged(true)))
{
// the current selection is unset or from a previous message
// so import the new colsel.
}
repaint |= av.isColSelChanged(true);
}
- if (copycolsel
- && av.hasHiddenColumns()
- && (av.getColumnSelection() == null || av.getAlignment()
- .getHiddenColumns().getHiddenRegions() == null))
+ if (copycolsel && av.hasHiddenColumns()
+ && (av.getColumnSelection() == null))
{
System.err.println("Bad things");
}
{
row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
- ap.scrollTo(ap.av.getRanges().getStartRes(), ap.av.getRanges()
- .getStartRes(), row, true, true);
+ ap.scrollTo(ap.av.getRanges().getStartRes(),
+ ap.av.getRanges().getStartRes(), row, true, true);
}
/**
{
column = column < 0 ? ap.av.getRanges().getStartRes() : column;
- ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true, true);
+ ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true,
+ true);
}
/**