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> </TD>", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), chromosome, cgiEncode(tdb->track), tdb->shortLabel); printf("<TD>"); + if (sameWord(tdb->type,"downloadsOnly")) + printf(" "); + 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("  <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(" <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 display mode: </B>"); else printf("<B>Display mode: </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(" "); cgiMakeButton("Submit", "Submit"); if(tdbIsComposite(tdb)) printf("\n <a href='#' onclick='setVarAndPostForm(\"%s\",\"1\",\"mainForm\"); return false;'>Reset to defaults</a>\n",setting); } if (ct) { puts(" "); cgiMakeButton(CT_DO_REMOVE_VAR, "Remove custom track"); cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track); puts(" "); @@ -2570,30 +2581,60 @@ { printf(" "); makeDownloadsLink(database, tdb, trackHash); } char *downArrow = "⇓"; enum browserType browser = cgiBrowser(); if (browser == btIE || browser == btFF) downArrow = "↓"; printf(" <A HREF='#DISPLAY_SUBTRACKS' TITLE='Jump to subtracks section of page'>Subtracks%s</A>",downArrow); printf(" <A HREF='#TRACK_HTML' TITLE='Jump to description section of page'>Description%s</A>",downArrow); printf(" </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 */