diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index 6b7291fc..53d3b629 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ 4C586F9E16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */; }; 4C586FA016D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586F9F16D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf */; }; 4C586FA216D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */; }; + 4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C61EA0216D2FD0800AC519E /* MPOutlineViewController.m */; }; + 4C61EA0516D2FFE200AC519E /* OutlineView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C61EA0416D2FFE200AC519E /* OutlineView.xib */; }; 4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C65FAE716D16DDB006E0577 /* MPPasswordInputController.m */; }; 4C669B7F16760ED100DD0774 /* AesInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3116760ED100DD0774 /* AesInputStream.m */; }; 4C669B8016760ED100DD0774 /* AesOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C669B3316760ED100DD0774 /* AesOutputStream.m */; }; @@ -68,6 +70,7 @@ 4CA0B2F015BCADC800654E32 /* GeneralSettings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CA0B2EF15BCADC800654E32 /* GeneralSettings.xib */; }; 4CA0B2F915BCAF6700654E32 /* MPGeneralSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B2F815BCAF6700654E32 /* MPGeneralSettingsController.m */; }; 4CA0B2FC15BCAF8600654E32 /* MPSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B2FB15BCAF8600654E32 /* MPSettingsController.m */; }; + 4CAC6F7816D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAC6F7716D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m */; }; 4CAD747B15B887FD00104512 /* DDXMLElementAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745715B887FD00104512 /* DDXMLElementAdditions.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 4CAD747C15B887FD00104512 /* NSString+DDXML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745A15B887FD00104512 /* NSString+DDXML.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 4CAD747D15B887FD00104512 /* DDXMLDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745D15B887FD00104512 /* DDXMLDocument.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; @@ -103,6 +106,9 @@ 4C586F9D16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 00_PasswordTemplate.pdf; sourceTree = ""; }; 4C586F9F16D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 01_PackageNetworkTemplate.pdf; sourceTree = ""; }; 4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 02_MessageBoxWarningTemplate.pdf; sourceTree = ""; }; + 4C61EA0116D2FD0800AC519E /* MPOutlineViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineViewController.h; sourceTree = ""; }; + 4C61EA0216D2FD0800AC519E /* MPOutlineViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineViewController.m; sourceTree = ""; }; + 4C61EA0416D2FFE200AC519E /* OutlineView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OutlineView.xib; sourceTree = ""; }; 4C65FAE616D16DDB006E0577 /* MPPasswordInputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordInputController.h; sourceTree = ""; }; 4C65FAE716D16DDB006E0577 /* MPPasswordInputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordInputController.m; sourceTree = ""; }; 4C669B3016760ED100DD0774 /* AesInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AesInputStream.h; sourceTree = ""; }; @@ -203,6 +209,8 @@ 4CA0B2FA15BCAF8600654E32 /* MPSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSettingsController.h; sourceTree = ""; }; 4CA0B2FB15BCAF8600654E32 /* MPSettingsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSettingsController.m; sourceTree = ""; }; 4CA0B30D15BCB6FD00654E32 /* MPSettingsTabProtocoll.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPSettingsTabProtocoll.h; sourceTree = ""; }; + 4CAC6F7616D2B54800D79D5E /* MPMainWindowSplitViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPMainWindowSplitViewDelegate.h; sourceTree = ""; }; + 4CAC6F7716D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPMainWindowSplitViewDelegate.m; sourceTree = ""; }; 4CAD745615B887FD00104512 /* DDXMLElementAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDXMLElementAdditions.h; sourceTree = ""; }; 4CAD745715B887FD00104512 /* DDXMLElementAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDXMLElementAdditions.m; sourceTree = ""; }; 4CAD745915B887FD00104512 /* NSString+DDXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+DDXML.h"; sourceTree = ""; }; @@ -255,6 +263,7 @@ 4C6B0E8B16C9B99B00A9ED23 /* PasswordInputView.xib */, 4C25D58416CF0F8800F6806C /* WelcomeView.xib */, 4C25D58616CF0FAA00F6806C /* EntryView.xib */, + 4C61EA0416D2FFE200AC519E /* OutlineView.xib */, ); name = Views; sourceTree = ""; @@ -277,6 +286,8 @@ 4CC6259015BA1C99002F5B11 /* MPOutlineViewDelegate.m */, 4C3BD51316D276F800389F1F /* MPToolbarDelegate.h */, 4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */, + 4CAC6F7616D2B54800D79D5E /* MPMainWindowSplitViewDelegate.h */, + 4CAC6F7716D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m */, ); name = Delegates; sourceTree = ""; @@ -491,6 +502,8 @@ 4C65FAE716D16DDB006E0577 /* MPPasswordInputController.m */, 4CDF01A116D1B76700D0AC08 /* MPEntryViewController.h */, 4CDF01A216D1B76700D0AC08 /* MPEntryViewController.m */, + 4C61EA0116D2FD0800AC519E /* MPOutlineViewController.h */, + 4C61EA0216D2FD0800AC519E /* MPOutlineViewController.m */, ); name = Controller; sourceTree = ""; @@ -635,6 +648,7 @@ 4CD78ABE16D155FF00768A1D /* 09_IdentityTemplate.pdf in Resources */, 4CD78ABF16D155FF00768A1D /* 10_ContactTemplate.pdf in Resources */, 4CD78AC016D155FF00768A1D /* 11_CameraTemplate.pdf in Resources */, + 4C61EA0516D2FFE200AC519E /* OutlineView.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -699,6 +713,8 @@ 4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */, 4CDF01A316D1B76700D0AC08 /* MPEntryViewController.m in Sources */, 4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */, + 4CAC6F7816D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m in Sources */, + 4C61EA0316D2FD0800AC519E /* MPOutlineViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacPass/EntryView.xib b/MacPass/EntryView.xib index 78787bac..744353ab 100644 --- a/MacPass/EntryView.xib +++ b/MacPass/EntryView.xib @@ -11,12 +11,9 @@ 3084 - IBNSLayoutConstraint NSCustomObject - NSCustomView NSScrollView NSScroller - NSSplitView NSTableColumn NSTableHeaderView NSTableView @@ -39,257 +36,221 @@ NSApplication - + - 268 + 4364 - - - 268 + + + 2304 - - + + 256 - - - - 4364 - - - - 2304 - - - - 256 - {703, 547} - - - - _NS:13 - YES - NO - YES - - - 256 - {703, 17} - - - - _NS:16 - - - - - -2147483392 - {{224, 0}, {16, 17}} - - _NS:19 - - - - 116 - 40 - 1000 - - 75497536 - 2048 - - - LucidaGrande - 11 - 3100 - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 337641536 - 2048 - Text Cell - - LucidaGrande - 13 - 1044 - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - - - 3 - YES - YES - - - - 581 - 40 - 1000 - - 75497536 - 2048 - - - - - - - 337641536 - 2048 - Text Cell - - - - - - 3 - YES - YES - - - - 3 - 2 - - 3 - MQA - - - 6 - System - gridColor - - 3 - MC41AA - - - 17 - -700448768 - - - 4 - 15 - 0 - YES - 0 - 1 - - - {{0, 17}, {703, 547}} - - - - _NS:11 - - - 4 + {703, 547} + + + + _NS:13 + YES + NO + YES + + + 256 + {703, 17} + + + + _NS:16 + + + + + -2147483392 + {{224, 0}, {16, 17}} + + _NS:19 + + + + 116 + 40 + 1000 + + 75497536 + 2048 + + + LucidaGrande + 11 + 3100 - - - -2147483392 - {{224, 17}, {15, 102}} - - - - _NS:58 - NO - - _doScroller: - 37 - 0.1947367936372757 + + 3 + MC4zMzMzMzI5ODU2AA - - - -2147483392 - {{1, 119}, {223, 15}} - - - _NS:60 - NO - 1 - - _doScroller: - 0.57142859697341919 + + 6 + System + headerTextColor + + 3 + MAA + - - - 2304 - - - - {703, 17} - - - - _NS:15 - - - 4 + + + 337641536 + 2048 + Text Cell + + LucidaGrande + 13 + 1044 - - {703, 564} - - - - _NS:9 - 133680 - - - - - QSAAAEEgAABBmAAAQZgAAA - 0.25 - 4 - 1 + + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + + + 3 + YES + YES + + + + 581 + 40 + 1000 + + 75497536 + 2048 + + + + + + + 337641536 + 2048 + Text Cell + + + + + + 3 + YES + YES + - {703, 563} - - - - _NS:13 - NSView + 3 + 2 + + 3 + MQA + + + 6 + System + gridColor + + 3 + MC41AA + + + 17 + -700448768 + + + 4 + 15 + 0 + YES + 0 + 1 - {703, 563} - + {{0, 17}, {703, 547}} + - - _NS:9 - YES - 2 + + _NS:11 + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + + + _NS:58 + NO + + _doScroller: + 37 + 0.1947367936372757 + + + + -2147483392 + {{1, 119}, {223, 15}} + + + _NS:60 + NO + 1 + + _doScroller: + 0.57142859697341919 + + + + 2304 + + + + {703, 17} + + + + _NS:15 + + + 4 - {703, 563} + {703, 564} - - NSView + + _NS:9 + 133680 + + + + + QSAAAEEgAABBmAAAQZgAAA + 0.25 + 4 + 1 @@ -298,9 +259,9 @@ view - + - 42 + 85 @@ -329,178 +290,6 @@ Application - - 1 - - - - - - 6 - 0 - - 6 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - - - 4 - 0 - - 4 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - - - 3 - 0 - - 3 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 5 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - - - - - 2 - - - - - - - - 4 - - - - - - 3 - 0 - - 3 - 1 - - -1 - - 1000 - - 3 - 9 - 3 - - - - 4 - 0 - - 4 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 5 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - - - 6 - 0 - - 6 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - 54 @@ -510,7 +299,7 @@ - + 55 @@ -562,52 +351,12 @@ - - 73 - - - - - 74 - - - - - 82 - - - - - 83 - - - 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 - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -617,17 +366,12 @@ 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 - 83 + 85 @@ -647,14 +391,6 @@ ./Classes/MPViewController.h - - NSLayoutConstraint - NSObject - - IBProjectSource - ./Classes/NSLayoutConstraint.h - - 0 diff --git a/MacPass/MPMainWindowController.h b/MacPass/MPMainWindowController.h index 5e37f728..2d30866c 100644 --- a/MacPass/MPMainWindowController.h +++ b/MacPass/MPMainWindowController.h @@ -8,10 +8,6 @@ #import -APPKIT_EXTERN NSString *const MPMainWindowControllerPasswordKey; -APPKIT_EXTERN NSString *const MPMainWindowControllerKeyfileKey; - -@class MPDatabaseDocument; @class MPViewController; @interface MPMainWindowController : NSWindowController diff --git a/MacPass/MPMainWindowController.m b/MacPass/MPMainWindowController.m index 6b12e7e3..74e4c213 100644 --- a/MacPass/MPMainWindowController.m +++ b/MacPass/MPMainWindowController.m @@ -7,38 +7,26 @@ // #import "MPMainWindowController.h" -#import "MPOutlineDataSource.h" -#import "MPOutlineViewDelegate.h" #import "MPDatabaseController.h" -#import "MPDatabaseDocument.h" #import "MPPasswordInputController.h" #import "MPEntryViewController.h" #import "MPToolbarDelegate.h" - -NSString *const MPMainWindowControllerPasswordKey = @"MPMainWindowControllerPasswordKey"; -NSString *const MPMainWindowControllerKeyfileKey = @"MPMainWindowControllerKeyfileKey"; - -NSString *const kColumnIdentifier = @"OutlineColumn"; -NSString *const kOutlineViewIdentifier = @"OutlineView"; - +#import "MPOutlineViewController.h" @interface MPMainWindowController () -@property (assign) IBOutlet NSOutlineView *outlineView; @property (assign) IBOutlet NSToolbar *toolbar; - +@property (assign) IBOutlet NSView *outlineView; +@property (assign) IBOutlet NSSplitView *splitView; @property (assign) IBOutlet NSView *contentView; -@property (retain) IBOutlet NSView *welcomeView; -@property (retain) MPOutlineDataSource *datasource; -@property (retain) MPOutlineViewDelegate *outlineDelegate; +@property (retain) IBOutlet NSView *welcomeView; @property (retain) MPPasswordInputController *passwordInputController; @property (retain) MPEntryViewController *entryViewController; -@property (retain) MPToolbarDelegate *toolbarDelegate; +@property (retain) MPOutlineViewController *outlineViewController; -- (void)updateData; -- (void)didOpenDocument:(NSNotification *)notification; +@property (retain) MPToolbarDelegate *toolbarDelegate; @end @@ -47,11 +35,10 @@ NSString *const kOutlineViewIdentifier = @"OutlineView"; -(id)init { self = [super initWithWindowNibName:@"MainWindow" owner:self]; if( self ) { - NSArray *topLevelObjects; - self.outlineDelegate = [[[MPOutlineViewDelegate alloc] init] autorelease]; - self.datasource = [[[MPOutlineDataSource alloc] init] autorelease]; self.toolbarDelegate = [[[MPToolbarDelegate alloc] init] autorelease]; - [[NSBundle mainBundle] loadNibNamed:@"WelcomeView" owner:self topLevelObjects:&topLevelObjects]; + self.outlineViewController = [[[MPOutlineViewController alloc] init] autorelease]; + + [[NSBundle mainBundle] loadNibNamed:@"WelcomeView" owner:self topLevelObjects:NULL]; [self.welcomeView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -70,13 +57,15 @@ NSString *const kOutlineViewIdentifier = @"OutlineView"; - (void)windowDidLoad { [super windowDidLoad]; - - [[self.outlineView outlineTableColumn] setIdentifier:kColumnIdentifier]; - [self.outlineView setDelegate:self.outlineDelegate]; - [self.outlineView setDataSource:self.datasource]; - [self.toolbar setDelegate:self.toolbarDelegate]; + NSRect frame = [self.outlineView frame]; + frame.size.height -= 1; + frame.origin.y = 10; + [self.outlineViewController.view setFrame:frame]; + [self.outlineViewController.view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + [self.splitView replaceSubview:self.outlineView with:self.outlineViewController.view]; + [self setContentViewController:nil]; } @@ -112,15 +101,9 @@ NSString *const kOutlineViewIdentifier = @"OutlineView"; } - (void)didOpenDocument:(NSNotification *)notification { - [self updateData]; [self showEntries]; } -- (void)updateData { - [self.outlineView reloadData]; - MPDatabaseController *dbContoller = [MPDatabaseController defaultController]; - [self.outlineView expandItem:dbContoller.database.root expandChildren:NO]; -} - (void)openDocument { diff --git a/MacPass/MPMainWindowSplitViewDelegate.h b/MacPass/MPMainWindowSplitViewDelegate.h new file mode 100644 index 00000000..4f3b9f92 --- /dev/null +++ b/MacPass/MPMainWindowSplitViewDelegate.h @@ -0,0 +1,14 @@ +// +// MPMainWindowSplitViewDelegate.h +// MacPass +// +// Created by michael starke on 18.02.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import + +@interface MPMainWindowSplitViewDelegate : NSObject + + +@end diff --git a/MacPass/MPMainWindowSplitViewDelegate.m b/MacPass/MPMainWindowSplitViewDelegate.m new file mode 100644 index 00000000..39f2586f --- /dev/null +++ b/MacPass/MPMainWindowSplitViewDelegate.m @@ -0,0 +1,26 @@ +// +// MPMainWindowSplitViewDelegate.m +// MacPass +// +// Created by michael starke on 18.02.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import "MPMainWindowSplitViewDelegate.h" + +const CGFloat _minimumSplitterWidth = 10.0; + +@implementation MPMainWindowSplitViewDelegate + +- (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex { + return _minimumSplitterWidth; +} + +- (CGFloat)splitView:(NSSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMaximumPosition ofSubviewAt:(NSInteger)dividerIndex { + NSView *otherView= [splitView subviews][(dividerIndex + 1) % 2]; + + CGFloat maximumWidth = [splitView frame].size.width - ( [splitView dividerThickness] + [otherView frame].size.width + _minimumSplitterWidth ); + return maximumWidth; +} + +@end diff --git a/MacPass/MPOutlineViewController.h b/MacPass/MPOutlineViewController.h new file mode 100644 index 00000000..371fd517 --- /dev/null +++ b/MacPass/MPOutlineViewController.h @@ -0,0 +1,13 @@ +// +// MPOutlineViewController.h +// MacPass +// +// Created by michael starke on 19.02.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import "MPViewController.h" + +@interface MPOutlineViewController : MPViewController + +@end diff --git a/MacPass/MPOutlineViewController.m b/MacPass/MPOutlineViewController.m new file mode 100644 index 00000000..c1f131a4 --- /dev/null +++ b/MacPass/MPOutlineViewController.m @@ -0,0 +1,79 @@ +// +// MPOutlineViewController.m +// MacPass +// +// Created by michael starke on 19.02.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import "MPOutlineViewController.h" +#import "MPOutlineViewDelegate.h" +#import "MPOutlineDataSource.h" +#import "MPDatabaseController.h" +#import "MPDatabaseDocument.h" + +@interface MPOutlineViewController () + +@property (assign) IBOutlet NSOutlineView *outlineView; + +@property (retain) MPOutlineDataSource *datasource; +@property (retain) MPOutlineViewDelegate *outlineDelegate; +@property (retain) NSMenu *menu; + + +- (void)didOpenDocument:(NSNotification *)notification; +- (void)setupMenu; + +@end + +@implementation MPOutlineViewController + +- (id)init { + return [[MPOutlineViewController alloc] initWithNibName:@"OutlineView" bundle:nil]; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + self.outlineDelegate = [[[MPOutlineViewDelegate alloc] init] autorelease]; + self.datasource = [[[MPOutlineDataSource alloc] init] autorelease]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didOpenDocument:) + name:MPDatabaseControllerDidLoadDatabaseNotification + object:nil]; + [self setupMenu]; + } + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [super dealloc]; +} + +- (void)didLoadView { + //[[self.outlineView outlineTableColumn] setIdentifier:kColumnIdentifier]; + [self.outlineView setDataSource:self.datasource]; + [self.outlineView setDelegate:self.outlineDelegate]; + [self.outlineView setMenu:self.menu]; +} + +- (void)didOpenDocument:(NSNotification *)notification { + [self.outlineView reloadData]; + MPDatabaseController *dbContoller = [MPDatabaseController defaultController]; + [self.outlineView expandItem:dbContoller.database.root expandChildren:NO]; +} + +- (void)setupMenu { + NSMenu *menu = [[NSMenu allocWithZone:[NSMenu menuZone]] init]; + [menu addItemWithTitle:@"Add Group" action:NULL keyEquivalent:@""]; + [menu addItem: [NSMenuItem separatorItem]]; + [menu addItemWithTitle:@"Delete" action:NULL keyEquivalent:@""]; + self.menu = menu; + [menu release]; +} + +@end diff --git a/MacPass/MPOutlineViewDelegate.m b/MacPass/MPOutlineViewDelegate.m index c77d1641..2e670476 100644 --- a/MacPass/MPOutlineViewDelegate.m +++ b/MacPass/MPOutlineViewDelegate.m @@ -10,22 +10,26 @@ #import "MPIconHelper.h" #import "KdbLib.h" +NSString *const _MPOutlineViewDataViewIdentifier = @"DataCell"; +NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell"; + @implementation MPOutlineViewDelegate - (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { KdbGroup *group = item; NSTableCellView *view; if(![group parent]) { - view = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; + view = [outlineView makeViewWithIdentifier:_MPOutlinveViewHeaderViewIdentifier owner:self]; [view.textField setStringValue:[group name]]; } else { - view = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; + view = [outlineView makeViewWithIdentifier:_MPOutlineViewDataViewIdentifier owner:self]; NSDictionary *availableIcons = [MPIconHelper availableIcons]; NSInteger randomIndex = rand() % [availableIcons count]; NSImage *icon = [MPIconHelper icon:(MPIconType)randomIndex]; [view.imageView setImage:icon]; [view.textField setStringValue:[group name]]; + } return view; diff --git a/MacPass/MPToolbarDelegate.m b/MacPass/MPToolbarDelegate.m index 8ff39dfa..3901d7dd 100644 --- a/MacPass/MPToolbarDelegate.m +++ b/MacPass/MPToolbarDelegate.m @@ -7,6 +7,7 @@ // #import "MPToolbarDelegate.h" +#import "MPIconHelper.h" NSString *const MPToolbarItemAddGroup = @"AddGroup"; NSString *const MPToolbarItemAddEntry = @"AddEntry"; @@ -63,11 +64,10 @@ NSString *const MPToolbarItemDelete =@"Delete"; } - (NSDictionary *)createToolbarImages{ - - NSDictionary *imageDict = @{ MPToolbarItemAddEntry: [NSImage imageNamed:NSImageNameAddTemplate], - MPToolbarItemAddGroup: [NSImage imageNamed:NSImageNameAddTemplate], - MPToolbarItemDelete: [NSImage imageNamed:NSImageNameRemoveTemplate], - MPToolbarItemEdit: [NSImage imageNamed:NSImageNameRefreshTemplate] + NSDictionary *imageDict = @{ MPToolbarItemAddEntry: [MPIconHelper icon:MPIconCamera], + MPToolbarItemAddGroup: [MPIconHelper icon:MPIconPassword], + MPToolbarItemDelete: [MPIconHelper icon:MPIconServer], + MPToolbarItemEdit: [MPIconHelper icon:MPIconNotepad] }; return imageDict; } diff --git a/MacPass/MainWindow.xib b/MacPass/MainWindow.xib index 4de89125..3e4758d7 100644 --- a/MacPass/MainWindow.xib +++ b/MacPass/MainWindow.xib @@ -12,19 +12,9 @@ IBNSLayoutConstraint - NSButton - NSButtonCell NSCustomObject - NSImageCell - NSImageView - NSOutlineView - NSScrollView - NSScroller + NSCustomView NSSplitView - NSTableCellView - NSTableColumn - NSTextField - NSTextFieldCell NSToolbar NSToolbarFlexibleSpaceItem NSToolbarSpaceItem @@ -51,7 +41,7 @@ 15 2 - {{196, 240}, {738, 609}} + {{196, 240}, {611, 449}} 544735232 Window NSWindow @@ -142,288 +132,52 @@ 256 - + 268 - {{132, 5}, {21, 18}} - - - _NS:22 - YES - - -2080374784 - 134348800 - - - LucidaGrande - 11 - 3100 - - _NS:22 - - -2033958912 - 163 - - NSImage - NSAddTemplate - - - - 400 - 75 - - NO - - - - 268 - {{103, 5}, {21, 18}} - - - - _NS:22 - YES - - -2080374784 - 134348800 - - - _NS:22 - - -2033958912 - 163 - - NSImage - NSRemoveTemplate - - - - 400 - 75 - - NO - - - - 4364 - - - 4364 - - - - 2304 - - - - 4352 - - {163, 577} - - - - _NS:13 - YES - NO - YES - - - -2147483392 - {{224, 0}, {16, 17}} - _NS:16 - - - - AutomaticTableColumnIdentifier.0 - 160 - 16 - 1000 - - 75497536 - 2048 - - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - 3 - MAA - - - - - 337641536 - 2048 - Text Cell - - LucidaGrande - 13 - 1044 - - - - 6 - System - controlBackgroundColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - - - 3 - YES - YES - - - - 3 - 0.0 - - 6 - System - _sourceListBackgroundColor - - 6 - System - alternateSelectedControlColor - - 1 - MCAwIDEAA - - - - - 6 - System - gridColor - - 3 - MC41AA - - - 24 - -767524864 - - - 1 - 15 - 0 - YES - 1 - 1 - 1 - -1 - NO - 14 - - - {163, 577} - - - - _NS:11 - - - 4 - - - - -2147483392 - {{224, 17}, {15, 102}} - - - - _NS:15 - NO - - _doScroller: - 0.99823943661971826 - - - - -2147483392 - {{0, 551}, {191, 16}} - - - - _NS:60 - NO - 1 - - _doScroller: - 0.99479166666666663 - - - {163, 577} - + + + 268 + {151, 449} + - + _NS:9 - 133680 - - - - QSAAAEEgAABBwAAAQcAAAA - 0.25 - 4 - 1 + NSView - - - 274 - - {{164, 0}, {574, 577}} - + + + 256 + {{152, 0}, {459, 449}} + - + _NS:13 + NSView - {{0, 32}, {738, 577}} + {611, 449} - + _NS:9 YES 2 - {738, 609} + {611, 449} - + - {{0, 0}, {2560, 1418}} + {{0, 0}, {1920, 1058}} {10000000000000, 10000000000000} - NO - 32 YES - - - outlineView - - - - 500 - window @@ -432,14 +186,6 @@ 501 - - - contentView - - - - 502 - toolbar @@ -450,127 +196,27 @@ - textField - - - 274 - - - - 266 - {{0, 1}, {160, 14}} - - - _NS:101 - YES - - 67108928 - 272631808 - HEADER CELL - - LucidaGrande-Bold - 11 - 16 - - _NS:101 - - - 6 - System - controlColor - - - - 1 - MC40MzkyMTU2ODYzIDAuNDk0MTE3NjQ3MSAwLjU0OTAxOTYwNzgAA - - - NO - - - {{1, 0}, {160, 17}} - - HeaderCell - - + contentView + + - 438 + 625 - textField - - - 274 - - - - 268 - - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple PNG pasteboard type - NSFilenamesPboardType - NeXT Encapsulated PostScript v1.2 pasteboard type - NeXT TIFF v4.0 pasteboard type - - {{3, 3}, {17, 17}} - - - _NS:71 - YES - - 134217728 - 33554432 - - NSImage - NSActionTemplate - - _NS:71 - 0 - 0 - 0 - NO - - NO - YES - - - - 266 - {{25, 3}, {135, 17}} - - - _NS:80 - YES - - 67108928 - 272631808 - Table View Cell - - _NS:80 - - - - - NO - - - {{1, 17}, {160, 23}} - - DataCell - - + splitView + + - 439 + 627 - imageView - - + outlineView + + - 440 + 634 @@ -612,72 +258,24 @@ 2 - - - 5 + + + 4 0 - - 6 - 1 - - 8 - - 1000 - - 6 - 24 - 3 - - - - 3 - 0 - - 3 + + 4 1 0.0 1000 - 6 - 24 - 2 - - - - 4 - 0 - - 4 - 1 - - 5 - - 1000 - - 3 - 9 - 3 - - - - 5 - 0 - - 5 - 1 - - 103 - - 1000 - - 3 - 9 + 8 + 29 3 - + 6 0 @@ -692,40 +290,8 @@ 29 3 - - - 4 - 0 - - 4 - 1 - - 32 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 5 - 1 - - 0.0 - - 1000 - - 8 - 29 - 3 - - + 3 0 @@ -740,443 +306,25 @@ 29 3 - - - - - - - - 108 - - - - - - 7 - 0 - - 0 - 1 - - 21 - - 1000 - - 3 - 9 - 1 - - - - - - 109 - - - - - 178 - - - - - 179 - - - - - 7 - 0 - - 0 - 1 - - 21 - - 1000 - - 3 - 9 - 1 - - - - - - - 180 - - - - - 181 - - - - - 183 - - - - - 184 - - - - - 405 - - - - - 406 - - - - - 407 - - - - - - - - - 414 - - - - - 415 - - - - - 418 - - - - - 419 - - - - - 420 - - - - - - - - - - 423 - - - - - 422 - - - - - 421 - - - - - - - - 424 - - - - - - - - - - 433 - - - - - 3 - 0 - - 3 - 1 - - 3 - - 1000 - - 8 - 29 - 3 - - - + + 5 0 - - 6 - 1 - - 8 - - 1000 - - 6 - 24 - 3 - - - - 6 - 0 - - 6 - 1 - - 3 - - 1000 - - 8 - 29 - 3 - - - - 4 - 0 - - 4 - 1 - - 3 - - 1000 - - 8 - 29 - 3 - - - - 3 - 0 - - 3 - 1 - - 3 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - + 5 1 - - 3 - - 1000 - - 8 - 29 - 3 - - - - - - - - 430 - - - - - 10 - 0 - - 10 - 1 0.0 1000 - - 5 - 22 - 2 - - - - 6 - 0 - - 6 - 1 - - 3 - - 1000 - + 8 29 3 - - - 5 - 0 - - 5 - 1 - - 3 - - 1000 - - 8 - 29 - 3 - - + - - - - 425 - - - - - 445 - - - - - 446 - - - - - 447 - - - - - 431 - - - - - - - - 432 - - - - - 450 - - - - - 449 - - - - - 453 - - - - - 436 - - - - - - - - 434 - - - - - - 7 - 0 - - 0 - 1 - - 17 - - 1000 - - 3 - 9 - 1 - - - - - - 435 - - - - - 437 - - - - - 475 - - - - - 469 - - - - - - 522 - - - - - 523 - - - - - 524 - - + 591 @@ -1197,6 +345,45 @@ + + 603 + + + + + + + + + 619 + + + + + 615 + + + + + 614 + + + + + 628 + + + + + 605 + + + + + 643 + + + @@ -1208,101 +395,30 @@ com.apple.InterfaceBuilder.CocoaPlugin {{357, 418}, {480, 270}} - - - - - 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 - 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 - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - HeaderCell - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - DataCell - - - - - 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 - 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 + + 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 - 597 + 643 @@ -1311,7 +427,8 @@ NSWindowController NSView - NSOutlineView + NSView + NSSplitView NSToolbar NSView @@ -1322,7 +439,11 @@ outlineView - NSOutlineView + NSView + + + splitView + NSSplitView toolbar @@ -1353,11 +474,8 @@ YES 3 - {15, 15} - {8, 8} {11, 11} {10, 3} - {8, 8} YES diff --git a/MacPass/OutlineView.xib b/MacPass/OutlineView.xib new file mode 100644 index 00000000..d783a2e9 --- /dev/null +++ b/MacPass/OutlineView.xib @@ -0,0 +1,817 @@ + + + + 1080 + 12C60 + 3084 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSCustomObject + NSImageCell + NSImageView + NSOutlineView + NSScrollView + NSScroller + NSTableCellView + NSTableColumn + NSTextField + NSTextFieldCell + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + MPOutlineViewController + + + FirstResponder + + + NSApplication + + + + 268 + + + + 2304 + + + + 256 + + {139, 231} + + + + _NS:13 + YES + NO + YES + + + -2147483392 + {{224, 0}, {16, 17}} + _NS:16 + + + + AutomaticTableColumnIdentifier.0 + 136 + 16 + 1000 + + 75497536 + 2048 + + + LucidaGrande + 11 + 3100 + + + 3 + MC4zMzMzMzI5ODU2AA + + + 6 + System + headerTextColor + + 3 + MAA + + + + + 337641536 + 2048 + Text Cell + + LucidaGrande + 13 + 1044 + + + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + + + 3 + YES + YES + + + + 3 + 0.0 + + 6 + System + _sourceListBackgroundColor + + 6 + System + alternateSelectedControlColor + + 1 + MCAwIDEAA + + + + + 6 + System + gridColor + + 3 + MC41AA + + + 17 + -767557632 + + + 4 + 15 + 0 + YES + 1 + 1 + 1 + -1 + NO + 14 + + + {139, 231} + + + + _NS:11 + + + 4 + + + + -2147483392 + {{224, 17}, {15, 102}} + + + + _NS:15 + NO + + _doScroller: + 0.99749373433583954 + + + + -2147483392 + {{1, 119}, {238, 15}} + + + + _NS:60 + NO + 1 + + _doScroller: + 0.99328859060402686 + + + {139, 231} + + + + _NS:9 + 133680 + + + + QSAAAEEgAABBwAAAQcAAAA + 0.25 + 4 + 1 + + + + + + + outlineView + + + + 97 + + + + view + + + + 181 + + + + textField + + + 274 + + + + 266 + {{0, 1}, {136, 14}} + + + _NS:101 + YES + + 67108928 + 272631808 + HEADER CELL + + LucidaGrande-Bold + 11 + 16 + + _NS:101 + + + 6 + System + controlColor + + + + 1 + MC40MzkyMTU2ODYzIDAuNDk0MTE3NjQ3MSAwLjU0OTAxOTYwNzgAA + + + NO + + + {{1, 0}, {136, 17}} + + HeaderCell + + + + 84 + + + + textField + + + 274 + + + + 268 + + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple PNG pasteboard type + NSFilenamesPboardType + NeXT Encapsulated PostScript v1.2 pasteboard type + NeXT TIFF v4.0 pasteboard type + + {{3, 0}, {17, 17}} + + + _NS:71 + YES + + 134217728 + 33554432 + + NSImage + NSActionTemplate + + _NS:71 + 0 + 0 + 0 + NO + + NO + YES + + + + 266 + {{25, 0}, {111, 17}} + + + _NS:80 + YES + + 67108928 + 272631808 + Table View Cell + + _NS:80 + + + + + NO + + + {{1, 17}, {136, 17}} + + DataCell + + + + 85 + + + + imageView + + + + 86 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 66 + + + + + + + + + + 67 + + + + + + + + 68 + + + + + 69 + + + + + 70 + + + + + + + + + + 71 + + + + + 76 + + + + + + 5 + 0 + + 5 + 1 + + 3 + + 1000 + + 8 + 29 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + 6 + 0 + + 6 + 1 + + 3 + + 1000 + + 8 + 29 + 3 + + + + + + 79 + + + + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + 6 + 0 + + 6 + 1 + + 3 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 3 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + + + 80 + + + + + + 7 + 0 + + 0 + 1 + + 17 + + 1000 + + 3 + 9 + 1 + + + + + + 82 + + + + + + + + 93 + + + + + 91 + + + + + 90 + + + + + 95 + + + + + 94 + + + + + 92 + + + + + 83 + + + + + 81 + + + + + 96 + + + + + 77 + + + + + + + + 89 + + + + + 88 + + + + + 87 + + + + + 78 + + + + + + + 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 + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + HeaderCell + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + DataCell + + + + + 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 + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 188 + + + + + MPOutlineViewController + MPViewController + + NSMenu + NSOutlineView + + + + itemMenu + NSMenu + + + outlineView + NSOutlineView + + + + IBProjectSource + ./Classes/MPOutlineViewController.h + + + + MPViewController + NSViewController + + IBProjectSource + ./Classes/MPViewController.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + + NSActionTemplate + {15, 15} + + YES + +