diff --git a/MacPass/MPAppDelegate.m b/MacPass/MPAppDelegate.m index ddd96941..a1e73189 100644 --- a/MacPass/MPAppDelegate.m +++ b/MacPass/MPAppDelegate.m @@ -16,6 +16,10 @@ @property (retain) MPSettingsController *settingsController; @property (retain) MPMainWindowController *mainWindowController; +@property (assign) IBOutlet NSMenuItem *toggleOutlineViewMenuItem; +@property (assign) IBOutlet NSMenuItem *toggleInspectorViewMenuItem; + +- (void)_setupMenues; - (IBAction)showPreferences:(id)sender; @end @@ -25,6 +29,8 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { self.mainWindowController = [[[MPMainWindowController alloc] init] autorelease]; [self.mainWindowController showWindow:[self.mainWindowController window]]; + [self _setupMenues]; + } - (void)dealloc { @@ -37,6 +43,13 @@ return [[NSBundle mainBundle] infoDictionary][@"CFBundleName"]; } +#pragma mark Setup + +- (void)_setupMenues { + [self.toggleInspectorViewMenuItem setAction:@selector(toggleInspector:)]; + [self.toggleOutlineViewMenuItem setAction:@selector(toggleOutlineView:)]; +} + #pragma mark Menu Actions - (void)showMainWindow:(id)sender { diff --git a/MacPass/MPMainWindowController.h b/MacPass/MPMainWindowController.h index 87049aa7..94f11103 100644 --- a/MacPass/MPMainWindowController.h +++ b/MacPass/MPMainWindowController.h @@ -31,5 +31,6 @@ */ - (void)clearFilter:(id)sender; - (void)toggleInspector:(id)sender; +- (void)toggleOutlineView:(id)sender; @end diff --git a/MacPass/MPMainWindowController.m b/MacPass/MPMainWindowController.m index 2d0cbdf2..b401ff5d 100644 --- a/MacPass/MPMainWindowController.m +++ b/MacPass/MPMainWindowController.m @@ -17,8 +17,9 @@ #import "MPInspectorTabViewController.h" #import "MPAppDelegate.h" +#define MIN_WINDOW_WIDTH MPMainWindowSplitViewDelegateMinimumContentWidth + MPMainWindowSplitViewDelegateMinimumOutlineWidth + [self.splitView dividerThickness] + static CGFloat _outlineSplitterPosition; -static CGFloat _inspectorSplitterPosition; @interface MPMainWindowController () @@ -46,6 +47,10 @@ static CGFloat _inspectorSplitterPosition; - (void)_setContentViewController:(MPViewController *)viewController; - (void)_updateWindowTitle; +/* window reszing and content checks */ +- (BOOL)_windowsIsLargeEnoughForInspectorView; +- (void)_resizeWindowForInspectorView; + @end @implementation MPMainWindowController @@ -94,8 +99,7 @@ static CGFloat _inspectorSplitterPosition; [[self.welcomeText cell] setBackgroundStyle:NSBackgroundStyleRaised]; - const CGFloat minimumWindowWidth = MPMainWindowSplitViewDelegateMinimumContentWidth + MPMainWindowSplitViewDelegateMinimumOutlineWidth + [self.splitView dividerThickness]; - [self.window setMinSize:NSMakeSize( minimumWindowWidth, 400)]; + [self.window setMinSize:NSMakeSize( MIN_WINDOW_WIDTH, 400)]; _toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainWindowToolbar"]; [self.toolbar setAllowsUserCustomization:YES]; @@ -191,18 +195,47 @@ static CGFloat _inspectorSplitterPosition; NSView *inspectorView = [self.splitView subviews][MPSplitViewInspectorViewIndex]; const BOOL collapsed = [self.splitView isSubviewCollapsed:inspectorView]; if(collapsed) { - CGFloat splitterPosition = MAX(MPMainWindowSplitViewDelegateMinimumInspectorWidth, _inspectorSplitterPosition); + if( NO == [self _windowsIsLargeEnoughForInspectorView]) { + [self _resizeWindowForInspectorView]; + } + CGFloat splitterPosition = [self.splitView frame].size.width - MPMainWindowSplitViewDelegateMinimumInspectorWidth; [self.splitView setPosition:splitterPosition ofDividerAtIndex:MPSplitViewInspectorDividerIndex]; } else { - _inspectorSplitterPosition = [inspectorView frame].origin.x; - CGFloat splitterPosition = [inspectorView frame].origin.x * [inspectorView frame].size.width; - [[NSAnimationContext currentContext] setDuration:2]; - [[self.splitView animator] setPosition:splitterPosition ofDividerAtIndex:MPSplitViewInspectorDividerIndex]; + CGFloat splitterPosition = [self.splitView frame].size.width; + [self.splitView setPosition:splitterPosition ofDividerAtIndex:MPSplitViewInspectorDividerIndex]; } [inspectorView setHidden:!collapsed]; } +- (void)toggleOutlineView:(id)sender { + +} + +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { + SEL menuAction = [menuItem action]; + if(menuAction == @selector(toggleOutlineView:)) { + NSView *outlineView = [self.splitView subviews][MPSplitViewOutlineViewIndex]; + BOOL outlineIsHidden = [self.splitView isSubviewCollapsed:outlineView]; + if(outlineIsHidden) { + [menuItem setTitle:@"Show Outline View"]; + } + [menuItem setTitle:@"Hide Outline View"]; + return YES; + } + + if( menuAction == @selector(toggleInspector:) ) { + NSView *inspectorView = [self.splitView subviews][MPSplitViewInspectorViewIndex]; + BOOL inspectorIsHidden = [self.splitView isSubviewCollapsed:inspectorView]; + if(inspectorIsHidden) { + [menuItem setTitle:@"Show Inspecotr"]; + } + [menuItem setTitle:@"Hide Inspector"]; + return YES; + } + return YES; +} + - (void)performFindPanelAction:(id)sender { [self.window makeFirstResponder:[self.toolbarDelegate.searchItem view]]; } @@ -268,6 +301,24 @@ static CGFloat _inspectorSplitterPosition; return nil; } +- (BOOL)_windowsIsLargeEnoughForInspectorView { + return ( MPMainWindowSplitViewDelegateMinimumInspectorWidth + < ([self.splitView frame].size.width + - MPMainWindowSplitViewDelegateMinimumContentWidth + - MPMainWindowSplitViewDelegateMinimumOutlineWidth + - 2 * [self.splitView dividerThickness]) ); +} + +- (void)_resizeWindowForInspectorView { + NSRect frame = [self.window frame]; + NSView *outlinView = [self.splitView subviews][MPSplitViewOutlineViewIndex]; + NSView *contentView = [self.splitView subviews][MPSplitViewContentViewIndex]; + + CGFloat outlineWidth = [self.splitView isSubviewCollapsed:outlinView] ? 0 : [outlinView frame].size.width; + frame.size.width = outlineWidth + [contentView frame].size.width + MPMainWindowSplitViewDelegateMinimumInspectorWidth; + [self.window setFrame:frame display:YES animate:YES]; +} + #pragma mark Notifications - (void)didOpenDocument:(NSNotification *)notification { diff --git a/MacPass/MPMainWindowSplitViewDelegate.m b/MacPass/MPMainWindowSplitViewDelegate.m index 7e9c3556..84af83b8 100644 --- a/MacPass/MPMainWindowSplitViewDelegate.m +++ b/MacPass/MPMainWindowSplitViewDelegate.m @@ -9,8 +9,8 @@ #import "MPMainWindowSplitViewDelegate.h" const CGFloat MPMainWindowSplitViewDelegateMinimumOutlineWidth = 150.0; -const CGFloat MPMainWindowSplitViewDelegateMinimumContentWidth = 400.0; -const CGFloat MPMainWindowSplitViewDelegateMinimumInspectorWidth = 200.0; +const CGFloat MPMainWindowSplitViewDelegateMinimumContentWidth = 250.0; +const CGFloat MPMainWindowSplitViewDelegateMinimumInspectorWidth = 250.0; @interface MPMainWindowSplitViewDelegate () @@ -26,22 +26,51 @@ const CGFloat MPMainWindowSplitViewDelegateMinimumInspectorWidth = 200.0; } - (BOOL)splitView:(NSSplitView *)splitView canCollapseSubview:(NSView *)subview { - return (subview != [self _subViewOfType:MPSplitViewContentViewIndex splitView:splitView]); + return (subview == [self _subViewOfType:MPSplitViewInspectorViewIndex splitView:splitView]); } - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex { - return proposedMinimumPosition; - - // Update to take inspector into account - return (proposedMinimumPosition < MPMainWindowSplitViewDelegateMinimumOutlineWidth) ? MPMainWindowSplitViewDelegateMinimumOutlineWidth : proposedMinimumPosition; + switch (dividerIndex) { + case MPSplitViewOutlineDividerIndex: + return (proposedMinimumPosition < MPMainWindowSplitViewDelegateMinimumOutlineWidth) ? MPMainWindowSplitViewDelegateMinimumOutlineWidth : proposedMinimumPosition; + break; + + case MPSplitViewInspectorDividerIndex: { + return [self splitView:splitView constrainSplitPosition:proposedMinimumPosition ofSubviewAt:dividerIndex]; + } + + default: + return proposedMinimumPosition; + break; + } +} + +- (CGFloat)splitView:(NSSplitView *)splitView constrainSplitPosition:(CGFloat)proposedPosition ofSubviewAt:(NSInteger)dividerIndex { + if(dividerIndex == MPSplitViewInspectorDividerIndex) { + return [splitView frame].size.width - MPMainWindowSplitViewDelegateMinimumInspectorWidth; + } + return proposedPosition; } - (CGFloat)splitView:(NSSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMaximumPosition ofSubviewAt:(NSInteger)dividerIndex { - return proposedMaximumPosition; // Update to take inpspector into account - CGFloat availableWidth = [splitView frame].size.width - [splitView dividerThickness]; - return (availableWidth - MPMainWindowSplitViewDelegateMinimumOutlineWidth); + NSView *outlineView = [self _subViewOfType:MPSplitViewOutlineViewIndex splitView:splitView]; + NSView *inspectorView = [self _subViewOfType:MPSplitViewInspectorViewIndex splitView:splitView]; + NSUInteger outlineMultiplicator = [splitView isSubviewCollapsed:outlineView] ? 0 : 1; + NSUInteger inpsectorMulitplicator = [splitView isSubviewCollapsed:inspectorView] ? 0 : 1; + NSUInteger dividerMultiplicator = inpsectorMulitplicator + outlineMultiplicator; + CGFloat availableWidth = [splitView frame].size.width - (dividerMultiplicator * [splitView dividerThickness]); + switch (dividerIndex) { + case MPSplitViewOutlineDividerIndex: + return availableWidth - (outlineMultiplicator * [outlineView frame].size.width ) - MPMainWindowSplitViewDelegateMinimumContentWidth; + + case MPSplitViewInspectorDividerIndex: + return availableWidth - MPMainWindowSplitViewDelegateMinimumInspectorWidth; + + default: + return proposedMaximumPosition; + } } - (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize { diff --git a/MacPass/MacPass-Info.plist b/MacPass/MacPass-Info.plist index 92495455..beef99cc 100644 --- a/MacPass/MacPass-Info.plist +++ b/MacPass/MacPass-Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 475 + 48A LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright diff --git a/MacPass/en.lproj/MainMenu.xib b/MacPass/en.lproj/MainMenu.xib index 7f877f74..c4116d0b 100644 --- a/MacPass/en.lproj/MainMenu.xib +++ b/MacPass/en.lproj/MainMenu.xib @@ -2,7 +2,7 @@ 1070 - 12C60 + 12C3103 3084 1187.34 625.00 @@ -708,6 +708,33 @@ View + + + Toggle Outline View + + 2147483647 + + + + + + Toggle Inspector + i + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + Show Toolbar @@ -1254,6 +1281,22 @@ 1178 + + + toggleOutlineViewMenuItem + + + + 1182 + + + + toggleInspectorViewMenuItem + + + + 1183 + @@ -1686,6 +1729,9 @@ + + + @@ -1882,6 +1928,21 @@ + + 1179 + + + + + 1180 + + + + + 1181 + + + @@ -1891,6 +1952,9 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -1985,7 +2049,7 @@ - 1178 + 1183 @@ -2006,6 +2070,20 @@ id + + NSMenuItem + NSMenuItem + + + + toggleInspectorViewMenuItem + NSMenuItem + + + toggleOutlineViewMenuItem + NSMenuItem + + IBProjectSource ./Classes/MPAppDelegate.h