From: gmungoc Date: Fri, 31 Mar 2017 09:59:57 +0000 (+0100) Subject: Merge branch 'develop' into bug/JAL-2431splitFrameNewView X-Git-Tag: Release_2_10_3b1~336^2~2 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=3d2b5edf9ea33c6ebbde4717ccc14f03554fb6f0;hp=-c;p=jalview.git Merge branch 'develop' into bug/JAL-2431splitFrameNewView --- 3d2b5edf9ea33c6ebbde4717ccc14f03554fb6f0 diff --combined src/jalview/gui/AlignFrame.java index c7bce10,ab1ac0e..507bfab --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@@ -86,6 -86,7 +86,7 @@@ import jalview.schemes.ResiduePropertie import jalview.schemes.TCoffeeColourScheme; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; + import jalview.viewmodel.ViewportRanges; import jalview.ws.DBRefFetcher; import jalview.ws.DBRefFetcher.FetchFinishedListenerI; import jalview.ws.jws1.Discoverer; @@@ -160,6 -161,8 +161,8 @@@ public class AlignFrame extends GAlignF AlignViewport viewport; + ViewportRanges vpRanges; + public AlignViewControllerI avc; List alignPanels = new ArrayList(); @@@ -331,6 -334,7 +334,7 @@@ progressBar = new ProgressBar(this.statusPanel, this.statusBar); } + vpRanges = viewport.getRanges(); avc = new jalview.controller.AlignViewController(this, viewport, alignPanel); if (viewport.getAlignmentConservationAnnotation() == null) @@@ -640,8 -644,10 +644,10 @@@ new String[] { (viewport.cursorMode ? "on" : "off") })); if (viewport.cursorMode) { - alignPanel.getSeqPanel().seqCanvas.cursorX = viewport.startRes; - alignPanel.getSeqPanel().seqCanvas.cursorY = viewport.startSeq; + alignPanel.getSeqPanel().seqCanvas.cursorX = vpRanges + .getStartRes(); + alignPanel.getSeqPanel().seqCanvas.cursorY = vpRanges + .getStartSeq(); } alignPanel.getSeqPanel().seqCanvas.repaint(); break; @@@ -679,8 -685,8 +685,8 @@@ } else { - alignPanel.setScrollValues(viewport.startRes, viewport.startSeq - - viewport.endSeq + viewport.startSeq); + alignPanel.setScrollValues(vpRanges.getStartRes(), + 2 * vpRanges.getStartSeq() - vpRanges.getEndSeq()); } break; case KeyEvent.VK_PAGE_DOWN: @@@ -690,8 -696,8 +696,8 @@@ } else { - alignPanel.setScrollValues(viewport.startRes, viewport.startSeq - + viewport.endSeq - viewport.startSeq); + alignPanel.setScrollValues(vpRanges.getStartRes(), + vpRanges.getEndSeq()); } break; } @@@ -2141,7 -2147,7 +2147,7 @@@ { // propagate alignment changed. - viewport.setEndSeq(alignment.getHeight()); + vpRanges.setEndSeq(alignment.getHeight()); if (annotationAdded) { // Duplicate sequence annotation in all views. @@@ -2545,7 -2551,7 +2551,7 @@@ { trimRegion = new TrimRegionCommand("Remove Left", true, seqs, column, viewport.getAlignment()); - viewport.setStartRes(0); + vpRanges.setStartRes(0); } else { @@@ -2612,13 -2618,13 +2618,13 @@@ // This is to maintain viewport position on first residue // of first sequence SequenceI seq = viewport.getAlignment().getSequenceAt(0); - int startRes = seq.findPosition(viewport.startRes); + int startRes = seq.findPosition(vpRanges.getStartRes()); // ShiftList shifts; // viewport.getAlignment().removeGaps(shifts=new ShiftList()); // edit.alColumnChanges=shifts.getInverse(); // if (viewport.hasHiddenColumns) // viewport.getColumnSelection().compensateForEdits(shifts); - viewport.setStartRes(seq.findIndex(startRes) - 1); + vpRanges.setStartRes(seq.findIndex(startRes) - 1); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); @@@ -2651,12 -2657,12 +2657,12 @@@ // This is to maintain viewport position on first residue // of first sequence SequenceI seq = viewport.getAlignment().getSequenceAt(0); - int startRes = seq.findPosition(viewport.startRes); + int startRes = seq.findPosition(vpRanges.getStartRes()); addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end, viewport.getAlignment())); - viewport.setStartRes(seq.findIndex(startRes) - 1); + vpRanges.setStartRes(seq.findIndex(startRes) - 1); viewport.firePropertyChange("alignment", null, viewport.getAlignment() .getSequences()); @@@ -2744,14 -2750,6 +2750,14 @@@ */ newap.av.replaceMappings(viewport.getAlignment()); + /* + * start up cDNA consensus (if applicable) now mappings are in place + */ + if (newap.av.initComplementConsensus()) + { + newap.refresh(true); // adjust layout of annotations + } + newap.av.viewName = getNewViewName(viewTitle); addAlignmentPanel(newap, true); diff --combined src/jalview/gui/AlignmentPanel.java index f7a1d2c,ac137b9..8ade5d6 --- a/src/jalview/gui/AlignmentPanel.java +++ b/src/jalview/gui/AlignmentPanel.java @@@ -35,6 -35,7 +35,7 @@@ import jalview.schemes.ResiduePropertie import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; import jalview.util.Platform; + import jalview.viewmodel.ViewportRanges; import java.awt.BorderLayout; import java.awt.Color; @@@ -69,6 -70,8 +70,8 @@@ public class AlignmentPanel extends GAl { public AlignViewport av; + ViewportRanges vpRanges; + OverviewPanel overviewPanel; private SeqPanel seqPanel; @@@ -91,9 -94,9 +94,9 @@@ // this value is set false when selection area being dragged boolean fastPaint = true; - int hextent = 0; + private int hextent = 0; - int vextent = 0; + private int vextent = 0; /* * Flag set while scrolling to follow complementary cDNA/protein scroll. When @@@ -113,6 -116,7 +116,7 @@@ { alignFrame = af; this.av = av; + vpRanges = av.getRanges(); setSeqPanel(new SeqPanel(av, this)); setIdPanel(new IdPanel(av, this)); @@@ -377,7 -381,7 +381,7 @@@ */ if (centre) { - int offset = (av.getEndRes() - av.getStartRes() + 1) / 2 - 1; + int offset = (vpRanges.getEndRes() - vpRanges.getStartRes() + 1) / 2 - 1; start = Math.max(start - offset, 0); end = end + offset - 1; } @@@ -413,7 -417,7 +417,7 @@@ // + av.getStartSeq() + ", ends=" + av.getEndSeq()); if (!av.getWrapAlignment()) { - if ((startv = av.getStartRes()) >= start) + if ((startv = vpRanges.getStartRes()) >= start) { /* * Scroll left to make start of search results visible @@@ -421,7 -425,7 +425,7 @@@ // setScrollValues(start - 1, seqIndex); // plus one residue setScrollValues(start, seqIndex); } - else if ((endv = av.getEndRes()) <= end) + else if ((endv = vpRanges.getEndRes()) <= end) { /* * Scroll right to make end of search results visible @@@ -429,19 -433,20 +433,20 @@@ // setScrollValues(startv + 1 + end - endv, seqIndex); // plus one setScrollValues(startv + end - endv, seqIndex); } - else if ((starts = av.getStartSeq()) > seqIndex) + else if ((starts = vpRanges.getStartSeq()) > seqIndex) { /* * Scroll up to make start of search results visible */ - setScrollValues(av.getStartRes(), seqIndex); + setScrollValues(vpRanges.getStartRes(), seqIndex); } - else if ((ends = av.getEndSeq()) <= seqIndex) + else if ((ends = vpRanges.getEndSeq()) <= seqIndex) { /* * Scroll down to make end of search results visible */ - setScrollValues(av.getStartRes(), starts + seqIndex - ends + 1); + setScrollValues(vpRanges.getStartRes(), starts + seqIndex - ends + + 1); } /* * Else results are already visible - no need to scroll @@@ -464,10 -469,11 +469,11 @@@ { int cwidth = getSeqPanel().seqCanvas .getWrappedCanvasWidth(getSeqPanel().seqCanvas.getWidth()); - if (res < av.getStartRes() || res >= (av.getStartRes() + cwidth)) + if (res < vpRanges.getStartRes() + || res >= (vpRanges.getStartRes() + cwidth)) { vscroll.setValue((res / cwidth)); - av.startRes = vscroll.getValue() * cwidth; + vpRanges.setStartRes(vscroll.getValue() * cwidth); } } @@@ -591,7 -597,7 +597,7 @@@ fontChanged(); setAnnotationVisible(av.isShowAnnotation()); boolean wrap = av.getWrapAlignment(); - av.startSeq = 0; + vpRanges.setStartSeq(0); scalePanelHolder.setVisible(!wrap); hscroll.setVisible(!wrap); idwidthAdjuster.setVisible(!wrap); @@@ -688,7 -694,6 +694,6 @@@ */ public void setScrollValues(int x, int y) { - // System.err.println("Scroll " + this.av.viewName + " to " + x + "," + y); if (av == null || av.getAlignment() == null) { return; @@@ -698,12 -703,10 +703,10 @@@ if (av.hasHiddenColumns()) { + // reset the width to exclude hidden columns 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(); @@@ -737,6 -740,10 +740,10 @@@ x = 0; } + // update endRes after x has (possibly) been adjusted + vpRanges.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 @@@ -757,14 -764,14 +764,14 @@@ @Override public void adjustmentValueChanged(AdjustmentEvent evt) { - int oldX = av.getStartRes(); - int oldY = av.getStartSeq(); + int oldX = vpRanges.getStartRes(); + int oldY = vpRanges.getStartSeq(); if (evt.getSource() == hscroll) { int x = hscroll.getValue(); - av.setStartRes(x); - av.setEndRes((x + (getSeqPanel().seqCanvas.getWidth() / av + vpRanges.setStartRes(x); + vpRanges.setEndRes((x + (getSeqPanel().seqCanvas.getWidth() / av .getCharWidth())) - 1); } @@@ -778,8 -785,8 +785,8 @@@ { int rowSize = getSeqPanel().seqCanvas .getWrappedCanvasWidth(getSeqPanel().seqCanvas.getWidth()); - av.setStartRes(offy * rowSize); - av.setEndRes((offy + 1) * rowSize); + vpRanges.setStartRes(offy * rowSize); + vpRanges.setEndRes((offy + 1) * rowSize); } else { @@@ -791,16 -798,18 +798,18 @@@ @Override public void run() { - setScrollValues(av.getStartRes(), av.getStartSeq()); + setScrollValues(vpRanges.getStartRes(), + vpRanges.getStartSeq()); } }); } } else { - av.setStartSeq(offy); - av.setEndSeq(offy - + (getSeqPanel().seqCanvas.getHeight() / av.getCharHeight())); + vpRanges.setStartSeq(offy); + vpRanges.setEndSeq(offy + + (getSeqPanel().seqCanvas.getHeight() / av.getCharHeight()) + - 1); } } @@@ -809,8 -818,8 +818,8 @@@ overviewPanel.setBoxPosition(); } - int scrollX = av.startRes - oldX; - int scrollY = av.startSeq - oldY; + int scrollX = vpRanges.getStartRes() - oldX; + int scrollY = vpRanges.getStartSeq() - oldY; if (av.getWrapAlignment() || !fastPaint) { @@@ -820,13 -829,13 +829,13 @@@ { // Make sure we're not trying to draw a panel // larger than the visible window - if (scrollX > av.endRes - av.startRes) + if (scrollX > vpRanges.getEndRes() - vpRanges.getStartRes()) { - scrollX = av.endRes - av.startRes; + scrollX = vpRanges.getEndRes() - vpRanges.getStartRes(); } - else if (scrollX < av.startRes - av.endRes) + else if (scrollX < vpRanges.getStartRes() - vpRanges.getEndRes()) { - scrollX = av.startRes - av.endRes; + scrollX = vpRanges.getStartRes() - vpRanges.getEndRes(); } if (scrollX != 0 || scrollY != 0) @@@ -926,7 -935,7 +935,7 @@@ } else { - setScrollValues(av.getStartRes(), av.getStartSeq()); + setScrollValues(vpRanges.getStartRes(), vpRanges.getStartSeq()); } } @@@ -1875,26 -1884,4 +1884,26 @@@ { return this.dontScrollComplement; } + + /** + * Redraw sensibly. + * + * @adjustHeight if true, try to recalculate panel height for visible + * annotations + */ + protected void refresh(boolean adjustHeight) + { + validateAnnotationDimensions(adjustHeight); + addNotify(); + if (adjustHeight) + { + // sort, repaint, update overview + paintAlignment(true); + } + else + { + // lightweight repaint + repaint(); + } + } } diff --combined src/jalview/viewmodel/AlignmentViewport.java index 6dcf26d,3547757..47dceec --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@@ -20,6 -20,17 +20,17 @@@ */ package jalview.viewmodel; + import java.awt.Color; + import java.beans.PropertyChangeSupport; + import java.util.ArrayDeque; + import java.util.ArrayList; + import java.util.BitSet; + import java.util.Deque; + import java.util.HashMap; + import java.util.Hashtable; + import java.util.List; + import java.util.Map; + import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.analysis.Conservation; import jalview.api.AlignCalcManagerI; @@@ -57,17 -68,6 +68,6 @@@ import jalview.workers.ComplementConsen import jalview.workers.ConsensusThread; import jalview.workers.StrucConsensusThread; - import java.awt.Color; - import java.beans.PropertyChangeSupport; - import java.util.ArrayDeque; - import java.util.ArrayList; - import java.util.BitSet; - import java.util.Deque; - import java.util.HashMap; - import java.util.Hashtable; - import java.util.List; - import java.util.Map; - /** * base class holding visualization and analysis attributes and common logic for * an active alignment view displayed in the GUI @@@ -78,6 -78,8 +78,8 @@@ public abstract class AlignmentViewport implements AlignViewportI, CommandListener, VamsasSource { + protected ViewportRanges ranges; + protected ViewStyleI viewStyle = new ViewStyle(); /** @@@ -672,6 -674,8 +674,8 @@@ protected AlignmentAnnotation complementConsensus; + protected AlignmentAnnotation gapcounts; + protected AlignmentAnnotation strucConsensus; protected AlignmentAnnotation conservation; @@@ -774,6 -778,12 +778,12 @@@ } @Override + public AlignmentAnnotation getAlignmentGapAnnotation() + { + return gapcounts; + } + + @Override public AlignmentAnnotation getComplementConsensusAnnotation() { return complementConsensus; @@@ -813,7 -823,7 +823,7 @@@ public void updateConsensus(final AlignmentViewPanel ap) { // see note in mantis : issue number 8585 - if (consensus == null || !autoCalculateConsensus) + if ((consensus == null || gapcounts == null) || !autoCalculateConsensus) { return; } @@@ -1285,15 -1295,6 +1295,6 @@@ */ private boolean followHighlight = true; - // TODO private with getters and setters? - public int startRes; - - public int endRes; - - public int startSeq; - - public int endSeq; - /** * Property change listener for changes in alignment * @@@ -1892,16 -1893,21 +1893,21 @@@ consensus = new AlignmentAnnotation("Consensus", "PID", new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); initConsensus(consensus); + gapcounts = new AlignmentAnnotation("Occupancy", + "Number of aligned positions", + new Annotation[1], 0f, alignment.getHeight(), + AlignmentAnnotation.BAR_GRAPH); + initGapCounts(gapcounts); initComplementConsensus(); } } /** - * If this is a protein alignment and there are mappings to cDNA, add the cDNA - * consensus annotation. + * If this is a protein alignment and there are mappings to cDNA, adds the + * cDNA consensus annotation and returns true, else returns false. */ - public void initComplementConsensus() + public boolean initComplementConsensus() { if (!alignment.isNucleotide()) { @@@ -1928,11 -1934,9 +1934,11 @@@ "PID for cDNA", new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH); initConsensus(complementConsensus); + return true; } } } + return false; } private void initConsensus(AlignmentAnnotation aa) @@@ -1946,6 -1950,20 +1952,20 @@@ } } + // these should be extracted from the view model - style and settings for + // derived annotation + private void initGapCounts(AlignmentAnnotation counts) + { + counts.hasText = false; + counts.autoCalculated = true; + counts.graph = AlignmentAnnotation.BAR_GRAPH; + + if (showConsensus) + { + alignment.addAnnotation(counts); + } + } + private void initConservation() { if (showConservation) @@@ -2647,63 -2665,10 +2667,10 @@@ this.followHighlight = b; } - public int getStartRes() - { - return startRes; - } - @Override - public int getEndRes() - { - return endRes; - } - - public int getStartSeq() - { - return startSeq; - } - - public void setStartRes(int res) - { - this.startRes = res; - } - - public void setStartSeq(int seq) - { - this.startSeq = seq; - } - - public void setEndRes(int res) + public ViewportRanges getRanges() { - if (res > alignment.getWidth() - 1) - { - // log.System.out.println(" Corrected res from " + res + " to maximum " + - // (alignment.getWidth()-1)); - res = alignment.getWidth() - 1; - } - if (res < 0) - { - res = 0; - } - this.endRes = res; - } - - public void setEndSeq(int seq) - { - if (seq > alignment.getHeight()) - { - seq = alignment.getHeight(); - } - if (seq < 0) - { - seq = 0; - } - this.endSeq = seq; - } - - public int getEndSeq() - { - return endSeq; + return ranges; } /** @@@ -2743,7 -2708,8 +2710,8 @@@ * locate 'middle' column (true middle if an odd number visible, left of * middle if an even number visible) */ - int middleColumn = getStartRes() + (getEndRes() - getStartRes()) / 2; + int middleColumn = ranges.getStartRes() + + (ranges.getEndRes() - ranges.getStartRes()) / 2; final HiddenSequences hiddenSequences = getAlignment() .getHiddenSequences(); @@@ -2753,7 -2719,7 +2721,7 @@@ */ int lastSeq = alignment.getHeight() - 1; List seqMappings = null; - for (int seqNo = getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) + for (int seqNo = ranges.getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) { sequence = getAlignment().getSequenceAt(seqNo); if (hiddenSequences != null && hiddenSequences.isHidden(sequence)) @@@ -2821,7 -2787,6 +2789,6 @@@ */ private boolean selectionIsDefinedGroup = false; - @Override public boolean isSelectionDefinedGroup() {