// // HistoryViewController.m // Perforce // // Created by Adam Czubernat on 12/05/14. // Copyright (c) 2014 Perforce Software, Inc. All rights reserved. // #import "HistoryViewController.h" #import "PSCustomScrollView.h" #import "ChangelistViewController.h" @interface HistoryViewController () { P4Item *item; __unsafe_unretained id actionDelegate; NSMutableArray *tableItems; BOOL loading; __weak IBOutlet NSTableView *tableView; __weak IBOutlet PSCustomScrollView *scrollView; NSPopover *popover; } - (IBAction)viewFilesAction:(NSButton *)sender; - (IBAction)revertAction:(NSButton *)sender; @end @implementation HistoryViewController - (id)initWithDirectoryItem:(P4Item *)dirItem actionDelegate:(id)delegate { if (self = [self initWithNibName:NSStringFromClass([self class]) bundle:nil]) { item = dirItem; actionDelegate = delegate; } return self; } - (void)dealloc { popover.delegate = nil; } - (void)loadView { [super loadView]; [scrollView setScrollVerticalOnly:YES]; [self reload]; } #pragma mark - Public - (void)reload { loading = YES; tableItems = [NSMutableArray array]; [tableView reloadData]; NSString *path = item.path; [[P4Workspace sharedInstance] listFolderVersions:path response:^(P4Operation *operation, NSArray *response) { [tableItems addObjectsFromArray:response]; // Add new rows if (response.count) [tableView insertRowsFromIndex:1 toIndex:response.count withAnimation:NSTableViewAnimationEffectFade]; // Remove loading loading = NO; [tableView removeRowsFromIndex:0 toIndex:0 withAnimation:NSTableViewAnimationSlideUp]; }]; } #pragma mark - Private - (IBAction)viewFilesAction:(NSButton *)sender { NSInteger row = [tableView rowForView:sender]; NSDictionary *tableItem = [tableItems objectAtIndex:row]; NSNumber *changelist = [tableItem objectForKey:@"change"]; ChangelistViewController *controller = [[ChangelistViewController alloc] initWithChangelist:changelist path:item.path]; popover = [[NSPopover alloc] init]; [popover setBehavior:NSPopoverBehaviorTransient]; [popover setContentViewController:controller]; [popover showRelativeToRect:[sender frame] ofView:[sender superview] preferredEdge:NSMaxXEdge]; popover.delegate = self; [scrollView setScrollDisabled:YES]; } - (IBAction)revertAction:(NSButton *)sender { NSInteger row = [tableView rowForView:sender]; NSDictionary *tableItem = [tableItems objectAtIndex:row]; NSNumber *changelist = [tableItem objectForKey:@"change"]; [item performAction:@selector(revertToChangelist:) object:changelist delegate:actionDelegate]; } #pragma mark - NSTableView data source - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { return tableItems.count + loading; } - (CGFloat)tableView:(NSTableView *)table heightOfRow:(NSInteger)row { if (loading && row == 0) return 32.0f; return 172.0f; } - (NSView *)tableView:(NSTableView *)table viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { row -= loading; if (row < 0) { NSView *indicatorCell = [tableView makeViewWithIdentifier:@"LoadingCell" owner:self]; [[indicatorCell.subviews lastObject] startAnimation:nil]; return indicatorCell; } NSDictionary *tableItem = [tableItems objectAtIndex:row]; NSTableCellView *cell = [tableView makeViewWithIdentifier:@"HistoryCell" owner:self]; [cell setObjectValue:tableItem]; if (row == 0) { NSButton *revertButton = [cell viewWithTag:1]; [revertButton setHidden:YES]; } return cell; } #pragma mark - NSPopoverDelegate - (void)popoverDidClose:(NSNotification *)notification { [scrollView setScrollDisabled:NO]; } @end