Annotation of Examples/EnterpriseObjects/EOController/PeopleDemo_sybase/MainController.m, revision 1.1

1.1     ! root        1: /* MainController.m
        !             2:  * You may freely copy, distribute, and reuse the code in this example.
        !             3:  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
        !             4:  * fitness for any particular use.
        !             5:  *
        !             6:  * Written by Mai Nguyen, NeXT Developer Support
        !             7:  *
        !             8:  */
        !             9: 
        !            10: #import "MainController.h"
        !            11: #import "Department.h"
        !            12: #import "strings.h"
        !            13: 
        !            14: @implementation MainController
        !            15: 
        !            16: - init
        !            17: {
        !            18:        [super init];
        !            19:        return self;
        !            20: }
        !            21: 
        !            22: - appDidInit:sender
        !            23: {
        !            24:        
        !            25:        dbDataSource = [masterController dataSource];
        !            26:        dbChannel = [dbDataSource databaseChannel];
        !            27:        adaptorChannel = [dbChannel adaptorChannel];
        !            28:        eoAdaptor = [[adaptorChannel adaptorContext] adaptor];
        !            29:        
        !            30:        
        !            31:        // Bring up a login panel and get the valid connection dictionary
        !            32:        
        !            33:        if(![eoAdaptor runLoginPanelAndValidateConnectionDictionary]) 
        !            34:                [NXApp terminate:self];
        !            35:     [eoAdaptor setConnectionDictionary: [eoAdaptor connectionDictionary]];
        !            36: 
        !            37:        rootEntity = [dbDataSource entity];
        !            38:        
        !            39:        [self setDelegates];
        !            40:        
        !            41:        // set up the controller to not alter the selection after a fetch  
        !            42:        [masterController setSelectsFirstObjectAfterFetch:NO];
        !            43: 
        !            44:        [self fetch:sender];    
        !            45:        return self;
        !            46: }
        !            47: 
        !            48: // Perform a fetch based on the latest options specified by user.  
        !            49: 
        !            50: - fetch:sender
        !            51: {
        !            52:        if (optionsPanel)
        !            53:                [optionsPanel orderOut:sender];
        !            54:                
        !            55:        [self setUpFetch:sender];
        !            56: 
        !            57:        [masterController fetch];
        !            58:        return self;
        !            59: }
        !            60: 
        !            61: - newRecord:sender
        !            62: {
        !            63:        int i;
        !            64:        
        !            65:        // Clear all the current values in the form cells to prepare
        !            66:        // for the insertion of a new record.
        !            67:         
        !            68:         for (i = 0; i < 5; i++)
        !            69:                [formMatrix setStringValue:"" at:i];
        !            70:        return self;
        !            71: }
        !            72: 
        !            73: - insert:sender
        !            74: {
        !            75:        // Disable the INSERT Button if the input is not valid  
        !            76:        if ([self validateRecord] == NO) {
        !            77:                [insertButton setState:0];
        !            78:                NXRunAlertPanel(NULL, ERR_INSERT_FAIL, NULL, NULL, NULL);
        !            79:        }
        !            80:        else {
        !            81:                [insertButton setState:1];
        !            82:                [masterController insert:sender];
        !            83:        }
        !            84:        return self;
        !            85: }
        !            86:  
        !            87: 
        !            88: // Set up the fetch order and specify a qualifier 
        !            89: // for the master table "Department" 
        !            90:  
        !            91: - setUpFetch:sender
        !            92: { 
        !            93:        const char      *inputString;
        !            94:        const char      *attrName = NULL;
        !            95:        EOQualifier *aQualifier;
        !            96:        id                       fetchOrder;
        !            97:        id                       sortAttribute;
        !            98:        int                      orderType;
        !            99: 
        !           100:        // build the qualifier.
        !           101:        // If the input string is empty, fetch all records.
        !           102:         
        !           103:        inputString = [(TextField *)textField stringValue];
        !           104:         
        !           105:        if (inputString == NULL)
        !           106:                [dbDataSource setQualifier: [rootEntity qualifier]];
        !           107:        else {
        !           108:                aQualifier = [[[EOQualifier alloc] initWithEntity:rootEntity
        !           109:                                                qualifierFormat:@"%A >= %d", @"DeptId", 
        !           110:                                                [textField intValue]] autorelease];
        !           111:                [dbDataSource setQualifier:aQualifier];
        !           112:                 }
        !           113:                                                                                                         
        !           114:        // build the fetch order based on the first column of the master
        !           115:        // tableview
        !           116:          
        !           117:        orderType = [sortMatrix selectedTag];
        !           118:        attrName  = [[masterTableview columnAt:0] title];
        !           119:        sortAttribute = [rootEntity attributeNamed:[ [[NSString alloc]
        !           120:                                                                initWithCString:attrName] autorelease]];
        !           121:        fetchOrder = [NSArray arrayWithObject:[[[EOAttributeOrdering alloc]
        !           122:         initWithAttribute:sortAttribute ordering: orderType] autorelease]];
        !           123:                        
        !           124:        [dbDataSource setFetchOrder:fetchOrder];
        !           125:        return self;
        !           126: }
        !           127: 
        !           128: 
        !           129: - (BOOL) validateRecord
        !           130: {
        !           131:        int newId, newLocation;
        !           132:        BOOL result = YES;
        !           133:        
        !           134:        newId = [formMatrix intValueAt:0];
        !           135:        newLocation = [formMatrix intValueAt:2];
        !           136:        
        !           137:        // Do validation here  
        !           138:        if ( newId < 100 || newId > 999) {
        !           139:                NXRunAlertPanel(NULL, ERR_INVALID_ID, NULL, NULL, NULL);
        !           140:                result = NO;
        !           141:        }
        !           142:        if ( newLocation != 1101 && newLocation != 1103
        !           143:                        && newLocation != 1104 && newLocation != 1106
        !           144:                        && newLocation != 1207) {
        !           145:                NXRunAlertPanel(NULL, ERR_INVALID_LOCATION, NULL, NULL, NULL);
        !           146:                result = NO;
        !           147:        } 
        !           148:        return result;
        !           149:         
        !           150: }
        !           151: - setDelegates
        !           152: {
        !           153: #ifdef DEBUG   
        !           154:        [adaptorChannel setDebugEnabled:YES];
        !           155: #endif 
        !           156:        [adaptorChannel setDelegate:self];
        !           157:        [(EOController *) masterController setDelegate:self];
        !           158:        
        !           159:        return self;
        !           160: }
        !           161: 
        !           162: @end
        !           163: 
        !           164: @implementation MainController (EOAdaptorDelegation)
        !           165: 
        !           166: //This method is useful to trace SQL queries  
        !           167: - (void)adaptorChannel:channel
        !           168:     didEvaluateExpression:(NSString *)expression
        !           169: {
        !           170:        if (sqlPanel) {
        !           171:                [text appendToText:"SQL Query:\n"];
        !           172:                [text appendToText:[expression cString]];
        !           173:                [text appendToText:"\n"];
        !           174:        }
        !           175: }
        !           176: @end
        !           177:  
        !           178: 
        !           179: @implementation MainController (EOControllerDelegation)
        !           180: 
        !           181: // This method is called before each update. Since the controller has
        !           182: // buffer edits turned ON, this method is called when the user explicitly
        !           183: // presses the UPDATE button. 
        !           184:  
        !           185: - (NSDictionary *)controller:(EOController *)controller 
        !           186:        willSaveEdits: (NSDictionary *)edits 
        !           187:        toObject:object
        !           188: {
        !           189:        if ([self validateRecord] == YES)
        !           190:                        return edits;
        !           191:        else {
        !           192:                NXRunAlertPanel(NULL, ERR_UPDATE_FAIL, NULL, NULL, NULL);
        !           193:                return nil;
        !           194:        }
        !           195: }
        !           196: 
        !           197: // Take the input from the formcells and create a new record.
        !           198: // This delegate method can be used to set up the default values of a newly
        !           199: // created EO. By default, we use the current user input in the formcells
        !           200: // to create a new record.
        !           201:  
        !           202:  
        !           203: - (BOOL)controller:(EOController *)controller willInsertObject:object atIndex: (unsigned)newIndex
        !           204: {
        !           205:        [object setDeptId: (int)[formMatrix intValueAt:0]];
        !           206:        [object setDepartmentName:[[[NSString alloc] initWithCString: 
        !           207:                                        [formMatrix stringValueAt:1]] autorelease]];
        !           208:        [object setLocationId:(int)[formMatrix intValueAt:2]];
        !           209:                 // The to-many relationship points to an empty autoreleased array    
        !           210:        [object setToEmployee:[NSArray array]];
        !           211:        return YES;
        !           212:        
        !           213: }
        !           214:  
        !           215: // After insertion, refetch object so that the derived attributes are 
        !           216: // properly redisplayed.
        !           217:  
        !           218: - (void)controller:(EOController *)controller didInsertObject:object
        !           219:     inDataSource:dataSource
        !           220: {
        !           221:        [dbChannel refetchObject:object];
        !           222: }
        !           223: 
        !           224: // After an update, refetch object so that the derived attributes are 
        !           225: // properly redisplayed.
        !           226:  
        !           227: - (void)controller:(EOController *)controller didUpdateObject:object
        !           228:     inDataSource:dataSource
        !           229: {
        !           230:        [dbChannel refetchObject:object];
        !           231: }      
        !           232: 
        !           233: // When the insert operation failed, remove the wrong record and rollback
        !           234: // the data source. A failure usually happens when trying to insert a duplicate
        !           235: // key. Since an insert operation adds a new record after the current
        !           236: // selection, the index has to be computed accordingly.
        !           237:  
        !           238:  
        !           239: - (EODataSourceFailureResponse)controller:(EOController *)controller
        !           240:     failedToInsertObject:object
        !           241:     inDataSource:dataSource;
        !           242: {
        !           243:        NXRunAlertPanel(NULL, ERR_INSERT_FAIL, NULL, NULL, NULL);
        !           244:         
        !           245:        [controller deleteObjectAtIndex:([masterTableview selectedRow] + 1)];
        !           246:        
        !           247:        return EORollbackDataSourceFailureResponse;
        !           248: }
        !           249: 
        !           250: - (EODataSourceFailureResponse) controller:(EOController *)controller
        !           251:     failedToUpdateObject:object
        !           252:     inDataSource:dataSource
        !           253: {
        !           254:        NXRunAlertPanel(NULL, ERR_UPDATE_FAIL, NULL, NULL, NULL);
        !           255:                // Restore object to its previous state
        !           256:        [dbChannel refetchObject:object];
        !           257:        
        !           258:        return EORollbackDataSourceFailureResponse;
        !           259: }
        !           260: 
        !           261:        
        !           262: // When deleting a department, we need to null all the references 
        !           263: // to that department. Therefore, the "toEmployee" relationship is
        !           264: // used to find the employee records attached to a given department.
        !           265: // All department ids will then be nulled out.
        !           266:   
        !           267: 
        !           268: - (BOOL)controller:controller willDeleteObject:object
        !           269: {
        !           270:     
        !           271:     NSArray *employeeArray = [object toEmployee];
        !           272:        NSEnumerator *enumerator = [employeeArray objectEnumerator];
        !           273:        EOGenericRecord *employee;
        !           274:        
        !           275:        while((employee = [enumerator nextObject]) != nil) {
        !           276:                [employee setObject:[EONull null] forKey:@"DeptId"];
        !           277:                [(id)[controller dataSource] updateObject:employee];
        !           278:        }
        !           279: 
        !           280:     return YES;
        !           281: }
        !           282: 
        !           283: 
        !           284: // Implementing this delegate method allows the controller to discard
        !           285: // pending edits. In this example, pending edits are edits rejected by
        !           286: // the validation mechanism, hence they can be discarded.
        !           287:  
        !           288: - (BOOL) controllerWillDiscardEdits:(EOController *)controller
        !           289: {
        !           290:        return YES;
        !           291: }
        !           292:        
        !           293: @end
        !           294: 
        !           295: @implementation Text(printResults)
        !           296: 
        !           297: - appendToText:(const char *)newText
        !           298: {
        !           299:        int currentLength = [self textLength];
        !           300: 
        !           301:        [self setSel:currentLength :currentLength];
        !           302:        [self replaceSel:newText];
        !           303:        [self scrollSelToVisible];
        !           304:        return self;
        !           305: }
        !           306: 
        !           307: @end

unix.superglobalmegacorp.com

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