X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FSeqPanel.java;h=70366e490146e9183df9ff512b4923fbcf822fdb;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=42e4d8e15e0a67dec5c8230e2d0f777a630283f5;hpb=c4b90e7ff57436d6bb96d316eed24c887b241f4d;p=jalview.git diff --git a/src/jalview/appletgui/SeqPanel.java b/src/jalview/appletgui/SeqPanel.java index 42e4d8e..70366e4 100644 --- a/src/jalview/appletgui/SeqPanel.java +++ b/src/jalview/appletgui/SeqPanel.java @@ -42,8 +42,8 @@ import jalview.structure.VamsasSource; import jalview.util.Comparison; import jalview.util.MappingUtils; import jalview.util.MessageManager; +import jalview.util.Platform; import jalview.viewmodel.AlignmentViewport; -import jalview.viewmodel.ViewportRanges; import java.awt.BorderLayout; import java.awt.Font; @@ -132,8 +132,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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; @@ -148,13 +148,13 @@ public class SeqPanel extends Panel implements MouseMotionListener, void setCursorRow() { seqCanvas.cursorY = getKeyboardNo1() - 1; - scrollToVisible(); + scrollToVisible(true); } void setCursorColumn() { seqCanvas.cursorX = getKeyboardNo1() - 1; - scrollToVisible(); + scrollToVisible(true); } void setCursorRowAndColumn() @@ -167,7 +167,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, { seqCanvas.cursorX = getKeyboardNo1() - 1; seqCanvas.cursorY = getKeyboardNo2() - 1; - scrollToVisible(); + scrollToVisible(true); } } @@ -176,38 +176,42 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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) { @@ -228,44 +232,34 @@ public class SeqPanel extends Panel implements MouseMotionListener, } 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()) - { - ranges.scrollUp(true); - } - while (seqCanvas.cursorY > ranges.getEndSeq()) + if (av.getWrapAlignment()) { - ranges.scrollUp(false); + av.getRanges().scrollToWrappedVisible(seqCanvas.cursorX); } - while (seqCanvas.cursorX < hidden.adjustForHiddenColumns(ranges - .getStartRes())) - { - - if (!ranges.scrollRight(false)) - { - break; - } - } - while (seqCanvas.cursorX > hidden.adjustForHiddenColumns(ranges - .getEndRes())) + else { - 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) @@ -337,7 +331,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, sg.addSequence(sequence, false); av.setSelectionGroup(sg); } - ap.paintAlignment(false); + ap.paintAlignment(false, false); av.sendSelection(); } @@ -419,7 +413,6 @@ public class SeqPanel extends Panel implements MouseMotionListener, * 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) { @@ -443,9 +436,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, } 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); @@ -507,8 +500,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, // 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 - && !av.MAC) + if (Platform.isWinMiddleButton(evt)) { mouseWheelPressed = true; return; @@ -572,8 +564,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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); @@ -643,8 +635,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, wrappedBlock += startRes / cwidth; int startOffset = startRes % cwidth; // in case start is scrolled right // from 0 - res = wrappedBlock * cwidth - + Math.min(cwidth - 1, startOffset + x / av.getCharWidth()); + res = wrappedBlock * cwidth + startOffset + + +Math.min(cwidth - 1, x / av.getCharWidth()); } else { @@ -654,7 +646,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (av.hasHiddenColumns()) { res = av.getAlignment().getHiddenColumns() - .adjustForHiddenColumns(res); + .visibleToAbsoluteColumn(res); } return res; @@ -690,8 +682,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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; @@ -699,10 +691,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, } 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; @@ -752,7 +743,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } @Override - public void highlightSequence(SearchResultsI results) + public String highlightSequence(SearchResultsI results) { if (av.isFollowHighlight()) { @@ -769,7 +760,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } setStatusMessage(results); seqCanvas.highlightSearchResults(results); - + return null; } @Override @@ -834,8 +825,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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(")"); @@ -849,7 +839,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, { 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")) @@ -916,7 +907,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, */ List findFeaturesAtColumn(SequenceI sequence, int column) { - return seqCanvas.getFeatureRenderer().findFeaturesAtColumn(sequence, column); + return seqCanvas.getFeatureRenderer().findFeaturesAtColumn(sequence, + column); } Tooltip tooltip; @@ -937,8 +929,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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(); @@ -985,7 +977,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, lastMousePress = evt.getPoint(); - ap.paintAlignment(false); + ap.paintAlignment(false, false); ap.annotationPanel.image = null; return; } @@ -1047,8 +1039,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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( @@ -1066,8 +1058,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, } 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 })); } } @@ -1084,9 +1077,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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; @@ -1131,9 +1123,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, { 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)) @@ -1186,8 +1178,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, { 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; @@ -1204,8 +1196,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, { if (sg.getSize() == av.getAlignment().getHeight()) { - if ((av.hasHiddenColumns() && startres < av.getAlignment() - .getHiddenColumns().getHiddenBoundaryRight(startres))) + if ((av.hasHiddenColumns() + && startres < av.getAlignment().getHiddenColumns() + .getNextHiddenBoundary(false, startres))) { endEditing(); return; @@ -1308,9 +1301,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, } 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 @@ -1344,8 +1336,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (max > 0) { editCommand.appendEdit(Action.DELETE_GAP, - new SequenceI[] { seq }, startres, max, - av.getAlignment(), true); + new SequenceI[] + { seq }, startres, max, av.getAlignment(), true); } } } @@ -1405,7 +1397,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, { if (scrollThread != null) { - scrollThread.running = false; + scrollThread.threadRunning = false; scrollThread = null; } @@ -1440,7 +1432,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, } // 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 allFeatures = findFeaturesAtColumn(sequence, sequence.findPosition(column + 1)); @@ -1452,7 +1445,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, { if (links == null) { - links = new Vector(); + links = new Vector<>(); } links.addAll(sf.links); } @@ -1526,7 +1519,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } } PaintRefresher.Refresh(ap, av.getSequenceSetId()); - ap.paintAlignment(needOverviewUpdate); + ap.paintAlignment(needOverviewUpdate, needOverviewUpdate); needOverviewUpdate = false; changeEndRes = false; changeStartRes = false; @@ -1651,7 +1644,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, mouseExited(evt); } - if (scrollThread != null) + if ((scrollThread != null) && (scrollThread.isRunning())) { scrollThread.setEvent(evt); } @@ -1667,9 +1660,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, oldSeq = 0; } - if (scrollThread != null) + if ((scrollThread != null) && (scrollThread.isRunning())) { - scrollThread.running = false; + scrollThread.stopScrolling(); scrollThread = null; } } @@ -1692,9 +1685,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, { if (evt == null) { - if (scrollThread != null) + if ((scrollThread != null) && (scrollThread.isRunning())) { - scrollThread.running = false; + scrollThread.stopScrolling(); scrollThread = null; } mouseDragging = false; @@ -1717,7 +1710,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, { MouseEvent evt; - boolean running = false; + private volatile boolean threadRunning = true; public ScrollThread() { @@ -1731,14 +1724,18 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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) @@ -1747,24 +1744,23 @@ public class SeqPanel extends Panel implements MouseMotionListener, 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); } } @@ -1789,9 +1785,10 @@ public class SeqPanel extends Panel implements MouseMotionListener, // 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; } @@ -1820,11 +1817,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, { 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(), @@ -1844,9 +1839,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, } 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. @@ -1872,8 +1866,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } repaint |= av.isColSelChanged(true); } - if (copycolsel - && av.hasHiddenColumns() + if (copycolsel && av.hasHiddenColumns() && (av.getColumnSelection() == null)) { System.err.println("Bad things"); @@ -1908,8 +1901,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, { 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); } /** @@ -1921,7 +1914,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, { 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); } /**