3977a0035febcc3af4ef51f12fd75548a7cc7062
tdreszer
  Wed Dec 14 16:44:17 2011 -0800
Minor cleanup to hui.c  Fix edge case bug in hgTracks.js where right click is lost.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 14638ba..0bdceb6 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -2182,35 +2182,34 @@
         fourState = FOUR_STATE_CHECKED;
     }
 
 // Now check visibility
 enum trackVisibility vis = tdbLocalVisibility(cart, subtrack, NULL);
 if (vis == tvHide)
     {
     if(tdbIsCompositeView(subtrack->parent))
         {
         if(tdbLocalVisibility(cart, subtrack->parent, NULL) == tvHide)
             FOUR_STATE_DISABLE(fourState);
         }
     }
 
 safef(objName, sizeof(objName), "%s_sel", subtrack->track);
-//fourState = cartUsualInt(cart, objName, fourState);
 setting = cartOptionalString(cart, objName);
 if (setting != NULL)
     {
-    if (sameWord("on",setting)) // ouch! atoi was interpreting "on" as 0, which was a bad bug!
+    if (sameWord("on",setting)) // ouch! cartUsualInt was interpreting "on" as 0, which was a bad bug!
         fourState = 1;
     else
         fourState = atoi(setting);
     }
 tdbExtrasFourStateSet(subtrack,fourState);
 return fourState;
 }
 
 void subtrackFourStateCheckedSet(struct trackDb *subtrack, struct cart *cart,boolean checked, boolean enabled)
 /* Sets the fourState Checked in the cart and updates cached state */
 {
 int fourState = ( checked ? FOUR_STATE_CHECKED : FOUR_STATE_UNCHECKED );
 if (!enabled)
     FOUR_STATE_DISABLE(fourState);
 
@@ -2279,31 +2278,31 @@
 
 static void dimensionsFree(dimensions_t **dimensions)
 /* frees any previously obtained dividers setting */
 {
 if(dimensions && *dimensions)
     {
     freeMem((*dimensions)->setting);
     freeMem((*dimensions)->names);
     freeMem((*dimensions)->subgroups);
     freez(dimensions);
     }
 }
 
 static char *firstCharNoDigit(char *name)
 // Turns out css classes cannot begin with a number.  So prepend 'A'
-// If this wee more widely used, could move to common.
+// If this were more widely used, could move to common.
 {
 if (!isdigit(*name))
      return name;
 
 char *newName = needMem(strlen(name)+1);
 *newName = 'A';
 strcpy(newName+1,name);
 return newName;
 }
 
 #define SUBGROUP_MAX 9
 
 #define FILTER_COMPOSITE_ONLYONE
 #ifdef FILTER_COMPOSITE_ONLYONE
 // FIXME: do we even support anything but multi???  If not, this is a boolean
@@ -2350,31 +2349,31 @@
 
 char * subgroupSettingByTagOrName(struct trackDb *parentTdb, char *groupNameOrTag)
 /* look for a subGroup by name (ie subGroup1) or tag (ie view) and return an unallocated char* */
 {
 struct trackDb *ancestor;
 for (ancestor = parentTdb; ancestor != NULL; ancestor = ancestor->parent)
     {
     int ix;
     char *setting = NULL;
     if(startsWith("subGroup",groupNameOrTag))
 	{
 	setting = trackDbSetting(ancestor, groupNameOrTag);
 	if(setting != NULL)
 	    return setting;
 	}
-    for(ix=1;ix<=SUBGROUP_MAX;ix++) // How many do we support?
+    for(ix=1;ix<=SUBGROUP_MAX;ix++)
 	{
 	char subGrp[16];
 	safef(subGrp, ArraySize(subGrp), "subGroup%d",ix);
 	setting = trackDbSetting(ancestor, subGrp);
 	if(setting != NULL)  // Doesn't require consecutive subgroups
 	    {
 	    if(startsWithWord(groupNameOrTag,setting))
 		return setting;
 	    }
 	}
     }
 return NULL;
 }
 
 boolean subgroupingExists(struct trackDb *parentTdb, char *groupNameOrTag)
@@ -2676,38 +2675,40 @@
             {
             membersForAll->members[dimX]=subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
             membersForAll->letters[dimX]=letter;
             }
         else
             {
             membersForAll->members[dimY]=subgroupMembersGet(parentTdb, membersForAll->dimensions->subgroups[ix]);
             membersForAll->letters[dimY]=letter;
             }
         }
     }
 else // No 'dimensions" setting: treat any subGroups as abc dimensions
     {
     char letter = 'A';
     // walk through numbered subgroups
-    for (ix=1;ix<SUBGROUP_MAX;ix++)  // how many to support?
+    for (ix=1;ix<SUBGROUP_MAX;ix++)  // how many do we support?
         {
         char group[32];
         safef(group, sizeof group,"subGroup%d",ix);
         char *setting = subgroupSettingByTagOrName(parentTdb, group);
         if (setting != NULL)
             {
             char *tag = cloneFirstWord(setting);
+            if (membersForAll->members[dimV] && sameWord(tag,"view"))
+                continue; // View should have already been handled. NOTE: extremely unlikely case
             membersForAll->members[membersForAll->dimMax]=subgroupMembersGet(parentTdb, tag);
             membersForAll->letters[membersForAll->dimMax]=letter;
             if(cart != NULL)
                 membersForAll->checkedTags[membersForAll->dimMax] = abcMembersChecked(parentTdb,cart,membersForAll->members[membersForAll->dimMax],letter);
             membersForAll->dimMax++;
             letter++;
             }
         }
     }
 membersForAll->abcCount = membersForAll->dimMax - dimA;
 
 membersForAll = membersForAllSubGroupsWeedOutEmpties(parentTdb, membersForAll, cart);
 
 // NOTE: Dimensions must be defined for filterComposite.  Filter dimensioms are all and only ABCs.  Use dimensionAchecked to define selected
 char *filtering = trackDbSettingOrDefault(parentTdb,"filterComposite",NULL);
@@ -2848,31 +2849,31 @@
 if(cnt <= 0)
     {
     freeMem(membership->setting);
     freeMem(membership);
     return NULL;
     }
 membership->subgroups  = needMem(cnt*sizeof(char*));
 membership->membership = needMem(cnt*sizeof(char*));
 membership->titles     = needMem(cnt*sizeof(char*));
 for (ix = 0,membership->count=0; ix < cnt; ix++)
     {
     char *name,*value;
     if (parseAssignment(words[ix], &name, &value))
         {
         membership->subgroups[membership->count]  = name;
-        membership->membership[membership->count] = firstCharNoDigit(value);//strSwapChar(value,'_',' ');
+        membership->membership[membership->count] = firstCharNoDigit(value); // tags will be used as classes by js
         members_t* members = subgroupMembersGet(childTdb->parent, name);
         membership->titles[membership->count] = NULL; // default
         if(members != NULL)
             {
             int ix2 = stringArrayIx(membership->membership[membership->count],members->tags,members->count);
             if(ix2 != -1)
                 membership->titles[membership->count] = strSwapChar(cloneString(members->titles[ix2]),'_',' ');
             subgroupMembersFree(&members);
             }
         membership->count++;
         }
     }
 tdbExtrasMembershipSet(childTdb,membership);
 return membership;
 }
@@ -4062,62 +4063,61 @@
     int ix;
 
     // Determine whether subtrack is checked, visible, configurable, has group membership, etc.
     int fourState = subtrackFourStateChecked(subtrack,cart);
     boolean checkedCB = fourStateChecked(fourState);
     boolean enabledCB = fourStateEnabled(fourState);
     boolean visibleCB = fourStateVisible(fourState);
     membership_t *membership = subgroupMembershipGet(subtrack);
     eCfgType cType = cfgNone;
     if (!tdbIsMultiTrack(parentTdb))  // MultiTracks never have configurable subtracks!
         cType = cfgTypeFromTdb(subtrack,FALSE);
     if (cType != cfgNone)
         {
     #ifdef SUBTRACK_CFG
         // Turn off configuring for certain track type or if explicitly turned off
-        int cfgSubterack = configurableByAjax(subtrack,cType);
-        if (cfgSubterack <= cfgNone)
+        int cfgSubtrack = configurableByAjax(subtrack,cType);
+        if (cfgSubtrack <= cfgNone)
             cType = cfgNone;
         else if (membersForAll->members[dimV]) // subtrack only configurable if more than one subtrack in view
             {                                  // find "view" in subgroup membership: e.g. "signal"
             if (-1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count)))
                 {
                 int ix2;                       // find "signal" in set of all views
                 if (-1 != (ix2 = stringArrayIx(membership->membership[ix], membersForAll->members[dimV]->tags, membersForAll->members[dimV]->count)))
                     {
                     if (membersForAll->members[dimV]->subtrackCount[ix2] < 2)
                         cType = cfgNone;
                     }
                 }
             }
         else if (slCount(subtrackRefList) < 2 && cfgTypeFromTdb(parentTdb,FALSE) != cfgNone)
             cType = cfgNone;  // don't bother if there is a single subtrack but the composite is configurable.
     #else///ifndef SUBTRACK_CFG
         if (trackDbSettingClosestToHomeOn(subtrack, "configurable") == FALSE)
             cType = cfgNone;
     #endif///ndef SUBTRACK_CFG
         }
 
     if (sortOrder == NULL && !useDragAndDrop)
         {
         if ( divisionIfNeeded(lastDivide,dividers,membership) )
             colorIx = (colorIx == COLOR_BG_DEFAULT_IX ? COLOR_BG_ALTDEFAULT_IX : COLOR_BG_DEFAULT_IX);
         }
 
     // Start the TR which must have an id that is directly related to the checkBox id
     char *id = checkBoxIdMakeForTrack(subtrack,membersForAll->members,membersForAll->dimMax,membership); // view is known tag
-
     printf("<TR valign='top' class='%s%s'",colors[colorIx],(useDragAndDrop?" trDraggable":""));
     printf(" id=tr_%s%s>\n",id,(!visibleCB && !displayAll?" style='display:none'":""));
 
     // Now the TD that holds the checkbox
     printf("<TD%s%s>",
            (enabledCB?"":" title='view is hidden'"),
            (useDragAndDrop?" class='dragHandle' title='Drag to reorder'":""));
 
     // The checkbox has identifying classes including subCB and the tag for each dimension (e.g. class='subCB GM12878 CTCF Peak')
     dyStringClear(dyHtml);
     dyStringAppend(dyHtml, "subCB"); // always first
     if (membersForAll->dimensions)
         {
         for(di=dimX;di<membersForAll->dimMax;di++)
             {