diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java index fab7732e850769010ca74c56d5c7bef7dace6a9f..caaa8085c37acb9cc9cc809fd677657843ca2db2 100644 --- a/uk/ac/sanger/artemis/components/alignment/BamView.java +++ b/uk/ac/sanger/artemis/components/alignment/BamView.java @@ -135,7 +135,7 @@ public class BamView extends JPanel private JPanel mainPanel; private CoveragePanel coveragePanel; private boolean showScale = true; - private Ruler ruler = new Ruler(); + private Ruler ruler; private int nbasesInView; private int startBase = -1; @@ -166,6 +166,7 @@ public class BamView extends JPanel private boolean concatSequences = false; private int ALIGNMENT_PIX_PER_BASE; + private int BASE_HEIGHT; private JPopupMenu popup; @@ -215,6 +216,7 @@ public class BamView extends JPanel setFont(Options.getOptions().getFont()); FontMetrics fm = getFontMetrics(getFont()); ALIGNMENT_PIX_PER_BASE = fm.charWidth('M'); + BASE_HEIGHT = fm.getHeight(); selection = new Selection(null); MultiLineToolTipUI.initialize(); @@ -491,7 +493,7 @@ public class BamView extends JPanel laststart = start; lastend = end; - if(pixPerBase*1.08f >= ALIGNMENT_PIX_PER_BASE) + if(showBaseAlignment) drawBaseAlignment(g2, seqLength, pixPerBase, start, end); else { @@ -513,7 +515,7 @@ public class BamView extends JPanel private float getPixPerBaseByWidth() { - return (float)( getPreferredSize().getWidth() /nbasesInView); + return (float)mainPanel.getWidth() / (float)nbasesInView; } @@ -537,7 +539,7 @@ public class BamView extends JPanel int seqLength, float pixPerBase, final int start, - final int end) + int end) { ruler.start = start; ruler.end = end; @@ -547,6 +549,8 @@ public class BamView extends JPanel String refSeq = null; int refSeqStart = start; + + end = start + ( mainPanel.getWidth() * ALIGNMENT_PIX_PER_BASE ); if(bases != null) { // draw the reference sequence @@ -564,7 +568,7 @@ public class BamView extends JPanel bases.getSubSequence(new Range(refSeqStart, seqEnd), Bases.FORWARD).toUpperCase(); g2.setColor(lightGrey); - g2.fillRect(0, ypos-11, getPreferredSize().width, 11); + g2.fillRect(0, ypos-11, mainPanel.getWidth(), 11); drawSelectionRange(g2, ALIGNMENT_PIX_PER_BASE, start, end); g2.setColor(Color.black); g2.drawString(refSeq, 0, ypos); @@ -670,6 +674,17 @@ public class BamView extends JPanel } } + // highlight + if(highlightSAMRecord != null && + highlightSAMRecord.getReadName().equals(samRecord.getReadName())) + { + int refPos = blocks.get(0).getReferenceStart()+offset-refSeqStart; + int xstart = refPos*ALIGNMENT_PIX_PER_BASE; + int width = len*ALIGNMENT_PIX_PER_BASE; + g2.setColor(Color.red); + g2.drawRect(xstart, ypos-BASE_HEIGHT, width, BASE_HEIGHT); + } + if(lastMousePoint != null) { int refPos = blocks.get(0).getReferenceStart()+offset-refSeqStart; @@ -990,8 +1005,8 @@ public class BamView extends JPanel { boolean offTheTop = false; int offset = getSequenceOffset(samRecord.getReferenceName()); - int thisStart = samRecord.getAlignmentStart()-1+offset; - int thisEnd = thisStart + samRecord.getReadString().length(); + int thisStart = samRecord.getAlignmentStart()+offset; + int thisEnd = thisStart + samRecord.getReadString().length() -1; if(ypos <= 0) { @@ -1007,16 +1022,16 @@ public class BamView extends JPanel if(samRecord.getAlignmentEnd() < samRecord.getMateAlignmentStart()) { int nextStart = - (int)((samRecord.getMateAlignmentStart()-getBaseAtStartOfView()+offset)*pixPerBase); + (int)((samRecord.getMateAlignmentStart()-getBaseAtStartOfView()+offset)*pixPerBase); drawTranslucentLine(g2, - (int)((thisStart-getBaseAtStartOfView())*pixPerBase), nextStart, ypos); + (int)((thisEnd-getBaseAtStartOfView())*pixPerBase), nextStart, ypos); } else { int nextStart = (int)((samRecord.getMateAlignmentStart()-getBaseAtStartOfView()+offset)*pixPerBase); drawTranslucentLine(g2, - (int)((thisEnd-getBaseAtStartOfView())*pixPerBase), nextStart, ypos); + (int)((thisStart-getBaseAtStartOfView())*pixPerBase), nextStart, ypos); } } @@ -1622,8 +1637,11 @@ public class BamView extends JPanel if(pixPerBase*1.08f >= ALIGNMENT_PIX_PER_BASE) { pixPerBase = ALIGNMENT_PIX_PER_BASE; - this.nbasesInView = (int)(getPreferredSize().getWidth()/pixPerBase); + this.nbasesInView = (int)(mainPanel.getWidth()/pixPerBase); jspView.getVerticalScrollBar().setValue(0); + + if(ruler == null) + ruler = new Ruler(); jspView.setColumnHeaderView(ruler); showBaseAlignment = true; } @@ -1640,6 +1658,7 @@ public class BamView extends JPanel scrollBar.setValues(startValue, nbasesInView, 1, getMaxBasesInPanel(getSequenceLength())); scrollBar.setUnitIncrement(nbasesInView/20); + scrollBar.setBlockIncrement(nbasesInView); } } @@ -1777,8 +1796,7 @@ public class BamView extends JPanel **/ private void handleCanvasMouseDragOrClick(final MouseEvent event) { - if(event.isShiftDown() || event.getButton() == MouseEvent.BUTTON3 - || bases == null) + if(event.getButton() == MouseEvent.BUTTON3 || bases == null) return; highlightSAMRecord = null; @@ -1789,21 +1807,31 @@ public class BamView extends JPanel return; } - int onmask = MouseEvent.BUTTON1_DOWN_MASK; + highlightRange(event, + MouseEvent.BUTTON1_DOWN_MASK & MouseEvent.BUTTON2_DOWN_MASK); + } + + /** + * + * @param event + * @param onmask + */ + private void highlightRange(MouseEvent event, int onmask) + { int seqLength = getSequenceLength(); float pixPerBase = getPixPerBaseByWidth(); int start = (int) ( ( (event.getPoint().getX())/pixPerBase) + getBaseAtStartOfView() ); - if (dragStart < 0 && (event.getModifiersEx() & onmask) == onmask) - dragStart = start; - else if((event.getModifiersEx() & onmask) != onmask) - dragStart = -1; - if(start < 1) start = 1; if(start > seqLength) start = seqLength; + if (dragStart < 0 && (event.getModifiersEx() & onmask) == onmask) + dragStart = start; + else if((event.getModifiersEx() & onmask) != onmask) + dragStart = -1; + MarkerRange drag_range; try { @@ -1868,7 +1896,7 @@ public class BamView extends JPanel public Ruler() { super(); - setPreferredSize(new Dimension(getPreferredSize().width, 15)); + setPreferredSize(new Dimension(mainPanel.getWidth(), 15)); setBackground(Color.white); setFont(getFont().deriveFont(11.f)); } @@ -1884,6 +1912,9 @@ public class BamView extends JPanel { int startMark = (((int)(start/10))*10)+1; + if(end > getSequenceLength()) + end = getSequenceLength(); + for(int i=startMark; i<end; i+=10) { int xpos = (i-start)*ALIGNMENT_PIX_PER_BASE; @@ -1909,6 +1940,8 @@ public class BamView extends JPanel getSelection().clear(); else if(e.getButton() == MouseEvent.BUTTON1) highlightSAMRecord = mouseOverSAMRecord; + else + highlightRange(e, MouseEvent.BUTTON2_DOWN_MASK); repaint(); }