#import "MyDocument.h"
#import "LogItem.h"
#import "GetEntry.h"
@implementation MyDocument
- (void)updateTotal {
[totalField setObjectValue: [NSNumber numberWithInt:[[self logItems] count]]];
}
- (void)updateViews {
[self updateTotal];
[tableview reloadData];
}
- (void)createNewLogItem:(id)sender {
int row;
[GetEntry getEntry: [self logItems]];
//Select and show thelast item added!
row = [[self logItems] count] - 1;
[self updateViews];
[tableview selectRow: row byExtendingSelection: NO];
[tableview scrollRowToVisible: row];
[self updateChangeCount: NSChangeDone];
}
- (void)deleteSelectedLogItem:(id)sender {
int row = [tableview selectedRow];
if (row != -1) {
[[self logItems] removeObjectAtIndex: row];
[tableview noteNumberOfRowsChanged];
if (--row >= 0) {
[tableview selectRow: row byExtendingSelection: NO];
[tableview scrollRowToVisible: row];
}
[self updateTotal];
[self updateChangeCount: NSChangeDone];
}
}
- (int)numberOfRowsInTableView:(NSTableView *)tv {
[self updateTotal];
return [[self logItems] count];
}
- (id)tableView:(NSTableView *)tv
objectValueForTableColumn: (NSTableColumn *)tc
row: (int)row
{
/*
The table column identifier (NB not title, think of localisation)
should be the name of the instance variable it will dispplay.
We can therefore retrieve the variable using key-value coding
rather than having to have switch statements for each value.
*/
/* Compute and Format the delta in Seconds */
if ([[tc identifier] isEqualTo: @"delta"] ){
SInt32 delta;
if (row != 0){
UInt32 current = [[[[self logItems] objectAtIndex: row] valueForKey: @"time"]unsignedIntValue];
UInt32 previous = [[[[self logItems] objectAtIndex: row - 1] valueForKey: @"time"]unsignedIntValue];
delta = current - previous;
}
else{
delta = 0;
}
if (delta > 999999 || delta < 0)
delta = 999999;
return [NSNumber numberWithLong:delta];
}
/* Format the time in Seconds */
if ([[tc identifier] isEqualTo: @"time"] ){
char newTime[255];
UInt32 raw = [[[[self logItems] objectAtIndex: row] valueForKey: [tc identifier]]unsignedIntValue];
UInt32 secs = raw / 1000000;
UInt32 usecs = raw
sprintf( newTime, " return [NSString stringWithCString:newTime];
}
/* Format the numbers in Hex */
if ([[tc identifier] isEqualTo: @"second"] | [[tc identifier] isEqualTo: @"first"]){
char hexValue[255];
sprintf(hexValue, "0x return [NSString stringWithCString:hexValue];
}
/* Do the default for the type */
return [[[self logItems] objectAtIndex: row] valueForKey: [tc identifier]];
}
- (void)tableView:(NSTableView *)tv
setObjectValue:(id)object
forTableColumn:(NSTableColumn *)tc
row:(int)row
{
}
- (NSString *)windowNibName {
// Override returning the nib file name of the document
// If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
return @"MyDocument";
}
- (void)windowControllerDidLoadNib:(NSWindowController *) aController{
[super windowControllerDidLoadNib:aController];
// Add any code here that need to be executed once the windowController has loaded the document's window.
}
- (NSData *)dataRepresentationOfType:(NSString *)aType {
// We need an archived representation of the model.
// The model is an array of logItems. An array knows how to archive
// itself; we should have written encoding method for LogItem.
return [NSArchiver archivedDataWithRootObject: [self logItems]];
}
- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType {
// We should be passed an archived representation of the
// array of logItems.
[self setLogItems: [NSUnarchiver unarchiveObjectWithData: data]];
return YES;
}
- (void)dealloc {
[self setLogItems:nil];
[super dealloc];
}
// accessor methods
- (NSArray *)logItems {
if (logItems == nil) {
[self setLogItems: [NSMutableArray array]];
}
return logItems;
}
- (void)setLogItems:(NSMutableArray *)value {
[value retain];
[logItems release];
logItems = value;
}
- (void) doTimer: (NSTimer *) myTimer{
// NSLog(@"doTimer");
[self createNewLogItem: myTimer];
}
- (void)startTimer:(id)sender{
if (state){
NSLog(@"Stop timer now!");
[timer invalidate];
// Display and keep track of state in button
[sender setTitle: @"Capture"];
state = false;
}
else{
NSLog(@"Start timer now!");
timer = [NSTimer scheduledTimerWithTimeInterval: .5 target: self selector: @selector(doTimer:) userInfo: nil repeats: YES];
// Display and keep track of state in button
[sender setTitle: @"Stop"];
state = true;
}
}
@end