|
|
1.1 root 1: /* DetailTableDataSource.m
2: *
3: * A data source implementation for a detail table.
4: *
5: * You may freely copy, distribute, and reuse the code in this example.
6: * NeXT disclaims any warranty of any kind, expressed or implied, as to its
7: * fitness for any particular use.
8: *
9: *
10: */
11:
12:
13:
14: #import <appkit/appkit.h>
15: #import <eoaccess/eoaccess.h>
16: #import "DetailTableDataSource.h"
17: #import "TableDataSourcePrivate.h"
18:
19: @implementation DetailTableDataSource
20:
21: - initWithMasterDataSource:(TableDataSource *)masterSource entity:(EOEntity *)detailEntity {
22: NSString *primaryKey;
23: NSArray *relations;
24: int i;
25: NSMutableArray *qualifiers = [[[NSMutableArray alloc] init] autorelease];
26:
27: [super init];
28: entity = [detailEntity retain];
29: master = [masterSource retain];
30: orderByKey=nil;
31:
32: primaryKey = [(EOAttribute *)[[entity primaryKeyAttributes] objectAtIndex:0] name];
33: relations = [entity relationships];
34: for (i=0; i<[relations count]; i++) {
35: EORelationship *rel=[relations objectAtIndex:i];
36:
37: if ([rel isToMany]) {
38: EOAttribute *attr = [[rel sourceAttributes] objectAtIndex:0];
39: if (!attr) continue;
40: else [qualifiers addObject:[attr name]];
41: }
42: }
43: relations = [[master entity] relationships];
44: for (i=0; i<[relations count]; i++) {
45: EORelationship *rel=[relations objectAtIndex:i];
46:
47: if ([rel isToMany] && [entity isEqual:[rel destinationEntity]]) {
48: EOAttribute *attr = [[rel destinationAttributes] objectAtIndex:0];
49: if (!attr) continue;
50: else [qualifiers addObject:[attr name]];
51: }
52: }
53:
54: return [self initWithTable:[master tablePath] primaryKey:primaryKey qualifierKeys:qualifiers];
55: }
56:
57: - (void)qualifyWithRelationshipKey:key ofObject:sourceObject {
58:
59: EORelationship *rel = [[master entity] relationshipNamed:key];
60: NSMutableDictionary *qual;
61: EOAttribute *source = [[rel sourceAttributes] objectAtIndex:0];
62: EOAttribute *dest = [[rel destinationAttributes] objectAtIndex:0];
63:
64: if (!rel) {
65: NSLog(@"Master source does not have relationship for key %@", [(NSString *)key description]);
66: [self setQualifier:nil];
67: }
68: else if (!source || !dest) {
69: NSLog(@"Master source does not have source or destination attribute");
70: [self setQualifier:nil];
71: }
72: else if (!sourceObject) {
73: [self setQualifier:nil];
74: }
75: else {
76: id linkValue;
77: linkValue = [sourceObject objectForKey:[source name]];
78: if (linkValue) {
79: qual = [[[NSMutableDictionary alloc] init] autorelease];
80: [qual setObject:[dest name] forKey:@QPROPERTY];
81: [qual setObject:linkValue forKey:@QVALUE];
82: [self setQualifier:qual];
83: }
84: else [self setQualifier:nil];
85: }
86: /*[masterObject autorelease];
87: masterObject=[sourceObject retain];
88: [masterKey autorelease];
89: masterKey=[key retain];*/
90: }
91:
92: - createObject{
93: NSMutableDictionary *newObject = [super createObject];
94: NSArray *relations = [[master entity] relationships];
95: int i;
96:
97: if (!newObject) return nil;
98: for (i=0; i<[relations count]; i++) {
99: EORelationship *rel=[relations objectAtIndex:i];
100:
101: if ( ([rel isToMany]) && ([entity isEqual:[rel destinationEntity]]) ) {
102: EOAttribute *attr = [[rel destinationAttributes] objectAtIndex:0];
103: NSString *key = [attr name];
104:
105: if (!attr) continue;
106: if ( ![key isEqual:[qualifier objectForKey:@QPROPERTY]] ) {
107: NSLog(@"qualifier %@ differs from relationship key %@ to create detail object %@",
108: [(NSMutableDictionary *)qualifier description], key, [entity name]);
109: continue;
110: }
111: else [newObject setObject:[qualifier objectForKey:@QVALUE] forKey:key];
112: }
113: }
114:
115:
116: return newObject;
117: }
118:
119:
120: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.