Annotation of Examples/IndexingKit/Ledger/MainDelegate.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Main Delegate
                      3:  *
                      4:  * Author: Kris Younger, NeXT Systems Engineering
                      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 
                      7:  * its fitness for any particular use.
                      8:  */
                      9: 
                     10: #import "MainDelegate.h"
                     11: #import "GlobalThings.h"
                     12: #import "Transaction.h"
                     13: #import "LedgerController.h"
                     14: 
                     15: #import <ansi/time.h>
                     16: #import <objc/hashtable.h>
                     17: 
                     18: @implementation MainDelegate
                     19: 
                     20: - findAccount:sender
                     21: {
                     22:     char       *name;
                     23:     id         matrix;
                     24:     int                i;
                     25: 
                     26:     name = (char *)[editField stringValue];
                     27:     if ([self getAccountNamed:name] != nil) {
                     28:        matrix = [listBrowser matrixInColumn:0];
                     29:        for (i = [matrix cellCount]; i--;)
                     30:            if (!strcmp(name, [[matrix cellAt:i :0] stringValue])) {
                     31:                [matrix selectCellAt:i :0];
                     32:                [self pickAccount:listBrowser];
                     33:                break;
                     34:            }
                     35:     }
                     36: 
                     37:     return self;
                     38: }
                     39: 
                     40: - addAccount:sender
                     41: {
                     42:     id                  newRM, firstx;
                     43:     int                 h;
                     44:     const char         *aName;
                     45:     id                  accountStore;
                     46: 
                     47:     aName = [editField stringValue];
                     48:     if ([accountsStoreDirectory hasEntryNamed:aName] == NO) {
                     49:        [accountsStoreDirectory getBlock:&h andStore:&accountStore];
                     50:        [accountStore startTransaction];
                     51:        [accountsStoreDirectory addEntryNamed:aName ofClass:[IXRecordManager class]];
                     52:        newRM = [accountsStoreDirectory openEntryNamed:aName];
                     53:        [self addAllAttributes:newRM];
                     54:        [accountsHashTable insertKey:aName value:newRM];
                     55:        /* post an original transaction */
                     56:        firstx = [[Transaction alloc] init];
                     57:        [firstx setTMemo:"Initial Value."];
                     58:        [firstx setTAmount:0.0];
                     59:        h = [newRM addRecord:firstx];
                     60:        [accountStore commitTransaction];
                     61:     } else {
                     62:        NXRunAlertPanel("Alert", "An account by that name already exists.", "OK", NULL, NULL);
                     63:        return nil;
                     64:     }
                     65:     [self ping:self];
                     66:     return self;
                     67: }
                     68: 
                     69: - appDidInit:sender
                     70: {
                     71: 
                     72:     if ([self openDatabase]) {
                     73:     } else {
                     74:        [self initSchema];
                     75:        [self openDatabase];
                     76:     }
                     77: 
                     78:     [self makeListKey:self];
                     79:     return self;
                     80: }
                     81: 
                     82: - appWillTerminate:sender
                     83: {
                     84:     [self closeDatabase];
                     85:     return self;
                     86: }
                     87: 
                     88: - closeAccount:sender
                     89: {
                     90:     id                  ledger;
                     91: 
                     92:     [self findAccount:sender];
                     93:     if ((currentAccount != NULL) && (currentAccount != nil)) {
                     94:        if ([ledgersHashTable isKey:currentAccountName] == YES) {
                     95:            ledger = [ledgersHashTable valueForKey:currentAccountName];
                     96:            [ledgersHashTable removeKey:currentAccountName];
                     97:            [(LedgerController *) ledger closeAccount:self];
                     98:            [(LedgerController *) ledger free];
                     99:        };
                    100:     };
                    101:     return self;
                    102: }
                    103: 
                    104: - doubleClickAccount:sender
                    105: {
                    106:     [self pickAccount:sender];
                    107:     [self openAccount:sender];
                    108:     return self;
                    109: }
                    110: 
                    111: - makeListKey:sender
                    112: {
                    113:     [listBrowser loadColumnZero];
                    114:     [listBrowser setDoubleAction:@selector(doubleClickAccount:)];
                    115:     [listWindow makeKeyAndOrderFront:self];
                    116:     [editField selectText:self];
                    117:     return self;
                    118: }
                    119: 
                    120: - openAccount:sender
                    121: {
                    122:     id                  newAccount;
                    123: 
                    124:     [self findAccount:sender];
                    125:     if ((currentAccount != NULL) && (currentAccount != nil)) {
                    126:        if ([ledgersHashTable isKey:currentAccountName] == YES) {
                    127:            [(id)[ledgersHashTable valueForKey:currentAccountName] makeKey:self];
                    128:        } else {
                    129:            newAccount = [[LedgerController alloc] initWith:currentAccount
                    130:                          named:currentAccountName];
                    131:            [ledgersHashTable insertKey:currentAccountName value:newAccount];
                    132:            [newAccount makeKey:self];
                    133:        };
                    134:     }
                    135:     return self;
                    136: }
                    137: 
                    138: - ping:sender
                    139: {
                    140:     [self makeListKey:sender];
                    141:     return self;
                    142: }
                    143: 
                    144: - pickAccount:sender
                    145: {
                    146:     BOOL                isSelected;
                    147: 
                    148:     isSelected = NO;
                    149:     currentAccount = [self getAccountNamed:[[[sender matrixInColumn:0] selectedCell] stringValue]];
                    150:     if ((currentAccount != NULL) && (currentAccount != nil)) {
                    151:        isSelected = YES;
                    152:        currentAccountName = [[[sender matrixInColumn:0] selectedCell] stringValue];
                    153:        currentAccountName = NXUniqueString(currentAccountName);
                    154:     }
                    155: 
                    156:     if (isSelected == YES) {
                    157:        [openButton setEnabled:YES];
                    158:        [closeButton setEnabled:YES];
                    159:        [editField setStringValue:currentAccountName];
                    160:        [removeButton setEnabled:YES];
                    161:     } else {
                    162:        [addButton setEnabled:NO];
                    163:        [removeButton setEnabled:NO];
                    164:        [openButton setEnabled:NO];
                    165:        [closeButton setEnabled:NO];
                    166:     }
                    167:     return self;
                    168: }
                    169: 
                    170: - removeAccount:sender
                    171: {
                    172:     id                  account;
                    173:     id                 accountStore;
                    174:     unsigned           block;
                    175: 
                    176:     [self closeAccount:self];
                    177:     if ((currentAccount != NULL) && (currentAccount != nil)) {
                    178:        if ((account = [self getAccountNamed:currentAccountName]) != nil) {
                    179:            [accountsStoreDirectory getBlock:&block andStore:&accountStore];
                    180:            [accountStore startTransaction];
                    181:            [accountsStoreDirectory removeName:currentAccountName];
                    182:            [accountsHashTable removeKey:currentAccountName];
                    183:            [account freeFromStore];
                    184:            [accountStore commitTransaction];
                    185:        };
                    186:     };
                    187:     [self ping:self];
                    188:     return self;
                    189: }
                    190: 
                    191: - (const char *)todaysDate
                    192: {
                    193:     char                buffer[32];
                    194:     struct tm          *timeptr;
                    195:     time_t              timer;
                    196: 
                    197:     time(&timer);
                    198:     timeptr = localtime(&timer);
                    199:     strftime(buffer, sizeof(buffer), "%Y/%m/%d", timeptr);
                    200:     return NXUniqueString(buffer);
                    201: }
                    202: 
                    203: - (int)consumeSerial
                    204: {
                    205:     return [globalThings consumeSerial];
                    206: }
                    207: 
                    208: - (int)browser:b fillMatrix:m inColumn:(int)c
                    209: {
                    210:     int                 cnt;
                    211:     int                 i;
                    212:     id                  t;
                    213: 
                    214:     if (list)
                    215:        free(list);
                    216:     list = [self listOfAccountNames];
                    217:     i = cnt = 0;
                    218:     if (list != NULL)
                    219:        while (list[i]) {
                    220:            [m addRow];
                    221:            t = [m cellAt:i :0];
                    222:            [t setStringValue:list[i]];
                    223:            [t setLoaded:YES];
                    224:            [t setLeaf:YES];
                    225:            cnt += 1;
                    226:            i += 1;
                    227:        };
                    228: 
                    229:     return cnt;
                    230: }
                    231: 
                    232: - initSchema
                    233: {
                    234:     id                  tmpSC;
                    235:     int                 handle;
                    236: 
                    237:  /* create main Archive */
                    238:     NXRunAlertPanel("Welcome.", "Creating Ledger.store.", "OK", NULL, NULL);
                    239:     mainStoreDirectory = [[IXStoreDirectory alloc] 
                    240:        initWithName:"Archive" inFile:"Ledger.store"];
                    241:     [mainStoreDirectory getBlock:&handle andStore:&mainStoreHandle];
                    242:     if ([mainStoreDirectory hasEntryNamed:"Accounts"] == NO) {
                    243:        accountsStoreDirectory = [mainStoreDirectory 
                    244:            addEntryNamed:"Accounts" ofClass:[IXStoreDirectory class]];
                    245:     }
                    246:     if ([mainStoreDirectory hasEntryNamed:"Globals"] == NO) {
                    247:        tmpSC = [mainStoreDirectory addEntryNamed:"Globals" ofClass:[IXRecordManager class]];
                    248:        [tmpSC addAttributeNamed:"Globals" forSelector:@selector(identification)];
                    249:        globalThings = (GlobalThings *)[[GlobalThings alloc] init];
                    250:        [tmpSC addRecord:globalThings];
                    251:     }
                    252:  /* the following two lines enable transactions in the storeFile. */
                    253:     [mainStoreHandle startTransaction];
                    254:     [mainStoreHandle commitTransaction];
                    255:     [mainStoreDirectory free];
                    256:     return self;
                    257: }
                    258: 
                    259: - openDatabase
                    260: {
                    261:     int                 handle;
                    262:     id                  cursor;
                    263: 
                    264:     if (mainStoreDirectory = [[IXStoreDirectory alloc] initFromName:"Archive"
                    265:                              inFile:"Ledger.store" forWriting:YES]) {
                    266:        [mainStoreDirectory getBlock:&handle andStore:&mainStoreHandle];
                    267:        [mainStoreHandle startTransaction];
                    268:        [mainStoreHandle commitTransaction];
                    269:        if ([mainStoreDirectory hasEntryNamed:"Accounts"] == YES) {
                    270:            accountsStoreDirectory = [mainStoreDirectory openEntryNamed:"Accounts"];
                    271:        }
                    272:        if ([mainStoreDirectory hasEntryNamed:"Globals"] == YES) {
                    273:            globalThingsRecordManager = [mainStoreDirectory openEntryNamed:"Globals"];
                    274:        }
                    275:        cursor = [globalThingsRecordManager cursorForAttributeNamed:"Globals"];
                    276:        if ([cursor setKey:(void *)GLOBALVARIDENT
                    277:             andLength:(strlen(GLOBALVARIDENT) + 1)] == YES) {
                    278:            handle = [cursor setFirstHandle];
                    279:            globalThings = [globalThingsRecordManager readRecord:handle fromZone:[self zone]];
                    280:        }
                    281:        [cursor free];
                    282:        accountsHashTable = [[HashTable alloc] initKeyDesc:"*"];
                    283:        ledgersHashTable = [[HashTable alloc] initKeyDesc:"*"];
                    284:     }
                    285:     if (mainStoreDirectory == nil)
                    286:        return nil;
                    287:     return self;
                    288: }
                    289: 
                    290: - closeDatabase
                    291: {
                    292:     [mainStoreHandle startTransaction];
                    293:     [globalThingsRecordManager replaceRecord:[globalThings handle] with:globalThings];
                    294:     [mainStoreHandle commitTransaction];
                    295:     [mainStoreDirectory free];
                    296:     return self;
                    297: }
                    298: 
                    299: - (char **)listOfAccountNames
                    300: {
                    301:     return [accountsStoreDirectory entries];
                    302: }
                    303: 
                    304: - getAccountNamed:(const char *)aName
                    305: {
                    306:     id                  account = nil;
                    307: 
                    308:     if ([accountsStoreDirectory hasEntryNamed:aName] == YES) {
                    309:        aName = NXUniqueString(aName);
                    310:        if ((account = [accountsHashTable valueForKey:aName]) == nil) {
                    311:            if ((account = [accountsStoreDirectory openEntryNamed:aName]) != nil)
                    312:                [accountsHashTable insertKey:aName value:account];
                    313:        };
                    314:     };
                    315:     return account;
                    316: }
                    317: 
                    318: - (BOOL)textWillChange:textObject
                    319: {
                    320:     [addButton setEnabled:YES];
                    321:     return NO;
                    322: }
                    323: 
                    324: - (BOOL)textWillEnd:textObject
                    325: {
                    326:     [self findAccount:listBrowser];
                    327:     [self openAccount:listBrowser];
                    328:     return NO;
                    329: }
                    330: 
                    331: - textDidChange:textObject
                    332: {
                    333:     currentAccount = nil;
                    334:     currentAccountName = NULL;
                    335:     return self;
                    336: }
                    337: 
                    338: - addAllAttributes:aRecMgr
                    339: {
                    340:     [mainStoreHandle startTransaction];
                    341:     [aRecMgr addAttributeNamed:"tSerial" forSelector:@selector(tSerial)];
                    342:     [aRecMgr addAttributeNamed:"tNumber" forSelector:@selector(tNumber)];
                    343:     [aRecMgr addAttributeNamed:"tDate" forSelector:@selector(tDate)];
                    344:     [aRecMgr addAttributeNamed:"tMemo" forSelector:@selector(tMemo)];
                    345:     [aRecMgr addAttributeNamed:"tDebit" forSelector:@selector(tDebit)];
                    346:     [aRecMgr addAttributeNamed:"tCredit" forSelector:@selector(tCredit)];
                    347:     [mainStoreHandle commitTransaction];
                    348:     return self;
                    349: }
                    350: 
                    351: 
                    352: @end

unix.superglobalmegacorp.com

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