From 59cc590b512500690c0bea369feff6a3545d5c23 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Fri, 31 Dec 2010 20:38:18 +0100 Subject: [PATCH 1/2] CPArrayController -setContent: fixed a bug where objects where not rearranged if clearsFilterPredicateOnInsertion == YES and filterPredicate == nil. --- AppKit/CPArrayController.j | 2 +- Tests/AppKit/CPArrayControllerTest.j | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/AppKit/CPArrayController.j b/AppKit/CPArrayController.j index 99c181b22..9890840da 100644 --- a/AppKit/CPArrayController.j +++ b/AppKit/CPArrayController.j @@ -220,7 +220,7 @@ // We need to be in control of when notifications fire. _contentObject = value; - if (_clearsFilterPredicateOnInsertion) + if (_clearsFilterPredicateOnInsertion && _filterPredicate != nil) [self __setFilterPredicate:nil]; // Causes a _rearrangeObjects. else [self _rearrangeObjects]; diff --git a/Tests/AppKit/CPArrayControllerTest.j b/Tests/AppKit/CPArrayControllerTest.j index dfa3c1fdb..84506e5a8 100644 --- a/Tests/AppKit/CPArrayControllerTest.j +++ b/Tests/AppKit/CPArrayControllerTest.j @@ -1,5 +1,6 @@ @import +@import @implementation CPArrayControllerTest : OJTestCase { @@ -190,8 +191,7 @@ [arrayController setContent:newContent]; - [self assert:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)] equals:[arrayController selectionIndexes] - message:@"last object cannot be selected"]; + [self assert:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, 2)] equals:[arrayController selectionIndexes] message:@"last object cannot be selected"]; } - (void)testContentBinding @@ -354,6 +354,16 @@ [self assert:@"Building 1" equals:[[self arrayController] valueForKeyPath:@"selection.department.building"]]; } +- (void)testArrangedObjectsNotEmptyAfterSetContentWhenClearsFilterOnInsertionIsTrue +{ + var arrayController = [[CPArrayController alloc] init]; + [arrayController setFilterPredicate:nil]; + [arrayController setClearsFilterPredicateOnInsertion:YES]; + [arrayController setContent:[CPArray arrayWithObject:@"a"]]; + + [self assertTrue:[[arrayController arrangedObjects] count] > 0]; +} + - (void)observeValueForKeyPath:keyPath ofObject:anActivity change:change From 54c3cc0187f122e447d673405a884808291059fa Mon Sep 17 00:00:00 2001 From: cacaodev Date: Fri, 31 Dec 2010 20:14:00 +0100 Subject: [PATCH 2/2] CPArrayController & nib2cib: added _automaticallyRearrangeObjects flag (not used currently). _sortDescriptors initial value is an emty array (like in cocoa), not nil; Added shared _init with default values, added missing accessors. --- AppKit/CPArrayController.j | 72 ++++++++++++++++++++++++++----- Tools/nib2cib/NSArrayController.j | 1 + 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/AppKit/CPArrayController.j b/AppKit/CPArrayController.j index 9890840da..bd25d62d1 100644 --- a/AppKit/CPArrayController.j +++ b/AppKit/CPArrayController.j @@ -46,10 +46,12 @@ BOOL _selectsInsertedObjects; BOOL _alwaysUsesMultipleValuesMarker; - id _selectionIndexes; - id _sortDescriptors; - id _filterPredicate; - id _arrangedObjects; + BOOL _automaticallyRearrangesObjects; // FIXME: Not in use + + CPIndexSet _selectionIndexes; + CPArray _sortDescriptors; + CPPredicate _filterPredicate; + CPArray _arrangedObjects; } + (void)initialize @@ -116,13 +118,29 @@ if (self) { - _sortDescriptors = [CPArray array]; - _selectionIndexes = [CPIndexSet indexSet]; + _preservesSelection = YES; + _selectsInsertedObjects = YES; + _avoidsEmptySelection = YES; + _clearsFilterPredicateOnInsertion = YES; + _alwaysUsesMultipleValuesMarker = NO; + _automaticallyRearrangesObjects = NO; + + _filterRestrictsInsertion = YES; // FIXME: Not in use + + [self _init]; } return self; } +- (void)_init +{ + _sortDescriptors = [CPArray array]; + _filterPredicate = nil; + _selectionIndexes = [CPIndexSet indexSet]; + _arrangedObjects = nil; +} + - (void)prepareContent { [self _setContentArray:[[self newObject]]]; @@ -180,6 +198,36 @@ _avoidsEmptySelection = value; } +- (BOOL)clearsFilterPredicateOnInsertion +{ + return _clearsFilterPredicateOnInsertion; +} + +- (void)setClearsFilterPredicateOnInsertion:(BOOL)value +{ + _clearsFilterPredicateOnInsertion = value; +} + +- (BOOL)alwaysUsesMultipleValuesMarker +{ + return _alwaysUsesMultipleValuesMarker; +} + +- (void)setAlwaysUsesMultipleValuesMarker:(BOOL)value +{ + _alwaysUsesMultipleValuesMarker = value; +} + +- (BOOL)automaticallyRearrangesObjects +{ + return _automaticallyRearrangesObjects; +} + +- (void)setAutomaticallyRearrangesObjects:(BOOL)value +{ + _automaticallyRearrangesObjects = value; +} + /*! Sets the controller's content object. @@ -280,7 +328,7 @@ var filterPredicate = [self filterPredicate], sortDescriptors = [self sortDescriptors]; - if (filterPredicate && sortDescriptors) + if (filterPredicate && [sortDescriptors count] > 0) { var sortedObjects = [objects filteredArrayUsingPredicate:filterPredicate]; [sortedObjects sortUsingDescriptors:sortDescriptors]; @@ -288,7 +336,7 @@ } else if (filterPredicate) return [objects filteredArrayUsingPredicate:filterPredicate]; - else if (sortDescriptors) + else if ([sortDescriptors count] > 0) return [objects sortedArrayUsingDescriptors:sortDescriptors]; return [objects copy]; @@ -338,7 +386,7 @@ if (_arrangedObjects === value) return; - _arrangedObjects = [[_CPObservableArray alloc] initWithArray:value]; + _arrangedObjects = [[_CPObservableArray alloc] initWithArray:value]; } /*! @@ -829,7 +877,8 @@ var CPArrayControllerAvoidsEmptySelection = @"CPArrayControllerAvoid CPArrayControllerFilterRestrictsInsertion = @"CPArrayControllerFilterRestrictsInsertion", CPArrayControllerPreservesSelection = @"CPArrayControllerPreservesSelection", CPArrayControllerSelectsInsertedObjects = @"CPArrayControllerSelectsInsertedObjects", - CPArrayControllerAlwaysUsesMultipleValuesMarker = @"CPArrayControllerAlwaysUsesMultipleValuesMarker"; + CPArrayControllerAlwaysUsesMultipleValuesMarker = @"CPArrayControllerAlwaysUsesMultipleValuesMarker", + CPArrayControllerAutomaticallyRearrangesObjects = @"CPArrayControllerAutomaticallyRearrangesObjects"; @implementation CPArrayController (CPCoding) @@ -845,6 +894,8 @@ var CPArrayControllerAvoidsEmptySelection = @"CPArrayControllerAvoid _preservesSelection = [aCoder decodeBoolForKey:CPArrayControllerPreservesSelection]; _selectsInsertedObjects = [aCoder decodeBoolForKey:CPArrayControllerSelectsInsertedObjects]; _alwaysUsesMultipleValuesMarker = [aCoder decodeBoolForKey:CPArrayControllerAlwaysUsesMultipleValuesMarker]; + _automaticallyRearrangesObjects = [aCoder decodeBoolForKey:CPArrayControllerAutomaticallyRearrangesObjects]; + _sortDescriptors = [CPArray array]; if (![self content] && [self automaticallyPreparesContent]) [self prepareContent]; @@ -865,6 +916,7 @@ var CPArrayControllerAvoidsEmptySelection = @"CPArrayControllerAvoid [aCoder encodeBool:_preservesSelection forKey:CPArrayControllerPreservesSelection]; [aCoder encodeBool:_selectsInsertedObjects forKey:CPArrayControllerSelectsInsertedObjects]; [aCoder encodeBool:_alwaysUsesMultipleValuesMarker forKey:CPArrayControllerAlwaysUsesMultipleValuesMarker]; + [aCoder encodeBool:_automaticallyRearrangesObjects forKey:CPArrayControllerAutomaticallyRearrangesObjects]; } - (void)awakeFromCib diff --git a/Tools/nib2cib/NSArrayController.j b/Tools/nib2cib/NSArrayController.j index ef6ea4ec9..d738cc96c 100644 --- a/Tools/nib2cib/NSArrayController.j +++ b/Tools/nib2cib/NSArrayController.j @@ -37,6 +37,7 @@ _preservesSelection = [aCoder decodeBoolForKey:@"NSPreservesSelection"]; _selectsInsertedObjects = [aCoder decodeBoolForKey:@"NSSelectsInsertedObjects"]; _alwaysUsesMultipleValuesMarker = [aCoder decodeBoolForKey:@"NSAlwaysUsesMultipleValuesMarker"]; + _automaticallyRearrangesObjects = [aCoder decodeBoolForKey:@"NSAutomaticallyRearrangesObjects"]; } return self;