|  | @@ -721,7 +721,9 @@ laProp *la_CreateProperty(laPropContainer *Container, int Type, const char *Iden
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      return p;
 |  |      return p;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | 
 |  | +void la_ClearDetachedProp(laPanel* p){
 | 
											
												
													
														|  | 
 |  | +    laProp *np; while(np=lstPopItem(&p->PropLinkContainer->Props)){ free(np->Identifier); memFree(np); }
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  laProp *la_MakeDetachedProp(laPanel* p, const char *From, const char *Rename){
 |  |  laProp *la_MakeDetachedProp(laPanel* p, const char *From, const char *Rename){
 | 
											
												
													
														|  |      laIntProp *ip;
 |  |      laIntProp *ip;
 | 
											
												
													
														|  |      laFloatProp *fp;
 |  |      laFloatProp *fp;
 | 
											
										
											
												
													
														|  | @@ -3712,18 +3714,19 @@ void laPushDifferences(char* Description, u64bit hint){
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void la_FreeInstance(void* inst, laPropContainer* pc, int no_free);
 |  |  void la_FreeInstance(void* inst, laPropContainer* pc, int no_free);
 | 
											
												
													
														|  | -void la_FreeDBInst(laDBInst* dbi, int no_freeinst);
 |  | 
 | 
											
												
													
														|  | -void la_FreeDBProp(laDBProp* dbp){
 |  | 
 | 
											
												
													
														|  | -    printf("free dbp %s %x\n",dbp->p->Identifier,dbp);
 |  | 
 | 
											
												
													
														|  | 
 |  | +void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipInstances);
 | 
											
												
													
														|  | 
 |  | +void la_FreeDBProp(laDBProp* dbp, int cleanup_only, int SkipInstances){
 | 
											
												
													
														|  | 
 |  | +    //printf("free dbp %s %x\n",dbp->p->Identifier,dbp);
 | 
											
												
													
														|  |      if(dbp->p->PropertyType==LA_PROP_SUB){
 |  |      if(dbp->p->PropertyType==LA_PROP_SUB){
 | 
											
												
													
														|  | -        if((((laSubProp*)dbp->p)->ListHandleOffset||dbp->p->UDFNoCreate||dbp->p->UDFIsSingle)&&(!dbp->p->UDFIsRefer)){
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if((((laSubProp*)dbp->p)->ListHandleOffset||dbp->p->UDFNoCreate||dbp->p->UDFIsSingle)&&(!dbp->p->UDFIsRefer)&&(!SkipInstances)){
 | 
											
												
													
														|  |              laDBSubProp* dsp=dbp; laDBInst* si;
 |  |              laDBSubProp* dsp=dbp; laDBInst* si;
 | 
											
												
													
														|  |              //printf("fdbp %s %x %x %x\n",dbp->p->Identifier,dsp->Instances.pFirst,dsp->Instances.pLast,((laListItem*)dsp->Instances.pFirst)->pNext);
 |  |              //printf("fdbp %s %x %x %x\n",dbp->p->Identifier,dsp->Instances.pFirst,dsp->Instances.pLast,((laListItem*)dsp->Instances.pFirst)->pNext);
 | 
											
												
													
														|  | -            while(si=lstPopItem(&dsp->Instances)){ la_FreeDBInst(si,dbp->p->UDFNoCreate||(!dbp->p->OffsetIsPointer)); }
 |  | 
 | 
											
												
													
														|  | 
 |  | +            while(si=lstPopItem(&dsp->Instances)){ la_FreeDBInst(si,dbp->p->UDFNoCreate||(!dbp->p->OffsetIsPointer),cleanup_only,SkipInstances); }
 | 
											
												
													
														|  |          } // prevent freeing the data;
 |  |          } // prevent freeing the data;
 | 
											
												
													
														|  |      }elif(dbp->p->PropertyType==LA_PROP_STRING && ((laStringProp*)dbp->p)->IsSafeString){
 |  |      }elif(dbp->p->PropertyType==LA_PROP_STRING && ((laStringProp*)dbp->p)->IsSafeString){
 | 
											
												
													
														|  |          strSafeSet(&dbp->Data,0);
 |  |          strSafeSet(&dbp->Data,0);
 | 
											
												
													
														|  |      }elif(dbp->p->PropertyType==LA_PROP_RAW){
 |  |      }elif(dbp->p->PropertyType==LA_PROP_RAW){
 | 
											
												
													
														|  | 
 |  | +        printf("raw dbp %s\n",dbp->p->Identifier);
 | 
											
												
													
														|  |          free(dbp->Data);
 |  |          free(dbp->Data);
 | 
											
												
													
														|  |      }else{
 |  |      }else{
 | 
											
												
													
														|  |          //printf("-data- %x\n",dbp->Data);
 |  |          //printf("-data- %x\n",dbp->Data);
 | 
											
										
											
												
													
														|  | @@ -3731,23 +3734,24 @@ void la_FreeDBProp(laDBProp* dbp){
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      memFree(dbp);
 |  |      memFree(dbp);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | -void la_FreeDBInst(laDBInst* dbi, int no_freeinst){
 |  | 
 | 
											
												
													
														|  | 
 |  | +void la_FreeDBInst(laDBInst* dbi, int no_freeinst, int cleanup_only, int SkipInstances){
 | 
											
												
													
														|  |      laListHandle* l=hsh65536DoHashLongPtr(MAIN.DBInstLink,dbi->OriginalInstance); lstRemoveItem(l, &dbi->Item2);
 |  |      laListHandle* l=hsh65536DoHashLongPtr(MAIN.DBInstLink,dbi->OriginalInstance); lstRemoveItem(l, &dbi->Item2);
 | 
											
												
													
														|  | -    printf("free dbi %s %x\n", dbi->pc->Identifier,dbi);
 |  | 
 | 
											
												
													
														|  | -    laDBProp* dbp; while(dbp=lstPopItem(&dbi->Props)){ la_FreeDBProp(dbp); }
 |  | 
 | 
											
												
													
														|  | -    if(dbi->OriginalInstance) la_FreeInstance(dbi->OriginalInstance, dbi->pc, no_freeinst);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    //printf("free dbi %s %x\n", dbi->pc->Identifier,dbi);
 | 
											
												
													
														|  | 
 |  | +    laDBProp* dbp; while(dbp=lstPopItem(&dbi->Props)){ la_FreeDBProp(dbp, cleanup_only,SkipInstances); }
 | 
											
												
													
														|  | 
 |  | +    if(dbi->OriginalInstance && (!cleanup_only)) la_FreeInstance(dbi->OriginalInstance, dbi->pc, no_freeinst);
 | 
											
												
													
														|  |      memFree(dbi);
 |  |      memFree(dbi);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void la_FreeDiffCommand(laDiffCommand* dc, laDiff* d, int FromLeft){
 |  |  void la_FreeDiffCommand(laDiffCommand* dc, laDiff* d, int FromLeft){
 | 
											
												
													
														|  | -    printf("freedc %s\n",dc->p->Identifier);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    //printf("freedc %s\n",dc->p->Identifier);
 | 
											
												
													
														|  |      if(dc->p->PropertyType==LA_PROP_SUB && (((laSubProp*)dc->p)->ListHandleOffset||dc->p->UDFNoCreate||dc->p->UDFIsSingle) && (!dc->p->UDFIsRefer)){
 |  |      if(dc->p->PropertyType==LA_PROP_SUB && (((laSubProp*)dc->p)->ListHandleOffset||dc->p->UDFNoCreate||dc->p->UDFIsSingle) && (!dc->p->UDFIsRefer)){
 | 
											
												
													
														|  |          laDiffCommandInst* dci; laDiffCommandSub* dcs=dc;
 |  |          laDiffCommandInst* dci; laDiffCommandSub* dcs=dc;
 | 
											
												
													
														|  | -        while(dci=lstPopItem(&dcs->AddedInst)){ if(!FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer))); memFree(dci); }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        while(dci=lstPopItem(&dcs->AddedInst)){ if(!FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer)),0,0); memFree(dci); }
 | 
											
												
													
														|  |          while(dci=lstPopItem(&dcs->MovedInst)){ memFree(dci); }
 |  |          while(dci=lstPopItem(&dcs->MovedInst)){ memFree(dci); }
 | 
											
												
													
														|  | -        while(dci=lstPopItem(&dcs->RemovedInst)){ if(FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer))); memFree(dci); }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        while(dci=lstPopItem(&dcs->RemovedInst)){ if(FromLeft) la_FreeDBInst(dci->DBInst,(dc->p->UDFNoCreate||(!dc->p->OffsetIsPointer)),0,1); memFree(dci); }
 | 
											
												
													
														|  |      }elif(dc->p->PropertyType==LA_PROP_STRING && ((laStringProp*)dc->p)->IsSafeString){
 |  |      }elif(dc->p->PropertyType==LA_PROP_STRING && ((laStringProp*)dc->p)->IsSafeString){
 | 
											
												
													
														|  |          strSafeSet(&dc->Data,0);
 |  |          strSafeSet(&dc->Data,0);
 | 
											
												
													
														|  |      }elif(dc->p->PropertyType==LA_PROP_RAW){
 |  |      }elif(dc->p->PropertyType==LA_PROP_RAW){
 | 
											
												
													
														|  | 
 |  | +        printf("raw %s\n",dc->p->Identifier);
 | 
											
												
													
														|  |          free(dc->Data);
 |  |          free(dc->Data);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      memFree(dc);
 |  |      memFree(dc);
 | 
											
										
											
												
													
														|  | @@ -3784,11 +3788,11 @@ void la_FreeOlderDifferences(int KeepHowMany){
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void la_FreeAllDifferences(){
 |  |  void la_FreeAllDifferences(){
 | 
											
												
													
														|  |      la_FreeNewerDifferences();
 |  |      la_FreeNewerDifferences();
 | 
											
												
													
														|  | -    la_FreeOlderDifferences(1); //XXX 0 seems to have problems
 |  | 
 | 
											
												
													
														|  | 
 |  | +    la_FreeOlderDifferences(1);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void la_NoLongerRecordUndo(){
 |  |  void la_NoLongerRecordUndo(){
 | 
											
												
													
														|  |      la_FreeAllDifferences();
 |  |      la_FreeAllDifferences();
 | 
											
												
													
														|  | -    laDBProp*dbp; while(dbp=lstPopItem(&MAIN.RootDBInst.Props)){ la_FreeDBProp(dbp); }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laDBProp*dbp; while(dbp=lstPopItem(&MAIN.RootDBInst.Props)){ la_FreeDBProp(dbp,1,0); }
 | 
											
												
													
														|  |      laDBRecordedProp* p; while(p=lstPopItem(&MAIN.DBRecordedProps)){ strSafeDestroy(&p->OriginalPath); memFree(p); }
 |  |      laDBRecordedProp* p; while(p=lstPopItem(&MAIN.DBRecordedProps)){ strSafeDestroy(&p->OriginalPath); memFree(p); }
 | 
											
												
													
														|  |      hshFree(&MAIN.DBInstLink);
 |  |      hshFree(&MAIN.DBInstLink);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
										
											
												
													
														|  | @@ -3990,6 +3994,8 @@ int la_GenerateListDifferences(laDBInst* dbi, laDBSubProp* dbp, laPropPack* pp,
 | 
											
												
													
														|  |          if(!dbi->Item.pPrev){dbp->Instances.pFirst=dbi;}
 |  |          if(!dbi->Item.pPrev){dbp->Instances.pFirst=dbi;}
 | 
											
												
													
														|  |          if(!dbi->Item.pNext){dbp->Instances.pLast=dbi;}
 |  |          if(!dbi->Item.pNext){dbp->Instances.pLast=dbi;}
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if(!New.pFirst){ dbp->Instances.pFirst=dbp->Instances.pLast=0; }
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  |      for(laDiffTemp* lip=NewDeleted.pFirst;lip;lip=lip->Item.pNext){
 |  |      for(laDiffTemp* lip=NewDeleted.pFirst;lip;lip=lip->Item.pNext){
 | 
											
												
													
														|  |          laDBInst* dbi=lip->p; lstAppendItem(&dc->RemovedInst, la_NewDiffCommandInst(dbi, lip->tPrev, lip->tNext));printf("deleted %x %x\n", dbi, dbi->OriginalInstance);
 |  |          laDBInst* dbi=lip->p; lstAppendItem(&dc->RemovedInst, la_NewDiffCommandInst(dbi, lip->tPrev, lip->tNext));printf("deleted %x %x\n", dbi, dbi->OriginalInstance);
 | 
											
										
											
												
													
														|  | @@ -4140,7 +4146,7 @@ void la_FreeInstance(void* inst, laPropContainer* pc, int no_free){
 | 
											
												
													
														|  |      //if(p->PropertyType!=LA_PROP_SUB) return;
 |  |      //if(p->PropertyType!=LA_PROP_SUB) return;
 | 
											
												
													
														|  |      //if(!p->SubProp || ((laSubProp*)p)->TargetID) p->SubProp=la_ContainerLookup(((laSubProp*)p)->TargetID);
 |  |      //if(!p->SubProp || ((laSubProp*)p)->TargetID) p->SubProp=la_ContainerLookup(((laSubProp*)p)->TargetID);
 | 
											
												
													
														|  |      //laPropContainer* pc=p->SubProp; if(((laSubProp*)p)->GetType) pc=((laSubProp*)p)->GetType(inst);
 |  |      //laPropContainer* pc=p->SubProp; if(((laSubProp*)p)->GetType) pc=((laSubProp*)p)->GetType(inst);
 | 
											
												
													
														|  | -    printf("freeinst %s %x\n",pc->Name,inst);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    //printf("freeinst %s %x\n",pc->Name,inst);
 | 
											
												
													
														|  |      if(pc->BeforeFree) pc->BeforeFree(inst);
 |  |      if(pc->BeforeFree) pc->BeforeFree(inst);
 | 
											
												
													
														|  |      laPropStep SubPS = {0}; laPropPack SubPP = {0}; laPropIterator pi={0}; SubPP.LastPs=&SubPS; 
 |  |      laPropStep SubPS = {0}; laPropPack SubPP = {0}; laPropIterator pi={0}; SubPP.LastPs=&SubPS; 
 | 
											
												
													
														|  |      for(laProp* p=pc->Props.pFirst;p;p=p->Item.pNext){
 |  |      for(laProp* p=pc->Props.pFirst;p;p=p->Item.pNext){
 |