src/hg/hgTracks/hgTracks.c 1.1577

1.1577 2009/06/26 20:24:57 tdreszer
Inital checkin of imageV2, but ifdef'd out.
Index: src/hg/hgTracks/hgTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/hgTracks.c,v
retrieving revision 1.1576
retrieving revision 1.1577
diff -b -B -U 4 -r1.1576 -r1.1577
--- src/hg/hgTracks/hgTracks.c	26 Jun 2009 14:49:43 -0000	1.1576
+++ src/hg/hgTracks/hgTracks.c	26 Jun 2009 20:24:57 -0000	1.1577
@@ -42,8 +42,10 @@
 #include "mafTrack.h"
 #include "hgConfig.h"
 #include "encode.h"
 #include "agpFrag.h"
+#include "imageV2.h"
+
 
 static char const rcsid[] = "$Id$";
 
 /* These variables persist from one incarnation of this program to the
@@ -282,13 +284,26 @@
 {
 x = hvGfxAdjXW(hvg, x, width);
 char *encodedName = cgiEncode(name);
 
+#ifdef IMAGEv2_UI
+if(curMap != NULL)
+    {
+    char link[512];
+    safef(link,sizeof(link),"%s?%s=%u&c=%s&g=%s",
+        hgTrackUiName(), cartSessionVarName(),cartSessionId(cart), chromName, encodedName);
+    char title[128];
+    safef(title,sizeof(title),"%s controls", shortLabel);
+    // Add map item to currnent map (TODO: pass in map)
+    mapSetItemAdd(curMap,link,title,x, y, x+width, y+height);
+    }
+#else//ifndef IMAGEv2_UI
 hPrintf("<AREA SHAPE=RECT COORDS=\"%d,%d,%d,%d\" ", x, y, x+width, y+height);
 hPrintf("HREF=\"%s?%s=%u&c=%s&g=%s\"", hgTrackUiName(), cartSessionVarName(),
                          cartSessionId(cart), chromName, encodedName);
 mapStatusMessage("%s controls", shortLabel);
 hPrintf(">\n");
+#endif//ndef IMAGEv2_UI
 freeMem(encodedName);
 }
 
 static void mapBoxToggleComplement(struct hvGfx *hvg, int x, int y, int width, int height,
@@ -298,16 +313,27 @@
  * "complement" to complement the DNA bases at the top by the ruler*/
 {
 struct dyString *ui = uiStateUrlPart(toggleGroup);
 x = hvGfxAdjXW(hvg, x, width);
+#ifdef IMAGEv2_UI
+if(curMap != NULL)
+    {
+    char link[512];
+    safef(link,sizeof(link),"%s?complement_%s=%d&%s",
+        hgTracksName(), database, !cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE),ui->string);
+    // Add map item to currnent map (TODO: pass in map)
+    mapSetItemAdd(curMap,link,(char *)(message != NULL?message:NULL),x, y, x+width, y+height);
+    }
+#else//ifndef IMAGEv2_UI
 hPrintf("<AREA SHAPE=RECT COORDS=\"%d,%d,%d,%d\" ", x, y, x+width, y+height);
 hPrintf("HREF=\"%s?complement_%s=%d",
 	hgTracksName(), database, !cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE));
 hPrintf("&%s\"", ui->string);
 freeDyString(&ui);
 if (message != NULL)
     mapStatusMessage("%s", message);
 hPrintf(">\n");
+#endif//ndef IMAGEv2_UI
 }
 
 void smallBreak()
 /* Draw small horizontal break */
@@ -1514,9 +1540,9 @@
 int trackPastTabX = (withLeftLabels ? trackTabWidth : 0);
 int trackTabX = gfxBorder;
 int trackPastTabWidth = tl.picWidth - trackPastTabX;
 int pixWidth, pixHeight;
-int y;
+int y=0;
 int titleHeight = fontHeight;
 int scaleBarPad = 2;
 int scaleBarHeight = fontHeight;
 int scaleBarTotalHeight = fontHeight + 2 * scaleBarPad;
@@ -1537,8 +1563,19 @@
 trackHash = newHash(8);
 /* Figure out dimensions and allocate drawing space. */
 pixWidth = tl.picWidth;
 
+#ifdef IMAGEv2_UI
+// Start an imagebox (temproarily global in order to avoid massive changes)
+theImgBox = imgBoxStart(database,chromName,winStart,winEnd,(!revCmplDisp),withLeftLabels,pixWidth);
+int sideSliceWidth  = 0;   // Just being explicit
+int dataSliceWidth  = 0;
+int sideSliceOffsetX = 0;
+int dataSliceOffsetX = 0;
+int sliceHeight  = 0;
+int sliceOffsetY = 0;
+#endif//def IMAGEv2_UI
+
 if (rulerMode != tvFull)
     {
     rulerCds = FALSE;
     }
@@ -1645,8 +1682,15 @@
 else
     {
     trashDirFile(&gifTn, "hgt", "hgt", ".gif");
     hvg = hvGfxOpenGif(pixWidth, pixHeight, gifTn.forCgi);
+    #ifdef IMAGEv2_UI
+    // Adds one single image for all tracks (TODO: build the track by track images)
+    theOneImg = imgBoxImageAdd(theImgBox,gifTn.forHtml,
+        (char *)(dragZooming?"click or drag mouse in base position track to zoom in" : NULL),
+        pixWidth, pixHeight,FALSE);
+    //curMap = imgMapStart(theOneImg,"theOne",NULL); // No common linkRoot (TODO: Drop image map in favor of slice maps)
+    #endif//def IMAGEv2_UI
     }
 hvg->rc = revCmplDisp;
 initColors(hvg);
 
@@ -1658,8 +1702,18 @@
 
 leftLabelX = gfxBorder;
 leftLabelWidth = insideX - gfxBorder*3;
 
+#ifdef IMAGEv2_UI
+if (withLeftLabels)
+    {
+    sideSliceWidth   = leftLabelWidth + 2;   // Just being explicit
+    sideSliceOffsetX = 0;                        // FIXME: Reverse?
+    }
+dataSliceWidth   = tl.picWidth - sideSliceWidth;
+dataSliceOffsetX = sideSliceWidth;               // FIXME: Reverse?
+#endif//def IMAGEv2_UI
+
 /* Draw mini-buttons. */
 if (withLeftLabels && psOutput == NULL)
     {
     int butOff;
@@ -1671,8 +1725,18 @@
         /* draw button for Base Position pseudo-track */
         int height = basePositionHeight;
         if (rulerCds)
             height += rulerTranslationHeight;
+        #ifdef IMAGEv2_UI
+            {
+            // Start Track, Add slice and start mapping the slice
+            sliceHeight      = height + 1;
+            sliceOffsetY     = 0;
+            curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,FALSE); // No tdb, no centerlabel, not reorderable
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+            curMap      = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
+            }
+        #endif//def IMAGEv2_UI
         drawGrayButtonBox(hvg, trackTabX, y, trackTabWidth, height, TRUE);
         mapBoxTrackUi(hvg, trackTabX, y, trackTabWidth, height,
 		      RULER_TRACK_NAME, RULER_TRACK_LABEL);
         y += height + 1;
@@ -1696,12 +1760,22 @@
             else
                 drawBlueButtonBox(hvg, trackTabX, yStart, trackTabWidth,
 	    	                h, track->hasUi);
 	    if (track->hasUi)
+                {
+                #ifdef IMAGEv2_UI
+                // Start Track, Add slice and start mapping the slice
+                sliceHeight      = h;
+                sliceOffsetY     = yStart;
+                curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+                curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+                curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+                #endif//def IMAGEv2_UI
                 mapBoxTrackUi(hvg, trackTabX, yStart, trackTabWidth, h,
 			      track->mapName, track->shortLabel);
 	    }
 	}
+	}
     butOff = trackTabX + trackTabWidth;
     leftLabelX += butOff;
     leftLabelWidth -= butOff;
     }
@@ -1714,8 +1788,18 @@
     	gfxBorder, pixHeight, lightRed);
     y = gfxBorder;
     if (rulerMode != tvHide)
 	{
+        #ifdef IMAGEv2_UI
+            {
+            // Start Track, Add slice and start mapping the slice
+            sliceHeight      = basePositionHeight + (rulerCds ? rulerTranslationHeight : 0) + 1;
+            sliceOffsetY     = 0;
+            curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,FALSE); // No tdb, no centerlabel,not reorderable
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+            curMap      = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
+            }
+        #endif//def IMAGEv2_UI
 	if (baseTitle)
 	    {
 	    hvGfxTextRight(hvg, leftLabelX, y, leftLabelWidth-1, titleHeight,
 			MG_BLACK, font, WIN_TITLE_LABEL);
@@ -1771,8 +1855,20 @@
     for (track = trackList; track != NULL; track = track->next)
         {
         if (track->limitedVis == tvHide)
             continue;
+        #ifdef IMAGEv2_UI
+            {
+            // FIXME: Notice I am treating all subtracks as indivisible from their composite
+            // This will need to change to allow drag and drop.  Until then the subtrack center labels will drag scroll while the composte will not.
+            // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+            sliceHeight      = trackPlusLabelHeight(track, fontHeight);
+            sliceOffsetY     = y;
+            curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+            curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+            }
+        #endif//def IMAGEv2_UI
         if (trackIsCompositeWithSubtracks(track))  //TODO: Change when tracks->subtracks are always set for composite
             {
             struct track *subtrack;
             if (isWithCenterLabels(track))
@@ -1797,8 +1893,16 @@
 
 /* Draw guidelines. */
 if (withGuidelines)
     {
+    #ifdef IMAGEv2_UI
+        // TODO: We should be making transparent data images and a separate background img for guidelines.
+        // This will allow the guidelines to dragscroll while the center labels are static.
+        // NOTE: The background image could easily be a reusable file, based upon zoom level and width.  Height could propbaby easily be stretched.
+        // struct image *bgImg = imgBoxImageAdd(theImgBox,gifBg.forHtml,
+        //    (char *)(dragZooming?"click or drag mouse in base position track to zoom in" : NULL),
+        //    pixWidth, pixHeight,FALSE);
+    #endif//def IMAGEv2_UI
     int height = pixHeight - 2*gfxBorder;
     int x;
     Color lightBlue = hvGfxFindRgb(hvg, &guidelineColor);
 
@@ -1812,8 +1916,17 @@
 
 /* Show ruler at top. */
 if (rulerMode != tvHide)
     {
+    #ifdef IMAGEv2_UI
+        {
+        sliceHeight      = basePositionHeight + (rulerCds ? rulerTranslationHeight : 0) + 1;
+        sliceOffsetY     = 0;
+        curImgTrack = imgBoxTrackFindOrAdd(theImgBox,NULL,RULER_TRACK_NAME,rulerMode,FALSE,FALSE); // No tdb, no centerlabel,not reorderable
+        curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+        curMap      = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
+        }
+    #endif//def IMAGEv2_UI
     struct dnaSeq *seq = NULL;
     int rulerClickY = 0;
     rulerClickHeight = rulerHeight;
 
@@ -2029,22 +2142,44 @@
         {
         struct track *subtrack;
 	if (track->limitedVis == tvHide)
 	    continue;
+        #ifdef IMAGEv2_UI
+        //if (isWithCenterLabels(track))  // NOTE: Since track may not have centerlabel but subtrack may (How?), then must always make this slice!
+            {
+            // FIXME: Notice I am treating all subtracks as indivisible from their composite
+            // This will need to change to allow drag and drop.  Until then the subtrack center labels will drag scroll while the composte will not.
+            // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+            sliceHeight      = fontHeight;
+            sliceOffsetY     = y;
+            curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isCenter,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+            curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+            }
+        #endif//def IMAGEv2_UI
         if (trackIsCompositeWithSubtracks(track))  //TODO: Change when tracks->subtracks are always set for composite
             {
 	    if (isWithCenterLabels(track))
-		y = doCenterLabels(track, track, hvg, font, y)
-		    - track->height; /* subtrack heights tallied below: */
-	    for (subtrack = track->subtracks; subtrack != NULL;
-		 subtrack = subtrack->next)
+                y = doCenterLabels(track, track, hvg, font, y) - track->height; /* subtrack heights tallied below: */
+            #ifdef IMAGEv2_UI
+                {
+                // FIXME: This special case allows the subtrack center label map items to be put into the data slice
+                // When subtracks are carved up into individual imgTracks, then this will not be necessary
+                sliceHeight      = trackPlusLabelHeight(track, fontHeight) - fontHeight;
+                sliceOffsetY     = y;
+                curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+                curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+                }
+            #endif//def IMAGEv2_UI
+            for (subtrack = track->subtracks; subtrack != NULL; subtrack = subtrack->next)
+                {
 		if (isSubtrackVisible(subtrack))
 		    {
 		    if (isWithCenterLabels(subtrack))
 			y = doCenterLabels(subtrack, track, hvg, font, y);
 		    else
-			y += subtrack->totalHeight(subtrack,
-						   subtrack->limitedVis);
+                        y += subtrack->totalHeight(subtrack,subtrack->limitedVis);
+                    }
 		    }
             }
         else
             y = doCenterLabels(track, track, hvg, font, y);
@@ -2061,18 +2196,31 @@
     for (track = trackList; track != NULL; track = track->next)
 	{
 	if (track->limitedVis == tvHide)
             continue;
+        #ifdef IMAGEv2_UI
+            {
+            // FIXME: Notice I am treating all subtracks as indivisible from their composite
+            // This will need to change to allow drag and drop.  Until then the subtrack center labels will drag scroll while the composte will not.
+            // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+            sliceHeight      = trackPlusLabelHeight(track, fontHeight) - (isWithCenterLabels(track) ? fontHeight : 0);
+            sliceOffsetY     = y + (isWithCenterLabels(track) ? fontHeight : 0);
+            curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+            curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isData,theOneImg,NULL,dataSliceWidth,sliceHeight,dataSliceOffsetX,sliceOffsetY);
+            curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+            }
+        #endif//def IMAGEv2_UI
         if (trackIsCompositeWithSubtracks(track))  //TODO: Change when tracks->subtracks are always set for composite
             {
             struct track *subtrack;
 	    if (isWithCenterLabels(track))
 		y += fontHeight;
-            for (subtrack = track->subtracks; subtrack != NULL;
-                         subtrack = subtrack->next)
+            for (subtrack = track->subtracks; subtrack != NULL;subtrack = subtrack->next)
+                {
                 if (isSubtrackVisible(subtrack))
                     y = doDrawItems(subtrack, hvg, font, y, &lastTime);
             }
+            }
         else
             y = doDrawItems(track, hvg, font, y, &lastTime);
         }
 }
@@ -2085,8 +2233,20 @@
     for (track = trackList; track != NULL; track = track->next)
 	{
 	if (track->limitedVis == tvHide)
             continue;
+    #ifdef IMAGEv2_UI
+        {
+        // FIXME: Notice I am treating all subtracks as indivisible from their composite
+        // This will need to change to allow drag and drop.  Until then the subtrack center labels will drag scroll while the composte will not.
+        // But as soon as subtracks are individual image tracks: problems with buttons, left labels, center labels, drag and drop, etc.
+        sliceHeight      = trackPlusLabelHeight(track, fontHeight);
+        sliceOffsetY     = y;
+        curImgTrack = imgBoxTrackFindOrAdd(theImgBox,track->tdb,NULL,track->limitedVis,isWithCenterLabels(track),TRUE);
+        curSlice    = imgTrackSliceUpdateOrAdd(curImgTrack,isSide,theOneImg,NULL,sideSliceWidth,sliceHeight,sideSliceOffsetX,sliceOffsetY);
+        curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
+        }
+    #endif//def IMAGEv2_UI
     if (trackIsCompositeWithSubtracks(track))  //TODO: Change when tracks->subtracks are always set for composite
 	    {
 	    struct track *subtrack;
 	    if (isWithCenterLabels(track))
@@ -2135,15 +2295,19 @@
     }
 
 /* Save out picture and tell html file about it. */
 hvGfxClose(&hvg);
+#ifdef IMAGEv2_UI
+imageBoxDraw(theImgBox);
+imgBoxFree(&theImgBox);
+#else//ifndef IMAGEv2_UI
 char *titleAttr = dragZooming ? "title='click or drag mouse in base position track to zoom in'" : "";
 hPrintf("<IMG SRC = \"%s\" BORDER=1 WIDTH=%d HEIGHT=%d USEMAP=#%s %s id='trackMap'",
     gifTn.forHtml, pixWidth, pixHeight, mapName, titleAttr);
 hPrintf("><BR>\n");
+#endif//ndef IMAGEv2_UI
 }
 
-
 static void printEnsemblAnchor(char *database, char* archive,
 	char *chrName, int start, int end)
 /* Print anchor to Ensembl display on same window. */
 {