From b7d747ee17186a5b59bebaa8e306a9fdd1ccef2d Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Tue, 5 Jan 2010 15:49:16 -0800 Subject: [PATCH] Fixed a bug in CPTreeNode's KVO implementation. Reviewed by me. --- AppKit/CPTreeNode.j | 17 ++++++++++------- Foundation/CPArray.j | 9 +++------ Foundation/CPKeyValueObserving.j | 6 +++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/AppKit/CPTreeNode.j b/AppKit/CPTreeNode.j index b296ec724..8d679da20 100644 --- a/AppKit/CPTreeNode.j +++ b/AppKit/CPTreeNode.j @@ -43,11 +43,13 @@ return [self mutableArrayValueForKey:@"childNodes"]; } -- (void)insertObject:(id)anObject inChildNodesAtIndex:(CPInteger)anIndex +- (void)insertObject:(id)aTreeNode inChildNodesAtIndex:(CPInteger)anIndex { - anObject._parentNode = self; + [[aTreeNode._parentNode mutableChildNodes] removeObjectIdenticalTo:aTreeNode]; - [_childNodes addObject:anObject]; + aTreeNode._parentNode = self; + + [_childNodes insertObject:aTreeNode atIndex:anIndex]; } - (void)removeObjectFromChildNodesAtIndex:(CPInteger)anIndex @@ -57,13 +59,14 @@ [_childNodes removeObjectAtIndex:anIndex]; } -- (void)replaceObjectFromChildNodesAtIndex:(CPInteger)anIndex withObject:(id)anObject +- (void)replaceObjectFromChildNodesAtIndex:(CPInteger)anIndex withObject:(id)aTreeNode { - var oldObject = [_childNodes objectAtIndex:anIndex]; + var oldTreeNode = [_childNodes objectAtIndex:anIndex]; - oldObject._parentNode = nil; + oldTreeNode._parentNode = nil; + aTreeNode._parentNode = self; - [_childNodes replaceObjectAtIndex:anIndex withObject:anObject]; + [_childNodes replaceObjectAtIndex:anIndex withObject:aTreeNode]; } - (id)objectInChildNodesAtIndex:(CPInteger)anIndex diff --git a/Foundation/CPArray.j b/Foundation/CPArray.j index 2bebe41f1..667191d05 100755 --- a/Foundation/CPArray.j +++ b/Foundation/CPArray.j @@ -534,14 +534,11 @@ */ - (CPArray)objectsAtIndexes:(CPIndexSet)indexes { - var index = [indexes firstIndex], + var index = CPNotFound, objects = []; - while(index != CPNotFound) - { - [objects addObject:self[index]]; - index = [indexes indexGreaterThanIndex:index]; - } + while((index = [indexes indexGreaterThanIndex:index]) !== CPNotFound) + [objects addObject:[self objectAtIndex:index]]; return objects; } diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index 0c91a6273..3dd95e70a 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -386,11 +386,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, var type = [changes objectForKey:CPKeyValueChangeKindKey]; // for to-many relationships, oldvalue is only sensible for replace and remove - if (type == CPKeyValueChangeReplacement || type == CPKeyValueChangeRemoval) + if (type === CPKeyValueChangeReplacement || type === CPKeyValueChangeRemoval) { //FIXME: do we need to go through and replace "" with CPNull? - var oldValues = [[_targetObject mutableArrayValueForKeyPath:aKey] objectsAtIndexes:indexes]; - [changes setValue:oldValues forKey:CPKeyValueChangeOldKey]; + var newValues = [[_targetObject mutableArrayValueForKeyPath:aKey] objectsAtIndexes:indexes]; + [changes setValue:newValues forKey:CPKeyValueChangeOldKey]; } } else