src/hg/hgTracks/hgTracks.c 1.1611

1.1611 2009/12/05 01:29:00 larrym
CONTEXT_MENU stuff; mostly turned off, except map area id's are live
Index: src/hg/hgTracks/hgTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/hgTracks.c,v
retrieving revision 1.1610
retrieving revision 1.1611
diff -b -B -U 4 -r1.1610 -r1.1611
--- src/hg/hgTracks/hgTracks.c	4 Dec 2009 17:02:25 -0000	1.1610
+++ src/hg/hgTracks/hgTracks.c	5 Dec 2009 01:29:00 -0000	1.1611
@@ -95,8 +95,10 @@
 boolean dragZooming = TRUE;
 struct hash *oldVars = NULL;
 
 boolean hideControls = FALSE;		/* Hide all controls? */
+boolean trackImgOnly = FALSE;           /* caller wants the image and map for just the given track */
+boolean ideogramToo =  FALSE;           /* caller wants the ideoGram (when requesting just one track) */
 
 /* Structure returned from findGenomePos.
  * We use this to to expand any tracks to full
  * that were found to contain the searched-upon
@@ -279,9 +281,9 @@
 }
 
 
 static void mapBoxTrackUi(struct hvGfx *hvg, int x, int y, int width,
-			  int height, char *name, char *shortLabel)
+			  int height, char *name, char *shortLabel, char *id)
 /* Print out image map rectangle that invokes hgTrackUi. */
 {
 x = hvGfxAdjXW(hvg, x, width);
 char *encodedName = cgiEncode(name);
@@ -292,9 +294,9 @@
     safef(link,sizeof(link),"%s?%s=%u&g=%s",
         hgTrackUiName(), cartSessionVarName(),cartSessionId(cart), encodedName);
     char title[128];
     safef(title,sizeof(title),"%s controls", shortLabel);
-    imgTrackAddMapItem(curImgTrack,link,title,x, y, x+width, y+height);
+    imgTrackAddMapItem(curImgTrack,link,title,x, y, x+width, y+height, id);
     }
 else
     {
     hPrintf("<AREA SHAPE=RECT COORDS=\"%d,%d,%d,%d\" ", x, y, x+width, y+height);
@@ -318,9 +320,9 @@
     {
     char link[512];
     safef(link,sizeof(link),"%s?complement_%s=%d&%s",
         hgTracksName(), database, !cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE),ui->string);
-    imgTrackAddMapItem(curImgTrack,link,(char *)(message != NULL?message:NULL),x, y, x+width, y+height);
+    imgTrackAddMapItem(curImgTrack,link,(char *)(message != NULL?message:NULL),x, y, x+width, y+height, NULL);
     }
 else
     {
     hPrintf("<AREA SHAPE=RECT COORDS=\"%d,%d,%d,%d\" ", x, y, x+width, y+height);
@@ -524,8 +526,12 @@
 
 /* If no ideogram don't draw. */
 if(ideoTrack == NULL)
     doIdeo = FALSE;
+else if(trackImgOnly && !ideogramToo)
+    {
+    doIdeo = FALSE;
+    }
 else
     {
     ideogramAvail = TRUE;
     /* Remove the track from the group and track list. */
@@ -1778,9 +1784,9 @@
             curMap      = sliceMapFindOrStart(curSlice,RULER_TRACK_NAME,NULL); // No common linkRoot
             }
         drawGrayButtonBox(hvg, trackTabX, y, trackTabWidth, height, TRUE);
         mapBoxTrackUi(hvg, trackTabX, y, trackTabWidth, height,
-		      RULER_TRACK_NAME, RULER_TRACK_LABEL);
+		      RULER_TRACK_NAME, RULER_TRACK_LABEL, "ruler");
         y += height + 1;
         }
     for (track = trackList; track != NULL; track = track->next)
         {
@@ -1815,9 +1821,9 @@
                     {
                     curMap      = sliceMapFindOrStart(curSlice,track->tdb->tableName,NULL); // No common linkRoot
                     }
                 mapBoxTrackUi(hvg, trackTabX, yStart, trackTabWidth, h,
-			      track->mapName, track->shortLabel);
+			      track->mapName, track->shortLabel, track->mapName);
             }
 	    }
 	}
     butOff = trackTabX + trackTabWidth;
@@ -2501,12 +2507,19 @@
 {
 struct trackDb *tdb, *tdbList = NULL;
 struct track *track;
 TrackHandler handler;
-tdbList = hTrackDb(database, chromName);
+char *trackNameFilter = cartOptionalString(cart, "hgt.trackNameFilter");
+if(trackNameFilter == NULL)
+    tdbList = hTrackDb(database, chromName);
+else
+    tdbList = hTrackDbForTrack(database, trackNameFilter);
 tdbSortPrioritiesFromCart(cart, &tdbList);
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
+    if(trackNameFilter != NULL && strcmp(trackNameFilter, tdb->tableName))
+        // suppress loading & display of all tracks except for the one passed in via trackNameFilter
+        continue;
     track = trackFromTrackDb(tdb);
     track->hasUi = TRUE;
     if (slCount(tdb->subtracks) != 0) {
         tdbSortPrioritiesFromCart(cart, &(tdb->subtracks));
@@ -3923,8 +3936,24 @@
     tg->limitedVisSet = TRUE;
     }
 }
 
+#ifdef CONTEXT_MENU
+
+static void trackJson(struct dyString *trackDbJson, struct track *track, int count)
+{
+// add entry for given track to the trackDbJson string
+if(count)
+    dyStringAppend(trackDbJson, "\n,");
+dyStringPrintf(trackDbJson, "\t%s: {", track->mapName);
+if(track->tdb->parent != NULL)
+    dyStringPrintf(trackDbJson, "\n\t\tparentTrack: '%s',", track->tdb->parent->tableName);
+dyStringPrintf(trackDbJson, "\n\t\tshortLabel: '%s',\n\t\tlongLabel: '%s',\n\t\tcanPack: %d,\n\t\tvisibility: %d\n\t}",
+               track->shortLabel, track->longLabel, track->canPack, track->limitedVis);
+}
+
+#endif
+
 void doTrackForm(char *psOutput, struct tempName *ideoTn)
 /* Make the tracks display form with the zoom/scroll buttons and the active
  * image.  If the ideoTn parameter is not NULL, it is filled in if the
  * ideogram is created.  */
@@ -3937,8 +3966,13 @@
 boolean showedRuler = FALSE;
 boolean showTrackControls = cartUsualBoolean(cart, "trackControlsOnMain", TRUE);
 long thisTime = 0, lastTime = 0;
 char *clearButtonJavascript;
+#ifdef CONTEXT_MENU
+struct dyString *trackDbJson = newDyString(1000);
+int trackDbJsonCount = 0;
+dyStringAppend(trackDbJson, "<script>var trackDbJson = {\n");
+#endif
 
 basesPerPixel = ((float)winBaseCount) / ((float)insideWidth);
 zoomedToBaseLevel = (winBaseCount <= insideWidth / tl.mWidth);
 zoomedToCodonLevel = (ceil(winBaseCount/3) * tl.mWidth) <= insideWidth;
@@ -4034,11 +4068,29 @@
 	    {
 	    thisTime = clock1000();
 	    track->loadTime = thisTime - lastTime;
 	    }
+#ifdef CONTEXT_MENU
+        trackJson(trackDbJson, track, trackDbJsonCount++);
+        if (trackIsCompositeWithSubtracks(track))
+            {
+            struct track *subtrack;
+            for (subtrack = track->subtracks;  subtrack != NULL; subtrack = subtrack->next)
+                {
+                // isSubtrackVisible is causing a problem in panTro2
+                if (isSubtrackVisible(subtrack))
+                    trackJson(trackDbJson, subtrack, trackDbJsonCount++);
+                }
+            }
+#endif
 	}
     }
 
+#ifdef CONTEXT_MENU
+dyStringAppend(trackDbJson, "}\n</script>\n");
+hPrintf(dyStringContents(trackDbJson));
+#endif
+
 /* Generate two lists of hidden variables for track group visibility.  Kludgy,
    but required b/c we have two different navigation forms on this page, but
    we want open/close changes in the bottom form to be submitted even if the user
    submits via the top form. */
@@ -4193,8 +4245,13 @@
 
 /* Make clickable image and map. */
 makeActiveImage(trackList, psOutput);
 fflush(stdout);
+
+if(trackImgOnly)
+    // bail out b/c we are done
+    return;
+
 if (!hideControls)
     {
     struct controlGrid *cg = NULL;
 
@@ -5049,8 +5106,18 @@
 dragZooming = advancedJavascriptFeaturesEnabled(cart);
 
 /* Do main display. */
 
+if (cartUsualBoolean(cart, "hgt.trackImgOnly", FALSE))
+    {
+    trackImgOnly = TRUE;
+    ideogramToo = cartUsualBoolean(cart, "hgt.ideogramToo", FALSE);
+    hideControls = TRUE;
+    withNextItemArrows = FALSE;
+    withNextExonArrows = FALSE;
+    hgFindMatches = NULL;     // XXXX necessary ???
+    }
+
 jsIncludeFile("jquery.js", NULL);
 if(dragZooming)
     {
     jsIncludeFile("jquery.imgareaselect.js", NULL);
@@ -5060,8 +5127,20 @@
 #ifdef LOWELAB
 jsIncludeFile("lowetooltip.js", NULL);
 #endif
 
+#ifdef CONTEXT_MENU
+jsIncludeFile("jquery-ui.js", NULL);
+jsIncludeFile("jquery.contextmenu.js", NULL);
+jsIncludeFile("ajax.js", NULL);
+
+hPrintf("<div style='height: 400px; width: 400px;' id='hgTrackUiDialog' style='display: none'></div>");
+hPrintf("<link href='../style/jquery.contextmenu.css' rel='stylesheet' type='text/css' />\n");
+hPrintf("<link href='../style/jquery-ui.css' rel='stylesheet' type='text/css' />\n");
+// XXXX stole this and '.hidden' from bioInt.css - needs work
+hPrintf("<div id='warning' class='ui-state-error ui-corner-all hidden' style='font-size: 0.75em;' onclick='$(this).hide();'><p><span class='ui-icon ui-icon-alert' style='float: left; margin-right: 0.3em;'></span><strong>Alert:  </strong><span id='warningText'></span> (click to hide)</p></div>\n");
+#endif
+
 if (cartVarExists(cart, "chromInfoPage"))
     {
     cartRemove(cart, "chromInfoPage");
     chromInfoPage();
@@ -5153,8 +5232,11 @@
                         "hgt.chromName", "hgt.winStart", "hgt.winEnd", "hgt.newWinWidth",
                         "hgt.insideX", "hgt.rulerClickHeight", "hgt.dragSelection", "hgt.revCmplDisp",
                         "hgt.collapseGroups", "hgt.expandGroups",
                         "hgt.jump", "hgt.refresh",
+#ifdef CONTEXT_MENU
+                        "hgt.trackImgOnly", "hgt.ideogramToo", "hgt.trackNameFilter",
+#endif
 			NULL };
 
 int main(int argc, char *argv[])
 {