9599e99e622644fc958a1a6481b82778cfd9a27f
kate
  Thu Feb 13 14:12:01 2020 -0800
Initial cut adding supertrack info to member track UI. refs #24948

diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c
index b4e3465..2d3c3eb 100644
--- src/hg/hgTrackUi/hgTrackUi.c
+++ src/hg/hgTrackUi/hgTrackUi.c
@@ -3135,30 +3135,112 @@
             printf("<h2>No description found for: %s.</h2>",tdbParent?tdbParent->track:tdb->track);
         }
     cartRemove(cart,"descriptionOnly"); // This is a once only request and should be deleted
     return;
     }
 if (tdbIsContainer(tdb))
     {
     safef(setting,sizeof(setting),"%s.%s",tdb->track,RESET_TO_DEFAULTS);
     // NOTE: if you want track vis to not be reset, move to after vis dropdown
     if (1 == cartUsualInt(cart, setting, 0))
         cartRemoveAllForTdbAndChildren(cart,tdb);
     else if (!ajax) // Overkill on !ajax, because ajax shouldn't be called for a composite
         cartTdbTreeReshapeIfNeeded(cart,tdb);
     }
 
+if (tdb->parent)
+    {
+    printf("<style>div.superTrackInfo {"
+                "box-shadow: inset 0 0 5px 0 black;"
+                "padding: 5px; padding-left: 50px;"
+                "margin-bottom: 10px;"
+                "} </style>\n");
+
+    printf("This track is part of a super-track. "
+            "To configure the parent or sibling tracks, click a link in the box below.");
+
+    // show super-track info
+    printf("<div class='superTrackInfo'>");
+/*
+    printf("<i>Parent track</i> ");
+*/
+    struct trackDb *tdbParent = tdb->parent;
+    if (trackDbSetting(tdbParent, "wgEncode"))
+        printf("<A HREF='/ENCODE/index.html'><IMG style='vertical-align:middle;' "
+               "width=100 src='/images/ENCODE_scaleup_logo.png'><A>");
+    printf("<b style='font-size:%d%%;'><a href='%s?%s=%s&c=%s&g=%s'"
+               " title='Configure parent track'>%s</a> Tracks</b>",
+                strlen(tdb->longLabel) > 30 ? 133 : 200,
+                hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
+                chromosome, cgiEncode(tdbParent->track), tdbParent->longLabel);
+
+    // show group info
+    struct grp *grp, *grps = hLoadGrps(database);
+    for (grp = grps; grp != NULL; grp = grp->next)
+        {
+        if (sameString(grp->name, tdb->grp))
+            {
+            printf("&nbsp;&nbsp;<B style='font-size:100%%;'>"
+                   "(<A HREF=\"%s?%s=%s&c=%s&hgTracksConfigPage=configure"
+                   "&hgtgroup_%s_close=0#%sGroup\" title='%s tracks in track configuration "
+                   "page'><IMG height=12 src='../images/ab_up.gif'>All %s%s</A>)</B>",
+                   hgTracksName(), cartSessionVarName(), cartSessionId(cart), chromosome,
+                   tdb->grp, tdb->grp, grp->label, grp->label,
+                   endsWith(grp->label," Tracks")?"":" tracks");
+            break;
+            }
+        }
+    grpFreeList(&grps);
+
+    printf("<table cellpadding='2' style='margin-left: 50px';>");
+    struct slRef *childRef;
+    tdbRefSortPrioritiesFromCart(cart, &tdbParent->children);
+    for (childRef = tdbParent->children; childRef != NULL; childRef = childRef->next)
+        {
+        struct trackDb *sibTdb = childRef->val;
+        if (sameString(sibTdb->track, tdb->track))
+            continue;
+        printf("<tr>");
+        //hPrintPennantIcon(sibTdb);
+        printf("<td><a href='%s?%s=%s&c=%s&g=%s'>%s</a>&nbsp;</td>", 
+                    tdbIsDownloadsOnly(sibTdb) ? hgFileUiName(): hTrackUiForTrack(sibTdb->track),
+                    cartSessionVarName(), cartSessionId(cart), chromosome, cgiEncode(sibTdb->track), 
+                    sibTdb->shortLabel);
+        printf("<td>%s</td></tr>\n", sibTdb->longLabel);
+        }
+    printf("</table>");
+
+
+/*
+   char *encodedMapName = cgiEncode(tdb->parent->track);
+    printf("&nbsp;&nbsp;<B style='font-size:100%%;'>"
+           "(<A HREF=\"%s?%s=%s&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, tdb->parent->shortLabel);
+
+    printf("<p>This track is part of a parent called <i>%s</i>. "
+            "To show other tracks of this parent, go to the "
+           "<A HREF=\"%s?%s=%s&c=%s&g=%s\" title='Link to parent track'>"
+           "%s</a> configuration page</A>.",
+           tdb->parent->shortLabel, hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
+           chromosome, encodedMapName, tdb->parent->shortLabel);
+    freeMem(encodedMapName);
+*/
+    printf("</div>");
+    }
+
 printf("<FORM ACTION=\"%s\" NAME=\""MAIN_FORM"\" METHOD=%s>\n\n",
        hgTracksName(), cartUsualString(cart, "formMethod", "POST"));
 cartSaveSession(cart);
 if (sameWord(tdb->track,"ensGene"))
     {
     char longLabel[256];
     struct trackVersion *trackVersion = getTrackVersion(database, tdb->track);
     if ((trackVersion != NULL) && !isEmpty(trackVersion->version))
         {
         if (!isEmpty(trackVersion->dateReference) && differentWord("current", trackVersion->dateReference))
             safef(longLabel, sizeof(longLabel), "Ensembl Gene Predictions - archive %s - %s", trackVersion->version, trackVersion->dateReference);
         else
             safef(longLabel, sizeof(longLabel), "Ensembl Gene Predictions - %s", trackVersion->version);
         }
     else
@@ -3185,68 +3267,55 @@
 	else
 	    safef(longLabel, sizeof(longLabel), "%s", tdb->longLabel);
 	}
     printf("<B style='font-size:200%%;'>%s%s</B>\n", longLabel, tdbIsSuper(tdb) ? " Tracks" : "");
     }
 else
     {
     if (trackDbSetting(tdb, "wgEncode"))
         printf("<A HREF='/ENCODE/index.html'><IMG style='vertical-align:middle;' "
                "width=100 src='/images/ENCODE_scaleup_logo.png'><A>");
     // set large title font size, but less so for long labels to minimize wrap
     printf("<B style='font-size:%d%%;'>%s%s</B>\n", strlen(tdb->longLabel) > 30 ? 133 : 200,
                 tdb->longLabel, tdbIsSuper(tdb) ? " Tracks" : "");
 
     }
+
 /* Print link for parent track */
 if (!ajax)
     {
-    if (tdb->parent)
-        {
-        char *encodedMapName = cgiEncode(tdb->parent->track);
-        printf("&nbsp;&nbsp;<B style='font-size:100%%;'>"
-               "(<A HREF=\"%s?%s=%s&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, tdb->parent->shortLabel);
-        printf("<p>This track is part of a parent called <i>%s</i>. "
-                "To show other tracks of this parent, go to the "
-               "<A HREF=\"%s?%s=%s&c=%s&g=%s\" title='Link to parent track'>"
-               "%s</a> configuration page</A>.",
-               tdb->parent->shortLabel, hgTrackUiName(), cartSessionVarName(), cartSessionId(cart),
-               chromosome, encodedMapName, tdb->parent->shortLabel);
-        freeMem(encodedMapName);
-        }
-    else
+    if (!tdb->parent)
         {
+        // show group info
         struct grp *grp, *grps = hLoadGrps(database);
         for (grp = grps; grp != NULL; grp = grp->next)
             {
             if (sameString(grp->name,tdb->grp))
                 {
                 printf("&nbsp;&nbsp;<B style='font-size:100%%;'>"
                        "(<A HREF=\"%s?%s=%s&c=%s&hgTracksConfigPage=configure"
                        "&hgtgroup_%s_close=0#%sGroup\" title='%s tracks in track configuration "
                        "page'><IMG height=12 src='../images/ab_up.gif'>All %s%s</A>)</B>",
                        hgTracksName(), cartSessionVarName(), cartSessionId(cart),chromosome,
                        tdb->grp,tdb->grp,grp->label,grp->label,
                        endsWith(grp->label," Tracks")?"":" tracks");
                 break;
                 }
             }
         grpFreeList(&grps);
         }
+
     }
 puts("<BR><BR>");
 
 if (ct && sameString(tdb->type, "maf"))
     tdb->canPack = TRUE;
 else if (sameString(tdb->track, WIKI_TRACK_TABLE))
     // special case wikiTrack (there's no trackDb entry); fixes redmine 2395
     tdb->canPack = TRUE;
 else if (sameString(tdb->type, "halSnake"))
     tdb->canPack = TRUE;
 else if (!startsWith("bigWig", tdb->type) && startsWith("big", tdb->type))
     tdb->canPack = TRUE;
 else if (sameString(tdb->type, "bigNarrowPeak"))
     tdb->canPack = TRUE;