src/hg/lib/hui.c 1.280

1.280 2010/04/30 00:26:31 tdreszer
Support for javascript to tie view level and subtrack level controls together in hgTrackUi
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.279
retrieving revision 1.280
diff -b -B -U 4 -r1.279 -r1.280
--- src/hg/lib/hui.c	27 Apr 2010 00:16:09 -0000	1.279
+++ src/hg/lib/hui.c	30 Apr 2010 00:26:31 -0000	1.280
@@ -2194,12 +2194,17 @@
     return dyStringCannibalize(&currentlyCheckedTags);
 return NULL;
 }
 
+#define MEMBERS_FOR_ALL_KEY "membersForAll"
 static membersForAll_t* membersForAllSubGroupsGet(struct trackDb *parentTdb, struct cart *cart)
 /* Returns all the parents subGroups and members */
 {
-membersForAll_t *membersForAll = needMem(sizeof(membersForAll_t));
+membersForAll_t *membersForAll =tdbExtrasGetOrDefault(parentTdb,MEMBERS_FOR_ALL_KEY,NULL);
+if(membersForAll != NULL)
+    return membersForAll;  // Already retrieved, so don't do it again
+
+membersForAll = needMem(sizeof(membersForAll_t));
 membersForAll->members[dimV]=subgroupMembersGet(parentTdb,"view");
 membersForAll->dimMax=dimA;  // This can expand, depending upon ABC dimensions
 membersForAll->dimensions = dimensionSettingsGet(parentTdb);
 if(membersForAll->dimensions != NULL)
@@ -2222,16 +2227,24 @@
         }
     }
 membersForAll->abcCount = membersForAll->dimMax - dimA;
 
+if(cart != NULL) // Only save this if it is fully populated!
+    tdbExtrasAddOrUpdate(parentTdb,MEMBERS_FOR_ALL_KEY,membersForAll);
+
 return membersForAll;
 }
 
-static void membersForAllSubGroupsFree(membersForAll_t** membersForAllPtr)
+static void membersForAllSubGroupsFree(struct trackDb *parentTdb, membersForAll_t** membersForAllPtr)
 /* frees memory for membersForAllSubGroups struct */
 {
 if(membersForAllPtr && *membersForAllPtr)
     {
+    if(parentTdb != NULL)
+        {
+        if(*membersForAllPtr == tdbExtrasGetOrDefault(parentTdb,MEMBERS_FOR_ALL_KEY,NULL))
+            return;  // Don't free something saved to the tdbExtras!
+        }
     membersForAll_t* membersForAll = *membersForAllPtr;
     subgroupMembersFree(&(membersForAll->members[dimX]));
     subgroupMembersFree(&(membersForAll->members[dimY]));
     subgroupMembersFree(&(membersForAll->members[dimV]));
@@ -3186,9 +3199,9 @@
 
 static void cfgLinkToDependentCfgs(struct trackDb *tdb,char *prefix)
 /* Link composite or view level controls to all associateled lower level controls */
 {
-if(tdbIsComposite(tdb))
+if(tdbIsComposite(tdb)) // FIXME: Only when some subtracks are configurable
     printf("<script type='text/javascript'>compositeCfgRegisterOnchangeAction(\"%s\")</script>\n",prefix);
 }
 
 #define TV_HIDE "hide"
@@ -3266,8 +3279,9 @@
 #define FOURSTATE_DISABLE(val)      {while((val) >= 0) (val) -= 2;}
 #define FOURSTATE_ENABLE(val)       {while((val) < 0) (val) += 2;}
 #define fourStateChecked(fourState) ((fourState) == 1 || (fourState) == -1)
 #define fourStateEnabled(fourState) ((fourState) >= 0)
+#define fourStateVisible(fourState) ((fourState) == 1)
 
 static int subtrackFourStateChecked(struct trackDb *subtrack, struct cart *cart)
 /* Returns the four state checked state of the subtrack */
 {
@@ -3563,9 +3577,9 @@
 if (!primarySubtrack)
     puts("<script type='text/javascript'>matInitializeMatrix();</script>");
 if(dependentCfgsNeedBinding)
     cfgLinkToDependentCfgs(parentTdb,parentTdb->tableName);
-membersForAllSubGroupsFree(&membersForAll);
+membersForAllSubGroupsFree(parentTdb,&membersForAll);
 dyStringFree(&dyHtml)
 sortOrderFree(&sortOrder);
 dividersFree(&dividers);
 hierarchyFree(&hierarchy);
@@ -3612,9 +3626,13 @@
         printf("<BR>");
     }
 if (boxed)
     {
-    printf("<TABLE class='blueBox' bgcolor=\"%s\" borderColor=\"%s\"><TR><TD align='RIGHT'>", COLOR_BG_ALTDEFAULT, COLOR_BG_ALTDEFAULT);
+    printf("<TABLE class='blueBox");
+    char *view = tdbGetViewName(tdb);
+    if(view != NULL)
+        printf(" %s",view);
+    printf("' bgcolor=\"%s\" borderColor=\"%s\"><TR><TD align='RIGHT'>", COLOR_BG_ALTDEFAULT, COLOR_BG_ALTDEFAULT);
     if (title)
         printf("<CENTER><B>%s Configuration</B></CENTER>\n", title);
     }
 else if (title)
@@ -4309,11 +4327,11 @@
         else
             dyStringPrintf(extraWhere, "%s(%s BETWEEN %d and %d)", (*and?" and ":""),field,min,max); // both min and max
 #endif//ndef FILTER_ASSUMES_RANGE_AT_LIMITS_IS_VALID_FILTER
         *and=TRUE;
-        //warn("%s: %s",tdb->tableName,extraWhere->string);
         }
     }
+    //if(dyStringLen(extraWhere)) warn("SELECT FROM %s WHERE %s",tdb->tableName,dyStringContents(extraWhere));
 return extraWhere;
 }
 
 struct dyString *dyAddFilterAsDouble(struct cart *cart, struct trackDb *tdb,
@@ -4390,8 +4408,9 @@
 #endif//ndef FILTER_ASSUMES_RANGE_AT_LIMITS_IS_VALID_FILTER
         *and=TRUE;
         }
     }
+    //if(dyStringLen(extraWhere)) warn("SELECT FROM %s WHERE %s",tdb->tableName,dyStringContents(extraWhere));
 return extraWhere;
 }
 
 void encodePeakCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
@@ -5164,8 +5183,9 @@
 
 toLowerN(membersOfView->title, 1);
 printf("<B>Select %s </B>(<A HREF=\"../goldenPath/help/multiView.html\" title='Help on views' TARGET=_BLANK>help</A>):<BR>\n", membersOfView->title);
 puts("<TABLE><TR align=\"LEFT\">");
+// Make row of vis drop downs
 for (ix = 0; ix < membersOfView->count; ix++)
     {
     struct trackDb *view = matchedSubtracks[ix];
     char *viewName = membersOfView->names[ix];
@@ -5191,10 +5211,11 @@
 	hTvDropDownClassWithJavascript(varName, tv, parentTdb->canPack,classes,javascript);
 	puts(" &nbsp; &nbsp; &nbsp;</TD>");
 	}
     }
-// Need to do the same for ENCODE Gencode 'filterBy's
 puts("</TR>");
+
+// Make row of cfg boxes if needed
 if(makeCfgRows)
     {
     puts("</TABLE><TABLE>");
     for (ix = 0; ix < membersOfView->count; ix++)
@@ -5501,15 +5522,10 @@
 char objName[SMALLBUF];
 char javascript[JBUFSIZE];
 
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,cart);
-if(membersForAll == NULL)
-    return FALSE;
-if(membersForAll->dimensions == NULL)
-    {
-    membersForAllSubGroupsFree(&membersForAll);
+if(membersForAll == NULL || membersForAll->dimensions == NULL) // Not Matrix!
     return FALSE;
-    }
 
 int ixX,ixY;
 if(membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL) // Must be an X or Y dimension
     return FALSE;
@@ -5685,9 +5701,8 @@
 
 puts("</TD></TR></TABLE>");
 puts("<BR>\n");
 
-membersForAllSubGroupsFree(&membersForAll);
 return TRUE;
 }
 
 static boolean hCompositeUiAllButtons(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName)
@@ -6045,9 +6060,9 @@
    returns TRUE for composite level name */
 {
 struct trackDb *parent;
 for (parent = tdb->parent; parent != NULL; parent = parent->parent)
-    if (startsWith(parent->tableName, name) && name[strlen(parent->tableName)] == '.')
+    if (startsWithWordByDelimiter(parent->tableName, '.', name))
         return TRUE;
 return FALSE;
 }