a80b650af2368300e4fd69251ff9d47e83c235a3
tdreszer
  Fri Dec 17 14:53:16 2010 -0800
New CFI 'hgFileUi' for composites with downloadable files
diff --git src/hg/hgFileUi/hgFileUi.c src/hg/hgFileUi/hgFileUi.c
new file mode 100644
index 0000000..c7e978a
--- /dev/null
+++ src/hg/hgFileUi/hgFileUi.c
@@ -0,0 +1,140 @@
+#include "common.h"
+#include "hash.h"
+#include "cheapcgi.h"
+#include "htmshell.h"
+#include "jsHelper.h"
+#include "trackDb.h"
+#include "hdb.h"
+#include "web.h"
+#include "mdb.h"
+#include "hCommon.h"
+#include "hui.h"
+#include "fileUi.h"
+
+#define MAIN_FORM "mainForm"
+#define WIGGLE_HELP_PAGE  "../goldenPath/help/hgWiggleTrackHelp.html"
+
+struct hash *trackHash = NULL;	/* Hash of all tracks in database. */
+
+void fileUi(struct cart *cart,struct trackDb *tdb, char *db, char *chrom, boolean ajax)
+// Downloadable Files UI
+{
+if (!ajax)
+    {
+    jsIncludeFile("jquery.js", NULL);
+    webIncludeResourceFile("jquery-ui.css");
+    jsIncludeFile("jquery-ui.js", NULL);
+    jsIncludeFile("utils.js",NULL);
+    }
+
+// QUESTION: Is this needed?  Are we doing a submit on hgTrackUi to get here??  Probably not.
+//if(tdbIsContainer(tdb) && !ajax)
+//    cartTdbTreeReshapeIfNeeded(cart,tdb);
+
+printf("<B style='font-family:serif; font-size:200%%;'>%s</B>\n", tdb->longLabel);
+
+// If Composite, link to the hgTrackUi.  But if downloadsOnly then link to any superTrack.
+#define LINK_TO_PARENT "%s<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>"
+if (tdbIsComposite(tdb))
+    {
+    char *encodedTrackName = cgiEncode(tdb->track);
+    printf(LINK_TO_PARENT,"&nbsp;&nbsp;", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), chrom, encodedTrackName,"Browser tracks");
+    freeMem(encodedTrackName);
+    }
+else if (tdb->parent) //Print link for parent track
+    {
+    char *encodedTrackName = cgiEncode(tdb->parent->track);
+    printf(LINK_TO_PARENT,"&nbsp;&nbsp;", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), chrom, encodedTrackName, tdb->parent->shortLabel);
+    freeMem(encodedTrackName);
+    }
+puts("<BR><BR>");
+
+filesDownloadUi(db,cart,tdb);
+
+// Print data version trackDB setting, if any */
+char *version = trackDbSetting(tdb, "dataVersion");
+if (version)
+    printf("<P><B>Data version:</B> %s<BR>\n", version);
+
+// Print lift information from trackDb, if any
+trackDbPrintOrigAssembly(tdb, db);
+
+if (tdb->html != NULL && tdb->html[0] != 0)
+    {
+    htmlHorizontalLine();
+    // include anchor for Description link
+    puts("<A NAME=TRACK_HTML></A>");
+    printf("<table class='windowSize'><tr valign='top'><td>");
+    puts(tdb->html);
+    printf("</td><td>");
+    makeTopLink(tdb);
+    printf("&nbsp</td></tr><tr valign='bottom'><td colspan=2>");
+    makeTopLink(tdb);
+    printf("&nbsp</td></tr></table>");
+    }
+}
+
+void doMiddle(struct cart *cart)
+/* Write body of web page. */
+{
+struct trackDb *tdbList = NULL;
+struct trackDb *tdb = NULL;
+char *track;
+char *ignored;
+char *db = NULL;
+track = cartString(cart, "g"); // QUESTION: Should this be 'f' ??
+getDbAndGenome(cart, &db, &ignored, NULL);
+char *chrom = cartUsualString(cart, "c", hDefaultChrom(db));
+
+// QUESTION: Do We need track list ???  trackHash ??? Can't we just get one track and no children
+trackHash = trackHashMakeWithComposites(db,chrom,&tdbList,FALSE);
+tdb = tdbForTrack(db, track,&tdbList);
+
+
+if (tdb == NULL)
+    {
+    errAbort("Can't find %s in track database %s", track, db);
+    return;
+    }
+cartWebStart(cart, db, "%s %s", tdb->shortLabel, DOWNLOADS_ONLY_TITLE);
+
+if (!tdbIsComposite(tdb) && !tdbIsDownloadsOnly(tdb))
+    {
+    warn("Track '%s' of type %s is not supported by hgFileUi.",track, tdb->type);
+    return;
+    }
+
+// Check for fileSortOrder
+if (trackDbSetting(tdb, FILE_SORT_ORDER) == NULL)
+    { // FIXME: This does not have to stay.  But lets start with this restriction until trackDb gets caught up
+    warn("Track '%s' needs '%s' trackDb setting.",track,FILE_SORT_ORDER);
+    return;
+    }
+
+// QUESTION: Do we need superTrack?  If we have lnk to superTrack, then yes.
+char *super = trackDbGetSupertrackName(tdb);
+if (super)
+    {
+    if (tdb->parent) // configured as a supertrack member in trackDb
+        {
+        tdbMarkAsSuperTrack(tdb->parent);
+        trackDbSuperMemberSettings(tdb);
+        }
+    }
+
+fileUi(cart, tdb, db, chrom, FALSE);
+
+printf("<BR>\n");
+webEnd();
+}
+
+char *excludeVars[] = { "submit", "Submit", "g", NULL, "ajax", NULL,};  // HOW IS 'ajax" going to be supported?
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+cgiSpoof(&argc, argv);
+htmlSetBackground(hBackgroundImage());
+cartEmptyShell(doMiddle, hUserCookie(), excludeVars, NULL);
+return 0;
+}