b75bbe708bc810fc1cfbd7e579940ba1c7b0f39f
tdreszer
  Fri Dec 10 09:32:37 2010 -0800
Added support for 'downloadsOnly' style tracks which will call fileDb APIs to present downloadable files from cgi.
diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index 1a6990e..9a56277 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -1,27 +1,28 @@
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "cheapcgi.h"
 #include "htmshell.h"
 #include "jksql.h"
 #include "jsHelper.h"
 #include "trackDb.h"
 #include "hgTrackUi.h"
 #include "hdb.h"
 #include "hCommon.h"
 #include "hui.h"
+#include "fileUi.h"
 #include "ldUi.h"
 #include "snpUi.h"
 #include "snp125Ui.h"
 #include "snp125.h"
 #include "sample.h"
 #include "wiggle.h"
 #include "hgMaf.h"
 #include "obscure.h"
 #include "chainCart.h"
 #include "chainDb.h"
 #include "gvUi.h"
 #include "oregannoUi.h"
 #include "chromGraph.h"
 #include "hgConfig.h"
 #include "customTrack.h"
@@ -2147,45 +2148,51 @@
 sqlFreeResult(&sr);
 jsMakeCheckboxGroupSetClearButton(cartVarName, TRUE);
 jsMakeCheckboxGroupSetClearButton(cartVarName, FALSE);
 cgiMakeCheckboxGroupWithVals(cartVarName, labelArr, valueArr, refCount, checked, 4);
 hFreeConn(&conn);
 }
 
 void superTrackUi(struct trackDb *superTdb)
 /* List tracks in this collection, with visibility controls and UI links */
 {
 struct trackDb *tdb;
 printf("<P><TABLE CELLPADDING=2>");
 tdbSortPrioritiesFromCart(cart, &superTdb->subtracks);
 for (tdb = superTdb->subtracks; tdb != NULL; tdb = tdb->next)
     {
-    if (!hTableOrSplitExists(database, tdb->table) && tdb->subtracks != NULL &&
-    	trackDbLocalSetting(tdb, "compositeTrack") == NULL)
+    if (!hTableOrSplitExists(database, tdb->table)
+    && tdb->subtracks != NULL && trackDbLocalSetting(tdb, "compositeTrack") == NULL
+    && !sameWord(tdb->type,"downloadsOnly"))
 	// NOTE: tdb if composite, is not yet populated with it's own subtracks!
         continue;
     printf("<TR>");
     printf("<TD NOWRAP><A HREF=\"%s?%s=%u&c=%s&g=%s\">%s</A>&nbsp;</TD>",
                 hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
                 chromosome, cgiEncode(tdb->track), tdb->shortLabel);
     printf("<TD>");
+    if (sameWord(tdb->type,"downloadsOnly"))
+        printf("&nbsp;");
+    else
+    {
     enum trackVisibility tv =
                     hTvFromString(cartUsualString(cart, tdb->track,
                                             hStringFromTv(tdb->visibility)));
     hTvDropDownClassVisOnly(tdb->track, tv, tdb->canPack,
                             tv == tvHide ?  "hiddenText" : "normalText",
                             trackDbSetting(tdb, "onlyVisibility"));
+    }
     printf("<TD>%s", tdb->longLabel);
     char *dataVersion = trackDbSetting(tdb, "dataVersion");
     if (dataVersion)
         printf("&nbsp&nbsp;<EM><FONT COLOR=#666666 SIZE=-1>%s</FONT></EM>", dataVersion);
     printf("</TD></TR>");
     }
 printf("</TABLE>");
 }
 
 void specificUi(struct trackDb *tdb, struct customTrack *ct, boolean ajax)
 	/* Draw track specific parts of UI. */
 {
 char *track = tdb->track;
 
 if (sameString(track, "stsMap"))
@@ -2493,58 +2500,62 @@
 /* Print link for parent track */
 struct trackDb *parentTdb = tdb->parent;
 if (parentTdb && !ajax)
     {
     char *encodedMapName = cgiEncode(parentTdb->track);
     printf("&nbsp;&nbsp;<B style='font-family:serif; font-size:100%%;'>(<A HREF=\"%s?%s=%u&c=%s&g=%s\" title='Link to parent track'><IMG height=12 src='../images/ab_up.gif'>%s</A>)</B>",
 		hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
 		chromosome, encodedMapName, parentTdb->shortLabel);
     freeMem(encodedMapName);
     }
     puts("<BR><BR>");
 
 if (ct && sameString(tdb->type, "maf"))
     tdb->canPack = TRUE;
 
+// Don't bother with vis controls for downloadsOnly
+if (!sameWord(tdb->type,"downloadsOnly"))
+    {
 /* Display visibility menu */
     if (tdbIsComposite(tdb) && multViewCount(tdb) > 0)
         printf("<B>Maximum&nbsp;display&nbsp;mode:&nbsp;</B>");
     else
         printf("<B>Display&nbsp;mode:&nbsp;</B>");
     if (tdbIsSuper(tdb))
         {
         /* This is a supertrack -- load its members and show hide/show dropdown */
         hTrackDbLoadSuper(database, tdb);
         superTrackDropDown(cart, tdb, 1);
         }
     else
         {
         /* normal visibility control dropdown */
         enum trackVisibility vis = tdb->visibility;
         boolean canPack = tdb->canPack;
         if (ajax)
             {
             vis = tdbVisLimitedByAncestry(cart, tdb, TRUE);  // ajax popups should show currently inherited visability
             if (tdbIsCompositeChild(tdb))
                 canPack = TRUE;
             }
         else
             vis = hTvFromString(cartUsualString(cart,tdb->track, hStringFromTv(vis))); // But hgTrackUi page should show local vis
         hTvDropDownClassVisOnlyAndExtra(tdb->track,vis,
             canPack, "normalText visDD", trackDbSetting(tdb, "onlyVisibility"),
                                (tdb->parent != NULL ?"onchange='return visTriggersHiddenSelect(this);'":NULL));
         }
+    }
 if (!ajax)
     {
     printf("&nbsp;");
     cgiMakeButton("Submit", "Submit");
 
     if(tdbIsComposite(tdb))
         printf("\n&nbsp;&nbsp;<a href='#' onclick='setVarAndPostForm(\"%s\",\"1\",\"mainForm\"); return false;'>Reset to defaults</a>\n",setting);
     }
 
 if (ct)
     {
     puts("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
     cgiMakeButton(CT_DO_REMOVE_VAR, "Remove custom track");
     cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track);
     puts("&nbsp;");
@@ -2570,30 +2581,60 @@
             {
             printf("&nbsp;&nbsp;");
             makeDownloadsLink(database, tdb, trackHash);
             }
         char *downArrow = "&dArr;";
         enum browserType browser = cgiBrowser();
         if (browser == btIE || browser == btFF)
             downArrow = "&darr;";
         printf("&nbsp;&nbsp;<A HREF='#DISPLAY_SUBTRACKS' TITLE='Jump to subtracks section of page'>Subtracks%s</A>",downArrow);
         printf("&nbsp;&nbsp;<A HREF='#TRACK_HTML' TITLE='Jump to description section of page'>Description%s</A>",downArrow);
         printf("&nbsp;</span>");
         }
     }
 printf("<BR>\n");
 
+// FIXME: Do something here for downloadOnly tracks.
+if (sameWord(tdb->type,"downloadsOnly"))
+    {
+    filesDownloadUi(database,cart,tdb);
+        // FIXME: To be written: hgTracUi cgi which is downloads page.
+        // Should be lib code and 2 cgis:
+        // hgTrackUi when we have downloads ONLY, except for this on trackDb entry to point us there
+        // hgFilesUi when we have composite tracks AND download filess, so that hgTrackUi handles composite and offers link to hgFilesUi for downloads
+        /*
+        struct fileDb, contains mdbObj struct
+        get composite name (in trackDb) from cart: g=wgEncodeBroadHistone
+        // Use composite name to aquire list of mdbObjs where composite= and fileName exists
+        // Use trackDb settings to get at html description, long and short labels
+        // Acquire composite level setting for:
+        //   experiment defining variables?
+        //   major sort order?
+        //   filterComposite stuff?  Or is this defined in trackDb for pseudo-composite?
+        // Sort list of mdbObjs?
+        // Weed list of mdbObjects via fileExists.
+        // Get preamble from dir
+        // Make any selection controls (filterBoxes) Do we want a matrix?
+        // Make table class=sortable
+        // Get html from trackDb
+        // Recommend different color background to get the point across that these are files, not tracks
+
+        */
+    //makeDownloadsLink(database, tdb, trackHash);
+    //extraUiLinks(database,tdb, trackHash);
+    }
+else
 specificUi(tdb, ct, ajax);
 puts("</FORM>");
 
 if (ct && !ajax)
     {
     /* hidden form for custom tracks CGI */
     printf("<FORM ACTION='%s' NAME='customTrackForm'>", hgCustomName());
     cartSaveSession(cart);
     cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track);
     puts("</FORM>\n");
     }
 
 if (ajax)
     return;
 
@@ -2670,65 +2711,67 @@
 {
 return trackDbForPseudoTrack(RULER_TRACK_NAME,
 	RULER_TRACK_LABEL, RULER_TRACK_LONGLABEL, tvFull, FALSE);
 }
 
 struct trackDb *trackDbForOligoMatch()
 /* Create a trackDb entry for the oligo matcher pseudo-track. */
 {
 return trackDbForPseudoTrack(OLIGO_MATCH_TRACK_NAME,
 	OLIGO_MATCH_TRACK_LABEL, OLIGO_MATCH_TRACK_LONGLABEL, tvHide, TRUE);
 }
 
 void doMiddle(struct cart *theCart)
 /* Write body of web page. */
 {
+struct trackDb *tdbList = NULL;
 struct trackDb *tdb = NULL;
 char *track;
 struct customTrack *ct = NULL, *ctList = NULL;
 char *ignored;
 cart = theCart;
 track = cartString(cart, "g");
 getDbAndGenome(cart, &database, &ignored, NULL);
 chromosome = cartUsualString(cart, "c", hDefaultChrom(database));
-trackHash = makeTrackHash(database, chromosome);
+
+trackHash = trackHashMakeWithComposites(database,chromosome,&tdbList,FALSE);
 if (sameWord(track, WIKI_TRACK_TABLE))
     tdb = trackDbForWikiTrack();
 else if (sameWord(track, RULER_TRACK_NAME))
     /* special handling -- it's not a full-fledged track */
     tdb = trackDbForRuler();
 else if (sameWord(track, OLIGO_MATCH_TRACK_NAME))
     tdb = trackDbForOligoMatch();
 else if (sameWord(track, CUTTERS_TRACK_NAME))
     tdb = trackDbForPseudoTrack(CUTTERS_TRACK_NAME, CUTTERS_TRACK_LABEL, CUTTERS_TRACK_LONGLABEL, tvHide, TRUE);
 else if (isCustomTrack(track))
     {
     ctList = customTracksParseCart(database, cart, NULL, NULL);
     for (ct = ctList; ct != NULL; ct = ct->next)
         {
         if (sameString(track, ct->tdb->track))
             {
             tdb = ct->tdb;
             break;
             }
         }
     }
 else if (sameString(track, "hgPcrResult"))
     tdb = pcrResultFakeTdb();
 else
     {
-    tdb = hTrackDbForTrack(database, track);
+    tdb = tdbForTrack(database, track,&tdbList);
     }
 if (tdb == NULL)
    {
    uglyAbort("Can't find %s in track database %s chromosome %s.  TrackHash has %d els",
 	    track, database, chromosome, trackHash->elCount);
    errAbort("Can't find %s in track database %s chromosome %s",
 	    track, database, chromosome);
    }
 char *super = trackDbGetSupertrackName(tdb);
 if (super)
     {
     /* configured as a supertrack member in trackDb */
     if (tdb->parent)
         {
         /* the supertrack is also configured, so use supertrack defaults */