Merged Advanced and Templates of database settings into on - Advanced

Added encryption rounds benchmark and setting to security tab (non-functional setter, benchmark works)
This commit is contained in:
michael starke
2013-09-11 00:54:26 +02:00
parent 5796333a2e
commit 2d84f2f8f8
10 changed files with 1223 additions and 698 deletions

View File

@@ -38,6 +38,7 @@
4C19E500178E26EF002F2CD0 /* Test_Password_1234.kdbx in Resources */ = {isa = PBXBuildFile; fileRef = 4C19E4FF178E26EF002F2CD0 /* Test_Password_1234.kdbx */; }; 4C19E500178E26EF002F2CD0 /* Test_Password_1234.kdbx in Resources */ = {isa = PBXBuildFile; fileRef = 4C19E4FF178E26EF002F2CD0 /* Test_Password_1234.kdbx */; };
4C19E503178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */; }; 4C19E503178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */; };
4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; }; 4C1DDCDD1711ECEB00C98DA3 /* PasswordCreatorWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */; };
4C224B4217DFCB2400FF6AEE /* MPNumericalInputFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C224B4117DFCB2400FF6AEE /* MPNumericalInputFormatter.m */; };
4C245B76176E1E3D0086100E /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6A176E1E3C0086100E /* DDData.m */; }; 4C245B76176E1E3D0086100E /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6A176E1E3C0086100E /* DDData.m */; };
4C245B77176E1E3D0086100E /* DDNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6C176E1E3C0086100E /* DDNumber.m */; }; 4C245B77176E1E3D0086100E /* DDNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6C176E1E3C0086100E /* DDNumber.m */; };
4C245B78176E1E3D0086100E /* DDRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6E176E1E3C0086100E /* DDRange.m */; }; 4C245B78176E1E3D0086100E /* DDRange.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C245A6E176E1E3C0086100E /* DDRange.m */; };
@@ -328,6 +329,8 @@
4C19E501178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabasePasswordAndKeyfile.h; sourceTree = "<group>"; }; 4C19E501178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatabasePasswordAndKeyfile.h; sourceTree = "<group>"; };
4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabasePasswordAndKeyfile.m; sourceTree = "<group>"; }; 4C19E502178E2871002F2CD0 /* MPDatabasePasswordAndKeyfile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDatabasePasswordAndKeyfile.m; sourceTree = "<group>"; };
4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; }; 4C1DDCDC1711ECEB00C98DA3 /* PasswordCreatorWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PasswordCreatorWindow.xib; sourceTree = "<group>"; };
4C224B4017DFCB2300FF6AEE /* MPNumericalInputFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNumericalInputFormatter.h; sourceTree = "<group>"; };
4C224B4117DFCB2400FF6AEE /* MPNumericalInputFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNumericalInputFormatter.m; sourceTree = "<group>"; };
4C245A69176E1E3C0086100E /* DDData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDData.h; sourceTree = "<group>"; }; 4C245A69176E1E3C0086100E /* DDData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDData.h; sourceTree = "<group>"; };
4C245A6A176E1E3C0086100E /* DDData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDData.m; sourceTree = "<group>"; }; 4C245A6A176E1E3C0086100E /* DDData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDData.m; sourceTree = "<group>"; };
4C245A6B176E1E3C0086100E /* DDNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDNumber.h; sourceTree = "<group>"; }; 4C245A6B176E1E3C0086100E /* DDNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDNumber.h; sourceTree = "<group>"; };
@@ -1046,6 +1049,8 @@
4CA23359176DBFE100F0B6AC /* MPLockDaemon.m */, 4CA23359176DBFE100F0B6AC /* MPLockDaemon.m */,
4C4B7EF617A4B335000234C7 /* MPUniqueCharactersFormatter.h */, 4C4B7EF617A4B335000234C7 /* MPUniqueCharactersFormatter.h */,
4C4B7EF717A4B335000234C7 /* MPUniqueCharactersFormatter.m */, 4C4B7EF717A4B335000234C7 /* MPUniqueCharactersFormatter.m */,
4C224B4017DFCB2300FF6AEE /* MPNumericalInputFormatter.h */,
4C224B4117DFCB2400FF6AEE /* MPNumericalInputFormatter.m */,
); );
name = Helper; name = Helper;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1999,6 +2004,7 @@
4CC6DB7D17D23DCE002C6091 /* KPKUTIs.m in Sources */, 4CC6DB7D17D23DCE002C6091 /* KPKUTIs.m in Sources */,
4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */, 4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */,
4C00E33817D8FA3500F37192 /* DDHotKeyCenter.m in Sources */, 4C00E33817D8FA3500F37192 /* DDHotKeyCenter.m in Sources */,
4C224B4217DFCB2400FF6AEE /* MPNumericalInputFormatter.m in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@@ -70,7 +70,7 @@
<CommandLineArguments> <CommandLineArguments>
<CommandLineArgument <CommandLineArgument
argument = "-NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints YES" argument = "-NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints YES"
isEnabled = "YES"> isEnabled = "NO">
</CommandLineArgument> </CommandLineArgument>
</CommandLineArguments> </CommandLineArguments>
<AdditionalOptions> <AdditionalOptions>

File diff suppressed because it is too large Load Diff

View File

@@ -11,9 +11,8 @@
typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) { typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
MPDatabaseSettingsTabGeneral, MPDatabaseSettingsTabGeneral,
MPDatabaseSettingsTabDisplay, MPDatabaseSettingsTabSecurity,
MPDatabaseSettingsTabAdvanced, MPDatabaseSettingsTabAdvanced
MPDatabaseSettingsTabTemplates,
}; };
@class MPDocument; @class MPDocument;
@@ -27,21 +26,20 @@ typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
@property (weak) IBOutlet NSTextField *databaseNameTextField; @property (weak) IBOutlet NSTextField *databaseNameTextField;
@property (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView; @property (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView;
/* Display Tab */ /* Security Tab */
@property (weak) IBOutlet NSButton *protectTitleCheckButton; @property (weak) IBOutlet NSButton *protectTitleCheckButton;
@property (weak) IBOutlet NSButton *protectUserNameCheckButton; @property (weak) IBOutlet NSButton *protectUserNameCheckButton;
@property (weak) IBOutlet NSButton *protectPasswortCheckButton; @property (weak) IBOutlet NSButton *protectPasswortCheckButton;
@property (weak) IBOutlet NSButton *protectURLCheckButton; @property (weak) IBOutlet NSButton *protectURLCheckButton;
@property (weak) IBOutlet NSButton *protectNotesCheckButton; @property (weak) IBOutlet NSButton *protectNotesCheckButton;
@property (weak) IBOutlet NSTextField *encryptionRoundsTextField;
@property (weak) IBOutlet NSButton *benchmarkButton;
/* Advanced Tab*/ /* Advanced Tab*/
@property (weak) IBOutlet NSButton *enableRecycleBinCheckButton; @property (weak) IBOutlet NSButton *enableRecycleBinCheckButton;
@property (weak) IBOutlet NSButton *emptyRecycleBinOnQuitCheckButton; @property (weak) IBOutlet NSButton *emptyRecycleBinOnQuitCheckButton;
@property (weak) IBOutlet NSPopUpButton *selectRecycleBinGroupPopUpButton; @property (weak) IBOutlet NSPopUpButton *selectRecycleBinGroupPopUpButton;
@property (weak) IBOutlet NSTextField *defaultUsernameTextField;
/* Templates Tab */
@property (weak) IBOutlet HNHRoundedTextField *defaultUsernameTextField;
@property (weak) IBOutlet NSPopUpButton *templateGroupPopUpButton; @property (weak) IBOutlet NSPopUpButton *templateGroupPopUpButton;

View File

@@ -12,11 +12,13 @@
#import "MPDatabaseVersion.h" #import "MPDatabaseVersion.h"
#import "MPIconHelper.h" #import "MPIconHelper.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
#import "MPNumericalInputFormatter.h"
#import "KPKGroup.h" #import "KPKGroup.h"
#import "KPKTree.h" #import "KPKTree.h"
#import "KPKMetaData.h" #import "KPKMetaData.h"
#import "KPKNode+IconImage.h" #import "KPKNode+IconImage.h"
#import "KPKPassword.h"
#import "HNHRoundedTextField.h" #import "HNHRoundedTextField.h"
#import "HNHRoundedSecureTextField.h" #import "HNHRoundedSecureTextField.h"
@@ -54,8 +56,11 @@
NSAssert(_document != nil, @"Document needs to be present"); NSAssert(_document != nil, @"Document needs to be present");
[self.sectionTabView setDelegate:self]; [self.sectionTabView setDelegate:self];
[self.encryptionRoundsTextField setFormatter:[[MPNumericalInputFormatter alloc] init]];
} }
#pragma mark Actions
- (IBAction)save:(id)sender { - (IBAction)save:(id)sender {
/* General */ /* General */
KPKMetaData *metaData = _document.tree.metaData; KPKMetaData *metaData = _document.tree.metaData;
@@ -103,6 +108,14 @@
[self dismissSheet:0]; [self dismissSheet:0];
} }
- (IBAction)benchmarkRounds:(id)sender {
[self.benchmarkButton setEnabled:NO];
[KPKPassword benchmarkTransformationRounds:1 completionHandler:^(NSUInteger rounds) {
[self.encryptionRoundsTextField setIntegerValue:rounds];
[self.benchmarkButton setEnabled:YES];
}];
}
- (void)updateView { - (void)updateView {
if(!self.isDirty) { if(!self.isDirty) {
return; return;
@@ -112,7 +125,6 @@
[self _setupDatabase:metaData]; [self _setupDatabase:metaData];
[self _setupProtectionTab:metaData]; [self _setupProtectionTab:metaData];
[self _setupAdvancedTab:_document.tree]; [self _setupAdvancedTab:_document.tree];
[self _setupTemplatesTab:_document.tree];
self.isDirty = NO; self.isDirty = NO;
} }
@@ -124,11 +136,6 @@
if(![self window]) { if(![self window]) {
return; return;
} }
NSTabViewItem *tabViewItem = [self.sectionTabView tabViewItemAtIndex:tab];
BOOL canSelectTab = [self tabView:self.sectionTabView shouldSelectTabViewItem:tabViewItem];
if(!canSelectTab) {
[self.sectionTabView selectTabViewItemAtIndex:MPDatabaseSettingsTabTemplates];
}
[self.sectionTabView selectTabViewItemAtIndex:tab]; [self.sectionTabView selectTabViewItemAtIndex:tab];
} }
@@ -136,14 +143,10 @@
- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem { - (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem {
NSUInteger index = [tabView indexOfTabViewItem:tabViewItem]; NSUInteger index = [tabView indexOfTabViewItem:tabViewItem];
switch ((MPDatabaseSettingsTab)index) { switch ((MPDatabaseSettingsTab)index) {
case MPDatabaseSettingsTabDisplay: case MPDatabaseSettingsTabSecurity:
return YES;
case MPDatabaseSettingsTabAdvanced: case MPDatabaseSettingsTabAdvanced:
case MPDatabaseSettingsTabGeneral: case MPDatabaseSettingsTabGeneral:
case MPDatabaseSettingsTabTemplates:
return YES; return YES;
//return (_document.version == MPDatabaseVersion4);
default: default:
return NO; return NO;
@@ -162,15 +165,15 @@
[self.protectTitleCheckButton setState:metaData.protectTitle ? NSOnState : NSOffState]; [self.protectTitleCheckButton setState:metaData.protectTitle ? NSOnState : NSOffState];
[self.protectURLCheckButton setState:metaData.protectUrl ? NSOnState : NSOffState]; [self.protectURLCheckButton setState:metaData.protectUrl ? NSOnState : NSOffState];
[self.protectUserNameCheckButton setState:metaData.protectUserName ? NSOnState : NSOffState]; [self.protectUserNameCheckButton setState:metaData.protectUserName ? NSOnState : NSOffState];
[self.encryptionRoundsTextField setIntegerValue:metaData.rounds];
[self.benchmarkButton setEnabled:YES];
} }
- (void)_setupAdvancedTab:(KPKTree *)tree { - (void)_setupAdvancedTab:(KPKTree *)tree {
[self.enableRecycleBinCheckButton bind:NSValueBinding toObject:self withKeyPath:@"trashEnabled" options:nil]; [self.enableRecycleBinCheckButton bind:NSValueBinding toObject:self withKeyPath:@"trashEnabled" options:nil];
[self.selectRecycleBinGroupPopUpButton bind:NSEnabledBinding toObject:self withKeyPath:@"trashEnabled" options:nil]; [self.selectRecycleBinGroupPopUpButton bind:NSEnabledBinding toObject:self withKeyPath:@"trashEnabled" options:nil];
[self _updateTrashFolders:tree]; [self _updateTrashFolders:tree];
}
- (void)_setupTemplatesTab:(KPKTree *)tree {
[self.defaultUsernameTextField setStringValue:tree.metaData.defaultUserName]; [self.defaultUsernameTextField setStringValue:tree.metaData.defaultUserName];
[self.defaultUsernameTextField setEditable:YES]; [self.defaultUsernameTextField setEditable:YES];
[self _updateTemplateGroup:tree]; [self _updateTemplateGroup:tree];
@@ -182,19 +185,16 @@
switch(tab) { switch(tab) {
case MPDatabaseSettingsTabAdvanced: case MPDatabaseSettingsTabAdvanced:
[[self window] makeFirstResponder:self.databaseNameTextField]; [[self window] makeFirstResponder:self.defaultUsernameTextField];
break; break;
case MPDatabaseSettingsTabDisplay: case MPDatabaseSettingsTabSecurity:
[[self window] makeFirstResponder:self.protectTitleCheckButton]; [[self window] makeFirstResponder:self.protectTitleCheckButton];
break; break;
case MPDatabaseSettingsTabGeneral: case MPDatabaseSettingsTabGeneral:
[[self window] makeFirstResponder:self.databaseNameTextField]; [[self window] makeFirstResponder:self.databaseNameTextField];
break; break;
case MPDatabaseSettingsTabTemplates:
break;
} }
} }

View File

@@ -299,7 +299,7 @@ typedef NS_ENUM(NSUInteger, MPAlertContext) {
} }
- (void)editTemplateGroup:(id)sender { - (void)editTemplateGroup:(id)sender {
[self _showDatabaseSetting:MPDatabaseSettingsTabTemplates]; [self _showDatabaseSetting:MPDatabaseSettingsTabAdvanced];
} }
- (void)editTrashGroup:(id)sender { - (void)editTrashGroup:(id)sender {

View File

@@ -0,0 +1,13 @@
//
// MPNumericalInputFormatter.h
// MacPass
//
// Created by Michael Starke on 10.09.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MPNumericalInputFormatter : NSFormatter
@end

View File

@@ -0,0 +1,46 @@
//
// MPNumericalInputFormatter.m
// MacPass
//
// Created by Michael Starke on 10.09.13.
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
//
#import "MPNumericalInputFormatter.h"
@implementation MPNumericalInputFormatter
static NSCharacterSet *_characterSet = nil;
- (id)init
{
self = [super init];
if (self) {
_characterSet = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890"] invertedSet];
}
return self;
}
- (NSString *)stringForObjectValue:(id)obj {
if([obj isKindOfClass:[NSNumber class]]) {
return [[NSString alloc] initWithFormat:@"%ld",[obj integerValue]];
}
return nil;
}
- (BOOL)getObjectValue:(out id *)obj forString:(NSString *)string errorDescription:(out NSString **)error {
NSNumber *number = [[NSNumber alloc] initWithInteger:[string integerValue]];
*obj = number;
return YES;
}
- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
originalString:(NSString *)origString
originalSelectedRange:(NSRange)origSelRange
errorDescription:(NSString **)error {
NSRange range = [*partialStringPtr rangeOfCharacterFromSet:_characterSet];
return (range.location == NSNotFound);
}
@end

View File

@@ -151,7 +151,7 @@
<string key="NSFrame">{{90, 60}, {200, 19}}</string> <string key="NSFrame">{{90, 60}, {200, 19}}</string>
<reference key="NSSuperview" ref="1006"/> <reference key="NSSuperview" ref="1006"/>
<reference key="NSWindow"/> <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="939116773"/> <reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string> <string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="1067181375"> <object class="NSButtonCell" key="NSCell" id="1067181375">
@@ -350,6 +350,7 @@
<string key="NSFrame">{{184, 13}, {151, 32}}</string> <string key="NSFrame">{{184, 13}, {151, 32}}</string>
<reference key="NSSuperview" ref="1006"/> <reference key="NSSuperview" ref="1006"/>
<reference key="NSWindow"/> <reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string> <string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool> <bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="767191408"> <object class="NSButtonCell" key="NSCell" id="767191408">
@@ -399,7 +400,7 @@
<reference key="NSWindow"/> <reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1060378975"/> <reference key="NSNextKeyView" ref="1060378975"/>
</object> </object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string> <string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string> <string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<bool key="NSWindowIsRestorable">YES</bool> <bool key="NSWindowIsRestorable">YES</bool>
</object> </object>
@@ -1361,11 +1362,6 @@
<reference key="object" ref="819722880"/> <reference key="object" ref="819722880"/>
<reference key="parent" ref="1006"/> <reference key="parent" ref="1006"/>
</object> </object>
<object class="IBObjectRecord">
<int key="objectID">76</int>
<reference key="object" ref="200690376"/>
<reference key="parent" ref="1006"/>
</object>
<object class="IBObjectRecord"> <object class="IBObjectRecord">
<int key="objectID">77</int> <int key="objectID">77</int>
<reference key="object" ref="452811316"/> <reference key="object" ref="452811316"/>
@@ -1376,6 +1372,11 @@
<reference key="object" ref="819324786"/> <reference key="object" ref="819324786"/>
<reference key="parent" ref="1006"/> <reference key="parent" ref="1006"/>
</object> </object>
<object class="IBObjectRecord">
<int key="objectID">76</int>
<reference key="object" ref="200690376"/>
<reference key="parent" ref="1006"/>
</object>
</array> </array>
</object> </object>
<dictionary class="NSMutableDictionary" key="flattenedProperties"> <dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -1502,7 +1503,7 @@
<nil key="activeLocalization"/> <nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/> <dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/> <nil key="sourceID"/>
<int key="maxID">85</int> <int key="maxID">98</int>
</object> </object>
<object class="IBClassDescriber" key="IBDocument.Classes"> <object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions"> <array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1529,16 +1530,10 @@
<string key="className">MPPasswordEditWindowController</string> <string key="className">MPPasswordEditWindowController</string>
<string key="superclassName">MPSheetWindowController</string> <string key="superclassName">MPSheetWindowController</string>
<dictionary class="NSMutableDictionary" key="actions"> <dictionary class="NSMutableDictionary" key="actions">
<string key="cancel:">id</string>
<string key="clearKey:">id</string> <string key="clearKey:">id</string>
<string key="generateKey:">id</string> <string key="generateKey:">id</string>
<string key="save:">id</string>
</dictionary> </dictionary>
<dictionary class="NSMutableDictionary" key="actionInfosByName"> <dictionary class="NSMutableDictionary" key="actionInfosByName">
<object class="IBActionInfo" key="cancel:">
<string key="name">cancel:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo" key="clearKey:"> <object class="IBActionInfo" key="clearKey:">
<string key="name">clearKey:</string> <string key="name">clearKey:</string>
<string key="candidateClassName">id</string> <string key="candidateClassName">id</string>
@@ -1547,10 +1542,6 @@
<string key="name">generateKey:</string> <string key="name">generateKey:</string>
<string key="candidateClassName">id</string> <string key="candidateClassName">id</string>
</object> </object>
<object class="IBActionInfo" key="save:">
<string key="name">save:</string>
<string key="candidateClassName">id</string>
</object>
</dictionary> </dictionary>
<dictionary class="NSMutableDictionary" key="outlets"> <dictionary class="NSMutableDictionary" key="outlets">
<string key="changePasswordButton">NSButton</string> <string key="changePasswordButton">NSButton</string>