Files
MacPass/MacPass/MPMainWindowController.m
michael starke cb6326480e added inspector to split views.
Rough setup, nothing working right now
2013-03-05 01:56:19 +01:00

290 lines
9.6 KiB
Objective-C

//
// MPMainWindowController.m
// MacPass
//
// Created by Michael Starke on 24.07.12.
// Copyright (c) 2012 HicknHack Software GmbH. All rights reserved.
//
#import "MPMainWindowController.h"
#import "MPDatabaseController.h"
#import "MPDatabaseDocument.h"
#import "MPPasswordInputController.h"
#import "MPEntryViewController.h"
#import "MPToolbarDelegate.h"
#import "MPOutlineViewController.h"
#import "MPMainWindowSplitViewDelegate.h"
#import "MPInspectorTabViewController.h"
#import "MPAppDelegate.h"
static CGFloat _outlineSplitterPosition;
static CGFloat _inspectorSplitterPosition;
@interface MPMainWindowController ()
@property (assign) IBOutlet NSView *outlineView;
@property (assign) IBOutlet NSSplitView *splitView;
@property (assign) IBOutlet NSView *contentView;
@property (assign) IBOutlet NSView *inspectorView;
@property (retain) IBOutlet NSView *welcomeView;
@property (assign) IBOutlet NSTextField *welcomeText;
@property (retain) NSToolbar *toolbar;
@property (retain) MPPasswordInputController *passwordInputController;
@property (retain) MPEntryViewController *entryViewController;
@property (retain) MPOutlineViewController *outlineViewController;
@property (retain) MPInspectorTabViewController *inspectorTabViewController;
@property (retain) MPToolbarDelegate *toolbarDelegate;
@property (retain) MPMainWindowSplitViewDelegate *splitViewDelegate;
/* View show/hide */
- (void)_collapseOutlineView;
- (void)_expandOutlineView;
- (void)_toggleInspector;
- (void)_setContentViewController:(MPViewController *)viewController;
- (void)_updateWindowTitle;
@end
@implementation MPMainWindowController
-(id)init {
self = [super initWithWindowNibName:@"MainWindow" owner:self];
if( self ) {
_toolbarDelegate = [[MPToolbarDelegate alloc] init];
_outlineViewController = [[MPOutlineViewController alloc] init];
_inspectorTabViewController = [[MPInspectorTabViewController alloc] init];
_splitViewDelegate = [[MPMainWindowSplitViewDelegate alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"WelcomeView" owner:self topLevelObjects:NULL];
[self.welcomeView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didOpenDocument:)
name:MPDatabaseControllerDidLoadDatabaseNotification
object:nil];
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[_welcomeView release];
[_welcomeText release];
[_toolbar release];
[_passwordInputController release];
[_entryViewController release];
[_outlineViewController release];
[_inspectorTabViewController release];
[_toolbarDelegate release];
[_splitViewDelegate release];
[super dealloc];
}
#pragma mark View Handling
- (void)windowDidLoad
{
[super windowDidLoad];
[self _updateWindowTitle];
[[self.welcomeText cell] setBackgroundStyle:NSBackgroundStyleRaised];
const CGFloat minimumWindowWidth = MPMainWindowSplitViewDelegateMinimumContentWidth + MPMainWindowSplitViewDelegateMinimumOutlineWidth + [self.splitView dividerThickness];
[self.window setMinSize:NSMakeSize( minimumWindowWidth, 400)];
_toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainWindowToolbar"];
[self.toolbar setAllowsUserCustomization:YES];
[self.toolbar setDelegate:self.toolbarDelegate];
[self.window setToolbar:self.toolbar];
[self.splitView setDelegate:self.splitViewDelegate];
/* Add outlineview */
const NSRect outlineFrame = [self.outlineView frame];
[self.outlineViewController.view setFrame:outlineFrame];
[self.outlineViewController.view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[self.splitView replaceSubview:self.outlineView with:[self.outlineViewController view]];
[self.outlineViewController updateResponderChain];
/* Add inspector view */
const NSRect inspectorFrame = [self.inspectorView frame];
[self.inspectorTabViewController.view setFrame:inspectorFrame];
[self.inspectorTabViewController.view setAutoresizesSubviews:NSViewWidthSizable | NSViewHeightSizable ];
[self.splitView replaceSubview:self.inspectorView with:[self.inspectorTabViewController view]];
[self.inspectorTabViewController updateResponderChain];
[self.splitView adjustSubviews];
[self _setContentViewController:nil];
[self _collapseOutlineView];
}
- (void)_setContentViewController:(MPViewController *)viewController {
NSView *newContentView = self.welcomeView;
if(viewController && viewController.view) {
newContentView = viewController.view;
}
/*
Set correct size and resizing for view
*/
[newContentView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
NSSize frameSize = [self.contentView frame].size;
[newContentView setFrame:NSMakeRect(0,0, frameSize.width, frameSize.height)];
/*
Add or replace subview
*/
NSArray *subViews = [self.contentView subviews];
BOOL hasSubViews = ([subViews count] > 0);
if(hasSubViews) {
NSView *subView = subViews[0];
assert(subView);
[self.contentView replaceSubview:subView with:newContentView];
}
else {
[self.contentView addSubview:newContentView];
}
[viewController updateResponderChain];
[self.contentView setNeedsDisplay:YES];
[self.splitView adjustSubviews];
/*
Set focus AFTER having added the view
*/
[self.window makeFirstResponder:[viewController reconmendedFirstResponder]];
}
- (void)_collapseOutlineView {
NSView *outlineView = [self.splitView subviews][MPSplitViewOutlineViewIndex];
if([outlineView isHidden]) {
_outlineSplitterPosition = [outlineView frame].size.width;
[self.splitView setPosition:0 ofDividerAtIndex:MPSplitViewOutlineViewIndex];
}
}
- (void)_expandOutlineView {
NSView *outlineView = [self.splitView subviews][MPSplitViewOutlineViewIndex];
if(![outlineView isHidden]) {
CGFloat splitterPosition = MAX( MPMainWindowSplitViewDelegateMinimumOutlineWidth, _outlineSplitterPosition );
[self.splitView setPosition:splitterPosition ofDividerAtIndex:MPSplitViewOutlineViewIndex];
}
}
- (void)_updateWindowTitle {
if([MPDatabaseController defaultController].database) {
NSString *appName = [(MPAppDelegate *)[NSApp delegate] applicationName];
NSString *openFile = [[MPDatabaseController defaultController].database.file lastPathComponent];
[self.window setTitle:[NSString stringWithFormat:@"%@ - %@", appName, openFile]];
}
else {
[self.window setTitle:[(MPAppDelegate *)[NSApp delegate] applicationName]];
}
}
#pragma mark Actions
- (void)toggleInspector:(id)sender {
NSView *inspectorView = [self.splitView subviews][MPSplitViewInspectorViewIndex];
const BOOL collapsed = [self.splitView isSubviewCollapsed:inspectorView];
if(collapsed) {
CGFloat splitterPosition = MAX(MPMainWindowSplitViewDelegateMinimumInspectorWidth, _inspectorSplitterPosition);
[self.splitView setPosition:splitterPosition ofDividerAtIndex:1];
}
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:1];
}
[inspectorView setHidden:!collapsed];
}
- (void)performFindPanelAction:(id)sender {
[self.window makeFirstResponder:[self.toolbarDelegate.searchItem view]];
}
- (void)showMainWindow:(id)sender {
[self showWindow:self.window];
}
- (void)openDocument:(id)sender {
if(!self.passwordInputController) {
self.passwordInputController = [[[MPPasswordInputController alloc] init] autorelease];
}
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setCanChooseDirectories:NO];
[openPanel setCanChooseFiles:YES];
[openPanel setCanCreateDirectories:NO];
[openPanel setAllowsMultipleSelection:NO];
[openPanel setAllowedFileTypes:@[ @"kdbx", @"kdb"]];
[openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result){
if(result == NSFileHandlingPanelOKButton) {
NSURL *file = [[openPanel URLs] lastObject];
self.passwordInputController.fileURL = file;
[self _collapseOutlineView];
[self _setContentViewController:self.passwordInputController];
}
}];
}
- (void)updateFilter:(id)sender {
NSSearchField *searchField = sender;
self.entryViewController.filter = [searchField stringValue];
[((NSOutlineView *)self.outlineViewController.view) deselectAll:self];
}
- (void)clearFilter:(id)sender {
NSSearchField *searchField = sender;
if(![sender isKindOfClass:[NSSearchField class]]) {
searchField = [self locateToolbarSearchField];
}
[searchField setStringValue:@""];
[self.entryViewController clearFilter];
}
- (void)clearOutlineSelection:(id)sender {
[self.outlineViewController clearSelection];
}
- (void)showEditForm:(id)sender {
}
#pragma mark Helper
- (NSSearchField *)locateToolbarSearchField {
for(NSToolbarItem *toolbarItem in [[self.window toolbar] items]) {
NSView *view = [toolbarItem view];
if([view isKindOfClass:[NSSearchField class]]) {
return (NSSearchField *)view;
}
}
return nil;
}
#pragma mark Notifications
- (void)didOpenDocument:(NSNotification *)notification {
[self _updateWindowTitle];
[self showEntries];
}
- (void)showEntries {
[self _expandOutlineView];
if(!self.entryViewController) {
_entryViewController = [[MPEntryViewController alloc] init];
}
[self _setContentViewController:self.entryViewController];
}
- (IBAction)changedFileType:(id)sender {
}
@end