8b3716c714d5129845b0f3323cb3596c13d58d1c
aamp
  Mon Feb 7 16:04:03 2011 -0800
Fixed bug to do with next/prev exon mouseover messages not showing the correct number of exons on reverse-strand genes.
diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index ec8582b..defe097 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -1737,68 +1737,75 @@
 /* It seems like lf->components isn't necessarily sorted. */
     {
     refAdd(&exonList, exon);
     exon = exon->next;
     }
 /* Now sort it. */
 if (next)
     slSort(&exonList, exonSlRefCmp);
 else
     slSort(&exonList, exonSlRefReverseCmp);
 numExons = slCount(exonList);
 for (ref = exonList; ref != NULL; ref = ref->next, exonIx++)
     {
     char mouseOverText[256];
     boolean bigExon = FALSE;
+    boolean revStrand = (lf->orientation == -1);
     exon = ref->val;
     if ((exon->end - exon->start) > (newWinSize - (2 * bufferToEdge)))
 	bigExon = TRUE;
     if (next && (exon->end > winEnd))
+	/* right overhang (but left side of screen in reserve-strand-display) */
 	{
 	if (exon->start < winEnd)
 	    {
 	    /* not an intron hanging over edge. */
 	    if ((lf->tallEnd > winEnd) && (lf->tallEnd < exon->end) && (lf->tallEnd > exon->start))
 		linkedFeaturesMoveWinEnd(lf->tallEnd, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
 	    else
 		linkedFeaturesMoveWinEnd(exon->end, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
 	    }
 	else if (bigExon)
 	    linkedFeaturesMoveWinStart(exon->start, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
 	else
 	    linkedFeaturesMoveWinEnd(exon->end, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
-	safef(mouseOverText, sizeof(mouseOverText), "%s Feature (%d/%d)",
-              (revCmplDisp ? "Prev" : "Next"), exonIx+1, numExons);
+	if (!revStrand)
+	    safef(mouseOverText, sizeof(mouseOverText), "Next Exon (%d/%d)", exonIx+1, numExons);
+	else
+	    safef(mouseOverText, sizeof(mouseOverText), "Prev Exon (%d/%d)", numExons-exonIx, numExons);
 	mapBoxJumpTo(hvg, x, y, w, h, tg, chromName, newWinStart, newWinEnd, mouseOverText);
 	break;
 	}
     else if (!next && (exon->start < winStart))
+	/* left overhang */
 	{
 	if (exon->end > winStart)
 	    {
 	    /* not an inron hanging over the edge. */
 	    if ((lf->tallStart < winStart) && (lf->tallStart > exon->start) && (lf->tallStart < exon->end))
 		linkedFeaturesMoveWinStart(lf->tallStart, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
 	    else
 		linkedFeaturesMoveWinStart(exon->start, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
 	    }
 	else if (bigExon)
 	    linkedFeaturesMoveWinEnd(exon->end, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
 	else
 	    linkedFeaturesMoveWinStart(exon->start, bufferToEdge, newWinSize, &newWinStart, &newWinEnd);
-	safef(mouseOverText, sizeof(mouseOverText), "%s Feature (%d/%d)",
-              (revCmplDisp ? "Next" : "Prev"), numExons-exonIx, numExons);
+	if (!revStrand)
+	    safef(mouseOverText, sizeof(mouseOverText), "Prev Exon (%d/%d)", numExons-exonIx, numExons);
+	else
+	    safef(mouseOverText, sizeof(mouseOverText), "Next Exon (%d/%d)", exonIx+1, numExons);
 	mapBoxJumpTo(hvg, x, y, w, h, tg, chromName, newWinStart, newWinEnd, mouseOverText);
 	break;
 	}
     }
 slFreeList(&exonList);
 }
 
 void linkedFeaturesLabelNextPrevItem(struct track *tg, boolean next)
 /* Default next-gene function for linkedFeatures.  Changes winStart/winEnd
  * and updates position in cart. */
 {
 int start = winStart;
 int end = winEnd;
 int size = winBaseCount;
 int sizeWanted = size;