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(¤tlyCheckedTags);
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(÷rs);
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(" </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;
}