62abffb9b3bc4dc77214ea9128636037686fb7b7
kate
  Wed Sep 25 15:08:09 2019 -0700
Minor code refactor to remove duplication before adding new feature. refs #23365

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index c00d0e2..fe37255 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -4374,78 +4374,84 @@
 
 /* Subtrack configuration settings */
 
 struct subtrackConfigSettings 
     {
     sortOrder_t *sortOrder; /* from trackDb setting */
     boolean useDragAndDrop; /* from trackDb setting */
     boolean restrictions;   /* from metadata ? */
     boolean colorPatch;     /* from trackDb setting */
     boolean displayAll;     /* from radiobutton */
     int bgColorIx;          /* from logic over other settings */
     int columnCount;        /* determined from trackDb settings */
     };
 #define LARGE_COMPOSITE_CUTOFF 30
 
+static void printSubtrackListRadioButtons(char *parentTrack, int subCount, boolean displayAll)
+// Print radio buttons for all/select
+{
+printf("<B>List subtracks:&nbsp;");
+char javascript[JBUFSIZE];
+safef(javascript, sizeof(javascript),
+      "showOrHideSelectedSubtracks(true);");
+char buffer[SMALLBUF];
+if (subCount > LARGE_COMPOSITE_CUTOFF)
+    safef(buffer,SMALLBUF,"%s.displaySubtracks", parentTrack);
+else
+    safecpy(buffer,SMALLBUF,"displaySubtracks");
+cgiMakeOnEventRadioButtonWithClass(buffer, "selected", !displayAll, "allOrOnly", "click", javascript);
+puts("only selected/visible &nbsp;&nbsp;");
+safef(javascript, sizeof(javascript),
+      "showOrHideSelectedSubtracks(false);");
+cgiMakeOnEventRadioButtonWithClass(buffer, "all", displayAll, "allOrOnly", "click", javascript);
+printf("all</B>");
+if (subCount > 5)
+    printf("&nbsp;&nbsp;&nbsp;&nbsp;(<span class='subCBcount'></span>)");
+}
+
 static void printSubtrackTableHeader(struct trackDb *parentTdb, struct slRef *subtrackRefList,
 				struct subtrackConfigSettings *settings)
 /* Print header of subtrack table, including classes describing display appearance and behavior.
 Return number of columns */
 {
-char buffer[SMALLBUF];
 boolean useDragAndDrop = settings->useDragAndDrop;
 sortOrder_t *sortOrder = settings->sortOrder;
 if (sortOrder != NULL)
     puts("<THEAD class=sortable>");
 else
     puts("<THEAD>");
 int colspan = 3;
 if (sortOrder != NULL)
     colspan = sortOrder->count+2;
 else if (!tdbIsMultiTrack(parentTdb)) // An extra column for subVis/wrench so dragAndDrop works
     colspan++;
 if (settings->colorPatch)
     colspan++;
 int columnCount = 0;
 if (sortOrder != NULL)
     printf("<TR id=\"subtracksHeader\" class='sortable%s'>\n",
 		useDragAndDrop ? " nodrop nodrag" : "");
 else
     {
     printf("<TR%s>", useDragAndDrop ? " id='noDrag' class='nodrop nodrag'" : "");
     // First table row contains the display "selected/visible" or "all" radio buttons
     // NOTE: list subtrack radio buttons are inside tracklist table header if
     //       there are no sort columns.  The reason is to ensure spacing of lines
     //       column headers when the only column header is "Restricted Until"
-    printf("<TD colspan='%d'><B>List subtracks:&nbsp;", colspan);
-    char javascript[JBUFSIZE];
-    safef(javascript, sizeof(javascript),
-	  "showOrHideSelectedSubtracks(true);");
+    printf("<TD colspan='%d'>", colspan);
     int subCount = slCount(subtrackRefList);
-    if (subCount > LARGE_COMPOSITE_CUTOFF)
-	safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track);
-    else
-	safecpy(buffer,SMALLBUF,"displaySubtracks");
-    cgiMakeOnEventRadioButtonWithClass(buffer, "selected", !settings->displayAll, "allOrOnly", "click", javascript);
-
-    puts("only selected/visible &nbsp;&nbsp;");
-    safef(javascript, sizeof(javascript),
-	  "showOrHideSelectedSubtracks(false);");
-    cgiMakeOnEventRadioButtonWithClass(buffer, "all", settings->displayAll, "allOrOnly", "click", javascript);
-    printf("all</B>");
-    if (subCount > 5)
-	printf("&nbsp;&nbsp;&nbsp;&nbsp;(<span class='subCBcount'></span>)");
+    printSubtrackListRadioButtons(parentTdb->track, subCount, settings->displayAll);
     puts("</TD>");
     columnCount = colspan;
     }
 
 // Add column headers which are sort button links
 if (sortOrder != NULL)
     {
     printf("<TH>&nbsp;<INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE='%s'></TH>\n",
 	   sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder
     columnCount++;
     if (!tdbIsMultiTrack(parentTdb))  // An extra column for subVis/wrench so dragAndDrop works
 	{
 	printf("<TH></TH>\n");
 	columnCount++;
 	}
@@ -4946,30 +4952,31 @@
 
 // End of the table
 puts("</TBODY>");
 dyStringFree(&dyHtml)
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 }
 
 static boolean membersHaveMatrix(membersForAll_t *membersForAll)
 /* Check for matrix */
 {
 if (membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL)
     return FALSE;
 return TRUE;
 }
 
+
 static void printSubtrackTable(struct trackDb *parentTdb, struct slRef *subtrackRefList,
 			    struct subtrackConfigSettings *settings, struct cart *cart)
 /* Print table of subtracks */
 {
 // Print table tag
 printf("\n<TABLE CELLSPACING='2' CELLPADDING='0' border='0'");
 struct dyString *dyHtml = newDyString(SMALLBUF);
 if (settings->sortOrder != NULL)
     dyStringPrintf(dyHtml, "sortable");
 if (settings->useDragAndDrop)
     {
     if (dyStringLen(dyHtml) > 0)
 	dyStringAppendC(dyHtml,' ');
     dyStringPrintf(dyHtml, "tableWithDragAndDrop");
     }
@@ -5018,46 +5025,31 @@
     {
     displaySubs = cartUsualString(cart, "displaySubtracks", "all"); // browser wide defaults to all
     }
 boolean displayAll = sameString(displaySubs, "all");
 
 // Table wraps around entire list so that "Top" link can float to the correct place.
 cgiDown(0.7);
 printf("<table><tr><td class='windowSize'>");
 printf("<A NAME='DISPLAY_SUBTRACKS'></A>");
 if (sortOrder != NULL)
     {
     // First table row contains the display "selected/visible" or "all" radio buttons
     // NOTE: list subtrack radio buttons are inside tracklist table header if
     //       there are no sort columns.  The reason is to ensure spacing of lines
     //       column headers when the only column header is "Restricted Until"
-    printf("<B>List subtracks:&nbsp;");
-    char javascript[JBUFSIZE];
-    safef(javascript, sizeof(javascript),
-	  "showOrHideSelectedSubtracks(true);");
-    if (subCount > LARGE_COMPOSITE_CUTOFF)
-	safef(buffer,SMALLBUF,"%s.displaySubtracks",parentTdb->track);
-    else
-	safecpy(buffer,SMALLBUF,"displaySubtracks");
-    cgiMakeOnEventRadioButtonWithClass(buffer, "selected", !displayAll, "allOrOnly", "click", javascript);
-    puts("only selected/visible &nbsp;&nbsp;");
-    safef(javascript, sizeof(javascript),
-	  "showOrHideSelectedSubtracks(false);");
-    cgiMakeOnEventRadioButtonWithClass(buffer, "all", displayAll, "allOrOnly", "click", javascript);
-    printf("all</B>");
-    if (slCount(subtrackRefList) > 5)
-	printf("&nbsp;&nbsp;&nbsp;&nbsp;(<span class='subCBcount'></span>)");
+    printSubtrackListRadioButtons(parentTdb->track, subCount, displayAll);
     if (membersHaveMatrix(membersForAll))
 	makeTopLink(parentTdb);
     printf("</td></tr></table>");
     }
 else
     {
     if (membersHaveMatrix(membersForAll))
 	makeTopLink(parentTdb);
     }
 
 // Get info for subtrack list
 struct subtrackConfigSettings *settings = NULL;
 AllocVar(settings);
 
 // Determine whether there is a restricted until date column