mirror of
https://github.com/kennethreitz-archive/gitx.git
synced 2026-06-05 23:40:18 +00:00
c36726b985
- In PBGitSidebarView.xib
- change indentation to 12
- change font size to 11
- disable the editable behavior
- disable autoresizing
- disable user resizing (column should resize with view)
- remove the window
- remove the shared user defaults controller (not being used)
- add a project item with the project's name
- a "Stage" item to go to what has been called the commit view
- new icons for branches, remote branches and tags (created by Nathan Kinsinger)
- remove the old tiff icons, PBSourceViewRemote.h/m and PBSourceViewAction.h/m from the xcode project
- uses system icon for folder
- uses Network icon for remotes
- capitalize group names
- rename the Custom group to Other (you can't really customize items in the traditional sense)
- create a class for each item type that takes care of it's image (instead of trying to guess the image from it or it's parent's name)
- remove the branch menu toolbar item from the history view, it's redundant now
198 lines
5.3 KiB
Objective-C
198 lines
5.3 KiB
Objective-C
//
|
|
// PBGitSidebar.m
|
|
// GitX
|
|
//
|
|
// Created by Pieter de Bie on 9/8/09.
|
|
// Copyright 2009 __MyCompanyName__. All rights reserved.
|
|
//
|
|
|
|
#import "PBGitSidebarController.h"
|
|
#import "PBSourceViewItems.h"
|
|
#import "NSOutlineViewExt.h"
|
|
|
|
@interface PBGitSidebarController ()
|
|
|
|
- (void)populateList;
|
|
- (void)updateSelection;
|
|
- (void)addRevSpec:(PBGitRevSpecifier *)revSpec;
|
|
@end
|
|
|
|
@implementation PBGitSidebarController
|
|
@synthesize items;
|
|
|
|
- (id)initWithRepository:(PBGitRepository *)theRepository superController:(PBGitWindowController *)controller
|
|
{
|
|
self = [super initWithRepository:theRepository superController:controller];
|
|
[sourceView setDelegate:self];
|
|
items = [NSMutableArray array];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)awakeFromNib
|
|
{
|
|
[super awakeFromNib];
|
|
window.contentView = self.view;
|
|
[self populateList];
|
|
|
|
[repository addObserver:self forKeyPath:@"currentBranch" options:0 context:@"currentBranchChange"];
|
|
[self updateSelection];
|
|
}
|
|
|
|
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
|
|
{
|
|
if ([@"currentBranchChange" isEqualTo:context])
|
|
[self updateSelection];
|
|
}
|
|
|
|
- (void)updateSelection
|
|
{
|
|
PBGitRevSpecifier *rev = repository.currentBranch;
|
|
if (!rev)
|
|
return;
|
|
|
|
PBSourceViewItem *item = nil;
|
|
for (PBSourceViewItem *it in items)
|
|
if (item = [it findRev:rev])
|
|
break;
|
|
|
|
if (!item) {
|
|
[self addRevSpec:rev];
|
|
// Try to find the just added item again.
|
|
// TODO: refactor with above.
|
|
for (PBSourceViewItem *it in items)
|
|
if (item = [it findRev:rev])
|
|
break;
|
|
}
|
|
|
|
[sourceView PBExpandItem:item expandParents:YES];
|
|
NSIndexSet *index = [NSIndexSet indexSetWithIndex:[sourceView rowForItem:item]];
|
|
|
|
[sourceView selectRowIndexes:index byExtendingSelection:NO];
|
|
}
|
|
|
|
- (void)addRevSpec:(PBGitRevSpecifier *)rev
|
|
{
|
|
if (![rev isSimpleRef]) {
|
|
[others addChild:[PBSourceViewItem itemWithRevSpec:rev]];
|
|
return;
|
|
}
|
|
|
|
NSArray *pathComponents = [[rev simpleRef] componentsSeparatedByString:@"/"];
|
|
if ([pathComponents count] < 2)
|
|
[branches addChild:[PBSourceViewItem itemWithRevSpec:rev]];
|
|
else if ([[pathComponents objectAtIndex:1] isEqualToString:@"heads"])
|
|
[branches addRev:rev toPath:[pathComponents subarrayWithRange:NSMakeRange(2, [pathComponents count] - 2)]];
|
|
else if ([[rev simpleRef] hasPrefix:@"refs/tags/"])
|
|
[tags addRev:rev toPath:[pathComponents subarrayWithRange:NSMakeRange(2, [pathComponents count] - 2)]];
|
|
else if ([[rev simpleRef] hasPrefix:@"refs/remotes/"])
|
|
[remotes addRev:rev toPath:[pathComponents subarrayWithRange:NSMakeRange(2, [pathComponents count] - 2)]];
|
|
}
|
|
|
|
#pragma mark NSOutlineView delegate methods
|
|
|
|
- (void)outlineViewSelectionDidChange:(NSNotification *)notification
|
|
{
|
|
NSInteger index = [sourceView selectedRow];
|
|
PBSourceViewItem *item = [sourceView itemAtRow:index];
|
|
|
|
if ([item revSpecifier]) {
|
|
[[repository windowController] showHistoryView:self];
|
|
repository.currentBranch = [item revSpecifier];
|
|
return;
|
|
}
|
|
|
|
if (item == stage)
|
|
[[repository windowController] showCommitView:self];
|
|
|
|
/* ... */
|
|
|
|
|
|
/* Handle Remotes */
|
|
}
|
|
|
|
#pragma mark NSOutlineView delegate methods
|
|
- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item
|
|
{
|
|
return [item isGroupItem];
|
|
}
|
|
|
|
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
|
|
{
|
|
[cell setImage:[item icon]];
|
|
}
|
|
|
|
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item
|
|
{
|
|
return ![item isGroupItem];
|
|
}
|
|
|
|
//
|
|
// The next method is necessary to hide the triangle for uncollapsible items
|
|
// That is, items which should always be displayed, such as the Project group.
|
|
// This also moves the group item to the left edge.
|
|
- (BOOL) outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item
|
|
{
|
|
return ![item isUncollapsible];
|
|
}
|
|
|
|
- (void)populateList
|
|
{
|
|
PBSourceViewItem *project = [PBSourceViewItem groupItemWithTitle:[repository projectName]];
|
|
project.isUncollapsible = YES;
|
|
|
|
stage = [PBGitSVStageItem stageItem];
|
|
[project addChild:stage];
|
|
|
|
branches = [PBSourceViewItem groupItemWithTitle:@"Branches"];
|
|
remotes = [PBSourceViewItem groupItemWithTitle:@"Remotes"];
|
|
tags = [PBSourceViewItem groupItemWithTitle:@"Tags"];
|
|
others = [PBSourceViewItem groupItemWithTitle:@"Other"];
|
|
|
|
for (PBGitRevSpecifier *rev in repository.branches)
|
|
[self addRevSpec:rev];
|
|
|
|
[items addObject:project];
|
|
[items addObject:branches];
|
|
[items addObject:remotes];
|
|
[items addObject:tags];
|
|
[items addObject:others];
|
|
|
|
[sourceView reloadData];
|
|
[sourceView expandItem:project];
|
|
[sourceView expandItem:branches expandChildren:YES];
|
|
[sourceView expandItem:remotes];
|
|
|
|
[sourceView reloadItem:nil reloadChildren:YES];
|
|
}
|
|
|
|
#pragma mark NSOutlineView Datasource methods
|
|
|
|
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item
|
|
{
|
|
if (!item)
|
|
return [items objectAtIndex:index];
|
|
|
|
return [[(PBSourceViewItem *)item children] objectAtIndex:index];
|
|
}
|
|
|
|
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
|
|
{
|
|
return [[(PBSourceViewItem *)item children] count];
|
|
}
|
|
|
|
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
|
|
{
|
|
if (!item)
|
|
return [items count];
|
|
|
|
return [[(PBSourceViewItem *)item children] count];
|
|
}
|
|
|
|
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
|
|
{
|
|
return [(PBSourceViewItem *)item title];
|
|
}
|
|
|
|
@end
|