2
0

Usability improvements to OS X MP app.

[ADDED]     OS X: A status item to activate the MP window.
[ADDED]     OS X: A global hotkey (cmd-ctrl-p) to activate the MP
            window.
[ADDED]     OS X: Make the MP window dismissable by hitting Esc.
[ADDED]     OS X: Copy the site content by hitting Enter.
[FIXED]     OS X: Make the password field first responder.
[FIXED]     OS X: Don't pop the password window multiple times if the
            application gets activated while the key isn't set yet.
[IMPROVED]  OS X: Remove the MP icon from the dock.
This commit is contained in:
Maarten Billemont 2012-05-05 00:15:51 +02:00
parent 376953ae56
commit 424479dada
7 changed files with 386 additions and 253 deletions

View File

@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
DA44255715546C580052177D /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA44255615546C570052177D /* Carbon.framework */; };
DA600BEB150420AC008E9AB6 /* MPPasswordWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA600BE9150420AC008E9AB6 /* MPPasswordWindowController.m */; };
DA600BEC150420AC008E9AB6 /* MPPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA600BEA150420AC008E9AB6 /* MPPasswordWindowController.xib */; };
DA600C2D150565FC008E9AB6 /* MPConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = DA600C2A150565FC008E9AB6 /* MPConfig.m */; };
@ -1430,6 +1431,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
DA44255615546C570052177D /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
DA600BE8150420AC008E9AB6 /* MPPasswordWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordWindowController.h; sourceTree = "<group>"; };
DA600BE9150420AC008E9AB6 /* MPPasswordWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordWindowController.m; sourceTree = "<group>"; };
DA600BEA150420AC008E9AB6 /* MPPasswordWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPPasswordWindowController.xib; sourceTree = "<group>"; };
@ -3235,6 +3237,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DA44255715546C580052177D /* Carbon.framework in Frameworks */,
DADEA5D51503EEDF00FD084E /* Security.framework in Frameworks */,
DAFE4A6415039CDC003ABA7C /* Pearl.dylib in Frameworks */,
DAB8D98D150374AD00CED3BC /* Cocoa.framework in Frameworks */,
@ -3982,7 +3985,6 @@
DAB8D97D150374AC00CED3BC = {
isa = PBXGroup;
children = (
DADEA5D31503EEA700FD084E /* Security.framework */,
DAB8D992150374AD00CED3BC /* MasterPassword */,
DA600C5915057F0F008E9AB6 /* Resources */,
DAB8D9DA1503940100CED3BC /* Pearl */,
@ -4007,6 +4009,8 @@
DAB8D98B150374AD00CED3BC /* Frameworks */ = {
isa = PBXGroup;
children = (
DA44255615546C570052177D /* Carbon.framework */,
DADEA5D31503EEA700FD084E /* Security.framework */,
DAB8D98C150374AD00CED3BC /* Cocoa.framework */,
DAB8D98E150374AD00CED3BC /* Other Frameworks */,
);

View File

@ -12,6 +12,7 @@
@interface MPAppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (strong) NSStatusItem *statusItem;
- (IBAction)saveAction:(id)sender;

View File

@ -9,16 +9,20 @@
#import "MPAppDelegate_Key.h"
#import "MPConfig.h"
#import "MPElementEntity.h"
#import <Carbon/Carbon.h>
@interface MPAppDelegate ()
@property (readwrite, strong, nonatomic) MPPasswordWindowController *passwordWindow;
- (void)activate;
@end
@implementation MPAppDelegate
@synthesize window = _window;
@synthesize window;
@synthesize statusItem;
@synthesize passwordWindow;
@dynamic persistentStoreCoordinator, managedObjectModel, managedObjectContext;
@ -26,19 +30,57 @@
@synthesize keyHash;
@synthesize keyHashHex;
static EventHotKeyID MPShowHotKey = { .signature = 'show', .id = 1 };
+ (void)initialize {
[MPConfig get];
#ifdef DEBUG
[PearlLogger get].autoprintLevel = PearlLogLevelTrace
;
[PearlLogger get].autoprintLevel = PearlLogLevelTrace;
#endif
}
static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData){
// Extract the hotkey ID.
EventHotKeyID hotKeyID;
GetEventParameter(theEvent,kEventParamDirectObject,typeEventHotKeyID,
NULL,sizeof(hotKeyID),NULL,&hotKeyID);
// Check which hotkey this was.
if (hotKeyID.signature == MPShowHotKey.signature && hotKeyID.id == MPShowHotKey.id) {
[((__bridge MPAppDelegate *)userData) activate];
return noErr;
}
return eventNotHandledErr;
}
- (void)activate {
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[self managedObjectContext];
// Status item.
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
self.statusItem.title = @"•••";
self.statusItem.highlightMode = YES;
self.statusItem.target = self;
self.statusItem.action = @selector(activate);
// Global hotkey.
EventHotKeyRef hotKeyRef;
EventTypeSpec hotKeyEvents[1] = { { .eventClass = kEventClassKeyboard, .eventKind = kEventHotKeyPressed } };
OSStatus status = InstallApplicationEventHandler(NewEventHandlerUPP(MPHotKeyHander), GetEventTypeCount(hotKeyEvents), hotKeyEvents,
(__bridge void *)self, NULL);
if(status != noErr)
err(@"Error installing application event handler: %d", status);
status = RegisterEventHotKey(35 /* p */, controlKey + cmdKey, MPShowHotKey, GetApplicationEventTarget(), 0, &hotKeyRef);
if(status != noErr)
err(@"Error registering hotkey: %d", status);
}
- (void)applicationDidBecomeActive:(NSNotification *)notification {
@ -59,13 +101,16 @@
if (!self.key)
// Ask the user to set the key through his master password.
dispatch_async(dispatch_get_main_queue(), ^{
if (self.key)
return;
NSAlert *alert = [NSAlert alertWithMessageText:@"Master Password is locked."
defaultButton:@"Unlock" alternateButton:@"Change" otherButton:@"Quit"
informativeTextWithFormat:@"Your master password is required to unlock the application."];
NSTextField *passwordField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 22)];
NSSecureTextField *passwordField = [[NSSecureTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 22)];
[alert setAccessoryView:passwordField];
[passwordField becomeFirstResponder];
[alert layout];
[passwordField becomeFirstResponder];
do {
NSInteger button = [alert runModal];

View File

@ -9,8 +9,9 @@
#import <Cocoa/Cocoa.h>
@interface MPPasswordWindowController : NSWindowController <NSTextFieldDelegate>
@property (weak) IBOutlet NSTextField *siteField;
@property (weak) IBOutlet NSTextField *contentField;
- (IBAction)empty:(id)sender;
@property (weak) IBOutlet NSTextField *tipField;
@end

View File

@ -22,10 +22,17 @@
@synthesize oldSiteName, siteResults;
@synthesize siteField;
@synthesize contentField;
@synthesize tipField;
- (void)windowDidLoad {
[self.contentField setStringValue:@""];
[self.tipField setStringValue:@""];
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotification object:self.window queue:nil
usingBlock:^(NSNotification *note) {
[self.siteField selectText:self];
}];
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification object:self.window queue:nil
usingBlock:^(NSNotification *note) {
[[NSApplication sharedApplication] hide:self];
@ -35,6 +42,10 @@
NSString *newSiteName = [self.siteField stringValue];
BOOL shouldComplete = [self.oldSiteName length] < [newSiteName length];
self.oldSiteName = newSiteName;
if ([self trySite])
shouldComplete = NO;
if (shouldComplete)
[[[note userInfo] objectForKey:@"NSFieldEditor"] complete:nil];
}];
@ -45,9 +56,9 @@
- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index {
NSString *query = [[control stringValue] substringWithRange:charRange];
if (![query length] || ![MPAppDelegate get].keyHashHex)
return nil;
assert(query);
assert([MPAppDelegate get].keyHashHex);
NSFetchRequest *fetchRequest = [MPAppDelegate.managedObjectModel
fetchRequestFromTemplateWithName:@"MPElements"
substitutionVariables:[NSDictionary dictionaryWithObjectsAndKeys:
@ -66,70 +77,91 @@
if (self.siteResults)
for (MPElementEntity *element in self.siteResults)
[mutableResults addObject:element.name];
// [mutableResults addObject:query]; // For when the app should be able to create new sites.
// [mutableResults addObject:query]; // For when the app should be able to create new sites.
return mutableResults;
}
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector {
dbg(@"Selector = %@", NSStringFromSelector(commandSelector));
if (commandSelector == @selector(cancel:))
[self.window close];
if (commandSelector == @selector(insertNewline:) && [[self.contentField stringValue] length]) {
[[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
if ([[NSPasteboard generalPasteboard] setString:[self.contentField stringValue] forType:NSPasteboardTypeString]) {
self.tipField.alphaValue = 1;
[self.tipField setStringValue:@"Copied!"];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 3.0f * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.2f];
[self.tipField.animator setAlphaValue:0];
[NSAnimationContext endGrouping];
});
return YES;
} else
wrn(@"Couldn't copy password to pasteboard.");
}
return NO;
}
- (void)controlTextDidEndEditing:(NSNotification *)obj {
if (obj.object == self.siteField) {
NSString *siteName = [self.siteField stringValue];
MPElementEntity *result = nil;
for (MPElementEntity *element in self.siteResults)
if ([element.name isEqualToString:siteName]) {
result = element;
break;
}
if (result)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSString *description = [result description];
[result use];
dispatch_async(dispatch_get_main_queue(), ^{
[self.contentField setStringValue:description];
});
});
// For when the app should be able to create new sites.
// else
// [[MPAppDelegate get].managedObjectContext performBlock:^{
// MPElementEntity *element = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MPElementGeneratedEntity class])
// inManagedObjectContext:[MPAppDelegate get].managedObjectContext];
// assert([element isKindOfClass:ClassFromMPElementType(element.type)]);
// assert([MPAppDelegate get].keyHashHex);
//
// element.name = siteName;
// element.mpHashHex = [MPAppDelegate get].keyHashHex;
//
// NSString *description = [element description];
// [element use];
//
// dispatch_async(dispatch_get_main_queue(), ^{
// [self.contentField setStringValue:description? description: @""];
// });
// }];
}
if (obj.object == self.siteField)
[self trySite];
}
- (IBAction)empty:(id)sender {
- (BOOL)trySite {
for(NSEntityDescription *entity in [[MPAppDelegate managedObjectModel] entities]) {
NSFetchRequest *request = [NSFetchRequest new];
[request setEntity:entity];
NSError *error;
NSArray *results = [[MPAppDelegate managedObjectContext] executeFetchRequest:request error:&error];
for(NSManagedObject *o in results) {
[[MPAppDelegate managedObjectContext] deleteObject:o];
}
MPElementEntity *result = [self findElement];
if (!result) {
[self.contentField setStringValue:@""];
[self.tipField setStringValue:@""];
return NO;
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSString *description = [result description];
[result use];
dispatch_async(dispatch_get_main_queue(), ^{
[self.contentField setStringValue:description];
[self.tipField setStringValue:@"Hit enter to copy the password."];
self.tipField.alphaValue = 1;
});
});
// For when the app should be able to create new sites.
/*
else
[[MPAppDelegate get].managedObjectContext performBlock:^{
MPElementEntity *element = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([MPElementGeneratedEntity class])
inManagedObjectContext:[MPAppDelegate get].managedObjectContext];
assert([element isKindOfClass:ClassFromMPElementType(element.type)]);
assert([MPAppDelegate get].keyHashHex);
element.name = siteName;
element.mpHashHex = [MPAppDelegate get].keyHashHex;
NSString *description = [element description];
[element use];
dispatch_async(dispatch_get_main_queue(), ^{
[self.contentField setStringValue:description? description: @""];
});
}];
*/
return YES;
}
- (MPElementEntity *)findElement {
for (MPElementEntity *element in self.siteResults)
if ([element.name isEqualToString:[self.siteField stringValue]])
return element;
return nil;
}
@end

View File

@ -12,13 +12,11 @@
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSTextField</string>
<string>NSView</string>
<string>NSWindowTemplate</string>
<string>NSCustomObject</string>
<string>IBNSLayoutConstraint</string>
<string>NSButtonCell</string>
<string>NSButton</string>
<string>NSTextFieldCell</string>
<string>NSWindowTemplate</string>
<string>NSView</string>
<string>IBNSLayoutConstraint</string>
<string>NSCustomObject</string>
</array>
<array key="IBDocument.PluginDependencies">
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -38,15 +36,15 @@
<string key="NSClassName">NSApplication</string>
</object>
<object class="NSWindowTemplate" id="45434518">
<int key="NSWindowStyleMask">8215</int>
<int key="NSWindowStyleMask">8209</int>
<int key="NSWindowBacking">2</int>
<string key="NSWindowRect">{{600, 530}, {480, 134}}</string>
<string key="NSWindowRect">{{600, 530}, {480, 159}}</string>
<int key="NSWTFlags">611845120</int>
<string key="NSWindowTitle">Master Password</string>
<string key="NSWindowClass">NSPanel</string>
<nil key="NSViewClass"/>
<nil key="NSUserInterfaceItemIdentifier"/>
<string key="NSWindowContentMaxSize">{480, 134}</string>
<string key="NSWindowContentMaxSize">{480, 320}</string>
<string key="NSWindowContentMinSize">{480, 134}</string>
<object class="NSView" key="NSWindowView" id="258451033">
<reference key="NSNextResponder"/>
@ -55,9 +53,10 @@
<object class="NSTextField" id="291791585">
<reference key="NSNextResponder" ref="258451033"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{140, 92}, {200, 22}}</string>
<string key="NSFrame">{{140, 117}, {200, 22}}</string>
<reference key="NSSuperview" ref="258451033"/>
<reference key="NSNextKeyView" ref="524129387"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="226215720"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
@ -70,16 +69,15 @@
<double key="NSSize">13</double>
<int key="NSfFlags">1044</int>
</object>
<string key="NSPlaceholderString">Enter site name X</string>
<string key="NSPlaceholderString">Site</string>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="291791585"/>
<bool key="NSDrawsBackground">YES</bool>
<int key="NSTextBezelStyle">1</int>
<object class="NSColor" key="NSBackgroundColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">textBackgroundColor</string>
<object class="NSColor" key="NSColor">
<object class="NSColor" key="NSColor" id="370404594">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MQA</bytes>
</object>
@ -98,8 +96,10 @@
<object class="NSTextField" id="226215720">
<reference key="NSNextResponder" ref="258451033"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 20}, {446, 64}}</string>
<string key="NSFrame">{{17, 45}, {446, 64}}</string>
<reference key="NSSuperview" ref="258451033"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1020047619"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSAntiCompressionPriority">{250, 750}</string>
@ -115,7 +115,7 @@
</object>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="226215720"/>
<object class="NSColor" key="NSBackgroundColor">
<object class="NSColor" key="NSBackgroundColor" id="245864165">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlColor</string>
@ -130,33 +130,35 @@
</object>
</object>
</object>
<object class="NSButton" id="524129387">
<object class="NSTextField" id="1020047619">
<reference key="NSNextResponder" ref="258451033"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{384, 85}, {82, 32}}</string>
<string key="NSFrame">{{17, 20}, {446, 17}}</string>
<reference key="NSSuperview" ref="258451033"/>
<reference key="NSNextKeyView" ref="226215720"/>
<reference key="NSWindow"/>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
<string key="NSReuseIdentifierKey">_NS:9</string>
<string key="NSReuseIdentifierKey">_NS:1505</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="1001833466">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">134217728</int>
<string key="NSContents">Empty</string>
<object class="NSTextFieldCell" key="NSCell" id="691402180">
<int key="NSCellFlags">68288064</int>
<int key="NSCellFlags2">138413056</int>
<string key="NSContents">Hit enter to copy the password.</string>
<reference key="NSSupport" ref="590895625"/>
<string key="NSCellIdentifier">_NS:9</string>
<reference key="NSControlView" ref="524129387"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">129</int>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
<string key="NSCellIdentifier">_NS:1505</string>
<reference key="NSControlView" ref="1020047619"/>
<reference key="NSBackgroundColor" ref="245864165"/>
<object class="NSColor" key="NSTextColor">
<int key="NSColorSpace">6</int>
<string key="NSCatalogName">System</string>
<string key="NSColorName">controlLightHighlightColor</string>
<reference key="NSColor" ref="370404594"/>
</object>
</object>
</object>
</array>
<string key="NSFrameSize">{480, 134}</string>
<string key="NSFrameSize">{480, 159}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="291791585"/>
<bool key="NSViewIsLayerTreeHost">YES</bool>
<int key="NSViewLayerContentsRedrawPolicy">2</int>
@ -164,7 +166,7 @@
</object>
<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
<string key="NSMinSize">{480, 153}</string>
<string key="NSMaxSize">{480, 153}</string>
<string key="NSMaxSize">{480, 339}</string>
<bool key="NSWindowIsRestorable">YES</bool>
</object>
</array>
@ -195,12 +197,12 @@
<int key="connectionID">42</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">empty:</string>
<object class="IBOutletConnection" key="connection">
<string key="label">tipField</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="524129387"/>
<reference key="destination" ref="1020047619"/>
</object>
<int key="connectionID">48</int>
<int key="connectionID">95</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
@ -210,6 +212,14 @@
</object>
<int key="connectionID">39</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">initialFirstResponder</string>
<reference key="source" ref="45434518"/>
<reference key="destination" ref="291791585"/>
</object>
<int key="connectionID">49</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">delegate</string>
@ -257,38 +267,6 @@
<int key="objectID">23</int>
<reference key="object" ref="258451033"/>
<array class="NSMutableArray" key="children">
<object class="IBNSLayoutConstraint" id="456428551">
<reference key="firstItem" ref="226215720"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="258451033"/>
<int key="secondAttribute">5</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="51508433">
<reference key="firstItem" ref="291791585"/>
<int key="firstAttribute">9</int>
<int key="relation">0</int>
<reference key="secondItem" ref="226215720"/>
<int key="secondAttribute">9</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">0.0</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">6</int>
<float key="scoringTypeFloat">24</float>
<int key="contentType">2</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="490796257">
<reference key="firstItem" ref="226215720"/>
<int key="firstAttribute">3</int>
@ -337,54 +315,6 @@
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="99093936">
<reference key="firstItem" ref="258451033"/>
<int key="firstAttribute">6</int>
<int key="relation">0</int>
<reference key="secondItem" ref="226215720"/>
<int key="secondAttribute">6</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="400319127">
<reference key="firstItem" ref="291791585"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="258451033"/>
<int key="secondAttribute">3</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="453166348">
<reference key="firstItem" ref="258451033"/>
<int key="firstAttribute">4</int>
<int key="relation">0</int>
<reference key="secondItem" ref="226215720"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">9</int>
<float key="scoringTypeFloat">40</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="582018795">
<reference key="firstItem" ref="258451033"/>
<int key="firstAttribute">6</int>
@ -419,12 +349,44 @@
</object>
<reference ref="226215720"/>
<reference ref="291791585"/>
<reference ref="524129387"/>
<object class="IBNSLayoutConstraint" id="118079668">
<object class="IBNSLayoutConstraint" id="456428551">
<reference key="firstItem" ref="226215720"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="258451033"/>
<int key="secondAttribute">5</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<reference ref="1020047619"/>
<object class="IBNSLayoutConstraint" id="51508433">
<reference key="firstItem" ref="291791585"/>
<int key="firstAttribute">9</int>
<int key="relation">0</int>
<reference key="secondItem" ref="226215720"/>
<int key="secondAttribute">9</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">0.0</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">6</int>
<float key="scoringTypeFloat">24</float>
<int key="contentType">2</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="99093936">
<reference key="firstItem" ref="258451033"/>
<int key="firstAttribute">6</int>
<int key="relation">0</int>
<reference key="secondItem" ref="524129387"/>
<reference key="secondItem" ref="1020047619"/>
<int key="secondAttribute">6</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
@ -436,35 +398,73 @@
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="840794562">
<reference key="firstItem" ref="524129387"/>
<int key="firstAttribute">11</int>
<object class="IBNSLayoutConstraint" id="536265876">
<reference key="firstItem" ref="258451033"/>
<int key="firstAttribute">4</int>
<int key="relation">0</int>
<reference key="secondItem" ref="291791585"/>
<int key="secondAttribute">11</int>
<reference key="secondItem" ref="1020047619"/>
<int key="secondAttribute">4</int>
<float key="multiplier">1</float>
<object class="IBLayoutConstant" key="constant">
<double key="value">0.0</double>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">6</int>
<float key="scoringTypeFloat">24</float>
<int key="contentType">2</int>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="1695776">
<reference key="firstItem" ref="258451033"/>
<int key="firstAttribute">6</int>
<int key="relation">0</int>
<reference key="secondItem" ref="226215720"/>
<int key="secondAttribute">6</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="400319127">
<reference key="firstItem" ref="291791585"/>
<int key="firstAttribute">3</int>
<int key="relation">0</int>
<reference key="secondItem" ref="258451033"/>
<int key="secondAttribute">3</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
<object class="IBNSLayoutConstraint" id="105480775">
<reference key="firstItem" ref="1020047619"/>
<int key="firstAttribute">5</int>
<int key="relation">0</int>
<reference key="secondItem" ref="258451033"/>
<int key="secondAttribute">5</int>
<float key="multiplier">1</float>
<object class="IBNSLayoutSymbolicConstant" key="constant">
<double key="value">20</double>
</object>
<float key="priority">1000</float>
<int key="scoringType">8</int>
<float key="scoringTypeFloat">29</float>
<int key="contentType">3</int>
<reference key="containingView" ref="258451033"/>
</object>
</array>
<reference key="parent" ref="45434518"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">24</int>
<reference key="object" ref="456428551"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">25</int>
<reference key="object" ref="51508433"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">26</int>
<reference key="object" ref="490796257"/>
@ -480,21 +480,6 @@
<reference key="object" ref="1014829211"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">29</int>
<reference key="object" ref="99093936"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">30</int>
<reference key="object" ref="400319127"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">31</int>
<reference key="object" ref="453166348"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">32</int>
<reference key="object" ref="582018795"/>
@ -517,6 +502,7 @@
<int key="objectID">35</int>
<reference key="object" ref="291791585"/>
<array class="NSMutableArray" key="children">
<reference ref="213149334"/>
<object class="IBNSLayoutConstraint" id="302161926">
<reference key="firstItem" ref="291791585"/>
<int key="firstAttribute">7</int>
@ -533,15 +519,9 @@
<int key="contentType">1</int>
<reference key="containingView" ref="291791585"/>
</object>
<reference ref="213149334"/>
</array>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">36</int>
<reference key="object" ref="302161926"/>
<reference key="parent" ref="291791585"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">37</int>
<reference key="object" ref="213149334"/>
@ -553,26 +533,56 @@
<reference key="parent" ref="226215720"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">44</int>
<reference key="object" ref="524129387"/>
<int key="objectID">50</int>
<reference key="object" ref="1020047619"/>
<array class="NSMutableArray" key="children">
<reference ref="1001833466"/>
<reference ref="691402180"/>
</array>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">45</int>
<reference key="object" ref="1001833466"/>
<reference key="parent" ref="524129387"/>
<int key="objectID">51</int>
<reference key="object" ref="691402180"/>
<reference key="parent" ref="1020047619"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">46</int>
<reference key="object" ref="118079668"/>
<int key="objectID">74</int>
<reference key="object" ref="456428551"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">47</int>
<reference key="object" ref="840794562"/>
<int key="objectID">85</int>
<reference key="object" ref="51508433"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">87</int>
<reference key="object" ref="99093936"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">90</int>
<reference key="object" ref="302161926"/>
<reference key="parent" ref="291791585"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">91</int>
<reference key="object" ref="536265876"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">92</int>
<reference key="object" ref="1695776"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">93</int>
<reference key="object" ref="400319127"/>
<reference key="parent" ref="258451033"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">94</int>
<reference key="object" ref="105480775"/>
<reference key="parent" ref="258451033"/>
</object>
</array>
@ -585,29 +595,24 @@
<boolean value="YES" key="22.IBNSWindowAutoPositionCentersVertical"/>
<string key="22.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="YES" key="22.NSWindowTemplate.visibleAtLaunch"/>
<array key="23.IBNSViewMetadataConstraints">
<array class="NSMutableArray" key="23.IBNSViewMetadataConstraints">
<reference ref="137127436"/>
<reference ref="582018795"/>
<reference ref="453166348"/>
<reference ref="400319127"/>
<reference ref="99093936"/>
<reference ref="1014829211"/>
<reference ref="751044970"/>
<reference ref="490796257"/>
<reference ref="51508433"/>
<reference ref="456428551"/>
<reference ref="118079668"/>
<reference ref="840794562"/>
<reference ref="51508433"/>
<reference ref="99093936"/>
<reference ref="536265876"/>
<reference ref="1695776"/>
<reference ref="400319127"/>
<reference ref="105480775"/>
</array>
<string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="25.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="26.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="27.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="28.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="30.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="31.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="32.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="33.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="34.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
@ -617,22 +622,65 @@
</array>
<boolean value="NO" key="35.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="35.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="36.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="37.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="38.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="44.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="44.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="45.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="46.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="47.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<boolean value="NO" key="50.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
<string key="50.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="51.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="74.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="85.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="87.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="90.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="91.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="93.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="94.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">48</int>
<int key="maxID">95</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">MPPasswordWindowController</string>
<string key="superclassName">NSWindowController</string>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="contentField">NSTextField</string>
<string key="siteField">NSTextField</string>
<string key="tipField">NSTextField</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
<object class="IBToOneOutletInfo" key="contentField">
<string key="name">contentField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo" key="siteField">
<string key="name">siteField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo" key="tipField">
<string key="name">tipField</string>
<string key="candidateClassName">NSTextField</string>
</object>
</dictionary>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/MPPasswordWindowController.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">NSLayoutConstraint</string>
<string key="superclassName">NSObject</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">./Classes/NSLayoutConstraint.h</string>
</object>
</object>
</array>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes"/>
<int key="IBDocument.localizationMode">0</int>
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>

View File

@ -26,6 +26,8 @@
<string>public.app-category.productivity</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>LSUIElement</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2012 Lyndir. All rights reserved.</string>
<key>NSMainNibFile</key>