154c2d14c0952d76054aff0b959a38c6c9ded41c
tdreszer
  Tue Nov 16 11:08:10 2010 -0800
Removed a bunch of composite reshaping ifdefs, now that track search is out the door.
diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 441b055..fc7af72 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -1750,102 +1750,30 @@
     char buf[512];
     safef(buf, sizeof buf, "%s.%s", tdb->track,suffix);
     char *cartSetting = hashFindVal(cart->hash, buf);
     if (cartSetting != NULL)
 	{
 	if(pVariable != NULL)
 	    *pVariable = cloneString(buf);
 	return cartSetting;
 	}
     }
 if (pVariable != NULL)
     *pVariable = NULL;
 return NULL;
 }
 
-// NEVER CHECKED IN.
-//#define NORMALIZE_CLOSEST_TO_HOME
-#ifdef NORMALIZE_CLOSEST_TO_HOME
-static void cartPairNormalize(struct cart *cart,struct cart *oldCart,char **lowestVar,char **lowestVal,char *parentVar,char *parentVal)
-/* Removes the lower level variable if it is the same as parent OR if the parent just changed */
-{
-if(parentVal)
-    {
-    if(*lowestVal)
-        {
-        if(sameString(*lowestVal,parentVal)) // same so don't need lowest
-            {
-            cartRemove(cart,*lowestVar);
-            *lowestVal = NULL;
-            }
-        else // Is parent newer?
-            {
-            char *oldVal = hashFindVal(oldCart->hash, parentVar);
-            if(oldVal == NULL || differentString(oldVal,parentVal)) // parent updated
-                {
-                oldVal = hashFindVal(oldCart->hash, *lowestVar);
-                if(oldVal && sameString(oldVal,*lowestVal)) // lowest not updated
-                    {
-                    cartRemove(cart,*lowestVar); // parent newer
-                    *lowestVal = NULL;
-                    }
-                }
-            }
-        }
-    if(*lowestVal == NULL)
-        {
-        *lowestVal = parentVal;
-        //safecpy(*lowestVar, sizeof *lowestVar, parentVar);
-        strcpy(*lowestVar, parentVar); // NOTE: these two must be same size!
-        }
-    }
-}
-
-char *cartNormalizeVariableClosestToHome(struct cart *cart,struct cart *oldCart,struct trackDb *tdb,boolean oneLevel, char *suffix)
-/* returns the ClosestToHome cart variable, but will remove any cart variable
-   most recently superceded */
-{
-char childVar[512];
-safef(childVar, sizeof childVar, "%s.%s", tdb->track,suffix);
-char *lowestVar = childVar;
-char *lowestVal = hashFindVal(cart->hash, childVar);
-if(!tdbIsCompositeChild(tdb))
-    return lowestVal;
-char *oldVal = cartOptionalString(oldCart, childVar);
-if(oldVal && differentString(oldVal,lowestVal))
-    return lowestVal; // It is newest and nothing needs to be removed
-
-// Find the closest to home parent
-char parentVar[512];
-char *parentVal = NULL;
-char *stView;
-if (tdbIsView(viewTdb,&stView))
-    {
-    safef(parentVar,sizeof parentVar,"%s.%s.%s",tdb->parent->track,stView,suffix);
-    parentVal = hashFindVal(cart->hash, parentVar);
-    cartPairNormalize(cart,oldCart,&lowestVar,&lowestVal,parentVar,parentVal);
-    }
-if(!oneLevel)
-    {
-    safef(parentVar,sizeof parentVar,"%s.%s",tdb->parent->track,suffix);
-    parentVal = hashFindVal(cart->hash, parentVar);
-    cartPairNormalize(cart,oldCart,&lowestVar,&lowestVal,parentVar,parentVal);
-    }
-return lowestVal?lowestVal:parentVal;
-}
-#endif//def NORMALIZE_CLOSEST_TO_HOME
-
 void cartRemoveVariableClosestToHome(struct cart *cart, struct trackDb *tdb, boolean compositeLevel, char *suffix)
 /* Looks for then removes a cart variable from lowest level on up:
    subtrackName.suffix, then compositeName.view.suffix, then compositeName.suffix */
 {
 char *var = NULL;
 (void)cartLookUpVariableClosestToHome(cart,tdb,compositeLevel,suffix,&var);
 if(var != NULL)
     {
     cartRemove(cart,var);
     freeMem(var);
     }
 }
 
 char *cartStringClosestToHome(struct cart *cart, struct trackDb *tdb, boolean compositeLevel, char *suffix)
 /* Returns value or Aborts for a cart string from lowest level on up:
@@ -2110,89 +2038,31 @@
         {
         if (child->visibility == tvHide)
             cartRemove(cart,child->track);
         else if (hTvFromString(cartVis) != tvHide)
             cartSetString(cart,child->track,"hide");
             }
     else if (child->visibility != tvHide)
         cartSetString(cart,child->track,"hide");
         }
 // and finally show the parent
 cartSetString(cart,tdb->parent->track,"show");
 WARN("Set %s to 'show'",tdb->parent->track);
 return TRUE;
 }
 
-// Shaping composite vis by subtrack specific vis comes in 3 flavors:
-// Simple) No shaping.  Subtrack specific vis overrides composite/view level but does not alter it
-// Plan A) When composite is in default settings only, then composite/vis is shaped to reflect current subtrack vis
-// Plan B) Whenever there is subtrack level vis, the composite and view vis are shaped to show maximum subtrack vis,
-//         while subtracks with inherited vis may be given subtrack specific vis to return them to that state
-#define COMPOSITE_VIS_SHAPING_PLAN_A
-#define COMPOSITE_VIS_SHAPING_PLAN_B
-
-#ifndef COMPOSITE_VIS_SHAPING_PLAN_B
-static boolean cartVarsNoneFoundForTdb(struct cart *cart,struct hash *subVisHash,struct trackDb *tdb)
-{
-struct slPair *cartVar,*cartVars = cartVarsWithPrefix(cart,tdb->track);
-if (cartVars != NULL)
-    {
-    for (cartVar = cartVars; cartVar != NULL; cartVar = cartVar->next)
-        {
-        if (tdbIsCompositeView(tdb) || !hashFindVal(subVisHash, cartVar->name)) // subVisHash does not contain anything prefixed by view!
-            {
-            // If composite vis changed but it is the same as trackDb default then ignore it
-            if (tdbIsContainer(tdb)
-            &&  sameString(cartVar->name,tdb->track)
-            &&  sameString((char *)cartVar->val,hStringFromTv(tdb->visibility)) )
-                continue;
-
-            // If view vis changed but it is the same as trackDb default then ignore it
-            if (tdbIsContainer(tdb)
-            && endsWith((char *)cartVar->val,".vis"))
-                {
-                // find out view
-                char *val = skipBeyondDelimit(cartVar->name,'.');
-                char *viewFound = cloneFirstWordByDelimiter(val,'.');
-                if (viewFound)
-                    {
-                    // find tdb for View
-                    struct trackDb *viewTdb;
-                    for (viewTdb=tdb->subtracks; viewTdb!=NULL; viewTdb=viewTdb->next)
-                        {
-                        char *viewOfTdb = NULL;
-                        if (tdbIsView(viewTdb,&viewOfTdb) && sameString(viewOfTdb,viewFound))
-                            {
-                            if(sameString((char *)cartVar->val,hStringFromTv(viewTdb->visibility)) )
-                                continue;
-                            break;
-                            }
-                        }
-                    }
-                }
-            WARN("cartVarsNoneFoundForTdb: %s=%s",cartVar->name,(char *)cartVar->val);
-            slFreeList(&cartVars);
-            return FALSE; // Any view cart vars means non-default so do not "shape" composite
-            }
-        }
-    slFreeList(&cartVars);
-    }
-return TRUE;
-}
-#endif///ndef COMPOSITE_VIS_SHAPING_PLAN_B
 
-#if defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B)
 static int cartTdbParentShapeVis(struct cart *cart,struct trackDb *parent,char *view,struct hash *subVisHash,boolean reshapeFully)
 // This shapes one level of vis (view or container) based upon subtrack specific visibility.  Returns count of tracks affected
 {
 ASSERT(view || (tdbIsContainer(parent) && tdbIsContainerChild(parent->subtracks)));
 struct trackDb *subtrack = NULL;
 char setting[512];
 if (view != NULL)
     safef(setting,sizeof(setting),"%s.%s.vis",parent->parent->track,view);
 else
     safef(setting,sizeof(setting),"%s",parent->track);
 
 enum trackVisibility visMax  = tvHide;
 enum trackVisibility visOrig = tdbVisLimitedByAncestry(cart, parent, FALSE);
 
 // Should walk through children to get max new vis for this parent
@@ -2271,39 +2141,35 @@
     {
     // MultiTrack vis is ALWAYS inherited vis so remove any subtrack specific vis
     struct hashCookie brownie = hashFirst(subVisHash);
     struct hashEl* cartVar = NULL;
     while ((cartVar = hashNext(&brownie)) != NULL)
         {
         if (!endsWith(cartVar->name,"_sel"))
             cartRemove(cart,cartVar->name);
         }
     }
 if (countUnchecked + countVisChanged)
     WARN("%s visOrig:%s visMax:%s unchecked:%d  Vis changed:%d",parent->track,hStringFromTv(visOrig),hStringFromTv(visMax),countUnchecked,countVisChanged);
 
 return (countUnchecked + countVisChanged);
 }
-#endif/// defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B)
 
 boolean cartTdbTreeMatchSubtrackVis(struct cart *cart,struct trackDb *tdbContainer)
 /* When subtrack vis is set via findTracks, and composite has no cart settings,
    then "shape" composite to match found */
 {
-#if !defined(COMPOSITE_VIS_SHAPING_PLAN_A) && !defined(COMPOSITE_VIS_SHAPING_PLAN_B)
-    return FALSE;  // Don't do any shaping
-#else/// if defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B)
 if (!tdbIsContainer(tdbContainer))
     return FALSE;  // Don't do any shaping
 
 // First look for subtrack level vis
 char setting[512];
 struct trackDb *subtrack = NULL;
 struct trackDb *tdbView  = NULL;
 struct hash *subVisHash = newHash(0);
 struct slRef *tdbRef, *tdbRefList = trackDbListGetRefsToDescendantLeaves(tdbContainer->subtracks);
 for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
     {
     subtrack = tdbRef->val;
     char *val=cartOptionalString(cart,subtrack->track);
     if (val && differentString(val,"hide"))  // NOTE should we include hide?
         {
@@ -2315,73 +2181,34 @@
             hashAdd(subVisHash,subtrack->track,val);
             safef(setting,sizeof(setting),"%s_sel",subtrack->track);
             hashAdd(subVisHash,setting,subtrack);     // Add the "_sel" setting which should also exist.  Point it to subtrack
             }
         }
     }
 slFreeList(&tdbRefList);
 
 if (hashNumEntries(subVisHash) == 0)
     {
     //WARN("No subtrack level vis for %s",tdbContainer->track);
     return FALSE;
     }
 
 // Next look for any cart settings other than subtrack vis/sel
-#ifdef COMPOSITE_VIS_SHAPING_PLAN_B
 // New directive means that if composite is hidden, then ignore previous and don't bother checking cart.
 boolean reshapeFully = (tdbVisLimitedByAncestry(cart, tdbContainer, FALSE) == tvHide);
 boolean hasViews = tdbIsCompositeView(tdbContainer->subtracks);
 
-#else///ifndef COMPOSITE_VIS_SHAPING_PLAN_B
-boolean reshapeFully = cartVarsNoneFoundForTdb(cart,subVisHash,tdbContainer);
-boolean hasViews = FALSE;
-tdbView = tdbContainer->subtracks;
-if (tdbIsCompositeView(tdbView))
-    {
-    hasViews = TRUE;
-    if (reshapeFully)
-        {
-        for( ;tdbView != NULL; tdbView = tdbView->next )
-            {
-            if(!cartVarsNoneFoundForTdb(cart,subVisHash,tdbView))
-                {
-                reshapeFully = FALSE;
-                break;
-                }
-            }
-        }
-    }
-
-// How about subtrack level settings?  Assume that compositePrefix caught them? If views then YES
-if (reshapeFully && !hasViews)
-    {
-    for(subtrack = tdbContainer->subtracks;subtrack != NULL; subtrack = subtrack->next )
-        {
-        if (!cartVarsNoneFoundForTdb(cart,subVisHash,subtrack));
-            {
-            reshapeFully = FALSE;
-            break;
-            }
-        }
-    }
-if (!reshapeFully)
-    {
-    hashFree(&subVisHash);
-    return FALSE; // Any view cart vars means non-default so do not "shape" composite
-    }
-#endif///ndef COMPOSITE_VIS_SHAPING_PLAN_B
 WARN("reshape: %s",reshapeFully?"Fully":"Incrementally");
 
 // Now shape views and composite to match subtrack specific visibility
 int count = 0;
 if (hasViews)
     {
     for(tdbView = tdbContainer->subtracks;tdbView != NULL; tdbView = tdbView->next )
         {
         char *view = NULL;
         if (tdbIsView(tdbView,&view) )
             count += cartTdbParentShapeVis(cart,tdbView,view,subVisHash,reshapeFully);
         }
     if (count > 0)
         {
         // At least on view was shaped, so all views will get explicit vis.  This means composite must be set to full
@@ -2390,31 +2217,30 @@
         if (visOrig == tvHide && tdbIsSuperTrackChild(tdbContainer))
             cartTdbOverrideSuperTracks(cart,tdbContainer,FALSE);      // deal with superTrack vis! cleanup
         }
     }
 else // If no views then composite is not set to fuul but to max of subtracks
     count = cartTdbParentShapeVis(cart,tdbContainer,NULL,subVisHash,reshapeFully);
 
 hashFree(&subVisHash);
 
 // If reshaped, be sure to set flag to stop composite cleanup
 #define RESHAPED_COMPOSITE "reshaped"
 if (count > 0)
     tdbExtrasAddOrUpdate(tdbContainer,RESHAPED_COMPOSITE,(void *)(long)TRUE); // Exists for the life of the cgi only
 
 return TRUE;
-#endif/// defined(COMPOSITE_VIS_SHAPING_PLAN_A) || defined(COMPOSITE_VIS_SHAPING_PLAN_B)
 }
 
 boolean cartTdbTreeCleanupOverrides(struct trackDb *tdb,struct cart *newCart,struct hash *oldVars)
 /* When container or composite/view settings changes, remove subtrack specific settings
    Returns TRUE if any cart vars are removed */
 {
 boolean anythingChanged = cartTdbOverrideSuperTracks(newCart,tdb,TRUE);
 if (!tdbIsContainer(tdb))
     return anythingChanged;
 
 // If composite has been reshaped then don't clean it up
 if ((boolean)(long)tdbExtrasGetOrDefault(tdb,RESHAPED_COMPOSITE,(void *)(long)FALSE))
     return anythingChanged;
 
 // vis is a special additive case! composite or view level changes then remove subtrack vis