bool Update(UserBreakpoint* changedBreakpoint) { if (fTeam == NULL) { for (int32 i = 0; UserBreakpoint* breakpoint = fBreakpoints.ItemAt(i); i++) { breakpoint->ReleaseReference(); } fBreakpoints.MakeEmpty(); return true; } AutoLocker<Team> locker(fTeam); UserBreakpointList::ConstIterator it = fTeam->UserBreakpoints().GetIterator(); UserBreakpoint* newBreakpoint = it.Next(); int32 index = 0; // remove no longer existing breakpoints while (UserBreakpoint* oldBreakpoint = fBreakpoints.ItemAt(index)) { if (oldBreakpoint == newBreakpoint) { if (oldBreakpoint == changedBreakpoint) NotifyRowsChanged(index, 1); index++; newBreakpoint = it.Next(); } else { // TODO: Not particularly efficient! fBreakpoints.RemoveItemAt(index); oldBreakpoint->ReleaseReference(); NotifyRowsRemoved(index, 1); } } // add new breakpoints int32 countBefore = fBreakpoints.CountItems(); while (newBreakpoint != NULL) { if (!fBreakpoints.AddItem(newBreakpoint)) return false; newBreakpoint->AcquireReference(); newBreakpoint = it.Next(); } int32 count = fBreakpoints.CountItems(); if (count > countBefore) NotifyRowsAdded(countBefore, count - countBefore); return true; }