From 981c33b7a6f15db0a1bc72da6224edd117b8f1a9 Mon Sep 17 00:00:00 2001
From: tcarver <tjc>
Date: Thu, 25 Oct 2012 16:04:33 +0100
Subject: [PATCH] add tooltip to coverage heatmaps

---
 .../artemis/components/alignment/BamView.java |  4 +
 .../components/alignment/CoveragePanel.java   | 79 +++++++++++++++----
 2 files changed, 69 insertions(+), 14 deletions(-)

diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java
index b0d974619..3e3ef70d4 100644
--- a/uk/ac/sanger/artemis/components/alignment/BamView.java
+++ b/uk/ac/sanger/artemis/components/alignment/BamView.java
@@ -372,6 +372,10 @@ public class BamView extends JPanel
   
   public String getToolTipText()
   {
+    if(isCoverageView(getPixPerBaseByWidth()) && lastMousePoint != null)
+      return coverageView.getToolTipText(
+          lastMousePoint.y-getJspView().getViewport().getViewPosition().y);
+    
     if(mouseOverSAMRecord == null)
       return null;
     
diff --git a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java
index d1351c363..0e0c3bb1c 100644
--- a/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java
+++ b/uk/ac/sanger/artemis/components/alignment/CoveragePanel.java
@@ -33,9 +33,11 @@ import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.geom.GeneralPath;
+import java.io.File;
 import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Vector;
 
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
@@ -63,6 +65,7 @@ import net.sf.samtools.SAMRecord;
     
     private boolean plotByStrand = false;
     private boolean plotHeatMap = false;
+    private List<HeatMapLn> heatPlots;
 
     protected CoveragePanel(final BamView bamView)
     {
@@ -237,34 +240,47 @@ import net.sf.samtools.SAMRecord;
       else
         lines = getLineAttributes(size);
 
+      if(plotHeatMap)
+        heatPlots = new Vector<HeatMapLn>();
       Enumeration<String> plotEum = plots.keys();
       while(plotEum.hasMoreElements())
       {
-        String fileName = (String) plotEum.nextElement();
-        int[][] thisPlot = plots.get(fileName);
+        String fName = plotEum.nextElement();
+        int[][] thisPlot = plots.get(fName);
 
         int idx;
-        if(fileName.equals("-1"))
+        if(fName.equals("-1"))
           idx = lines.length-1;
         else
-          idx = bamView.bamList.indexOf(fileName);
+          idx = bamView.bamList.indexOf(fName);
 
         final LineAttributes line = lines[idx];
         if(plotHeatMap)
         {
           if(hideBamList != null)
-          {
-            for(Short i: hideBamList)
-              if(idx > i)
-                idx--;
-          }
-          drawHeatMap(g2, hgt, line, idx, thisPlot);
+            idx = adjustIdx(idx, hideBamList);
+          drawHeatMap(g2, hgt, line, idx, thisPlot, fName);
         }
         else
           drawLinePlot(g2, wid, hgt, line, thisPlot);
       }
     }
     
+    /**
+     * Adjust for BAM's that have been hidden
+     * @param index
+     * @param hideBamList
+     * @return
+     */
+    private int adjustIdx(int index, List<Short> hideBamList)
+    {
+      int shiftIdx = index;
+      for(short i=0; i<index; i++)
+        if(hideBamList.contains(i))
+          shiftIdx--;
+      return shiftIdx;
+    }
+    
     private void drawLinePlot(final Graphics2D g2, int wid, int hgt, LineAttributes line, int[][] thisPlot)
     {
       g2.setColor(line.getLineColour());
@@ -363,14 +379,15 @@ import net.sf.samtools.SAMRecord;
      * @param idx
      * @param thisPlot
      */
-    private void drawHeatMap(final Graphics2D g2, int hgt, LineAttributes line, int idx, int[][] thisPlot)
+    private void drawHeatMap(final Graphics2D g2, int hgt, LineAttributes line, int idx, int[][] thisPlot, String fName)
     { // heat map
-      int NUMBER_OF_SHADES = 240;
+      int NSHADES = 240;
       int plotHgt = hgt/plots.size();
       int plotPos = plotHgt * idx;
-      Color definedColours[] = Plot.makeColours(line.getLineColour(),
-          NUMBER_OF_SHADES);
+      Color definedColours[] = Plot.makeColours(line.getLineColour(), NSHADES);
 
+      heatPlots.add(new HeatMapLn(plotPos, plotPos+plotHgt, idx, fName));
+      
       float maxVal = getValue(max);
       for(int i=0; i<thisPlot.length; i++)
       {
@@ -448,6 +465,22 @@ import net.sf.samtools.SAMRecord;
     {
       return plotHeatMap;
     }
+    
+    /**
+     * Return tooltip text for a given position
+     * @param e
+     * @return
+     */
+    public String getToolTipText(int ypos)
+    {
+      for(HeatMapLn h: heatPlots)
+      {
+        if(ypos > h.yTop && ypos < h.yBtm)
+          return h.toString();
+      }
+
+      return null;
+    }
 
     private void defineOpts()
     {
@@ -526,4 +559,22 @@ import net.sf.samtools.SAMRecord;
       }
     }
 
+    class HeatMapLn
+    {
+      int yTop, yBtm, idx;
+      String fName;
+      HeatMapLn(int yTop, int yBtm, int idx, String fName)
+      {
+        this.yTop = yTop;
+        this.yBtm = yBtm;
+        this.idx  = idx;
+        this.fName = fName;
+      }
+      
+      public String toString()
+      {
+        final File f = new File(fName);
+        return f.getName();
+      }
+    }
   }
\ No newline at end of file
-- 
GitLab