Annotation of Examples/EnterpriseObjects/MasteringDetails/EOFExtensions.subproj/SelectionInsertionAssociation.m, revision 1.1

1.1     ! root        1: /* SelectionInsertionAssocation.m created by cfeder on Tue 08-Nov-1994 */
        !             2: 
        !             3: #import "SelectionInsertionAssociation.h"
        !             4: 
        !             5: @interface NSArray (_arrayWithObjectsNotInArray)
        !             6: - (NSArray *)arrayWithObjectsNotInArray:other;
        !             7: - (NSArray *)arrayOfSelectionIndexesForObjects:other;
        !             8: @end
        !             9: 
        !            10: @implementation NSArray (_arrayWithObjectsNotInArray)
        !            11: - (NSArray *)arrayWithObjectsNotInArray:other
        !            12: {
        !            13:     // Tremendously inefficient brain-dead implementation
        !            14:     NSMutableArray *result = [NSMutableArray array];
        !            15:     int i, count = [self count];
        !            16:     for(i=0; i<count; i++) {
        !            17:         id object = [self objectAtIndex:i];
        !            18:         if ([other indexOfObjectIdenticalTo:object] == NSNotFound)
        !            19:             [result addObject:object];
        !            20:     }
        !            21:     return result;
        !            22: }
        !            23: 
        !            24: - (NSArray *)arrayOfSelectionIndexesForObjects:other
        !            25: {
        !            26:     // look up each of objects in other and return their indices in our array
        !            27:     NSMutableArray *result = [NSMutableArray array];
        !            28:     int i, count = [other count];
        !            29:     for(i=0; i<count; i++) {
        !            30:         id object = [other objectAtIndex:i];
        !            31:         unsigned idx = [self indexOfObjectIdenticalTo:object];
        !            32:         if ( idx != NSNotFound)
        !            33:             [result addObject:[NSNumber numberWithUnsignedInt:idx]];
        !            34:     }
        !            35:     return result;
        !            36: }
        !            37: @end
        !            38: 
        !            39: 
        !            40: // silly association to tell us about changes in the destination
        !            41: @interface _SIMessager : EOAssociation
        !            42: {
        !            43: }
        !            44: - initWithController:(EOController *)aController
        !            45:         key: (NSString *)aKey destination: aDest;
        !            46: @end
        !            47: 
        !            48: @implementation SelectionInsertionAssociation
        !            49: // Our controller is the one we perform insert and delete operations on.
        !            50: // Our destination is the controller that provides us with selected objects
        !            51: 
        !            52: - initWithController:(EOController *)aController
        !            53:         key: (NSString *)aKey destination: aDest
        !            54: {
        !            55:     [super initWithController:aController key: aKey destination:aDest];
        !            56: 
        !            57:     // Our destination is a controller and we want to know when it changes.
        !            58:     // We use another association to pass on relevant events from it.
        !            59:     [destination addAssociation:[[[_SIMessager alloc] initWithController:destination key:nil destination:self] autorelease]];
        !            60:     return self;
        !            61: }
        !            62: 
        !            63: - (void)updateSelection
        !            64: {
        !            65:     NSArray *allObjects = [destination allObjects];
        !            66:     NSArray *destinationObjects = [controller allObjects];
        !            67:     
        !            68:     [destination setSelectionIndexes:[allObjects arrayOfSelectionIndexesForObjects:destinationObjects]];
        !            69: }
        !            70: 
        !            71: - (void)contentsDidChange
        !            72: {
        !            73:     if (!ignoreNotifications)
        !            74:         [self updateSelection];
        !            75: }
        !            76: 
        !            77: - (void)selectionDidChange
        !            78: {
        !            79:     if (!ignoreNotifications)
        !            80:         [self updateSelection];
        !            81: }
        !            82: 
        !            83: - (void)contentsDidChangeInController:(EOController *)aController
        !            84: {
        !            85:     // who cares
        !            86: }
        !            87: 
        !            88: - (void)selectionDidChangeInController:(EOController *)aController
        !            89: {
        !            90:     // Our selection changed.  Perform relevant insertions and deletions in our
        !            91:     // destination.
        !            92:     NSArray *selectedObjects = [destination selectedObjects];
        !            93:     NSArray *destinationObjects = [controller allObjects];
        !            94:     NSArray *added = [selectedObjects arrayWithObjectsNotInArray:destinationObjects];
        !            95:     NSArray *removed = [destinationObjects arrayWithObjectsNotInArray:selectedObjects];
        !            96:     int i, count;
        !            97: 
        !            98:     ignoreNotifications = YES;
        !            99: 
        !           100:     // We do deletions before insertions so that the right thing happens for
        !           101:     // to-one detail relationships (insert before delete would, for a moment,
        !           102:     // put two objects at the destination of a to-one)
        !           103:     for(i=0,count=[removed count]; i<count; i++) {
        !           104:         id object = [removed objectAtIndex:i];
        !           105:         unsigned idx = [[controller allObjects] indexOfObjectIdenticalTo:object];
        !           106:         if (idx != NSNotFound)
        !           107:             [controller deleteObjectAtIndex:idx];
        !           108:     }
        !           109: 
        !           110:     for(i=0,count=[added count]; i<count; i++) {
        !           111:         id object = [added objectAtIndex:i];
        !           112:         [controller insertObject:object atIndex:0];
        !           113:     }
        !           114: 
        !           115:     ignoreNotifications = NO;
        !           116: }
        !           117: @end
        !           118: 
        !           119: 
        !           120: @implementation _SIMessager
        !           121: - initWithController:(EOController *)aController
        !           122:         key: (NSString *)aKey destination: aDest
        !           123:     // destination is object we forward association messages to
        !           124:     // key is not used
        !           125: {
        !           126:     return [super initWithController:aController key: aKey destination:aDest];
        !           127: }
        !           128: 
        !           129: - (void)selectionDidChange
        !           130: {
        !           131:     [destination selectionDidChangeInController:[self controller]];
        !           132: }
        !           133: - (void)contentsDidChange
        !           134: {
        !           135:     [destination contentsDidChangeInController:[self controller]];
        !           136: }
        !           137: @end
        !           138: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.