home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / YellowBox / Productivity / EggTimer-2.5-I / ReminderController.m < prev    next >
Encoding:
Text File  |  1998-04-07  |  15.4 KB  |  505 lines

  1. #import "ReminderController.h"
  2. #import "Reminder.h"
  3.  
  4. @implementation ReminderController
  5.  
  6. - (void)addReminder:(id)sender
  7. {
  8.     [self addReminder:sender atIndex:-1];
  9. }
  10.  
  11. - (BOOL)addReminder:(id)sender atIndex:(int)rowIndex
  12. {
  13.     Reminder *aReminder;
  14.     SEL aSelector;
  15.     int hr, min, sec;
  16.     BOOL repeats, shouldEmitSound, shouldShowAlertPanel, relative;
  17.  
  18.     aSelector  = @selector(reminderDue:);
  19.     aReminder  = [[Reminder alloc] init];
  20.     repeats    = (BOOL) [[repeatOnOffMatrix selectedCell] tag];
  21.     relative   = (BOOL) [[absoluteRelativeMatrix selectedCell] tag];
  22.     shouldEmitSound = (BOOL) [[soundOnOffMatrix selectedCell] tag];
  23.     shouldShowAlertPanel = (BOOL) [[panelOnOffMatrix selectedCell] tag];
  24.     hr  = [hoursField intValue];
  25.     min = [minutesField intValue];
  26.     sec = [secondsField intValue];
  27.  
  28.     if(relative == 0 || hr != 0 || min != 0 || sec != 0)
  29.       {
  30.         [aReminder setReminder:hr :min :sec :self :aSelector :(BOOL)repeats :(BOOL)relative :(BOOL)shouldEmitSound :(BOOL)shouldShowAlertPanel :[reminderMessageField stringValue]];
  31.         if(rowIndex > -1)
  32.           {
  33.             [reminderArray insertObject:aReminder atIndex:rowIndex];
  34.             [remindersTable selectRow:rowIndex byExtendingSelection:NO];
  35.           }
  36.         else
  37.           {
  38.             [reminderArray addObject:aReminder];
  39.             [remindersTable selectRow:[reminderArray count]-1 byExtendingSelection:NO];
  40.           }
  41.  
  42.         [remindersTable reloadData];
  43.         return YES;
  44.       }
  45.     else
  46.       {
  47.         NSBeep();
  48.         NSRunAlertPanel(@"EggTimer Warning",@"Relative Delay time must be greater than zero!", @"OK", nil, nil);
  49.         return NO;
  50.       }
  51. }
  52.  
  53. - (void)applicationDidFinishLaunching:(NSNotification *)notification
  54. {
  55.     SEL clickSelector, timerSelector;
  56.     NSImage *miniwindowImage;
  57.  
  58.     clickSelector = @selector(updateControls);
  59.     timerSelector = @selector(reloadData);
  60.  
  61.     miniwindowImage = [[NSImage alloc] initWithContentsOfFile:@"MiniTimer.tiff"];
  62.     [mainWindow setMiniwindowImage:miniwindowImage];
  63.  
  64.     reminderArray = [[NSMutableArray alloc] init];
  65.     [remindersTable setDataSource:self];
  66.     [remindersTable setAction:clickSelector];
  67.     [[remindersTable tableColumnWithIdentifier:@"expired"] setDataCell:[NSImageCell new]];
  68.     [[remindersTable tableColumnWithIdentifier:@"absolute_relative"] setDataCell:[NSImageCell new]];
  69.     [[remindersTable tableColumnWithIdentifier:@"once_repeats"] setDataCell:[NSImageCell new]];
  70.     [[remindersTable tableColumnWithIdentifier:@"sound"] setDataCell:[NSImageCell new]];
  71.     [[remindersTable tableColumnWithIdentifier:@"alert_panel"] setDataCell:[NSImageCell new]];
  72.  
  73.     [remindersTable sizeLastColumnToFit];
  74.  
  75.     [timeField setRefusesFirstResponder:YES];
  76.  
  77.     [absoluteRelativeMatrix setRefusesFirstResponder:YES];
  78.     [repeatOnOffMatrix setRefusesFirstResponder:YES];
  79.     [soundOnOffMatrix setRefusesFirstResponder:YES];
  80.     [panelOnOffMatrix setRefusesFirstResponder:YES];
  81.  
  82.     [absoluteRelativeMatrix selectCell:[absoluteRelativeMatrix cellWithTag:0]];
  83.  
  84.     [repeatOnOffMatrix selectCell:[repeatOnOffMatrix cellWithTag:0]];
  85.     [[repeatOnOffMatrix cellWithTag:1] setEnabled:NO];
  86.  
  87.     [soundOnOffMatrix selectCell:[soundOnOffMatrix cellWithTag:1]];
  88.     [panelOnOffMatrix selectCell:[panelOnOffMatrix cellWithTag:1]];
  89.  
  90.     [hoursField setDelegate:self];
  91.     [minutesField setDelegate:self];
  92.     [secondsField setDelegate:self];
  93.     
  94.     [mainWindow makeKeyAndOrderFront:self];
  95.  
  96.     [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:timerSelector userInfo:nil repeats:YES];
  97. }
  98.  
  99. - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
  100. {
  101.     return YES;
  102. }
  103.  
  104. - (BOOL)applicationShouldTerminate:(NSApplication *)sender
  105. {
  106.     if([reminderArray count])
  107.       {
  108.         NSBeep();
  109.         switch (NSRunAlertPanel(@"EggTimer Warning", @"There are still reminders in the list.\nAre you sure you want to quit?", @"Quit", @"No", nil))
  110.           {
  111.             case 0:
  112.                 [self showWindow:self];
  113.                 return NO;
  114.                 break;
  115.             case 1:
  116.                 return YES;
  117.                 break;
  118.           }
  119.  
  120.       }
  121.     return YES;
  122. }
  123.  
  124. - (void)cancelReminderIdenticalTo:(id)aReminder
  125. {
  126.     [aReminder cancelReminder];
  127.     [remindersTable reloadData];
  128.     [self updateControls];
  129. }
  130.  
  131. - (void)cancelSelectedReminder:(id)sender
  132. {
  133.     int rowIndex = [remindersTable selectedRow];
  134.     if(rowIndex > -1)
  135.       {
  136.         [self cancelReminderIdenticalTo:[reminderArray objectAtIndex:rowIndex]];
  137.       }
  138.     else
  139.       {
  140.         NSBeep();
  141.         NSRunAlertPanel(@"EggTimer Warning",@"Nothing to cancel!", @"OK", nil, nil);
  142.       }
  143. }
  144.  
  145. - (void)deleteReminderIdenticalTo:(id)aReminder
  146. {
  147.     int rowIndex = [remindersTable selectedRow];
  148.     [aReminder cancelReminder];
  149.     [reminderArray removeObjectIdenticalTo:aReminder];
  150.     if(rowIndex == 0)
  151.       {
  152.         rowIndex = 1;
  153.       }
  154.     [remindersTable selectRow:(rowIndex-1) byExtendingSelection:NO];
  155.     [remindersTable reloadData];
  156.     [self updateControls];
  157. }
  158.  
  159. - (void)deleteSelectedReminder:(id)sender
  160. {
  161.     int rowIndex = [remindersTable selectedRow];
  162.     if(rowIndex > -1)
  163.       {
  164.         [self deleteReminderIdenticalTo:[reminderArray objectAtIndex:rowIndex]];
  165.       }
  166.     else
  167.       {
  168.         NSBeep();
  169.         NSRunAlertPanel(@"EggTimer Warning",@"Nothing to delete!", @"OK", nil, nil);
  170.       }
  171. }
  172.  
  173. - (int)numberOfRowsInTableView:(NSTableView *)theTableView
  174. {
  175.     return [reminderArray count];
  176. }
  177.  
  178. - (void)reloadData
  179. {
  180.     [dayField setStringValue:[[[NSDate date]
  181.         descriptionWithCalendarFormat:@"%a" timeZone:nil
  182.         locale:nil] uppercaseString]];
  183.     [dateField setStringValue:[[NSDate date]
  184.         descriptionWithCalendarFormat:@"%d" timeZone:nil
  185.         locale:nil]];
  186.     [monthField setStringValue:[[[NSDate date]
  187.         descriptionWithCalendarFormat:@"%b" timeZone:nil
  188.         locale:nil] uppercaseString]];
  189.     [timeField setStringValue:[[NSDate date]
  190.             descriptionWithCalendarFormat:@"%H:%M:%S" timeZone:nil
  191.             locale:nil]];
  192.     [remindersTable reloadData];
  193. }
  194.  
  195. - (void)reminderDue:(NSTimer *)sender
  196. {
  197.     Reminder *aReminder;
  198.     aReminder = [sender userInfo];
  199.     if([aReminder shouldEmitSound])
  200.       {
  201.         NSBeep();
  202.       }
  203.     if([aReminder shouldShowAlertPanel])
  204.       {
  205.         switch (NSRunAlertPanel(@"EggTimer Reminder", [aReminder stringValue], @"OK", @"Expire", @"Delete"))
  206.           {
  207.             case 1:
  208.                 break;
  209.             case 0:
  210.                 [self cancelReminderIdenticalTo:aReminder];
  211.                 break;
  212.             case -1:
  213.                 [self deleteReminderIdenticalTo:aReminder];
  214.                 break;
  215.           }
  216.       }
  217. }
  218.  
  219. - (void)replaceReminder:(id)sender
  220. {
  221.     Reminder *aReminder;
  222.     int selectedRow = [remindersTable selectedRow];
  223.     if (selectedRow > -1 && selectedRow < [reminderArray count])
  224.       {
  225.         aReminder = [reminderArray objectAtIndex:selectedRow];
  226.         if(aReminder)
  227.           {
  228.             [self addReminder:self atIndex:selectedRow];
  229.             [self deleteReminderIdenticalTo:aReminder];
  230.             [remindersTable selectRow:selectedRow byExtendingSelection:NO];
  231.             [self updateControls];
  232.           }
  233.       }
  234.     else
  235.       {
  236.         NSBeep();
  237.         NSRunAlertPanel(@"EggTimer Warning",@"Nothing to replace!", @"OK", nil, nil);
  238.       }
  239. }
  240.  
  241. - (void)setAbsoluteOrRelative:(id)sender
  242. {
  243.     if([[sender selectedCell] tag] == 0)
  244.       {
  245.         if ([[repeatOnOffMatrix selectedCell] tag] == 1)
  246.           {
  247.             NSBeep();
  248.             [repeatOnOffMatrix selectCell:[repeatOnOffMatrix cellWithTag:0]];
  249.           }
  250.         [[repeatOnOffMatrix cellWithTag:1] setEnabled:NO];
  251.       }
  252.     else
  253.       {
  254.         [[repeatOnOffMatrix cellWithTag:1] setEnabled:YES];
  255.       }
  256. }
  257.  
  258. - (void)setOnceOrRepeats:(id)sender
  259. {
  260.     if([[sender selectedCell] tag] == 0)
  261.       {
  262.         [[absoluteRelativeMatrix cellWithTag:0] setEnabled:YES];
  263.       }
  264.     else
  265.       {
  266.         if([[absoluteRelativeMatrix selectedCell] tag] == 0)
  267.           {
  268.             NSBeep();
  269.             [absoluteRelativeMatrix selectCell:[absoluteRelativeMatrix cellWithTag:1]];
  270.           }
  271.         [[absoluteRelativeMatrix cellWithTag:0] setEnabled:NO];
  272.       }
  273. }
  274.  
  275. - (void)showWindow:(id)sender
  276. {
  277.     [mainWindow makeKeyAndOrderFront:self];
  278. }
  279.  
  280. - (id)tableView:(NSTableView *)theTableView objectValueForTableColumn: (NSTableColumn *)theColumn row:(int)rowIndex;
  281. {
  282.     int hours, minutes, seconds;
  283.  
  284.     if ([[theColumn identifier] isEqualToString:@"reminder"])
  285.       {
  286.         return [[reminderArray objectAtIndex:rowIndex] stringValue];
  287.       }
  288.         else if ([[theColumn identifier] isEqualToString:@"expired"])
  289.           {
  290.             if ([[reminderArray objectAtIndex:rowIndex] getValid])
  291.               {
  292.                 return [NSImage imageNamed:@"Valid"];
  293.               }
  294.             else
  295.               {
  296.                 return [NSImage imageNamed:@"Expired"];
  297.               }
  298.           }
  299.     else if ([[theColumn identifier] isEqualToString:@"time"])
  300.       {
  301.         [[reminderArray objectAtIndex:rowIndex] remainingTime:&hours minutes:&minutes seconds:&seconds];
  302.         return [NSString stringWithFormat:@"%02d:%02d:%02d",hours,minutes,seconds];
  303.       }
  304.     else if ([[theColumn identifier] isEqualToString:@"absolute_relative"])
  305.       {
  306.         if ([[reminderArray objectAtIndex:rowIndex] getRelative])
  307.           {
  308.             return [NSImage imageNamed:@"RelativeTime"];
  309.           }
  310.         else
  311.           {
  312.             return [NSImage imageNamed:@"AbsoluteTime"];
  313.           }
  314.       }
  315.     else if ([[theColumn identifier] isEqualToString:@"once_repeats"])
  316.       {
  317.         if([[reminderArray objectAtIndex:rowIndex] getRepeats])
  318.           {
  319.             return [NSImage imageNamed:@"RepeatOn"];
  320.           }
  321.         else
  322.           {
  323.             return [NSImage imageNamed:@"RepeatOff"];
  324.           }
  325.       }
  326.     else if ([[theColumn identifier] isEqualToString:@"sound"])
  327.       {
  328.         if([[reminderArray objectAtIndex:rowIndex] shouldEmitSound])
  329.           {
  330.             return [NSImage imageNamed:@"SoundOn"];
  331.           }
  332.         else
  333.           {
  334.             return [NSImage imageNamed:@"SoundOff"];
  335.           }
  336.       }
  337.     else if ([[theColumn identifier] isEqualToString:@"alert_panel"])
  338.       {
  339.         if([[reminderArray objectAtIndex:rowIndex] shouldShowAlertPanel])
  340.           {
  341.             return [NSImage imageNamed:@"PanelOn"];
  342.           }
  343.         else
  344.           {
  345.             return [NSImage imageNamed:@"PanelOff"];
  346.           }
  347.       }
  348.     else
  349.       {
  350.         return nil;
  351.       }
  352. }
  353.  
  354. - (void)textDidEndEditing:(NSNotification *)aNotification
  355. {
  356.     [self takeIntValueFrom:[[aNotification userInfo] objectForKey:@"NSFieldEditor"]];
  357.     NSBeep();
  358. }
  359.  
  360. - (void)takeIntValueFrom:(id)sender
  361. {
  362.     int hr, min, sec;
  363.     if([sender isEqual:hoursSlider])
  364.       {
  365.         [hoursField setStringValue:[NSString stringWithFormat:@"%02d",[hoursSlider intValue]]];
  366.       }
  367.     else if([sender isEqual:minutesSlider])
  368.       {
  369.         [minutesField setStringValue:[NSString stringWithFormat:@"%02d",[minutesSlider intValue]]];
  370.       }
  371.     else if([sender isEqual:secondsSlider])
  372.       {
  373.         [secondsField setStringValue:[NSString stringWithFormat:@"%02d",[secondsSlider intValue]]];
  374.       }
  375.     else if([sender isEqual:hoursField])
  376.       {
  377.         hr = [hoursField intValue];
  378.         if(hr < 24 && hr >-1)
  379.           {
  380.             [hoursSlider setIntValue:hr];
  381.             [hoursField setStringValue:[NSString stringWithFormat:@"%02d",hr]];
  382.           }
  383.         else
  384.           {
  385.             [hoursField setStringValue:[NSString stringWithFormat:@"%02d",[hoursSlider intValue]]];
  386.           }
  387.         [hoursField selectText:self];
  388.       }
  389.     else if([sender isEqual:minutesField])
  390.       {
  391.         min = [minutesField intValue];
  392.         if(min < 60 && min >-1)
  393.           {
  394.             [minutesSlider setIntValue:min];
  395.             [minutesField setStringValue:[NSString stringWithFormat:@"%02d",min]];
  396.           }
  397.         else
  398.           {
  399.             [minutesField setStringValue:[NSString stringWithFormat:@"%02d",[minutesSlider intValue]]];
  400.           }
  401.         [minutesField selectText:self];
  402.       }
  403.     else if([sender isEqual:secondsField])
  404.       {
  405.         sec = [secondsField intValue];
  406.         if(sec < 61 && sec >-1)
  407.           {
  408.             [secondsSlider setIntValue:sec];
  409.             [secondsField setStringValue:[NSString stringWithFormat:@"%02d",sec]];
  410.           }
  411.         else
  412.           {
  413.             [secondsField setStringValue:[NSString stringWithFormat:@"%02d",[secondsSlider intValue]]];
  414.           }
  415.         [secondsField selectText:self];
  416.       }
  417. }
  418.  
  419. - (void)updateControls
  420. {
  421.     int rowIndex;
  422.     int hours, minutes, seconds;
  423.     rowIndex = [remindersTable selectedRow];
  424.     if([reminderArray count] < 1)
  425.       {
  426.         [cancelButton setEnabled:NO];
  427.         [deleteButton setEnabled:NO];
  428.         [replaceButton setEnabled:NO];
  429.         [cancelMenuItem setEnabled:NO];
  430.         [deleteMenuItem setEnabled:NO];
  431.         [replaceMenuItem setEnabled:NO];
  432.       }
  433.     else if(rowIndex > -1 && rowIndex < [reminderArray count])
  434.       {
  435.         [cancelButton setEnabled:YES];
  436.         [deleteButton setEnabled:YES];
  437.         [replaceButton setEnabled:YES];
  438.         [cancelMenuItem setEnabled:YES];
  439.         [deleteMenuItem setEnabled:YES];
  440.         [replaceMenuItem setEnabled:YES];
  441.         [reminderMessageField setStringValue:[[reminderArray objectAtIndex:rowIndex] stringValue]];
  442.         if([[reminderArray objectAtIndex:rowIndex] getRepeats])
  443.           {
  444.             [repeatOnOffMatrix selectCell:[repeatOnOffMatrix cellWithTag:1]];
  445.           }
  446.         else
  447.           {
  448.             [repeatOnOffMatrix selectCell:[repeatOnOffMatrix cellWithTag:0]];
  449.             [[absoluteRelativeMatrix cellWithTag:0] setEnabled:YES];
  450.           }
  451.  
  452.         if([[reminderArray objectAtIndex:rowIndex] getRelative])
  453.           {
  454.             [absoluteRelativeMatrix selectCell:[absoluteRelativeMatrix cellWithTag:1]];
  455.             [[repeatOnOffMatrix cellWithTag:1] setEnabled:YES];
  456.           }
  457.         else
  458.           {
  459.             [[absoluteRelativeMatrix cellWithTag:0] setEnabled:YES];
  460.             [[repeatOnOffMatrix cellWithTag:1] setEnabled:NO];
  461.             [absoluteRelativeMatrix selectCell:[absoluteRelativeMatrix cellWithTag:0]];
  462.           }
  463.  
  464.         if([[reminderArray objectAtIndex:rowIndex] shouldEmitSound])
  465.           {
  466.             [soundOnOffMatrix selectCell:[soundOnOffMatrix cellWithTag:1]];
  467.           }
  468.         else
  469.           {
  470.             [soundOnOffMatrix selectCell:[soundOnOffMatrix cellWithTag:0]];
  471.           }
  472.  
  473.         if([[reminderArray objectAtIndex:rowIndex] shouldShowAlertPanel])
  474.           {
  475.             [panelOnOffMatrix selectCell:[panelOnOffMatrix cellWithTag:1]];
  476.           }
  477.         else
  478.           {
  479.             [panelOnOffMatrix selectCell:[panelOnOffMatrix cellWithTag:0]];
  480.           }
  481.  
  482.         if([[reminderArray objectAtIndex:rowIndex] getValid])
  483.           {
  484.             [[reminderArray objectAtIndex:rowIndex] remainingTime:&hours minutes:&minutes seconds:&seconds];
  485.             [hoursField setStringValue:[NSString stringWithFormat:@"%02d",hours]];
  486.             [minutesField setStringValue:[NSString stringWithFormat:@"%02d",minutes]];
  487.             [secondsField setStringValue:[NSString stringWithFormat:@"%02d",seconds]];
  488.             [hoursSlider setIntValue:hours];
  489.             [minutesSlider setIntValue:minutes];
  490.             [secondsSlider setIntValue:seconds];
  491.          }
  492.         else
  493.          {
  494.             [hoursField setStringValue:@"00"];
  495.             [minutesField setStringValue:@"00"];
  496.             [secondsField setStringValue:@"00"];
  497.             [hoursSlider setIntValue:0];
  498.             [minutesSlider setIntValue:0];
  499.             [secondsSlider setIntValue:0];
  500.          }
  501.       }
  502. }
  503.  
  504. @end
  505.