X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FSeqPanel.java;h=946fc2afc55815a18793d8418273ecfc1781a218;hb=571d15a897c11bdc2dda76ce03686604596f220d;hp=10db71a837aedb103d8a56c679a550c7f6b49203;hpb=06faf90ba52bfcdc4547a68cb3df86c14a5c6e05;p=jalview.git diff --git a/src/jalview/appletgui/SeqPanel.java b/src/jalview/appletgui/SeqPanel.java index 10db71a..946fc2a 100644 --- a/src/jalview/appletgui/SeqPanel.java +++ b/src/jalview/appletgui/SeqPanel.java @@ -25,8 +25,9 @@ import jalview.commands.EditCommand; import jalview.commands.EditCommand.Action; import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.SearchResultMatchI; import jalview.datamodel.SearchResults; -import jalview.datamodel.SearchResults.Match; +import jalview.datamodel.SearchResultsI; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceGroup; @@ -225,16 +226,16 @@ public class SeqPanel extends Panel implements MouseMotionListener, } else { - while (seqCanvas.cursorY < av.startSeq) + while (seqCanvas.cursorY < av.getStartSeq()) { ap.scrollUp(true); } - while (seqCanvas.cursorY + 1 > av.endSeq) + while (seqCanvas.cursorY + 1 > av.getEndSeq()) { ap.scrollUp(false); } while (seqCanvas.cursorX < av.getColumnSelection() - .adjustForHiddenColumns(av.startRes)) + .adjustForHiddenColumns(av.getStartRes())) { if (!ap.scrollRight(false)) @@ -243,7 +244,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } } while (seqCanvas.cursorX > av.getColumnSelection() - .adjustForHiddenColumns(av.endRes)) + .adjustForHiddenColumns(av.getEndRes())) { if (!ap.scrollRight(true)) { @@ -432,8 +433,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, } else { - residue = "X".equalsIgnoreCase(displayChar) ? "X" - : ResidueProperties.aa2Triplet.get(displayChar); + residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*" + .equals(displayChar) ? "STOP" : ResidueProperties.aa2Triplet + .get(displayChar)); if (residue != null) { text.append(" Residue: ").append(residue); @@ -457,7 +459,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, * @param results * @return true if results were matched, false if not */ - private boolean setStatusMessage(SearchResults results) + private boolean setStatusMessage(SearchResultsI results) { AlignmentI al = this.av.getAlignment(); int sequenceIndex = al.findIndex(results); @@ -466,7 +468,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, return false; } SequenceI ds = al.getSequenceAt(sequenceIndex).getDatasetSequence(); - for (Match m : results.getResults()) + for (SearchResultMatchI m : results.getResults()) { SequenceI seq = m.getSequence(); if (seq.getDatasetSequence() != null) @@ -480,7 +482,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, * Convert position in sequence (base 1) to sequence character array * index (base 0) */ - int start = m.getStart() - 1; + int start = m.getStart() - m.getSequence().getStart(); setStatusMessage(seq, start, sequenceIndex); return true; } @@ -488,6 +490,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, return false; } + @Override public void mousePressed(MouseEvent evt) { lastMousePress = evt.getPoint(); @@ -538,6 +541,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, return; } + @Override public void mouseClicked(MouseEvent evt) { SequenceI sequence = av.getAlignment().getSequenceAt(findSeq(evt)); @@ -556,21 +560,22 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (features != null && features.length > 0) { - SearchResults highlight = new SearchResults(); + SearchResultsI highlight = new SearchResults(); highlight.addResult(sequence, features[0].getBegin(), features[0].getEnd()); seqCanvas.highlightSearchResults(highlight); } if (features != null && features.length > 0) { - seqCanvas.getFeatureRenderer().amendFeatures(new SequenceI[] - { sequence }, features, false, ap); + seqCanvas.getFeatureRenderer().amendFeatures( + new SequenceI[] { sequence }, features, false, ap); seqCanvas.highlightSearchResults(null); } } } + @Override public void mouseReleased(MouseEvent evt) { mouseDragging = false; @@ -606,8 +611,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } int cHeight = av.getAlignment().getHeight() * av.getCharHeight() - + hgap - + seqCanvas.getAnnotationHeight(); + + hgap + seqCanvas.getAnnotationHeight(); int y = evt.getY(); y -= hgap; @@ -664,8 +668,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } int cHeight = av.getAlignment().getHeight() * av.getCharHeight() - + hgap - + seqCanvas.getAnnotationHeight(); + + hgap + seqCanvas.getAnnotationHeight(); y -= hgap; @@ -716,6 +719,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, String lastMessage; + @Override public void mouseOverSequence(SequenceI sequence, int index, int pos) { String tmp = sequence.hashCode() + index + ""; @@ -727,7 +731,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, lastMessage = tmp; } - public void highlightSequence(SearchResults results) + @Override + public void highlightSequence(SearchResultsI results) { if (av.isFollowHighlight()) { @@ -747,12 +752,14 @@ public class SeqPanel extends Panel implements MouseMotionListener, return this.ap == null ? null : this.ap.av; } + @Override public void updateColours(SequenceI seq, int index) { System.out.println("update the seqPanel colours"); // repaint(); } + @Override public void mouseMoved(MouseEvent evt) { int res = findRes(evt); @@ -799,8 +806,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, } else { - obj = "X".equalsIgnoreCase(ch) ? "X" - : ResidueProperties.aa2Triplet.get(ch); + obj = "X".equalsIgnoreCase(ch) ? "X" : ResidueProperties.aa2Triplet + .get(ch); if (obj != null) { text.append(" Residue: ").append(obj); @@ -884,13 +891,15 @@ public class SeqPanel extends Panel implements MouseMotionListener, for (int i = 0; i < features.length; i++) { if (av.getFeaturesDisplayed() == null - || !av.getFeaturesDisplayed().isVisible(features[i].getType())) + || !av.getFeaturesDisplayed().isVisible( + features[i].getType())) { continue; } if (features[i].featureGroup != null - && !seqCanvas.fr.checkGroupVisibility(features[i].featureGroup,false)) + && !seqCanvas.fr.checkGroupVisibility( + features[i].featureGroup, false)) { continue; } @@ -911,6 +920,15 @@ public class SeqPanel extends Panel implements MouseMotionListener, Tooltip tooltip; + /** + * set when the current UI interaction has resulted in a change that requires + * overview shading to be recalculated. this could be changed to something + * more expressive that indicates what actually has changed, so selective + * redraws can be applied + */ + private boolean needOverviewUpdate; // TODO: refactor to avcontroller + + @Override public void mouseDragged(MouseEvent evt) { if (mouseWheelPressed) @@ -1046,8 +1064,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (editCommand == null) { editCommand = new EditCommand(MessageManager.formatMessage( - "label.edit_params", new String[] - { label })); + "label.edit_params", new String[] { label })); } } @@ -1281,14 +1298,14 @@ public class SeqPanel extends Panel implements MouseMotionListener, { for (int j = lastres; j < startres; j++) { - insertChar(j, new SequenceI[] - { seq }, fixedRight); + insertChar(j, new SequenceI[] { seq }, fixedRight); } } 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 @@ -1303,8 +1320,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, endEditing(); break; } - deleteChar(startres, new SequenceI[] - { seq }, fixedRight); + deleteChar(startres, new SequenceI[] { seq }, fixedRight); } } else @@ -1322,8 +1338,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (max > 0) { - editCommand.appendEdit(Action.DELETE_GAP, new SequenceI[] - { seq }, startres, max, av.getAlignment(), true); + editCommand.appendEdit(Action.DELETE_GAP, + new SequenceI[] { seq }, startres, max, + av.getAlignment(), true); } } } @@ -1406,41 +1423,15 @@ public class SeqPanel extends Panel implements MouseMotionListener, stretchGroup = av.getSelectionGroup(); - if (stretchGroup == null) + if (stretchGroup == null || !stretchGroup.contains(sequence, res)) { - stretchGroup = av.getAlignment().findGroup(sequence); - if (stretchGroup != null && res > stretchGroup.getStartRes() - && res < stretchGroup.getEndRes()) + stretchGroup = av.getAlignment().findGroup(sequence, res); + if (stretchGroup != null) { + // only update the current selection if the popup menu has a group to + // focus on av.setSelectionGroup(stretchGroup); } - else - { - stretchGroup = null; - } - } - - else if (!stretchGroup.getSequences(null).contains(sequence) - || stretchGroup.getStartRes() > res - || stretchGroup.getEndRes() < res) - { - stretchGroup = null; - - SequenceGroup[] allGroups = av.getAlignment().findAllGroups(sequence); - - if (allGroups != null) - { - for (int i = 0; i < allGroups.length; i++) - { - if (allGroups[i].getStartRes() <= res - && allGroups[i].getEndRes() >= res) - { - stretchGroup = allGroups[i]; - break; - } - } - } - av.setSelectionGroup(stretchGroup); } // DETECT RIGHT MOUSE BUTTON IN AWT @@ -1495,13 +1486,13 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (av.getConservationSelected()) { - SliderPanel.setConservationSlider(ap, av.getGlobalColourScheme(), - "Background"); + SliderPanel.setConservationSlider(ap, av.getResidueShading(), + ap.getViewName()); } if (av.getAbovePIDThreshold()) { - SliderPanel.setPIDSliderSource(ap, av.getGlobalColourScheme(), - "Background"); + SliderPanel.setPIDSliderSource(ap, av.getResidueShading(), + ap.getViewName()); } } @@ -1513,9 +1504,11 @@ public class SeqPanel extends Panel implements MouseMotionListener, { return; } - - stretchGroup.recalcConservation(); // always do this - annotation has own - // state + // always do this - annotation has own state + // but defer colourscheme update until hidden sequences are passed in + boolean vischange = stretchGroup.recalcConservation(true); + // here we rely on stretchGroup == av.getSelection() + needOverviewUpdate |= vischange && av.isSelectionDefinedGroup(); if (stretchGroup.cs != null) { stretchGroup.cs.alignmentChanged(stretchGroup, @@ -1526,17 +1519,18 @@ public class SeqPanel extends Panel implements MouseMotionListener, SliderPanel.setConservationSlider(ap, stretchGroup.cs, stretchGroup.getName()); } - else + if (stretchGroup.cs.getThreshold() > 0) { SliderPanel.setPIDSliderSource(ap, stretchGroup.cs, stretchGroup.getName()); } } + PaintRefresher.Refresh(ap, av.getSequenceSetId()); + ap.paintAlignment(needOverviewUpdate); + needOverviewUpdate = false; changeEndRes = false; changeStartRes = false; stretchGroup = null; - PaintRefresher.Refresh(ap, av.getSequenceSetId()); - ap.paintAlignment(true); av.sendSelection(); } @@ -1588,6 +1582,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (res > (stretchGroup.getStartRes() - 1)) { stretchGroup.setEndRes(res); + needOverviewUpdate |= av.isSelectionDefinedGroup(); } } else if (changeStartRes) @@ -1595,6 +1590,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (res < (stretchGroup.getEndRes() + 1)) { stretchGroup.setStartRes(res); + needOverviewUpdate |= av.isSelectionDefinedGroup(); } } @@ -1628,6 +1624,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, if (stretchGroup.getSequences(null).contains(nextSeq)) { stretchGroup.deleteSequence(seq, false); + needOverviewUpdate |= av.isSelectionDefinedGroup(); } else { @@ -1637,6 +1634,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } stretchGroup.addSequence(nextSeq, false); + needOverviewUpdate |= av.isSelectionDefinedGroup(); } } @@ -1645,8 +1643,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, oldSeq = -1; } - if (res > av.endRes || res < av.startRes || y < av.startSeq - || y > av.endSeq) + if (res > av.getEndRes() || res < av.getStartRes() + || y < av.getStartSeq() || y > av.getEndSeq()) { mouseExited(evt); } @@ -1659,6 +1657,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, seqCanvas.repaint(); } + @Override public void mouseEntered(MouseEvent e) { if (oldSeq < 0) @@ -1673,6 +1672,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, } } + @Override public void mouseExited(MouseEvent e) { if (av.getWrapAlignment()) @@ -1732,6 +1732,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, running = false; } + @Override public void run() { running = true; @@ -1776,6 +1777,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, /** * modify current selection according to a received message. */ + @Override public void selection(SequenceGroup seqsel, ColumnSelection colsel, SelectionSource source) { @@ -1801,9 +1803,12 @@ public class SeqPanel extends Panel implements MouseMotionListener, // do we want to thread this ? (contention with seqsel and colsel locks, I // suspect) - // rules are: colsel is copied if there is a real intersection between - // sequence selection - boolean repaint = false, copycolsel = true; + /* + * only copy colsel if there is a real intersection between + * sequence selection and this panel's alignment + */ + boolean repaint = false; + boolean copycolsel = false; if (av.getSelectionGroup() == null || !av.isSelectionGroupChanged(true)) { SequenceGroup sgroup = null; @@ -1820,11 +1825,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, } sgroup = seqsel.intersect(av.getAlignment(), (av.hasHiddenRows()) ? av.getHiddenRepSequences() : null); - if ((sgroup == null || sgroup.getSize() == 0) - && (colsel == null || colsel.size() == 0)) + if ((sgroup != null && sgroup.getSize() > 0)) { - // don't copy columns if the region didn't intersect. - copycolsel = false; + copycolsel = true; } } if (sgroup != null && sgroup.getSize() > 0) @@ -1843,7 +1846,7 @@ public class SeqPanel extends Panel implements MouseMotionListener, { // the current selection is unset or from a previous message // so import the new colsel. - if (colsel == null || colsel.size() == 0) + if (colsel == null || colsel.isEmpty()) { if (av.getColumnSelection() != null) { @@ -1887,8 +1890,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, public void scrollTo(int row, int column) { - row = row < 0 ? ap.av.startSeq : row; - column = column < 0 ? ap.av.startRes : column; + row = row < 0 ? ap.av.getStartSeq() : row; + column = column < 0 ? ap.av.getStartRes() : column; ap.scrollTo(column, column, row, true, true); } @@ -1900,8 +1903,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, public void scrollToRow(int row) { - row = row < 0 ? ap.av.startSeq : row; - ap.scrollTo(ap.av.startRes, ap.av.startRes, row, true, true); + row = row < 0 ? ap.av.getStartSeq() : row; + ap.scrollTo(ap.av.getStartRes(), ap.av.getStartRes(), row, true, true); } /** @@ -1912,8 +1915,8 @@ public class SeqPanel extends Panel implements MouseMotionListener, public void scrollToColumn(int column) { - column = column < 0 ? ap.av.startRes : column; - ap.scrollTo(column, column, ap.av.startSeq, true, true); + column = column < 0 ? ap.av.getStartRes() : column; + ap.scrollTo(column, column, ap.av.getStartSeq(), true, true); } /** @@ -1928,33 +1931,34 @@ public class SeqPanel extends Panel implements MouseMotionListener, protected boolean selectionFromTranslation(SequenceGroup seqsel, ColumnSelection colsel, SelectionSource source) { - if (!(source instanceof AlignViewportI)) { + if (!(source instanceof AlignViewportI)) + { return false; } final AlignViewportI sourceAv = (AlignViewportI) source; - if (sourceAv.getCodingComplement() != av && av.getCodingComplement() != sourceAv) + if (sourceAv.getCodingComplement() != av + && av.getCodingComplement() != sourceAv) { return false; } - + /* * Map sequence selection */ SequenceGroup sg = MappingUtils.mapSequenceGroup(seqsel, sourceAv, av); av.setSelectionGroup(sg); av.isSelectionGroupChanged(true); - + /* * Map column selection */ ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv, av); av.setColumnSelection(cs); - av.isColSelChanged(true); - + ap.scalePanelHolder.repaint(); ap.repaint(); - + return true; }