Made overrideSetterFor: aware of dependent key mapping.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@25739 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
fredkiefer 2007-12-14 19:55:51 +00:00
parent 95daef46c6
commit dc96bd2cd7
2 changed files with 48 additions and 6 deletions

View file

@ -1,3 +1,8 @@
2007-12-14 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSKeyValueObserving.m (-overrideSetterFor:): Made aware
of dependent key mapping.
2007-12-14 Richard Frith-Macdonald <rfm@gnu.org> 2007-12-14 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSKeyValueObserving.m: Rewrite code for the subclass which * Source/NSKeyValueObserving.m: Rewrite code for the subclass which

View file

@ -506,8 +506,39 @@ replacementForInstance(id o)
} }
else else
{ {
[NSException raise: NSInvalidArgumentException NSMapTable depKeys = NSMapGet(dependentKeyTable, [self class]);
format: @"class not KVC complient for %@", aKey];
if (depKeys)
{
NSMapEnumerator enumerator = NSEnumerateMapTable(depKeys);
NSString *mainKey;
NSHashTable dependents;
while (NSNextMapEnumeratorPair(&enumerator, (void **)(&mainKey), &dependents))
{
NSHashEnumerator dependentKeyEnum;
NSString *dependentKey;
if (!dependents) continue;
dependentKeyEnum = NSEnumerateHashTable(dependents);
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
{
if ([dependentKey isEqual: aKey])
{
[self overrideSetterFor: mainKey];
found = YES;
}
}
NSEndHashTableEnumeration(&dependentKeyEnum);
}
NSEndMapTableEnumeration(&enumerator);
}
if (!found)
{
[NSException raise: NSInvalidArgumentException
format: @"class not KVC complient for %@", aKey];
}
} }
} }
} }
@ -1212,13 +1243,16 @@ replacementForInstance(id o)
if (keys) if (keys)
{ {
NSHashTable dependents = NSMapGet(keys, aKey); NSHashTable dependents = NSMapGet(keys, aKey);
NSString *dependentKey;
NSHashEnumerator dependentKeyEnum;
if (!dependents) return; if (!dependents) return;
NSHashEnumerator dependentKeyEnum = NSEnumerateHashTable(dependents); dependentKeyEnum = NSEnumerateHashTable(dependents);
NSString * dependentKey;
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
{ {
[self willChangeValueForKey:dependentKey]; [self willChangeValueForKey:dependentKey];
} }
NSEndHashTableEnumeration(&dependentKeyEnum);
} }
} }
@ -1228,13 +1262,16 @@ replacementForInstance(id o)
if (keys) if (keys)
{ {
NSHashTable dependents = NSMapGet(keys, aKey); NSHashTable dependents = NSMapGet(keys, aKey);
NSString *dependentKey;
NSHashEnumerator dependentKeyEnum;
if (!dependents) return; if (!dependents) return;
NSHashEnumerator dependentKeyEnum = NSEnumerateHashTable(dependents); dependentKeyEnum = NSEnumerateHashTable(dependents);
NSString * dependentKey;
while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum))) while ((dependentKey = NSNextHashEnumeratorItem(&dependentKeyEnum)))
{ {
[self didChangeValueForKey:dependentKey]; [self didChangeValueForKey:dependentKey];
} }
NSEndHashTableEnumeration(&dependentKeyEnum);
} }
} }