PageRenderTime 57ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/Controller.m

https://github.com/kek/khronos_time_tracker
Objective C | 2417 lines | 1504 code | 300 blank | 613 comment | 320 complexity | 3243d359c9a1355b13d2a497579db5ae MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. #import "Controller.h"
  2. #import "CUPreferenceController.h"
  3. #import "CUPreferences.h"
  4. @implementation Controller
  5. //***Main Methods***
  6. + (void)initialize
  7. {
  8. [CUPreferences initializeDefaults];
  9. }
  10. - (void)dealloc
  11. {
  12. [preferences release];
  13. [preferencesController release];
  14. [main release];
  15. // Remove Notifications.
  16. NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
  17. [nc removeObserver:self];
  18. [super dealloc];
  19. }
  20. - (void)awakeFromNib
  21. {
  22. NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
  23. // Setup the Main Variable.
  24. if(!main)
  25. main = [NSBundle mainBundle];
  26. // Setup Preferences model.
  27. if(!preferences)
  28. preferences = [[CUPreferences init] alloc];
  29. firstLaunch = [preferences firstLaunch];
  30. // Attach Notifications
  31. // Get notifications for clock setting changes.
  32. [nc addObserver:self
  33. selector:@selector(handleClockSettingsChanged:)
  34. name:CUPreferencesTimeSettingsChangedNotification
  35. object:nil];
  36. // Get notifications for table changes.
  37. [nc addObserver:self
  38. selector:@selector(handleTableChanges:)
  39. name:CUPreferencesTableNotification
  40. object:nil];
  41. // Get notifications for Preferences Reset.
  42. [nc addObserver:self
  43. selector:@selector(handlePreferencesReset:)
  44. name:CUPreferencesResetNotification
  45. object:nil];
  46. // FIXME: Need to save the window size and placement (gdey)
  47. // [mainWindow setFrameOrigin:NSMakePoint(windowY, windowX)];
  48. // [mainWindow setContentSize:NSMakeSize(windowWidth, windowHeight)];
  49. [addSessionButton setEnabled:NO];
  50. [deleteSessionButton setEnabled:NO];
  51. [editSessionButton setEnabled:NO];
  52. [deleteJobButton setEnabled:NO];
  53. [editJobButton setEnabled:NO];
  54. if (firstLaunch) [mainWindow center];
  55. jobData = [[NSMutableArray alloc] init];
  56. tableActive = [NSImage imageNamed:@"jobActive"];
  57. tableInactive = [NSImage imageNamed:@"jobInactive"];
  58. tablePaused = [NSImage imageNamed:@"jobPause"];
  59. pauseYes = [NSImage imageNamed:@"stst_pause"];
  60. pauseNo = [NSImage imageNamed:@"stst_pause2"];
  61. startStopGray = [NSImage imageNamed:@"stst_null"];
  62. startStopGreen = [NSImage imageNamed:@"stst_start"];
  63. startStopRed = [NSImage imageNamed:@"stst_stop"];
  64. menuStartStopGray = [NSImage imageNamed:@"stst_nullMB"];
  65. menuStartStopRed = [NSImage imageNamed:@"stst_stopMB"];
  66. menuStartStopGreen = [NSImage imageNamed:@"stst_startMB"];
  67. menuPauseYes = [NSImage imageNamed:@"stst_playMB"];
  68. menuPauseNo = [NSImage imageNamed:@"stst_pause2MB"];
  69. menuPauseNull = [NSImage imageNamed:@"stst_nullPauseMB"];
  70. menuJobListIcon = [NSImage imageNamed:@"MBjobSelector3"];
  71. menuJobListAltIcon = [NSImage imageNamed:@"MBjobSelector3Alt"];
  72. updateTimer = [[NSTimer scheduledTimerWithTimeInterval:(1.0) target:self selector:@selector(updateLoop) userInfo:nil repeats:YES] retain];
  73. [[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSEventTrackingRunLoopMode];
  74. [[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSModalPanelRunLoopMode];
  75. saveTimer = 0;
  76. autoDeleteTime = 0;
  77. NSFileManager *fileManager = [NSFileManager defaultManager];
  78. if ([fileManager fileExistsAtPath:[@"~/Library/Application Support/Khronos/khronosData.khd" stringByExpandingTildeInPath]])
  79. [jobData setArray:[dataHandler createJobListFromFile:[@"~/Library/Application Support/Khronos/khronosData.khd" stringByExpandingTildeInPath]]];
  80. else if ([fileManager fileExistsAtPath:@"/Library/Application Support/KhronosHelp/khronosData.khd"])
  81. [jobData setArray:[dataHandler createJobListFromFile:@"/Library/Application Support/KhronosHelp/khronosData.khd"]];
  82. int i = 0;
  83. int count = [jobData count];
  84. while (i < count)
  85. {
  86. [self computeJobTime:i];
  87. i++;
  88. }
  89. if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_2)
  90. {
  91. lastJobSorter = [[NSSortDescriptor alloc] initWithKey:@"jobNumber" ascending:YES];
  92. lastSessionSorter = [[NSSortDescriptor alloc] initWithKey:@"sessionNumber" ascending:YES];
  93. lastJobSortAscending = YES;
  94. lastSessionSortAscending = YES;
  95. }
  96. printInfo = [NSPrintInfo sharedPrintInfo];
  97. [self buildStatusItem];
  98. [self updateMenuBarJobList];
  99. [self buildJobTable];
  100. [self buildSessionTable];
  101. [jobTable setTarget:self];
  102. [jobTable setDoubleAction:@selector(tableDoubleClick:)];
  103. [sessionTable setTarget:self];
  104. [sessionTable setDoubleAction:@selector(tableDoubleClick:)];
  105. [startStopField setStringValue:@""];
  106. [mainWindow makeKeyAndOrderFront:nil];
  107. }
  108. #pragma mark Preferences Notification Handlers
  109. -(void) handleTableChanges:(NSNotification *)note
  110. {
  111. NSLog(@"Recieved Notifications %@",note);
  112. NSDictionary *userInfo = [note userInfo];
  113. if([[userInfo objectForKey:CUPreferencesTableUserInfoTableName] isEqual:CUPreferencesProjectDisplay]) {
  114. NSLog(@"Updating the Project Table.");
  115. [self buildJobTable];
  116. }
  117. if([[userInfo objectForKey:CUPreferencesTableUserInfoTableName] isEqual:CUPreferencesSessionDisplay]) {
  118. NSLog(@"Updating the Session Table.");
  119. [self buildSessionTable];
  120. }
  121. if([[userInfo objectForKey:CUPreferencesTableUserInfoTableName] isEqual:CUPreferencesMenuDisplay]){
  122. NSLog(@"Updating the Menu Table");
  123. [self buildStatusItem];
  124. }
  125. }
  126. - (void) handleClockSettingsChanged:(NSNotification *)note
  127. {
  128. NSLog(@"Recieved Notification %@",note);
  129. [jobTable reloadData];
  130. [sessionTable reloadData];
  131. }
  132. - (void)handlePreferencesReset:(NSNotification *)note
  133. {
  134. [self buildJobTable];
  135. [self buildSessionTable];
  136. }
  137. - (void)applicationWillTerminate:(NSNotification *)notification
  138. {
  139. [self saveLoop];
  140. }
  141. - (void)createNewJob:(NSString *)name client:(NSString *)client rate:(double)rate
  142. {
  143. NSMutableDictionary *tempJob = [[NSMutableDictionary alloc] init];
  144. [tempJob setObject:[NSNumber numberWithInt:[self getHighestJobNumber]] forKey:@"jobNumber"];
  145. [tempJob setObject:@"No" forKey:@"jobActive"];
  146. [tempJob setObject:name forKey:@"jobName"];
  147. [tempJob setObject:client forKey:@"clientName"];
  148. cuDateTime *tempTimeLogged = [[cuDateTime alloc] initWithTimeString:@"0:00:00"];
  149. [tempJob setObject:tempTimeLogged forKey:@"jobTimeLogged"];
  150. [tempJob setObject:[NSNumber numberWithDouble:rate] forKey:@"hourlyRate"];
  151. [tempJob setObject:[NSNumber numberWithDouble:0] forKey:@"jobCharges"];
  152. NSMutableArray *tempSessionList = [[NSMutableArray alloc] init];
  153. [tempJob setObject:tempSessionList forKey:@"sessionList"];
  154. [jobData addObject:tempJob];
  155. }
  156. - (void)createNewSession:(cuDateTime *)startDateTime endDateTime:(cuDateTime *)endDateTime job:(int)whichJob active:(BOOL)active
  157. {
  158. NSMutableDictionary *tempSession = [[NSMutableDictionary alloc] init];
  159. [tempSession setObject:[NSNumber numberWithInt:[self getHighestSessionNumber:whichJob]] forKey:@"sessionNumber"];
  160. if (active) [tempSession setObject:@"Yes" forKey:@"sessionActive"];
  161. else [tempSession setObject:@"No" forKey:@"sessionActive"];
  162. [tempSession setObject:startDateTime forKey:@"startDateTime"];
  163. [tempSession setObject:endDateTime forKey:@"endDateTime"];
  164. cuDateTime *pauseTime = [[cuDateTime alloc] init];
  165. [tempSession setObject:pauseTime forKey:@"pauseTime"];
  166. [tempSession setObject:pauseTime forKey:@"tempPauseTime"];
  167. [[[jobData objectAtIndex:whichJob] objectForKey:@"sessionList"] addObject:tempSession];
  168. [self computeJobTime:whichJob];
  169. }
  170. - (void)computeJobTime:(int)job
  171. {
  172. cuDateTime *newTime = [[[cuDateTime alloc] init] autorelease];
  173. id sessionList = [[jobData objectAtIndex:job] objectForKey:@"sessionList"];
  174. cuDateTime *mathTime = [[cuDateTime alloc] init];
  175. cuDateTime *mathTimeTwo = [[cuDateTime alloc] init];
  176. cuDateTime *mathTimeThree = [[cuDateTime alloc] init];
  177. int i = 0;
  178. int count = [sessionList count];
  179. while (i < count)
  180. {
  181. [mathTime setValues:[[[[jobData objectAtIndex:job] objectForKey:@"sessionList"] objectAtIndex:i] objectForKey:@"endDateTime"]];
  182. [mathTimeTwo setValues:[[[[jobData objectAtIndex:job] objectForKey:@"sessionList"] objectAtIndex:i] objectForKey:@"startDateTime"]];
  183. [mathTimeThree setValues:[[[[jobData objectAtIndex:job] objectForKey:@"sessionList"] objectAtIndex:i] objectForKey:@"pauseTime"]];
  184. [newTime setValues:[newTime addInterval:[mathTimeTwo getTimeInterval:mathTime]]];
  185. [newTime setValues:[newTime subtractInterval:mathTimeThree]];
  186. i++;
  187. }
  188. [[jobData objectAtIndex:job] setObject:newTime forKey:@"jobTimeLogged"];
  189. [mathTime release];
  190. [mathTimeTwo release];
  191. [mathTimeThree release];
  192. }
  193. - (void)buildJobTable
  194. {
  195. NSArray *jobTableColumns = [jobTable tableColumns];
  196. int i = [jobTableColumns count];
  197. while (i > 0)
  198. {
  199. [jobTable removeTableColumn:[jobTableColumns objectAtIndex:i - 1]];
  200. i--;
  201. }
  202. //Add Columns
  203. [jobTable addTableColumn:[tableGenerator createJobActiveColumn:[main localizedStringForKey:@"ActiveHeader" value:@"..." table:@"ProjectTable"]]];
  204. if ([preferences displayForTable:CUPreferencesProjectDisplay column:CUPreferencesProjectDisplayNumber])
  205. [jobTable addTableColumn:[tableGenerator createJobNumberColumn:[main localizedStringForKey:@"NumberHeader" value:@"#" table:@"ProjectTable"]]];
  206. if ([preferences displayForTable:CUPreferencesProjectDisplay column:CUPreferencesProjectDisplayName])
  207. [jobTable addTableColumn:[tableGenerator createJobNameColumn:[main localizedStringForKey:@"NameHeader" value:@"Project" table:@"ProjectTable"]]];
  208. if ([preferences displayForTable:CUPreferencesProjectDisplay column:CUPreferencesProjectDisplayClient])
  209. [jobTable addTableColumn:[tableGenerator createJobClientColumn:[main localizedStringForKey:@"ClientHeader" value:@"Client" table:@"ProjectTable"]]];
  210. if ([preferences displayForTable:CUPreferencesProjectDisplay column:CUPreferencesProjectDisplayRate])
  211. [jobTable addTableColumn:[tableGenerator createJobHourlyRateColumn:[main localizedStringForKey:@"RateHeader" value:@"Rate" table:@"ProjectTable"]]];
  212. if ([preferences displayForTable:CUPreferencesProjectDisplay column:CUPreferencesProjectDisplayTime])
  213. [jobTable addTableColumn:[tableGenerator createJobTimeLoggedColumn:[main localizedStringForKey:@"TimeHeader" value:@"Time Logged" table:@"ProjectTable"]]];
  214. if([preferences displayForTable:CUPreferencesProjectDisplay column:CUPreferencesProjectDisplayCharges])
  215. [jobTable addTableColumn:[tableGenerator createJobChargesColumn:[main localizedStringForKey:@"ChargesHeader" value:@"Charges" table:@"ProjectTable"]]];
  216. [jobTable reloadData];
  217. }
  218. - (void)buildSessionTable
  219. {
  220. NSArray *sessionTableColumns = [sessionTable tableColumns];
  221. int i = [sessionTableColumns count];
  222. while (i > 0)
  223. {
  224. [sessionTable removeTableColumn:[sessionTableColumns objectAtIndex:i - 1]];
  225. i--;
  226. }
  227. //Add Columns
  228. [sessionTable addTableColumn:[tableGenerator createSessionActiveColumn:
  229. [main localizedStringForKey:@"ActiveHeader" value:@"..." table:@"SessionTable"]]];
  230. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayNumber])
  231. [sessionTable addTableColumn:[tableGenerator createSessionNumberColumn:
  232. [main localizedStringForKey:@"NumberHeader" value:@"#" table:@"SessionTable"]]];
  233. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayStartDate])
  234. [sessionTable addTableColumn:[tableGenerator createSessionSDateColumn:
  235. [main localizedStringForKey:@"StartDateHeader" value:@"Date" table:@"SessionTable"]]];
  236. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayStartTime])
  237. [sessionTable addTableColumn:[tableGenerator createSessionETimeColumn:
  238. [main localizedStringForKey:@"StartTimeHeader" value:@"Time" table:@"SessionTable"]]];
  239. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayEndDate])
  240. [sessionTable addTableColumn:[tableGenerator createSessionEDateColumn:
  241. [main localizedStringForKey:@"EndDateHeader" value:@"End Date" table:@"SessionTable"]]];
  242. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayEndTime])
  243. [sessionTable addTableColumn:[tableGenerator createSessionETimeColumn:
  244. [main localizedStringForKey:@"EndTimeHeader" value:@"End Time" table:@"SessionTable"]]];
  245. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayPauseTime])
  246. [sessionTable addTableColumn:[tableGenerator createSessionPauseTimeColumn:
  247. [main localizedStringForKey:@"PauseTimeHeader" value:@"Pauses" table:@"SessionTable"]]];
  248. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayTotalTime])
  249. [sessionTable addTableColumn:[tableGenerator createSessionTotalTimeColumn:
  250. [main localizedStringForKey:@"TotalTimeHeader" value:@"Total Time" table:@"SessionTable"]]];
  251. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayCharges])
  252. [sessionTable addTableColumn:[tableGenerator createSessionChargesColumn:
  253. [main localizedStringForKey:@"ChargesHeader" value:@"Charges" table:@"SessionTable"]]];
  254. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplaySummary])
  255. [sessionTable addTableColumn:[tableGenerator createSessionSummaryColumn:
  256. [main localizedStringForKey:@"SummaryHeader" value:@"Summary" table:@"SessionTable"]]];
  257. [sessionTable reloadData];
  258. }
  259. - (void)buildPrintTable
  260. {
  261. NSArray *tableColumns = [printTable tableColumns];
  262. int i = [tableColumns count];
  263. while (i > 0)
  264. {
  265. [printTable removeTableColumn:[tableColumns objectAtIndex:i - 1]];
  266. i--;
  267. }
  268. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayNumber])
  269. [printTable addTableColumn:[tableGenerator createSessionNumberColumn:
  270. [main localizedStringForKey:@"NumberHeader" value:@"#" table:@"SessionTable"]]];
  271. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayStartDate])
  272. [printTable addTableColumn:[tableGenerator createSessionSDateColumn:
  273. [main localizedStringForKey:@"StartDateHeader" value:@"Date" table:@"SessionTable"]]];
  274. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayStartTime])
  275. [printTable addTableColumn:[tableGenerator createSessionETimeColumn:
  276. [main localizedStringForKey:@"StartTimeHeader" value:@"Time" table:@"SessionTable"]]];
  277. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayEndDate])
  278. [printTable addTableColumn:[tableGenerator createSessionEDateColumn:
  279. [main localizedStringForKey:@"EndDateHeader" value:@"End Date" table:@"SessionTable"]]];
  280. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayEndTime])
  281. [printTable addTableColumn:[tableGenerator createSessionETimeColumn:
  282. [main localizedStringForKey:@"EndTimeHeader" value:@"End Time" table:@"SessionTable"]]];
  283. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayPauseTime])
  284. [printTable addTableColumn:[tableGenerator createSessionPauseTimeColumn:
  285. [main localizedStringForKey:@"PauseTimeHeader" value:@"Pauses" table:@"SessionTable"]]];
  286. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayTotalTime])
  287. [printTable addTableColumn:[tableGenerator createSessionTotalTimeColumn:
  288. [main localizedStringForKey:@"TotalTimeHeader" value:@"Total Time" table:@"SessionTable"]]];
  289. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplayCharges])
  290. [printTable addTableColumn:[tableGenerator createSessionChargesColumn:
  291. [main localizedStringForKey:@"ChargesHeader" value:@"Charges" table:@"SessionTable"]]];
  292. if ([preferences displayForTable:CUPreferencesSessionDisplay column:CUPreferencesSessionDisplaySummary])
  293. [printTable addTableColumn:[tableGenerator createSessionSummaryColumn:
  294. [main localizedStringForKey:@"SummaryHeader" value:@"Summary" table:@"SessionTable"]]];
  295. [printTable reloadData];
  296. }
  297. - (NSString *)formatterString
  298. {
  299. int time = [preferences updateTimeEvery];
  300. if (time == 0) return @"second";
  301. if (time == 15) return @"quarter";
  302. if (time == 30) return @"half";
  303. if (time == 60) return @"hour";
  304. return nil;
  305. }
  306. - (void)updatePrintWindowFields
  307. {
  308. [printJobName setStringValue:[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobName"]];
  309. [printClientName setStringValue:[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"clientName"]];
  310. NSMutableString *hourlyRateFormatted = [[NSMutableString alloc] init];
  311. [hourlyRateFormatted appendString:[preferences monetaryUnit]];
  312. [hourlyRateFormatted appendString:[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"hourlyRate"] stringValue]];
  313. [printHourlyRate setStringValue:hourlyRateFormatted];
  314. cuDateTime *tempTimeLogged = [[cuDateTime alloc] init];
  315. [tempTimeLogged setValues:[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobTimeLogged"]];
  316. [printTotalTimeLogged setStringValue:[tempTimeLogged getTimeStringFor:[preferences updateTimeEvery]]];
  317. NSNumber *rate = [[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"hourlyRate"];
  318. NSString *formatterString = [self formatterString];
  319. NSMutableString *chargeNumberString = [[NSMutableString alloc] init];
  320. [chargeNumberString setString:[[NSNumber numberWithDouble:[tempTimeLogged calculateCharges:[rate doubleValue]
  321. format:formatterString]] stringValue]];
  322. [chargeNumberString setString:[self truncateChargeString:chargeNumberString]];
  323. NSMutableString *tempChargesString = [[NSMutableString alloc] init];
  324. [tempChargesString appendString:[preferences monetaryUnit]];
  325. [tempChargesString appendString:chargeNumberString];
  326. [printTotalCharges setStringValue:tempChargesString];
  327. [printWindow setContentSize:NSMakeSize(482, 235)];
  328. int i = 0;
  329. int count = [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] count];
  330. while (i < count)
  331. {
  332. [printWindow setContentSize:NSMakeSize(482, i * 19 + 235)];
  333. i++;
  334. }
  335. }
  336. - (void)buildStatusItem
  337. {
  338. [[NSStatusBar systemStatusBar] removeStatusItem:menuPauseButton];
  339. [[NSStatusBar systemStatusBar] removeStatusItem:menuStartStopButton];
  340. [[NSStatusBar systemStatusBar] removeStatusItem:jobPullDownMenu];
  341. [[NSStatusBar systemStatusBar] removeStatusItem:menuChargeDisplay];
  342. [[NSStatusBar systemStatusBar] removeStatusItem:menuTimeDisplay];
  343. if ([preferences displayForTable:CUPreferencesMenuDisplay column:CUPreferencesMenuDisplayRecrodingButton])
  344. {
  345. menuStartStopButton = [[[NSStatusBar systemStatusBar] statusItemWithLength:25] retain];
  346. [menuStartStopButton setHighlightMode:NO];
  347. [menuStartStopButton setImage:menuStartStopGray];
  348. [menuStartStopButton setTarget:self];
  349. [menuStartStopButton setAction:@selector(startStopRecording:)];
  350. [menuStartStopButton setEnabled:YES];
  351. }
  352. if ([preferences displayForTable:CUPreferencesMenuDisplay column:CUPreferencesMenuDisplayPauseButton])
  353. {
  354. menuPauseButton = [[[NSStatusBar systemStatusBar] statusItemWithLength:25] retain];
  355. [menuPauseButton setHighlightMode:NO];
  356. [menuPauseButton setImage:menuPauseNull];
  357. [menuPauseButton setTarget:self];
  358. [menuPauseButton setAction:@selector(pauseUnpause:)];
  359. [menuPauseButton setEnabled:YES];
  360. }
  361. if ([preferences displayForTable:CUPreferencesMenuDisplay column:CUPreferencesMenuDisplayProjectList]
  362. && floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_2)
  363. {
  364. jobPullDownMenu = [[[NSStatusBar systemStatusBar] statusItemWithLength:25] retain];
  365. [jobPullDownMenu setHighlightMode:YES];
  366. [jobPullDownMenu setImage:menuJobListIcon];
  367. [jobPullDownMenu setAlternateImage:menuJobListAltIcon];
  368. [jobPullDownMenu setMenu:menuJobList];
  369. [jobPullDownMenu setEnabled:YES];
  370. }
  371. if ([preferences displayForTable:CUPreferencesMenuDisplay column:CUPreferencesMenuDisplayTotalTime])
  372. {
  373. menuTimeDisplay = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain];
  374. [menuTimeDisplay setHighlightMode:NO];
  375. [menuTimeDisplay setTitle:@""];
  376. [menuTimeDisplay setEnabled:YES];
  377. }
  378. if ([preferences displayForTable:CUPreferencesMenuDisplay column:CUPreferencesMenuDisplayCharges])
  379. {
  380. menuChargeDisplay = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] retain];
  381. [menuChargeDisplay setHighlightMode:NO];
  382. [menuChargeDisplay setTitle:@""];
  383. [menuChargeDisplay setEnabled:YES];
  384. }
  385. }
  386. - (void)updateLoop
  387. {
  388. saveTimer++;
  389. if (saveTimer > [preferences autoSaveTime] * 60) [self saveLoop];
  390. int i = 0;
  391. int count = [jobData count];
  392. int j = 0;
  393. int sessionCount = 0;
  394. while (i < count)
  395. {
  396. if ([[[jobData objectAtIndex:i] objectForKey:@"jobActive"] isEqualTo:@"Yes"])
  397. {
  398. sessionCount = [[[jobData objectAtIndex:i] objectForKey:@"sessionList"] count];
  399. while (j < sessionCount)
  400. {
  401. if ([[[[[jobData objectAtIndex:i] objectForKey:@"sessionList"] objectAtIndex:j] objectForKey:@"sessionActive"] isEqualTo:@"Yes"])
  402. {
  403. [[[[jobData objectAtIndex:i] objectForKey:@"sessionList"] objectAtIndex:j]
  404. setObject:[[[cuDateTime alloc] initWithCurrentDateAndTime] autorelease] forKey:@"endDateTime"];
  405. }
  406. j++;
  407. }
  408. [self computeJobTime:i];
  409. [jobTable reloadData];
  410. [sessionTable reloadData];
  411. }
  412. if ([[[jobData objectAtIndex:i] objectForKey:@"jobActive"] isEqualTo:@"Paused"])
  413. {
  414. sessionCount = [[[jobData objectAtIndex:i] objectForKey:@"sessionList"] count];
  415. while (j < sessionCount)
  416. {
  417. if ([[[[[jobData objectAtIndex:i] objectForKey:@"sessionList"] objectAtIndex:j] objectForKey:@"sessionActive"] isEqualTo:@"Paused"])
  418. {
  419. [[[[jobData objectAtIndex:i] objectForKey:@"sessionList"] objectAtIndex:j]
  420. setObject:[[[cuDateTime alloc] initWithCurrentDateAndTime] autorelease] forKey:@"pauseStop"];
  421. cuDateTime *tempStartTime = [[cuDateTime alloc] init];
  422. [tempStartTime setValues:[[[[jobData objectAtIndex:i] objectForKey:@"sessionList"] objectAtIndex:j]
  423. objectForKey:@"pauseStart"]];
  424. cuDateTime *tempEndTime = [[cuDateTime alloc] init];
  425. [tempEndTime setValues:[[[[jobData objectAtIndex:i] objectForKey:@"sessionList"] objectAtIndex:j]
  426. objectForKey:@"pauseStop"]];
  427. [[[[jobData objectAtIndex:i] objectForKey:@"sessionList"] objectAtIndex:j]
  428. setObject:[tempStartTime getTimeInterval:tempEndTime] forKey:@"tempPauseTime"];
  429. [tempStartTime release];
  430. [tempEndTime release];
  431. }
  432. j++;
  433. }
  434. [self computeJobTime:i];
  435. [jobTable reloadData];
  436. [sessionTable reloadData];
  437. }
  438. j = 0;
  439. i++;
  440. }
  441. [self updateMenuBarData];
  442. }
  443. - (void)updateMenuBarData
  444. {
  445. if ([jobTable selectedRow] != -1)
  446. {
  447. id tempMenuTime = [[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobTimeLogged"];
  448. if ([preferences displayForTable:CUPreferencesMenuDisplay column:CUPreferencesMenuDisplayTotalTime])
  449. {
  450. [menuTimeDisplay setTitle:[tempMenuTime getTimeStringFor:[preferences updateTimeEvery]]];
  451. }
  452. if ([preferences displayForTable:CUPreferencesMenuDisplay column:CUPreferencesMenuDisplayCharges])
  453. {
  454. NSNumber *rate = [[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"hourlyRate"];
  455. NSString *formatterString = [self formatterString];
  456. NSMutableString *chargeNumberString = [[[NSMutableString alloc] init] autorelease];
  457. [chargeNumberString setString:[[NSNumber numberWithDouble:[tempMenuTime calculateCharges:[rate doubleValue]
  458. format:formatterString]] stringValue]];
  459. [chargeNumberString setString:[self truncateChargeString:chargeNumberString]];
  460. NSMutableString *tempChargesString = [[[NSMutableString alloc] init] autorelease];
  461. [tempChargesString appendString:[preferences monetaryUnit]];
  462. [tempChargesString appendString:chargeNumberString];
  463. [menuChargeDisplay setTitle:tempChargesString];
  464. }
  465. int i = [menuJobList numberOfItems] - 1;
  466. while (i >= 0)
  467. {
  468. [[menuJobList itemAtIndex:i] setState:NSOffState];
  469. i--;
  470. }
  471. [[menuJobList itemAtIndex:[jobTable selectedRow]] setState:NSOnState];
  472. }
  473. else
  474. {
  475. [menuTimeDisplay setTitle:@""];
  476. [menuChargeDisplay setTitle:@""];
  477. int i = [menuJobList numberOfItems] - 1;
  478. while (i >= 0)
  479. {
  480. [[menuJobList itemAtIndex:i] setState:NSOffState];
  481. i--;
  482. }
  483. }
  484. }
  485. - (void)updateMenuBarJobList
  486. {
  487. int i = [menuJobList numberOfItems] - 1;
  488. while (i >= 0)
  489. {
  490. [menuJobList removeItemAtIndex:i];
  491. i--;
  492. }
  493. int j = [jobData count] - 1;
  494. while (j >= 0)
  495. {
  496. [self addJobToMenuList:[[jobData objectAtIndex:j] objectForKey:@"jobName"]];
  497. j--;
  498. }
  499. }
  500. - (void)updateMenuBarButtons
  501. {
  502. if ([jobTable selectedRow] == -1)
  503. {
  504. [menuStartStopButton setImage:menuStartStopGray];
  505. [menuPauseButton setImage:menuPauseNull];
  506. }
  507. else
  508. {
  509. if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Yes"])
  510. {
  511. [menuStartStopButton setImage:menuStartStopRed];
  512. [menuPauseButton setImage:menuPauseNo];
  513. }
  514. else if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"No"])
  515. {
  516. [menuStartStopButton setImage:menuStartStopGreen];
  517. [menuPauseButton setImage:menuPauseNull];
  518. }
  519. else if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Paused"])
  520. {
  521. [menuStartStopButton setImage:menuStartStopRed];
  522. [menuPauseButton setImage:menuPauseYes];
  523. }
  524. }
  525. }
  526. - (void)addJobToMenuList:(NSString *)jobName
  527. {
  528. NSMenuItem *tempMenuItem = [[NSMenuItem alloc] initWithTitle:jobName action:@selector(jobMenuListSelectionChanged:) keyEquivalent:@""];
  529. [tempMenuItem setTarget:self];
  530. [menuJobList insertItem:tempMenuItem atIndex:0];
  531. }
  532. - (void)jobMenuListSelectionChanged:(id)sender
  533. {
  534. if ([sender state] == NSOffState)
  535. {
  536. [sender setState:NSOnState];
  537. [jobTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[menuJobList indexOfItem:sender]] byExtendingSelection:YES];
  538. }
  539. }
  540. - (void)saveLoop
  541. {
  542. saveTimer = 0;
  543. [dataHandler saveJobListToFile:jobData];
  544. }
  545. - (int)getHighestJobNumber
  546. {
  547. if ([jobData count] == 0) return 1;
  548. else
  549. {
  550. int testInt = 2;
  551. int i = 0;
  552. int count = [jobData count];
  553. while (i < count)
  554. {
  555. if ([[[jobData objectAtIndex:i] objectForKey:@"jobNumber"] intValue] >= testInt)
  556. testInt = [[[jobData objectAtIndex:i] objectForKey:@"jobNumber"] intValue] + 1;
  557. i++;
  558. }
  559. return testInt;
  560. }
  561. }
  562. - (int)getHighestSessionNumber:(int)whichJob
  563. {
  564. id sessionList = [[jobData objectAtIndex:whichJob] objectForKey:@"sessionList"];
  565. if ([sessionList count] == 0) return 1;
  566. else
  567. {
  568. int testInt = 2;
  569. int i = 0;
  570. int count = [sessionList count];
  571. while (i < count)
  572. {
  573. if ([[[sessionList objectAtIndex:i] objectForKey:@"sessionNumber"] intValue] >= testInt)
  574. testInt = [[[sessionList objectAtIndex:i] objectForKey:@"sessionNumber"] intValue] + 1;
  575. i++;
  576. }
  577. return testInt;
  578. }
  579. }
  580. - (NSString *)truncateChargeString:(NSString *)originalString
  581. {
  582. NSMutableString *tempString = [[[NSMutableString alloc] init] autorelease];
  583. [tempString setString:originalString];
  584. int i = 0;
  585. int count = [tempString length];
  586. int periodLocation = -1;
  587. while (i < count)
  588. {
  589. if ([tempString characterAtIndex:i] == '.') periodLocation = i;
  590. i++;
  591. }
  592. if (periodLocation == 0) [tempString insertString:@"0" atIndex:0];
  593. if (count - periodLocation > 2 && periodLocation != -1) [tempString deleteCharactersInRange:NSMakeRange(periodLocation + 3, count - periodLocation - 3)];
  594. if (count - periodLocation == 2 && periodLocation != -1) [tempString appendString:@"0"];
  595. return tempString;
  596. }
  597. //***TableView Methods***
  598. - (int)numberOfRowsInTableView:(NSTableView *)tableView
  599. {
  600. if (tableView == jobTable)
  601. return [jobData count];
  602. else if ([jobTable selectedRow] != -1)
  603. return [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] count];
  604. else
  605. return 0;
  606. }
  607. - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex
  608. {
  609. id theRow;
  610. id theValue = nil;
  611. if (tableView == jobTable)
  612. {
  613. theRow = [jobData objectAtIndex:rowIndex];
  614. if ([[tableColumn identifier] isEqualTo:@"jobActive"])
  615. {
  616. if ([[theRow objectForKey:@"jobActive"] isEqualTo:@"No"]) theValue = tableInactive;
  617. else if ([[theRow objectForKey:@"jobActive"] isEqualTo:@"Yes"]) theValue = tableActive;
  618. else if ([[theRow objectForKey:@"jobActive"] isEqualTo:@"Paused"]) theValue = tablePaused;
  619. }
  620. else if ([[tableColumn identifier] isEqualTo:@"hourlyRate"])
  621. {
  622. NSMutableString *hourlyRateString = [[[NSMutableString alloc] init] autorelease];
  623. [hourlyRateString appendString:[preferences monetaryUnit]];
  624. [hourlyRateString appendString:[[[jobData objectAtIndex:rowIndex] objectForKey:@"hourlyRate"] stringValue]];
  625. [hourlyRateString appendString:[textHourSuffix stringValue]];
  626. theValue = hourlyRateString;
  627. }
  628. else if ([[tableColumn identifier] isEqualTo:@"jobTimeLogged"] || [[tableColumn identifier] isEqualTo:@"jobCharges"])
  629. {
  630. cuDateTime *tempTimeLogged = [[[cuDateTime alloc] init] autorelease];
  631. [tempTimeLogged setValues:[[jobData objectAtIndex:rowIndex] objectForKey:@"jobTimeLogged"]];
  632. if ([[tableColumn identifier] isEqualTo:@"jobTimeLogged"])
  633. {
  634. theValue = [tempTimeLogged getTimeStringFor:[preferences updateTimeEvery]];
  635. }
  636. else
  637. {
  638. NSNumber *rate = [[jobData objectAtIndex:rowIndex] objectForKey:@"hourlyRate"];
  639. NSString *formatterString = [self formatterString];
  640. NSMutableString *chargeNumberString = [[[NSMutableString alloc] init] autorelease];
  641. [chargeNumberString setString:[[NSNumber numberWithDouble:[tempTimeLogged calculateCharges:[rate doubleValue]
  642. format:formatterString]] stringValue]];
  643. [chargeNumberString setString:[self truncateChargeString:chargeNumberString]];
  644. NSMutableString *tempChargesString = [[[NSMutableString alloc] init] autorelease];
  645. [tempChargesString appendString:[preferences monetaryUnit]];
  646. [tempChargesString appendString:chargeNumberString];
  647. theValue = tempChargesString;
  648. }
  649. }
  650. else theValue = [theRow objectForKey:[tableColumn identifier]];
  651. }
  652. else if ([jobTable selectedRow] != -1)
  653. {
  654. if (rowIndex < [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] count]){
  655. theRow = [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:rowIndex];
  656. if ([[tableColumn identifier] isEqualTo:@"sessionActive"])
  657. {
  658. if ([[theRow objectForKey:@"sessionActive"] isEqualTo:@"No"]) theValue = tableInactive;
  659. else if ([[theRow objectForKey:@"sessionActive"] isEqualTo:@"Yes"]) theValue = tableActive;
  660. else if ([[theRow objectForKey:@"sessionActive"] isEqualTo:@"Paused"]) theValue = tablePaused;
  661. }
  662. else if ([[tableColumn identifier] isEqualTo:@"startDate"])
  663. {
  664. theValue = [[theRow objectForKey:@"startDateTime"] getDateString];
  665. }
  666. else if ([[tableColumn identifier] isEqualTo:@"startTime"])
  667. {
  668. if ([preferences is24HourClock]) theValue = [[theRow objectForKey:@"startDateTime"] getTimeString];
  669. else theValue = [[theRow objectForKey:@"startDateTime"] getTwelveHourTimeString];
  670. }
  671. else if ([[tableColumn identifier] isEqualTo:@"endDate"])
  672. {
  673. theValue = [[theRow objectForKey:@"endDateTime"] getDateString];
  674. }
  675. else if ([[tableColumn identifier] isEqualTo:@"endTime"])
  676. {
  677. if ([preferences is24HourClock]) theValue = [[theRow objectForKey:@"endDateTime"] getTimeString];
  678. else theValue = [[theRow objectForKey:@"endDateTime"] getTwelveHourTimeString];
  679. }
  680. else if ([[tableColumn identifier] isEqualTo:@"totalTime"] || [[tableColumn identifier] isEqualTo:@"sessionCharges"])
  681. {
  682. cuDateTime *tempInterval = [[[cuDateTime alloc] init] autorelease];
  683. [tempInterval setValues:[[theRow objectForKey:@"startDateTime"] getTimeInterval:[theRow objectForKey:@"endDateTime"]]];
  684. [tempInterval setValues:[tempInterval subtractInterval:[theRow objectForKey:@"pauseTime"]]];
  685. NSString *formatterString = [self formatterString];
  686. if ([[tableColumn identifier] isEqualTo:@"totalTime"])
  687. {
  688. if ([formatterString isEqualTo:@"second"]) theValue = [tempInterval getTimeString];
  689. else if ([formatterString isEqualTo:@"minute"]) theValue = [tempInterval getTimeString:NO];
  690. else theValue = [tempInterval getFormattedTimeString:formatterString];
  691. }
  692. else if ([[tableColumn identifier] isEqualTo:@"sessionCharges"])
  693. {
  694. NSNumber *rate = [[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"hourlyRate"];
  695. NSMutableString *chargeNumberString = [[[NSMutableString alloc] init] autorelease];
  696. [chargeNumberString setString:[[NSNumber numberWithDouble:[tempInterval calculateCharges:[rate doubleValue]
  697. format:formatterString]] stringValue]];
  698. [chargeNumberString setString:[self truncateChargeString:chargeNumberString]];
  699. NSMutableString *tempChargesString = [[[NSMutableString alloc] init] autorelease];
  700. [tempChargesString appendString:[preferences monetaryUnit]];
  701. [tempChargesString appendString:chargeNumberString];
  702. theValue = tempChargesString;
  703. }
  704. }
  705. else if ([[tableColumn identifier] isEqualTo:@"pauseTime"])
  706. {
  707. cuDateTime *tempPauseTime = [[[cuDateTime alloc] init] autorelease];
  708. [tempPauseTime setValues:[theRow objectForKey:@"pauseTime"]];
  709. [tempPauseTime setValues:[tempPauseTime addInterval:[theRow objectForKey:@"tempPauseTime"]]];
  710. theValue = [tempPauseTime getTimeString];
  711. }
  712. else theValue = [theRow objectForKey:[tableColumn identifier]];
  713. }}
  714. return theValue;
  715. }
  716. - (void)tableView:(NSTableView *)tableView mouseDownInHeaderOfTableColumn:(NSTableColumn *)tableColumn
  717. {
  718. if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_2)
  719. {
  720. if (tableView == jobTable)
  721. {
  722. NSSortDescriptor *newSorter = [[NSSortDescriptor alloc] initWithKey:[tableColumn identifier] ascending:lastJobSortAscending];
  723. NSMutableArray *sortDescriptors = [[NSMutableArray alloc] init];
  724. [sortDescriptors addObject:newSorter];
  725. [sortDescriptors addObject:lastJobSorter];
  726. [jobData setArray:[jobData sortedArrayUsingDescriptors:sortDescriptors]];
  727. lastJobSortAscending = !lastJobSortAscending;
  728. if (![[lastJobSorter key] isEqualTo:[tableColumn identifier]])
  729. lastJobSorter = [[NSSortDescriptor alloc] initWithKey:[tableColumn identifier] ascending:lastJobSortAscending];
  730. [jobTable reloadData];
  731. [sessionTable reloadData];
  732. [self updateMenuBarJobList];
  733. }
  734. if (tableView == sessionTable && [jobTable selectedRow] != -1)
  735. {
  736. NSSortDescriptor *newSorter = [[NSSortDescriptor alloc] initWithKey:[tableColumn identifier] ascending:lastJobSortAscending];
  737. NSMutableArray *sortDescriptors = [[NSMutableArray alloc] init];
  738. [sortDescriptors addObject:newSorter];
  739. [sortDescriptors addObject:lastSessionSorter];
  740. [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] setArray:[[[jobData objectAtIndex:[jobTable selectedRow]]
  741. objectForKey:@"sessionList"] sortedArrayUsingDescriptors:sortDescriptors]];
  742. lastSessionSortAscending = !lastSessionSortAscending;
  743. if (![[lastSessionSorter key] isEqualTo:[tableColumn identifier]])
  744. lastSessionSorter = [[NSSortDescriptor alloc] initWithKey:[tableColumn identifier] ascending:lastSessionSortAscending];
  745. [jobTable reloadData];
  746. [sessionTable reloadData];
  747. }
  748. }
  749. }
  750. - (void)tableViewSelectionDidChange:(NSNotification *)notification
  751. {
  752. if ([notification object] == jobTable)
  753. {
  754. if ([jobTable selectedRow] != -1)
  755. {
  756. [addSessionButton setEnabled:YES]; [deleteJobButton setEnabled:YES]; [editJobButton setEnabled:YES];
  757. if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"No"])
  758. {
  759. [pauseButton setImage:nil];
  760. [pauseButton setAlternateImage:nil];
  761. [startStopButton setImage:startStopGreen];
  762. [startStopButton setAlternateImage:startStopGreen];
  763. [self updateMenuBarButtons];
  764. [startStopField setStringValue:[textStartRecording stringValue]];
  765. }
  766. else if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Yes"])
  767. {
  768. [pauseButton setImage:pauseNo];
  769. [pauseButton setAlternateImage:pauseNo];
  770. [startStopButton setImage:startStopRed];
  771. [startStopButton setAlternateImage:startStopRed];
  772. [self updateMenuBarButtons];
  773. [startStopField setStringValue:[textStopRecording stringValue]];
  774. }
  775. else if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Paused"])
  776. {
  777. [startStopButton setImage:startStopRed];
  778. [startStopButton setAlternateImage:startStopRed];
  779. [pauseButton setImage:pauseYes];
  780. [pauseButton setAlternateImage:pauseYes];
  781. [self updateMenuBarButtons];
  782. [startStopField setStringValue:[textStopRecording stringValue]];
  783. }
  784. [self updateMenuBarData];
  785. }
  786. else
  787. {
  788. [addSessionButton setEnabled:NO]; [deleteJobButton setEnabled:NO]; [editJobButton setEnabled:NO];
  789. [startStopButton setImage:startStopGray];
  790. [startStopButton setAlternateImage:startStopGray];
  791. [pauseButton setImage:nil];
  792. [pauseButton setAlternateImage:nil];
  793. [self updateMenuBarButtons];
  794. [menuChargeDisplay setTitle:@""];
  795. [menuTimeDisplay setTitle:@""];
  796. int i = [menuJobList numberOfItems] - 1;
  797. while (i >= 0)
  798. {
  799. [[menuJobList itemAtIndex:i] setState:NSOffState];
  800. i--;
  801. }
  802. [startStopField setStringValue:@""];
  803. }
  804. [sessionTable reloadData];
  805. }
  806. else if ([notification object] == sessionTable)
  807. {
  808. if ([sessionTable selectedRow] == -1)
  809. {
  810. [deleteSessionButton setEnabled:NO]; [editSessionButton setEnabled:NO];
  811. }
  812. else
  813. {
  814. [deleteSessionButton setEnabled:YES]; [editSessionButton setEnabled:YES];
  815. }
  816. }
  817. }
  818. - (void)tableDoubleClick:(NSTableView *)tableView
  819. {
  820. if (tableView == jobTable) [self editJob];
  821. else [self editSession];
  822. }
  823. - (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(int)rowIndex
  824. {
  825. if (tableView == sessionTable)
  826. [[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:rowIndex] setObject:anObject forKey:@"sessionSummary"];
  827. }
  828. - (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row
  829. {
  830. if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_2)
  831. {
  832. if (![[tableColumn identifier] isEqualTo:@"jobActive"] && ![[tableColumn identifier] isEqualTo:@"sessionActive"])
  833. {
  834. [cell setDrawsBackground:YES];
  835. if (row % 2) [cell setBackgroundColor:[NSColor whiteColor]];
  836. else [cell setBackgroundColor:[NSColor colorWithCalibratedRed:0.9 green:0.9 blue:0.9 alpha:1.0]];
  837. [tableView setIntercellSpacing:NSMakeSize(0, 0)];
  838. }
  839. }
  840. }
  841. //***Buttons***
  842. //Main Window
  843. - (IBAction)startStopRecording:(id)sender
  844. {
  845. if ([jobTable selectedRow] != -1)
  846. {
  847. if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"No"])
  848. {
  849. [[jobData objectAtIndex:[jobTable selectedRow]] setObject:@"Yes" forKey:@"jobActive"];
  850. cuDateTime *newStart = [[[cuDateTime alloc] initWithCurrentDateAndTime] autorelease];
  851. cuDateTime *newEnd = [[[cuDateTime alloc] initWithCurrentDateAndTime] autorelease];
  852. [self createNewSession:newStart endDateTime:newEnd job:[jobTable selectedRow] active:YES];
  853. [startStopButton setImage:startStopRed];
  854. [startStopButton setAlternateImage:startStopRed];
  855. [pauseButton setImage:pauseNo];
  856. [pauseButton setAlternateImage:pauseNo];
  857. [self updateMenuBarButtons];
  858. [startStopField setStringValue:[textStopRecording stringValue]];
  859. [jobTable reloadData];
  860. [sessionTable reloadData];
  861. }
  862. else if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Yes"] ||
  863. [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Paused"])
  864. {
  865. [[jobData objectAtIndex:[jobTable selectedRow]] setObject:@"No" forKey:@"jobActive"];
  866. int count = [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] count];
  867. [[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:count - 1]
  868. setObject:@"No" forKey:@"sessionActive"];
  869. [startStopButton setImage:startStopGreen];
  870. [startStopButton setAlternateImage:startStopGreen];
  871. [pauseButton setImage:nil];
  872. [pauseButton setAlternateImage:nil];
  873. [self updateMenuBarButtons];
  874. [startStopField setStringValue:[textStartRecording stringValue]];
  875. cuDateTime *tempStart = [[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:count - 1] objectForKey:@"startDateTime"];
  876. cuDateTime *tempEnd = [[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:count - 1] objectForKey:@"endDateTime"];
  877. // TODO: Should this autoSaveTime and not autoDeleteSettings?
  878. if ([[tempStart getTimeInterval:tempEnd] getHour] < 1 && [[tempStart getTimeInterval:tempEnd] getMinute] < [preferences autoDeleteSettings])
  879. {
  880. [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] removeObjectAtIndex:count - 1];
  881. [self computeJobTime:[jobTable selectedRow]];
  882. [self updateMenuBarData];
  883. }
  884. [jobTable reloadData];
  885. [sessionTable reloadData];
  886. }
  887. }
  888. }
  889. - (IBAction)pauseUnpause:(id)sender;
  890. {
  891. if ([jobTable selectedRow] != -1 && ![[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"No"])
  892. {
  893. int i = 0;
  894. int count = [[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] count];
  895. if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Yes"])
  896. {
  897. [[jobData objectAtIndex:[jobTable selectedRow]] setObject:@"Paused" forKey:@"jobActive"];
  898. while (i < count)
  899. {
  900. if ([[[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:i]
  901. objectForKey:@"sessionActive"] isEqualTo:@"Yes"])
  902. {
  903. [[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:i]
  904. setObject:@"Paused" forKey:@"sessionActive"];
  905. [[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtIndex:i]
  906. setObject:[[cuDateTime alloc] initWithCurrentDateAndTime] forKey:@"pauseStart"];
  907. [[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"]
  908. objectAtIndex:i] setObject:[[[cuDateTime alloc] initWithCurrentDateAndTime] autorelease] forKey:@"pauseStop"];
  909. }
  910. i++;
  911. }
  912. [pauseButton setImage:pauseYes];
  913. [pauseButton setAlternateImage:pauseYes];
  914. [self updateMenuBarButtons];
  915. [jobTable reloadData];
  916. [sessionTable reloadData];
  917. }
  918. else if ([[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"jobActive"] isEqualTo:@"Paused"])
  919. {
  920. [[jobData objectAtIndex:[jobTable selectedRow]] setObject:@"Yes" forKey:@"jobActive"];
  921. while (i < count)
  922. {
  923. if ([[[[[jobData objectAtIndex:[jobTable selectedRow]] objectForKey:@"sessionList"] objectAtInde

Large files files are truncated, but you can click here to view the full file