From d669050551cf47ee351981bbeb84d793f97644a1 Mon Sep 17 00:00:00 2001 From: Johannes Gilger Date: Sun, 21 Jun 2009 12:52:22 +0200 Subject: [PATCH] Add PBCollapsibleSplitView as subclass of PBNiceSplitView This adds a subclass to PBNiceSplitView which has collapsible subviews as well as an uncollapse-method. The initWithTopMin method is used to set the minimum sizes for the subviews. Signed-off-by: Johannes Gilger --- GitX.xcodeproj/project.pbxproj | 6 ++++++ PBCollapsibleSplitView.h | 23 +++++++++++++++++++++++ PBCollapsibleSplitView.m | 28 ++++++++++++++++++++++++++++ PBGitHistoryController.h | 8 ++++++++ PBGitHistoryController.m | 26 ++++++++++++++++++++++++++ PBGitHistoryView.xib | 26 ++++++++++++++++++++++---- 6 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 PBCollapsibleSplitView.h create mode 100644 PBCollapsibleSplitView.m diff --git a/GitX.xcodeproj/project.pbxproj b/GitX.xcodeproj/project.pbxproj index b874424..b89cb2b 100644 --- a/GitX.xcodeproj/project.pbxproj +++ b/GitX.xcodeproj/project.pbxproj @@ -44,6 +44,7 @@ 93CB42C20EAB7B2200530609 /* PBGitDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 93CB42C10EAB7B2200530609 /* PBGitDefaults.m */; }; 93F7857F0EA3ABF100C1F443 /* PBCommitMessageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F7857E0EA3ABF100C1F443 /* PBCommitMessageView.m */; }; D26DC6450E782C9000C777B2 /* gitx.icns in Resources */ = {isa = PBXBuildFile; fileRef = D26DC6440E782C9000C777B2 /* gitx.icns */; }; + EB2A734A0FEE3F09006601CF /* PBCollapsibleSplitView.m in Sources */ = {isa = PBXBuildFile; fileRef = EB2A73490FEE3F09006601CF /* PBCollapsibleSplitView.m */; }; F50A411F0EBB874C00208746 /* mainSplitterBar.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F50A411D0EBB874C00208746 /* mainSplitterBar.tiff */; }; F50A41200EBB874C00208746 /* mainSplitterDimple.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F50A411E0EBB874C00208746 /* mainSplitterDimple.tiff */; }; F50A41230EBB875D00208746 /* PBNiceSplitView.m in Sources */ = {isa = PBXBuildFile; fileRef = F50A41220EBB875D00208746 /* PBNiceSplitView.m */; }; @@ -190,6 +191,8 @@ 93F7857E0EA3ABF100C1F443 /* PBCommitMessageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBCommitMessageView.m; sourceTree = ""; }; 93FCCBA80EA8AF450061B02B /* PBGitConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBGitConfig.m; sourceTree = ""; }; D26DC6440E782C9000C777B2 /* gitx.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = gitx.icns; sourceTree = ""; }; + EB2A73480FEE3F09006601CF /* PBCollapsibleSplitView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBCollapsibleSplitView.h; sourceTree = ""; }; + EB2A73490FEE3F09006601CF /* PBCollapsibleSplitView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBCollapsibleSplitView.m; sourceTree = ""; }; F50A411D0EBB874C00208746 /* mainSplitterBar.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = mainSplitterBar.tiff; path = Images/mainSplitterBar.tiff; sourceTree = ""; }; F50A411E0EBB874C00208746 /* mainSplitterDimple.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = mainSplitterDimple.tiff; path = Images/mainSplitterDimple.tiff; sourceTree = ""; }; F50A41210EBB875D00208746 /* PBNiceSplitView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBNiceSplitView.h; sourceTree = ""; }; @@ -530,6 +533,8 @@ F56244080E9684B0002B6C44 /* PBUnsortableTableHeader.m */, F50A41210EBB875D00208746 /* PBNiceSplitView.h */, F50A41220EBB875D00208746 /* PBNiceSplitView.m */, + EB2A73480FEE3F09006601CF /* PBCollapsibleSplitView.h */, + EB2A73490FEE3F09006601CF /* PBCollapsibleSplitView.m */, F5FC41F20EBCBD4300191D80 /* PBGitXProtocol.h */, F5FC41F30EBCBD4300191D80 /* PBGitXProtocol.m */, ); @@ -848,6 +853,7 @@ 47DBDB670E94EE8B00671A1E /* PBPrefsWindowController.m in Sources */, 47DBDBCA0E95016F00671A1E /* PBNSURLPathUserDefaultsTransfomer.m in Sources */, F562C8870FE1766C000EC528 /* NSString_RegEx.m in Sources */, + EB2A734A0FEE3F09006601CF /* PBCollapsibleSplitView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/PBCollapsibleSplitView.h b/PBCollapsibleSplitView.h new file mode 100644 index 0000000..6055ce3 --- /dev/null +++ b/PBCollapsibleSplitView.h @@ -0,0 +1,23 @@ +// +// PBCollapsibleSplitView.h +// GitX +// +// Created by Johannes Gilger on 6/21/09. +// Copyright 2009 Johannes Gilger. All rights reserved. +// + +#import +#import "PBNiceSplitView.h" + +@interface PBCollapsibleSplitView : PBNiceSplitView { + CGFloat topViewMin; + CGFloat bottomViewMin; +} + +@property (readonly) CGFloat topViewMin; +@property (readonly) CGFloat bottomViewMin; + +- (void)setTopMin:(CGFloat)topMin andBottomMin:(CGFloat)bottomMin; +- (void)uncollapse; + +@end diff --git a/PBCollapsibleSplitView.m b/PBCollapsibleSplitView.m new file mode 100644 index 0000000..dedfc0d --- /dev/null +++ b/PBCollapsibleSplitView.m @@ -0,0 +1,28 @@ +// +// PBCollapsibleSplitView.m +// GitX +// +// Created by Johannes Gilger on 6/21/09. +// Copyright 2009 Johannes Gilger. All rights reserved. +// + +#import "PBCollapsibleSplitView.h" + +@implementation PBCollapsibleSplitView +@synthesize topViewMin, bottomViewMin; + +- (void)setTopMin:(CGFloat)topMin andBottomMin:(CGFloat)bottomMin { + topViewMin = topMin; + bottomViewMin = bottomMin; +} + +- (void)uncollapse { + for (NSView *subview in [self subviews]) { + if([self isSubviewCollapsed:subview]) { + [self setPosition:[self frame].size.height / 3 ofDividerAtIndex:0]; + [self adjustSubviews]; + } + } +} + +@end diff --git a/PBGitHistoryController.h b/PBGitHistoryController.h index 6c99a20..fadb6cd 100644 --- a/PBGitHistoryController.h +++ b/PBGitHistoryController.h @@ -10,6 +10,7 @@ #import "PBGitCommit.h" #import "PBGitTree.h" #import "PBViewController.h" +#import "PBCollapsibleSplitView.h" @interface PBGitHistoryController : PBViewController { IBOutlet NSSearchField *searchField; @@ -17,6 +18,7 @@ IBOutlet NSTreeController* treeController; IBOutlet NSOutlineView* fileBrowser; IBOutlet NSTableView* commitList; + IBOutlet PBCollapsibleSplitView *historySplitView; IBOutlet id webView; int selectedTab; @@ -54,4 +56,10 @@ - (BOOL) hasNonlinearPath; - (NSMenu *)tableColumnMenu; + +- (BOOL)splitView:(NSSplitView *)sender canCollapseSubview:(NSView *)subview; +- (BOOL)splitView:(NSSplitView *)splitView shouldCollapseSubview:(NSView *)subview forDoubleClickOnDividerAtIndex:(NSInteger)dividerIndex; +- (CGFloat)splitView:(NSSplitView *)sender constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)offset; +- (CGFloat)splitView:(NSSplitView *)sender constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)offset; + @end diff --git a/PBGitHistoryController.m b/PBGitHistoryController.m index fb4d886..a078eaf 100644 --- a/PBGitHistoryController.m +++ b/PBGitHistoryController.m @@ -41,6 +41,8 @@ [[commitList tableColumnWithIdentifier:@"subject"] setSortDescriptorPrototype:[[NSSortDescriptor alloc] initWithKey:@"subject" ascending:YES]]; // Add a menu that allows a user to select which columns to view [[commitList headerView] setMenu:[self tableColumnMenu]]; + [historySplitView setTopMin:33.0 andBottomMin:100.0]; + [historySplitView uncollapse]; [super awakeFromNib]; } @@ -296,4 +298,28 @@ return menuItems; } +- (BOOL)splitView:(NSSplitView *)sender canCollapseSubview:(NSView *)subview { + return TRUE; +} + +- (BOOL)splitView:(NSSplitView *)splitView shouldCollapseSubview:(NSView *)subview forDoubleClickOnDividerAtIndex:(NSInteger)dividerIndex { + int index = [[splitView subviews] indexOfObject:subview]; + // this method (and canCollapse) are called by the splitView to decide how to collapse on double-click + // we compare our two subviews, so that always the smaller one is collapsed. + if([[[splitView subviews] objectAtIndex:index] frame].size.height < [[[splitView subviews] objectAtIndex:((index+1)%2)] frame].size.height) { + return TRUE; + } + return FALSE; +} + +- (CGFloat)splitView:(NSSplitView *)sender constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)offset { + return proposedMin + historySplitView.topViewMin; +} + +- (CGFloat)splitView:(NSSplitView *)sender constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)offset { + if(offset = 1) + return proposedMax - historySplitView.bottomViewMin; + return [sender frame].size.height; +} + @end diff --git a/PBGitHistoryView.xib b/PBGitHistoryView.xib index 3b7152f..a7e58bd 100644 --- a/PBGitHistoryView.xib +++ b/PBGitHistoryView.xib @@ -8,8 +8,8 @@ 353.00 YES + - YES @@ -420,7 +420,7 @@ 2322 - {835, 70} + {835, 0} @@ -784,7 +784,7 @@ 2322 - {543, 112} + {543, 0} @@ -2093,6 +2093,14 @@ 274 + + + historySplitView + + + + 275 + @@ -2859,7 +2867,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - PBNiceSplitView + PBCollapsibleSplitView {{312, 577}, {852, 384}} com.apple.InterfaceBuilder.CocoaPlugin @@ -2993,6 +3001,14 @@ YES + + PBCollapsibleSplitView + PBNiceSplitView + + IBProjectSource + PBCollapsibleSplitView.h + + PBCommitList NSTableView @@ -3051,6 +3067,7 @@ commitController commitList fileBrowser + historySplitView searchField treeContextMenu treeController @@ -3061,6 +3078,7 @@ NSArrayController NSTableView NSOutlineView + PBCollapsibleSplitView NSSearchField NSMenu NSTreeController