src/hg/lib/hui.c 1.205

1.205 2009/05/27 21:36:17 tdreszer
Support for composite level controls to update view and subtrack level. Support for blocking view level controls. Fix for single dimension matrix.
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.204
retrieving revision 1.205
diff -b -B -U 4 -r1.204 -r1.205
--- src/hg/lib/hui.c	24 May 2009 09:24:14 -0000	1.204
+++ src/hg/lib/hui.c	27 May 2009 21:36:17 -0000	1.205
@@ -3213,8 +3213,15 @@
     printf("<p>");
 return boxed;
 }
 
+static void cfgLinkToDependentCfgs(struct trackDb *tdb,char *prefix)
+/* Link composite or view level controls to all associateled lower level controls */
+{
+if(tdbIsComposite(tdb))
+    printf("<script type='text/javascript'>compositeCfgRegisterOnchangeAction(\"%s\")</script>\n",prefix);
+}
+
 static void cfgEndBox(boolean boxed)
 /* Handle end of box and title for individual track type settings */
 {
 if (boxed)
@@ -4459,8 +4466,11 @@
 char configurable[membersOfView->count];
 memset(configurable,cfgNone,sizeof(configurable));
 boolean makeCfgRows = FALSE;
 struct trackDb **matchedSubtracks = needMem(sizeof(struct trackDb *)*membersOfView->count);
+char *setting = trackDbSetting(parentTdb,"settingsByView");
+boolean blockCfgs = (setting != NULL && (sameWord(setting,"off") || sameWord(setting,"disabled") || sameWord(setting,"false")));
+
 for (ix = 0; ix < membersOfView->count; ix++)
     {
     for (subtrack = parentTdb->subtracks; subtrack != NULL; subtrack = subtrack->next)
         {
@@ -4469,12 +4479,14 @@
             continue;
         if(differentString(stView,membersOfView->names[ix]))
             continue;
         matchedSubtracks[ix] = subtrack;
+        if(!blockCfgs)
+            {
         configurable[ix] = (char)cfgTypeFromTdb(subtrack,TRUE); // Warns if not multi-view compatible
-        // Need to find maximum wig range
         if(configurable[ix] != cfgNone)
             makeCfgRows = TRUE;
+            }
         break;
         }
     }
 
@@ -4533,9 +4545,9 @@
             safef(objName, sizeof(objName), "%s.%s", parentTdb->tableName,membersOfView->names[ix]);
             if(configurable[ix] != cfgNone)
                 {
                 cfgByCfgType(configurable[ix],db,cart,matchedSubtracks[ix],objName,membersOfView->values[ix],TRUE);
-                printf("<script type='text/javascript'>compositeCfgRegisterOnchangeAction(\"%s\")</script>\n",objName);
+                cfgLinkToDependentCfgs(parentTdb,objName);
                 }
             }
         }
     }
@@ -4696,9 +4708,9 @@
         if(dimensionY)
             printf("<TH align='right' WIDTH=\"100\"><EM><B>%s</EM></B>:</TH>", dimensionX->title);
         for (ixX = 0; ixX < dimensionX->count; ixX++)
             {
-            if(tdbsX[ixX] != NULL)
+            if(tdbsX[ixX] != NULL || dimensionX == NULL)
                 {
                 char *label = replaceChars(dimensionX->values[ixX]," (","<BR>(");//
                 printf("<TH WIDTH=\"100\">%s</TH>",labelWithVocabLink(parentTdb,tdbsX[ixX],dimensionX->tag,label));
                 freeMem(label);
@@ -4719,9 +4731,9 @@
         {
         printf("<TR ALIGN=CENTER BGCOLOR=\"%s\"><TH ALIGN=RIGHT><EM><B>%s</EM></B></TH><TD>&nbsp;</TD>",COLOR_BG_ALTDEFAULT, dimensionY->title);
         for (ixX = 0; ixX < dimensionX->count; ixX++)    // Special row of +- +- +-
             {
-            if(tdbsX[ixX] != NULL)
+            if(tdbsX[ixX] != NULL || dimensionX == NULL)
                 {
                 puts("<TD>");
                 safef(objName, sizeof(objName), "plus_%s_all", dimensionX->names[ixX]);
                 BUTTON_PLUS_ONE( objName,dimensionX->names[ixX]);
@@ -4734,9 +4746,9 @@
 
     // Now the Y by X matrix
     for (ixY = 0; ixY < sizeOfY; ixY++)
         {
-        if(tdbsY[ixY] != NULL)
+        if(tdbsY[ixY] != NULL || dimensionY == NULL)
             {
             assert(!dimensionY || ixY < dimensionY->count);
             printf("<TR ALIGN=CENTER BGCOLOR=\"#FFF9D2\">");
             if(dimensionY == NULL) // 'All' buttons go here if no Y dimension
@@ -4760,9 +4772,9 @@
                 puts("</TD>");
                 }
             for (ixX = 0; ixX < sizeOfX; ixX++)
                 {
-                if(tdbsX[ixX] != NULL)
+                if(tdbsX[ixX] != NULL || dimensionX == NULL)
                     {
                     assert(!dimensionX || ixX < dimensionX->count);
                     if(dimensionX && ixX == dimensionX->count)
                         break;
@@ -4825,13 +4837,10 @@
                 puts("</TH>");
                 cntZ++;
                 }
             }
-        while((cntZ % sizeOfX) > 0) // fill in the rest of the row
-            {
-            printf("<TH>&nbsp;</TH>");
-            cntZ++;
-            }
+        if((cntZ % sizeOfX) > 0)
+            printf("<TH colspan=%d>&nbsp;</TH>",sizeOfX);
         }
     puts("</TD></TR></TABLE>");
     subgroupMembersFree(&dimensionX);
     subgroupMembersFree(&dimensionY);
@@ -5035,8 +5044,10 @@
     compositeUiAllSubtracks(db, cart, tdb, primarySubtrack);
 else
     compositeUiSelectedSubtracks(db, cart, tdb, primarySubtrack);
 
+cfgLinkToDependentCfgs(tdb,tdb->tableName);
+
 if (primarySubtrack == NULL)  // This is set for tableBrowser but not hgTrackUi
     {
         if (slCount(tdb->subtracks) > 5)
         {