SetTimeWindowController.m
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:8k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. //  SetTimeWindowController.m
  3. //  celestia
  4. //
  5. //  Created by Bob Ippolito on Tue May 28 2002.
  6. //  Copyright (C) 2007, Celestia Development Team
  7. //
  8. #import "SetTimeWindowController.h"
  9. #import "CelestiaAppCore.h"
  10. #import "CelestiaSimulation.h"
  11. #import "Astro.h"
  12. #import "CelestiaSettings.h"
  13. @interface SetTimeWindowController(Private)
  14. - (NSNumber *) julianDateFromDateAndTime;
  15. @end
  16. @implementation SetTimeWindowController
  17. - (void) awakeFromNib
  18. {
  19. #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
  20.     dateTimeFormat = [[NSDateFormatter alloc] init];
  21.     [ dateTimeFormat setFormatterBehavior: NSDateFormatterBehavior10_4 ];
  22.     [ dateTimeFormat setDateFormat: @"MM/dd/uuuu HH:mm:ss" ];
  23.     // uuuu handles -ve (BCE) years
  24.     // 1 BCE = 0 (not -1)
  25.     // Reference: Unicode Technical Standard #35
  26.     // http://unicode.org/reports/tr35/tr35-4.html
  27. #else
  28.     dateTimeFormat = [[NSDateFormatter alloc] initWithDateFormat:
  29.                                                    @"%m/%d/%Y %H:%M:%S"
  30.                                             allowNaturalLanguage: NO ];
  31.     bcFormat       = [[NSDateFormatter alloc] initWithDateFormat:
  32.                                                    @"%m/%d/-%Y %H:%M:%S"
  33.                                             allowNaturalLanguage: NO ];
  34.     zeroFormat     = [[NSDateFormatter alloc] initWithDateFormat:
  35.                                                   @"%m/%d/%y %H:%M:%S"
  36.                                             allowNaturalLanguage: NO ];
  37.     // Due to a "reverse Y2K" bug, the 4-digit %Y format rejects
  38.     // the year 0 (1 BCE), even if 0000 is entered.
  39.     // But the 2-digit %y format ends up working!
  40. #endif
  41. }
  42. - (void) dealloc
  43. {
  44. #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4
  45.     [zeroFormat release];
  46.     [bcFormat release];
  47. #endif
  48.     [dateTimeFormat release];
  49.     [super dealloc];
  50. }
  51. - (IBAction)setTime:(id)sender
  52. {
  53.     NSString* dateString = [dateField stringValue];
  54.     NSString* timeString = [timeField stringValue];
  55.     if ( [dateString isEqualToString: @""] && [timeString isEqualToString: @""])
  56.     {
  57.         NSRunAlertPanel(NSLocalizedString(@"No Date or Time Entered",@""),
  58.                         NSLocalizedString(@"Please enter a date and/or time.",@""),
  59.                         nil,nil,nil);
  60.         return;
  61.     }
  62.     CelestiaSimulation *sim = [[CelestiaAppCore sharedAppCore] simulation];
  63.     NSNumber *jd = [self julianDateFromDateAndTime];
  64.     if (jd)
  65.         [sim setDate: jd ];
  66. }
  67. - (void)windowDidBecomeKey:(NSNotification *)aNotification
  68. {
  69.     if (!setupDone && [self window]==[aNotification object])
  70.     {
  71.         setupDone = YES;
  72.         [[CelestiaSettings shared] scanForKeys: [self window]];
  73.         [[CelestiaSettings shared] validateItems];
  74.     }
  75. }
  76. - (NSNumber *) julianDateFromDateAndTime
  77. {
  78.     NSNumber *jd = nil;
  79.     NSDate *date = nil;
  80.     BOOL dateValid = NO;
  81.     NSString *inputString = nil;
  82.     NSString *errorString = nil;
  83.     NSString* dateString = [dateField stringValue];
  84.     NSString* timeString = [timeField stringValue];
  85.     BOOL useUTC = (0 != [[CelestiaSettings shared] timeZone]);
  86.     if ( [timeString isEqualToString: @""] )
  87.     {
  88.         timeString = @"00:00:00";
  89.     }
  90.     else
  91.     {
  92.         NSArray* pieces = [ timeString componentsSeparatedByString: @":" ];
  93.         if ( [[pieces objectAtIndex: [pieces count]-1 ] isEqualToString: @"" ])
  94.             timeString = [timeString stringByAppendingString: @"00" ];
  95.         if ([ pieces count] == 1) 
  96.             timeString = [ timeString stringByAppendingString: @":00:00" ];
  97.         else if ([ pieces count] == 2) 
  98.             timeString = [ timeString stringByAppendingString: @":00" ];
  99.     }
  100. #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4
  101.     {
  102.         // 1 BCE - only works if year is 2 digits (00)
  103.         // so transform 0000 etc to 2 digits
  104.         NSArray* pieces = [dateString componentsSeparatedByString: @"/"];
  105.         if ([pieces count] == 3)
  106.         {
  107.             NSString *yearString = [pieces objectAtIndex: 2];
  108.             NSScanner *zeroScan  = [NSScanner scannerWithString: yearString];
  109.             int yearVal = 0;
  110.             if ([zeroScan scanInt: &yearVal] && 0 == yearVal)
  111.             {
  112.                 dateString = [NSString stringWithFormat: @"%@/%@/00", [pieces objectAtIndex: 0], [pieces objectAtIndex: 1]];
  113.             }
  114.         }
  115.     }
  116. #endif
  117.     inputString = [ [  dateString stringByAppendingString: @" " ]  
  118.                              stringByAppendingString: timeString ];  
  119. #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
  120.     if (useUTC)
  121.     {
  122.         [dateTimeFormat setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @"GMT"]];
  123.     }
  124.     else
  125.     {
  126.         [NSTimeZone resetSystemTimeZone];
  127.         [dateTimeFormat setTimeZone: [NSTimeZone systemTimeZone]];
  128.     }
  129. #endif
  130.     dateValid = [ dateTimeFormat getObjectValue: &date
  131.                                       forString: inputString
  132.                                errorDescription: &errorString ];
  133. #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4
  134.     if (!dateValid)
  135.     {
  136.         // BCE dates (except 1 BCE)
  137.         dateValid = [ bcFormat getObjectValue: &date
  138.                                     forString: inputString
  139.                              errorDescription: &errorString ];
  140.     }
  141.     if (!dateValid)
  142.     {
  143.         // 1 BCE - only works if year is 2 digits (00)
  144.         dateValid = [ zeroFormat getObjectValue: &date
  145.                                       forString: inputString
  146.                                errorDescription: &errorString ];
  147.     }
  148. #endif
  149.     if (dateValid)
  150.     {
  151. #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4
  152.         // +[Astro julianDate:] also converts NSDate->NSCalendarDate
  153.         // but it doesn't work so well with -ve (BCE) dates
  154.         // so help it by passing a ready-made NSCalendarDate
  155.         NSArray *dtParts = [dateString componentsSeparatedByString: @"/"];
  156.         NSArray *tmParts = [timeString componentsSeparatedByString: @":"];
  157.         if (dtParts && tmParts &&
  158.             [dtParts count] > 0 && [tmParts count] > 0)
  159.         {
  160.             NSTimeZone *tz = nil;
  161.             if (useUTC)
  162.             {
  163.                 tz = [NSTimeZone timeZoneWithAbbreviation: @"GMT"];
  164.             }
  165.             else
  166.             {
  167.                 [NSTimeZone resetSystemTimeZone];
  168.                 tz = [NSTimeZone systemTimeZone];
  169.             }
  170.             date = [NSCalendarDate dateWithYear: [[dtParts objectAtIndex: 2] intValue]
  171.                                           month: [[dtParts objectAtIndex: 0] intValue]
  172.                                             day: [[dtParts objectAtIndex: 1] intValue]
  173.                                            hour: [[tmParts objectAtIndex: 0] intValue]
  174.                                          minute: [[tmParts objectAtIndex: 1] intValue]
  175.                                          second: [[tmParts objectAtIndex: 2] intValue]
  176.                                        timeZone: tz];
  177.         }
  178. #endif
  179.         jd = [ Astro julianDate: date];
  180.     }
  181.     return jd;
  182. }
  183. - (void) controlTextDidEndEditing: (NSNotification *) aNotification
  184. {
  185.     id sender = [aNotification object];
  186.     if (dateField == sender || timeField == sender)
  187.     {
  188.         if ([[dateField stringValue] isEqualToString: @""])
  189.             return;
  190.         NSNumber *jd = [self julianDateFromDateAndTime];
  191.         if (jd)
  192.         {
  193.             [ jdField setDoubleValue: [jd doubleValue] ];
  194.         }
  195.         else
  196.         {
  197.             NSRunAlertPanel(NSLocalizedString(@"Improper Date or Time Format",@""),
  198.                             NSLocalizedString(@"Please enter the date as "mm/dd/yyyy" and the time as "hh:mm:ss".",@""),
  199.                             nil,nil,nil);
  200.         }
  201.     }
  202.     else if (jdField == sender)
  203.     {
  204.         if ([[jdField stringValue] isEqualToString: @""])
  205.             return;
  206.         NSDate *date = [ NSDate dateWithJulian: [NSNumber numberWithDouble: [jdField doubleValue] ] ];
  207.         NSString *dateTimeString = nil;
  208. #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
  209.         dateTimeString = [dateTimeFormat stringFromDate: date];
  210. #else
  211.         dateTimeString = [dateTimeFormat stringForObjectValue: date];
  212. #endif
  213.         if (dateTimeString && [dateTimeString length] > 0)
  214.         {
  215.             NSArray *components = [dateTimeString componentsSeparatedByString: @" "];
  216.             if (components && [components count] > 1)
  217.             {
  218.                 [dateField setStringValue: [components objectAtIndex: 0]];
  219.                 [timeField setStringValue: [components objectAtIndex: 1]];
  220.             }
  221.         }
  222.     }
  223. }
  224. @end