home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / AppKit / TravelAdvisor / TAController.m < prev    next >
Text File  |  1996-01-23  |  10KB  |  349 lines

  1.  
  2. #import "TAController.h"
  3. #import "Converter.h"
  4. @implementation TAController
  5.  
  6. - (void)addRecord:(id)sender
  7. {
  8.     Country *aCountry;
  9.     NSString *countryName = [countryField stringValue];
  10.     
  11.     /* look up country name in dictionary */
  12.     /* if exists, remove record in dictionary, else create new one*/
  13.  
  14.     if (countryName && (![countryName isEqualToString:@""])) {
  15.         aCountry = [countryDict objectForKey:countryName];
  16.  
  17.         if (aCountry && recordNeedsSaving) {
  18.            /* remove old Country object from dictionary */
  19.            [countryDict removeObjectForKey:[aCountry name]];
  20.          }
  21.         else if (!aCountry)  /* record is new */
  22.             aCountry = [[Country alloc] init];
  23.         else return;   /* record already exists and hasn't changed */
  24.  
  25.         /* extract field values and put in dictionary and keys array */
  26.         [self extractFields:aCountry];
  27.         [countryDict setObject:aCountry forKey:[aCountry name]];
  28.         [countryKeys addObject:[aCountry name]];
  29.         
  30.         /* sort array */
  31.         [countryKeys sortUsingSelector:@selector(compare:)];
  32.         
  33.         recordNeedsSaving=NO;
  34.         [commentsLabel setStringValue:[NSString stringWithFormat:@"Notes and Itinerary for %@", [countryField stringValue]]];
  35.         [countryField selectText:self];
  36.         [tableView tile];
  37.         [tableView selectRow:[countryKeys indexOfObject:[aCountry name]] byExtendingSelection:NO];
  38.  
  39.     }
  40.     return;
  41.  
  42. }
  43.  
  44. - (void)blankFields:(id)sender
  45. {
  46.     [countryField setStringValue:@""];
  47.  
  48.     [[logisticsForm cellAtIndex:LGairports] setStringValue:@""];
  49.     [[logisticsForm cellAtIndex:LGairlines] setStringValue:@""];
  50.     [[logisticsForm cellAtIndex:LGtransportation] setStringValue:@""];
  51.     [[logisticsForm cellAtIndex:LGhotels] setStringValue:@""];
  52.  
  53.     [currencyNameField setStringValue:@""];
  54.     [currencyRateField setFloatValue:0.000];
  55.     [languagesField setStringValue:@""];
  56.     [englishSpokenSwitch setState:NO];
  57.  
  58.     [currencyDollarsField setFloatValue:0.00];
  59.     [currencyLocalField setFloatValue:0.00];
  60.     [celsius setIntValue:0];
  61.     [fahrenheit setIntValue:0];
  62.  
  63.     [commentsField setString:@""];
  64.  
  65.     [countryField selectText:self];
  66.  
  67.     return;
  68. }
  69.  
  70. - (void)populateFields:(Country *)aRec
  71. {
  72.     [countryField setStringValue:[aRec name]];
  73.  
  74.     [[logisticsForm cellAtIndex:LGairports] setStringValue:[aRec airports]];
  75.     [[logisticsForm cellAtIndex:LGairlines] setStringValue:[aRec airlines]];
  76.     [[logisticsForm cellAtIndex:LGtransportation] setStringValue:[aRec transportation]];
  77.     [[logisticsForm cellAtIndex:LGhotels] setStringValue:[aRec hotels]];
  78.  
  79.     [currencyNameField setStringValue:[aRec currencyName]];
  80.     [currencyRateField setFloatValue:[aRec currencyRate]];
  81.     [languagesField setStringValue:[aRec languages]];
  82.     [englishSpokenSwitch setState:[aRec englishSpoken]];
  83.  
  84.     [commentsField setString:[aRec comments]];
  85.  
  86.     [countryField selectText:self];
  87.  
  88.     return;
  89.  
  90. }
  91.  
  92. - (void)extractFields:(Country *)aRec
  93. {
  94.     [aRec setName:[countryField stringValue]];
  95.  
  96.     [aRec setAirports:[[logisticsForm cellAtIndex:LGairports] stringValue]];
  97.     [aRec setAirlines:[[logisticsForm cellAtIndex:LGairlines] stringValue]];
  98.     [aRec setTransportation:[[logisticsForm cellAtIndex:LGtransportation] stringValue]];
  99.     [aRec setHotels:[[logisticsForm cellAtIndex:LGhotels] stringValue]];
  100.  
  101.     [aRec setCurrencyName:[currencyNameField stringValue]];
  102.     [aRec setCurrencyRate:[currencyRateField floatValue]];
  103.     [aRec setLanguages:[languagesField stringValue]];
  104.     [aRec setEnglishSpoken:[englishSpokenSwitch state]];
  105.  
  106.     [aRec setComments:[commentsField string]];
  107.      
  108.     return;
  109. }
  110.  
  111.  
  112. - (void)convertCelsius:(id)sender
  113. {
  114.     
  115.     return;
  116. }
  117.  
  118. - (void)convertCurrency:(id)sender
  119. {
  120.  
  121.     [currencyLocalField setFloatValue:[converter convertAmount:[currencyDollarsField floatValue] byRate:[currencyRateField floatValue]]];
  122.  
  123.     return;
  124. }
  125.  
  126. - (void)deleteRecord:(id)sender
  127. {
  128.     Country *aCountry;
  129.     NSString *countryName = [countryField stringValue];
  130.     
  131.     if (countryName && (![countryName isEqualToString:@""])) {
  132.         aCountry = [countryDict objectForKey:countryName];
  133.  
  134.         if (aCountry) {
  135.             [countryDict removeObjectForKey:countryName];
  136.             [countryKeys removeObject:countryName];
  137.             [self blankFields:self];
  138.             [tableView tile];
  139.         }
  140.     }    
  141.     return;
  142. }
  143.  
  144. - (void)switchChecked:(id)sender { recordNeedsSaving = YES; }
  145.  
  146. - (void)handleTVClick:(id)sender
  147. {
  148.     Country *aRec, *newRec, *newerRec;
  149.     int index = [sender selectedRow];
  150.  
  151.     /* does current obj need to be saved? */
  152.     if (recordNeedsSaving) {
  153.         /* is current object already in dictionary? */
  154.         if ( aRec = [countryDict objectForKey:[countryField stringValue]] ) {
  155.             /* remove if it's been changed */
  156.             if (aRec) {
  157.                 [countryDict removeObjectForKey:[aRec name]];
  158.                 [countryKeys removeObject:[aRec name]];
  159.             }
  160.         }
  161.  
  162.         /* Create Country obj, add it to dict and add name to keys array */
  163.         newRec = [[Country alloc] init];
  164.         [self extractFields:newRec];
  165.         [countryDict setObject:newRec forKey:[countryField stringValue]];
  166.         [countryKeys addObject:[countryField stringValue]];
  167.  
  168.         /* sort array here */
  169.         [countryKeys sortUsingSelector:@selector(compare:)];
  170.     }
  171.     if (index >= 0 && index < [countryKeys count]) {
  172.         newerRec = [countryDict objectForKey:[countryKeys objectAtIndex:index]];
  173.         [self populateFields:newerRec];
  174.         [commentsLabel setStringValue:[NSString stringWithFormat:
  175.                @"Notes and Itinerary for %@", [countryField stringValue]]];
  176.         recordNeedsSaving=NO;
  177.         [tableView tile];
  178.     }
  179.     return;
  180. }
  181.  
  182. - (void)nextRecord:(id)sender
  183. {
  184.     int r;
  185.  
  186.     r = [tableView selectedRow];
  187.     if (r == [countryKeys indexOfObject:[countryKeys lastObject]])
  188.         r = 0; /* wrap to beginning */
  189.     else
  190.         r++;
  191.     [tableView selectRow:r byExtendingSelection:NO];
  192.     [self handleTVClick:tableView];
  193.     
  194.     return;
  195. }
  196.  
  197. - (void)priorRecord:(id)sender
  198. {
  199.     int r;
  200.  
  201.     r = [tableView selectedRow];
  202.     if (r == 0)
  203.         /* wrap to end */
  204.         r = [countryKeys indexOfObject:[countryKeys lastObject]]; 
  205.     else
  206.         r--;
  207.     [tableView selectRow:r byExtendingSelection:NO];
  208.     [self handleTVClick:tableView];
  209.     
  210.     return;
  211. }
  212.  
  213. /* ** enabling/disabling menu items, an alternative to "wrapping"
  214.    ** the selection in nextRecord: and priorRecord:
  215.    ** uncomment to see what happens
  216. - (BOOL)validateMenuItem:(NSMenuItem *)anItem
  217. {
  218.     int row = [tableView selectedRow];
  219.     if ([[anItem title] isEqualToString:@"Next Record"] &&
  220.         (row == [countryKeys indexOfObject:[countryKeys lastObject]])) {
  221.         NSBeep();
  222.         return NO;
  223.     }
  224.     if ([[anItem title] isEqualToString:@"Prior Record"] && row == 0 ) {
  225.         NSBeep();
  226.         return NO;
  227.     }
  228.     return YES;
  229. }
  230. **************************************************** */
  231.  
  232. - (id)init
  233. {
  234.     NSString *storePath = [[NSBundle mainBundle] pathForResource:@"TravelData" ofType:nil];
  235.     [super init];
  236.  
  237.     countryDict = [NSUnarchiver unarchiveObjectWithFile:storePath];
  238.  
  239.     if (!countryDict) {
  240.         countryDict = [[NSMutableDictionary alloc] initWithCapacity:10];
  241.         countryKeys = [[NSMutableArray alloc] initWithCapacity:10];
  242.     } else
  243.         countryDict = [countryDict retain];
  244.     
  245.     recordNeedsSaving=NO;
  246.     
  247.     return self;
  248. }
  249.  
  250. - (void)dealloc
  251. {
  252.     [countryDict release];
  253.     [countryKeys release];
  254.     [super dealloc];
  255. }
  256.  
  257. - (void)awakeFromNib
  258. {
  259.     NSArray *tmpArray = [[countryDict allKeys] /* 1 */
  260.                          sortedArrayUsingSelector:@selector(compare:)];
  261.     countryKeys = [[NSMutableArray alloc] initWithArray:tmpArray];
  262.  
  263.     /* select first field */
  264.     [countryField selectText:self];
  265.     
  266.     [[NSNotificationCenter defaultCenter] addObserver:self
  267.                           selector:@selector(textDidChange:)
  268.                           name:@"NSControlTextDidChangeNotification" object:nil];
  269.     
  270.     [tableView setDataSource:self];
  271.     [tableView setDelegate:self];
  272.     [tableView sizeLastColumnToFit];
  273.  
  274.     [commentsField setDelegate:self];
  275.     [currencyRateField setDelegate:self];
  276.  
  277.     [[currencyRateField cell] setEntryType:NSFloatType];
  278.     [[currencyRateField cell] setFloatingPointFormat:YES left:2 right:1];       
  279.     [[currencyDollarsField cell] setEntryType:NSFloatType];
  280.     [[currencyDollarsField cell] setFloatingPointFormat:YES left:5 right:2];       
  281.     [[currencyLocalField cell] setEntryType:NSFloatType];
  282.     [[currencyLocalField cell] setFloatingPointFormat:YES left:5 right:2];
  283.     [[celsius cell] setEntryType:NSFloatType];
  284.     [[celsius cell] setFloatingPointFormat:YES left:2 right:1];
  285. }
  286.  
  287. /* NSTableView data source methods */
  288.  
  289. - (int)numberOfRowsInTableView:(NSTableView *)theTableView
  290. {
  291.     return [countryKeys count];
  292. }
  293.  
  294. - (id)tableView:(NSTableView *)theTableView
  295.       objectValueForTableColumn:(NSTableColumn *)theColumn
  296.             row:(int)rowIndex
  297. {
  298.     if ([[theColumn identifier] intValue]==0)
  299.         return [countryKeys objectAtIndex:rowIndex];
  300.     else
  301.         return nil;
  302. }
  303.       
  304.     
  305.  
  306. /* Delegation and notification methods */
  307.  
  308. - (void)textDidChange:(NSNotification *)notification
  309. {
  310.     recordNeedsSaving=YES;
  311. }
  312.  
  313. - (void)controlTextDidChange:(NSNotification *)notification
  314. {
  315.     recordNeedsSaving=YES;
  316. }
  317.  
  318. - (BOOL)textShouldBeginEditing:(NSText *)textObj
  319. {
  320.     recordNeedsSaving=YES;
  321.     return YES;
  322. }
  323.  
  324. - (BOOL)applicationShouldTerminate:(id)sender
  325. {
  326.     NSString *storePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"TravelData"];
  327.     /* save current record if it is new or changed */
  328.    [self addRecord:self];
  329.  
  330.    /* save dictionary (if it has contents) to archive file */
  331.    if (countryDict && [countryDict count])
  332.         [NSArchiver archiveRootObject:countryDict toFile:storePath];
  333.  
  334.     return YES;
  335. }
  336.  
  337. - (BOOL)control:(NSControl *)control isValidObject:(id)obj
  338. {
  339.     if (control == currencyRateField) {
  340.         if ([obj floatValue] < 0.0) {
  341.             NSRunAlertPanel(@"Travel Advisor", @"Rate cannot be negative.", nil, nil, nil);
  342.             return NO;
  343.         }
  344.     }
  345.     return YES;
  346. }
  347.  
  348. @end
  349.