Skip to content

Instantly share code, notes, and snippets.

@nickjs
Created June 28, 2010 15:52
Show Gist options
  • Save nickjs/455996 to your computer and use it in GitHub Desktop.
Save nickjs/455996 to your computer and use it in GitHub Desktop.
diff --git a/AppKit/CPArrayController.j b/AppKit/CPArrayController.j
index 5fefb58..729b937 100644
--- a/AppKit/CPArrayController.j
+++ b/AppKit/CPArrayController.j
@@ -334,8 +334,12 @@
- (CPArray)selectedObjects
{
var objects = [[self arrangedObjects] objectsAtIndexes:[self selectionIndexes]];
+ if (objects)
+ objects = [_CPObservableArray arrayWithArray:objects];
+ else
+ objects = [_CPObservableArray array];
- return objects || [_CPObservableArray array];
+ return objects;
}
- (BOOL)setSelectedObjects:(CPArray)objects
diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j
index 3aabc98..a926cdd 100644
--- a/AppKit/CPKeyValueBinding.j
+++ b/AppKit/CPKeyValueBinding.j
@@ -263,7 +263,7 @@ var CPBindingOperationAnd = 0,
// CPLog.warn("No binding exposed on "+self+" for "+aBinding);
[self unbind:aBinding];
- [[CPKeyValueBinding alloc] initWithBinding:[anObject _replacementKeyPathForBinding:aBinding] name:aBinding to:anObject keyPath:aKeyPath options:options from:self];
+ [[CPKeyValueBinding alloc] initWithBinding:[self _replacementKeyPathForBinding:aBinding] name:aBinding to:anObject keyPath:aKeyPath options:options from:self];
}
- (CPDictionary)infoForBinding:(CPString)aBinding
diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j
index 480c013..d40747d 100644
--- a/AppKit/CPTableView.j
+++ b/AppKit/CPTableView.j
@@ -882,6 +882,22 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
[self _noteSelectionDidChange];
}
+- (void)_setSelectedRowIndexes:(CPIndexSet)rows
+{
+ var previousSelectedIndexes = [_selectedRowIndexes copy];
+
+ _lastSelectedRow = ([rows count] > 0) ? [rows lastIndex] : -1;
+ _selectedRowIndexes = [rows copy];
+
+ [self _updateHighlightWithOldRows:previousSelectedIndexes newRows:_selectedRowIndexes];
+ [_tableDrawView display]; // FIXME: should be setNeedsDisplayInRect:enclosing rect of new (de)selected rows
+ // but currently -drawRect: is not implemented here
+
+ [[CPKeyValueBinding getBinding:@"selectionIndexes" forObject:self] reverseSetValueFor:@"selectedRowIndexes"];
+
+ [self _noteSelectionDidChange];
+}
+
/*!
Sets the row selection using indexes.
@param rows a CPIndexSet of rows to select
@@ -902,20 +918,16 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
[_headerView setNeedsDisplay:YES];
}
- var previousSelectedIndexes = [_selectedRowIndexes copy];
-
+ var newSelectedIndexes;
if (shouldExtendSelection)
- [_selectedRowIndexes addIndexes:rows];
+ {
+ newSelectedIndexes = [_selectedRowIndexes copy];
+ [newSelectedIndexes addIndexes:rows];
+ }
else
- _selectedRowIndexes = [rows copy];
-
- // update last selected row
- _lastSelectedRow = ([rows count] > 0) ? [rows lastIndex] : -1;
+ newSelectedIndexes = [rows copy];
- [self _updateHighlightWithOldRows:previousSelectedIndexes newRows:_selectedRowIndexes];
- [_tableDrawView display]; // FIXME: should be setNeedsDisplayInRect:enclosing rect of new (de)selected rows
- // but currently -drawRect: is not implemented here
- [self _noteSelectionDidChange];
+ [self _setSelectedRowIndexes:newSelectedIndexes];
}
- (void)_updateHighlightWithOldRows:(CPIndexSet)oldRows newRows:(CPIndexSet)newRows
@@ -3427,14 +3439,23 @@ CPTableViewFirstColumnOnlyAutoresizingStyle = 5;
@implementation CPTableView (Bindings)
+- (CPString)_replacementKeyPathForBinding:(CPString)aBinding
+{
+ if (aBinding === @"selectionIndexes")
+ return @"selectedRowIndexes";
+
+ return [super _replacementKeyPathForBinding:aBinding];
+}
+
- (void)_establishBindingsIfUnbound:(id)destination
{
if ([[self infoForBinding:@"content"] objectForKey:CPObservedObjectKey] !== destination)
- {
[self bind:@"content" toObject:destination withKeyPath:@"arrangedObjects" options:nil];
- //[self bind:@"sortDescriptors" toObject:destination withKeyPath:@"sortDescriptors" options:nil];
- //[self bind:@"selectionIndexes" toObject:destination withKeyPath:@"selectionIndexes" options:nil];
- }
+
+ if ([[self infoForBinding:@"selectionIndexes"] objectForKey:CPObservedObjectKey] !== destination)
+ [self bind:@"selectionIndexes" toObject:destination withKeyPath:@"selectionIndexes" options:nil];
+
+ //[self bind:@"sortDescriptors" toObject:destination withKeyPath:@"sortDescriptors" options:nil];
}
- (void)setContent:(CPArray)content
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment