|
|
1.1 ! root 1: #import "UniqueKey.h" ! 2: #import "MasterDetail.h" ! 3: ! 4: ! 5: static BOOL _Debug = YES; ! 6: ! 7: @implementation MasterDetail ! 8: ! 9: /****************************************************************************** ! 10: * Create an instance of the UniqueKey object to grab blocks of <count> keys for ! 11: * our use during insert. The count is set low so you can see the SQL reserve ! 12: * blocks of keys. Up the count to something larger for it to be of use. ! 13: * ! 14: * The login information (connection dictionary) has been blanked out, since ! 15: * you may elect to have the tables in some database other than PEOPLE, so we ! 16: * elect to run a login panel. Once the login is complete we can get the ! 17: * connection dictionary from the adaptor and use that information to allow ! 18: * UniqueKey to login and create its separate connection for key reservation. ! 19: * ! 20: * Many of the method calls in EOF return (id)<some protocol>, so you will notice ! 21: * several casts to (id) to avoid warnings for nested method calls supported by ! 22: * the returned object, but not by the protocol. Alternatively, you can cast to ! 23: * the exact class you know returned, such as (EODatabaseDataSource*) or ! 24: * (EODetailDatabaseSource*). ! 25: ******************************************************************************/ ! 26: - appDidInit:sender ! 27: { ! 28: EOAdaptorChannel *eoAdaptorChannel = [[(id)[employeeController dataSource] ! 29: databaseChannel] adaptorChannel]; ! 30: EOAdaptor *eoAdaptor = [[eoAdaptorChannel adaptorContext] adaptor]; ! 31: ! 32: if(_Debug) [eoAdaptorChannel setDelegate:self]; ! 33: ! 34: employeeEntity = [[(id)[employeeController dataSource] entity] retain]; ! 35: equipmentOwnerEntity = [[(id)[equipmentOwnerController dataSource] entity] retain]; ! 36: ! 37: if(![eoAdaptor runLoginPanelAndValidateConnectionDictionary]) [NXApp terminate:self]; ! 38: [UniqueKey setConnectionDictionary:[eoAdaptor connectionDictionary]]; ! 39: ! 40: employeeUniqueKey = [[[UniqueKey alloc] initWithEntity:employeeEntity count:5] retain]; ! 41: if(!employeeUniqueKey) [NXApp terminate:self]; ! 42: ! 43: [self setFetchOrderFor:employeeController with:@"LastName" order:EOAscendingOrder]; ! 44: [self setFetchOrderFor:equipmentOwnerController with:@"Description" order:EOAscendingOrder]; ! 45: ! 46: [employeeController fetch:self]; ! 47: return self; ! 48: } ! 49: ! 50: ! 51: /****************************************************************************** ! 52: * Set a controller's data source to fetch sorted by a given attribute name ! 53: * and order. ! 54: ******************************************************************************/ ! 55: - setFetchOrderFor:(EOController*)controller with:(NSString*)attributeName order:(EOOrdering)order ! 56: { ! 57: id dataSource = [controller dataSource]; ! 58: id attribute = [[dataSource entity] attributeNamed:attributeName]; ! 59: NSArray *orderArray; ! 60: ! 61: orderArray = [NSArray arrayWithObject: ! 62: [EOAttributeOrdering attributeOrderingWithAttribute:attribute ordering:order]]; ! 63: [dataSource setFetchOrder:orderArray]; ! 64: return self; ! 65: } ! 66: ! 67: ! 68: /****************************************************************************** ! 69: * Generate unique keys for the new object. Use the instance of UniqueKey ! 70: * to dole out a key from its internal buffer. The UniqueKey object has its ! 71: * own channel to the DB which it uses to allocate blocks of keys. ! 72: ******************************************************************************/ ! 73: - (BOOL)controller:(EOController *)controller willInsertObject:object atIndex: (unsigned)newIndex ! 74: { ! 75: if(controller==employeeController) ! 76: { ! 77: NSNumber *uniqueKey = [NSNumber numberWithInt:[employeeUniqueKey nextKey]]; ! 78: NSArray *emptyArray = [[[NSArray alloc] init] autorelease]; ! 79: ! 80: [object setObject:uniqueKey forKey:@"EmpId"]; ! 81: [object setObject:@"<LastName>" forKey:@"LastName"]; ! 82: [object setObject:@"<FirstName>" forKey:@"FirstName"]; ! 83: [object setObject:@"<Phone>" forKey:@"Phone"]; ! 84: [object setObject:emptyArray forKey:@"toEmpEquipment"]; ! 85: return YES; ! 86: } ! 87: return NO; ! 88: } ! 89: ! 90: ! 91: /****************************************************************************** ! 92: * When an employee is deleted from the database, we need to remove that person's ! 93: * ownership of their equipment. We use the toEmpEquipment relationship to get ! 94: * an NSArray of equipment objects and null the EmpId for each. ! 95: ******************************************************************************/ ! 96: - (BOOL)controller:controller willDeleteObject:object ! 97: { ! 98: NSArray *eeArray; ! 99: NSEnumerator *eeEnumerator; ! 100: EOGenericRecord *equipment; ! 101: ! 102: if(controller==employeeController) { ! 103: eeArray = [object objectForKey:@"toEmpEquipment"]; ! 104: eeEnumerator = [eeArray objectEnumerator]; ! 105: ! 106: while ((equipment = [eeEnumerator nextObject]) != nil) { ! 107: [equipment setObject:[EONull null] forKey:@"EmpId"]; ! 108: [(id)[employeeController dataSource] updateObject:equipment]; ! 109: } ! 110: } ! 111: return YES; ! 112: } ! 113: ! 114: ! 115: /****************************************************************************** ! 116: * Bring up the assign equipment panel and start a modal session. Construct ! 117: * an 'otherEquipment' qualifier to select equipment not currently assigned to ! 118: * the selected employee. ! 119: ******************************************************************************/ ! 120: - assignEquipmentToEmployee:sender ! 121: { ! 122: EOGenericRecord *employee; ! 123: NSNumber *empId; ! 124: EOQualifier *otherEquipment; ! 125: NSString *qualifierString; ! 126: ! 127: employee = [(id)[equipmentForEmployeeController dataSource] masterObject]; ! 128: empId = [employee objectForKey:@"EmpId"]; ! 129: ! 130: qualifierString = [NSString stringWithFormat:@"(EmpId != %@ or EmpId = NULL)",empId]; ! 131: ! 132: otherEquipment = [[[EOQualifier alloc] ! 133: initWithEntity:equipmentOwnerEntity qualifierFormat:qualifierString] autorelease]; ! 134: ! 135: [(id)[equipmentOwnerController dataSource] setQualifier:otherEquipment]; ! 136: [equipmentOwnerController clearSelection]; ! 137: [equipmentOwnerController fetch]; ! 138: [[assignEquipmentPanel center] makeKeyAndOrderFront:nil]; ! 139: [NXApp runModalFor:assignEquipmentPanel]; ! 140: [assignEquipmentPanel orderOut:self]; ! 141: [employeeController fetch]; ! 142: return self; ! 143: } ! 144: ! 145: - assignEquipmentToEmployeeOK:sender ! 146: { ! 147: EOGenericRecord *employee; ! 148: NSNumber *empId; ! 149: NSArray *eoArray; ! 150: NSEnumerator *eoEnumerator; ! 151: EOGenericRecord *equipmentOwner; ! 152: ! 153: employee = [(id)[equipmentForEmployeeController dataSource] masterObject]; ! 154: empId = [employee objectForKey:@"EmpId"]; ! 155: eoArray = [equipmentOwnerController selectedObjects]; ! 156: eoEnumerator = [eoArray objectEnumerator]; ! 157: ! 158: while((equipmentOwner = [eoEnumerator nextObject]) != nil) { ! 159: [equipmentOwner setObject:empId forKey:@"EmpId"]; ! 160: [(id)[equipmentOwnerController dataSource] updateObject:equipmentOwner]; ! 161: } ! 162: [NXApp stopModal]; ! 163: return self; ! 164: } ! 165: ! 166: ! 167: /****************************************************************************** ! 168: * Release the equipment shown in the detail view. Null out the equipment owner's ! 169: * EmpId for each. ! 170: ******************************************************************************/ ! 171: - releaseEquipmentForEmployee:sender ! 172: { ! 173: NSArray *efeArray; ! 174: NSEnumerator *efeEnumerator; ! 175: EOGenericRecord *equipment; ! 176: ! 177: efeArray = [equipmentForEmployeeController selectedObjects]; ! 178: efeEnumerator = [efeArray objectEnumerator]; ! 179: ! 180: while( (equipment = [efeEnumerator nextObject]) != nil) { ! 181: [equipment setObject:[EONull null] forKey:@"EmpId"]; ! 182: [(id)[equipmentForEmployeeController dataSource] updateObject:equipment]; ! 183: } ! 184: [employeeController fetch]; ! 185: return self; ! 186: } ! 187: ! 188: ! 189: /****************************************************************************** ! 190: * Echo SQL when debug is enabled. ! 191: ******************************************************************************/ ! 192: - (EODelegateResponse)adaptorChannel:channel willEvaluateExpression:(NSMutableString *)expression ! 193: { ! 194: NSLog(expression); ! 195: return EODelegateApproves; ! 196: } ! 197: ! 198: - (void)dealloc ! 199: { ! 200: [employeeEntity release]; ! 201: [equipmentOwnerEntity release]; ! 202: [employeeUniqueKey release]; ! 203: [super dealloc]; ! 204: ! 205: } ! 206: ! 207: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.