From 7d6712536bf3e6473799c5fe5219a728fc8521d5 Mon Sep 17 00:00:00 2001 From: michael starke Date: Sun, 3 Mar 2013 04:46:25 +0100 Subject: [PATCH] Added simple hud overlay on double-click actions --- MacPass.xcodeproj/project.pbxproj | 64 +++- MacPass/MPEntryViewController.m | 31 +- MacPass/MPOverlayView.h | 13 + MacPass/MPOverlayView.m | 29 ++ MacPass/MPOverlayWindowController.h | 20 ++ MacPass/MPOverlayWindowController.m | 87 +++++ MacPass/MPPasteBoardController.m | 2 +- MacPass/MacPass-Info.plist | 2 +- MacPass/OverlayWindow.xib | 540 ++++++++++++++++++++++++++++ 9 files changed, 773 insertions(+), 15 deletions(-) create mode 100644 MacPass/MPOverlayView.h create mode 100644 MacPass/MPOverlayView.m create mode 100644 MacPass/MPOverlayWindowController.h create mode 100644 MacPass/MPOverlayWindowController.m create mode 100644 MacPass/OverlayWindow.xib diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index eded05d8..1d19c8c0 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 4C3BD51516D276F800389F1F /* MPToolbarDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BD51416D276F800389F1F /* MPToolbarDelegate.m */; }; 4C3FFD9E16DAF60600DF9186 /* FilterBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */; }; 4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */; }; + 4C431BCF16E2BAB000700A81 /* OverlayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */; }; 4C4E1DC716DC6536007B9B47 /* PathBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4E1DC616DC6536007B9B47 /* PathBar.xib */; }; 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 */; }; @@ -101,6 +102,8 @@ 4CDB556416E29A7C00635918 /* MPPathControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDB556316E29A7C00635918 /* MPPathControl.m */; }; 4CDF01A316D1B76700D0AC08 /* MPEntryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDF01A216D1B76700D0AC08 /* MPEntryViewController.m */; }; 4CE06D7D16DEF3FE00840E3A /* MPButtonBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE06D7C16DEF3FE00840E3A /* MPButtonBar.m */; }; + 4CE8246F16E2E93400573141 /* MPOverlayWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */; }; + 4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8247416E2F2B900573141 /* MPOverlayView.m */; }; 4CF5D49616D5B6E900CB78BD /* MPEntryEditController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF5D49416D5B6E900CB78BD /* MPEntryEditController.m */; }; 4CF5D49716D5B6E900CB78BD /* EntryEditView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF5D49516D5B6E900CB78BD /* EntryEditView.xib */; }; /* End PBXBuildFile section */ @@ -126,6 +129,7 @@ 4C3FFD9D16DAF60600DF9186 /* FilterBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FilterBar.xib; sourceTree = ""; }; 4C431BCB16E2A82700700A81 /* MPPasteBoardController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasteBoardController.h; sourceTree = ""; }; 4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasteBoardController.m; sourceTree = ""; }; + 4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OverlayWindow.xib; sourceTree = ""; }; 4C4E1DC616DC6536007B9B47 /* PathBar.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PathBar.xib; sourceTree = ""; }; 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 = ""; }; @@ -278,6 +282,10 @@ 4CDF01A216D1B76700D0AC08 /* MPEntryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryViewController.m; sourceTree = ""; }; 4CE06D7B16DEF3FE00840E3A /* MPButtonBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPButtonBar.h; sourceTree = ""; }; 4CE06D7C16DEF3FE00840E3A /* MPButtonBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPButtonBar.m; sourceTree = ""; }; + 4CE8246D16E2E93400573141 /* MPOverlayWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayWindowController.h; sourceTree = ""; }; + 4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayWindowController.m; sourceTree = ""; }; + 4CE8247316E2F2B900573141 /* MPOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayView.h; sourceTree = ""; }; + 4CE8247416E2F2B900573141 /* MPOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayView.m; sourceTree = ""; }; 4CF5D49316D5B6E900CB78BD /* MPEntryEditController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntryEditController.h; sourceTree = ""; }; 4CF5D49416D5B6E900CB78BD /* MPEntryEditController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPEntryEditController.m; sourceTree = ""; }; 4CF5D49516D5B6E900CB78BD /* EntryEditView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EntryEditView.xib; sourceTree = ""; }; @@ -305,7 +313,6 @@ 4CF5D49516D5B6E900CB78BD /* EntryEditView.xib */, 4CA0B2EF15BCADC800654E32 /* GeneralSettings.xib */, 4C77E37B15B84A240093A587 /* MainMenu.xib */, - 4CD884B615BD47080042BBF8 /* MainWindow.xib */, 4C61EA0416D2FFE200AC519E /* OutlineView.xib */, 4CA0B2EC15BCADAC00654E32 /* SettingsWindow.xib */, 4C6B0E8B16C9B99B00A9ED23 /* PasswordInputView.xib */, @@ -314,6 +321,8 @@ 4C4E1DC616DC6536007B9B47 /* PathBar.xib */, 4C69A73816D589DF00EC1B1A /* MPGradientView.h */, 4C69A73916D589DF00EC1B1A /* MPGradientView.m */, + 4CE8247316E2F2B900573141 /* MPOverlayView.h */, + 4CE8247416E2F2B900573141 /* MPOverlayView.m */, ); name = Views; sourceTree = ""; @@ -529,7 +538,10 @@ 4C586F9C16D07ABD00E7DB57 /* Icons */, 4CA0B30F15BCB85D00654E32 /* General */, 4CA0B30E15BCB70200654E32 /* Protocolls */, - 4CA0B2F115BCAEE600654E32 /* Controller */, + 4CE8247116E2E98200573141 /* Data Controller */, + 4CE8247016E2E96500573141 /* Window Controller */, + 4CA0B2F115BCAEE600654E32 /* View Controller */, + 4CE8247216E2E99F00573141 /* Windows */, 4C06398C15B980480004DE27 /* Views */, 4CDB556616E29A8A00635918 /* Controls */, 4C37A84215B8B495005EF8EE /* Model */, @@ -551,17 +563,11 @@ name = "Supporting Files"; sourceTree = ""; }; - 4CA0B2F115BCAEE600654E32 /* Controller */ = { + 4CA0B2F115BCAEE600654E32 /* View Controller */ = { isa = PBXGroup; children = ( 4CA0B2F715BCAF6700654E32 /* MPGeneralSettingsController.h */, 4CA0B2F815BCAF6700654E32 /* MPGeneralSettingsController.m */, - 4CA0B2FA15BCAF8600654E32 /* MPSettingsController.h */, - 4CA0B2FB15BCAF8600654E32 /* MPSettingsController.m */, - 4C83814015BF4677001AE468 /* MPMainWindowController.h */, - 4C83814115BF4677001AE468 /* MPMainWindowController.m */, - 4C75CE3A16CB128700F61A4D /* MPDatabaseController.h */, - 4C75CE3B16CB128700F61A4D /* MPDatabaseController.m */, 4C2E382416D1470200037A9D /* MPViewController.h */, 4C2E382516D1470200037A9D /* MPViewController.m */, 4C65FAE616D16DDB006E0577 /* MPPasswordInputController.h */, @@ -572,10 +578,8 @@ 4C61EA0216D2FD0800AC519E /* MPOutlineViewController.m */, 4CF5D49316D5B6E900CB78BD /* MPEntryEditController.h */, 4CF5D49416D5B6E900CB78BD /* MPEntryEditController.m */, - 4C431BCB16E2A82700700A81 /* MPPasteBoardController.h */, - 4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */, ); - name = Controller; + name = "View Controller"; sourceTree = ""; }; 4CA0B30E15BCB70200654E32 /* Protocolls */ = { @@ -663,6 +667,39 @@ name = Controls; sourceTree = ""; }; + 4CE8247016E2E96500573141 /* Window Controller */ = { + isa = PBXGroup; + children = ( + 4CA0B2FA15BCAF8600654E32 /* MPSettingsController.h */, + 4CA0B2FB15BCAF8600654E32 /* MPSettingsController.m */, + 4C83814015BF4677001AE468 /* MPMainWindowController.h */, + 4C83814115BF4677001AE468 /* MPMainWindowController.m */, + 4CE8246D16E2E93400573141 /* MPOverlayWindowController.h */, + 4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */, + ); + name = "Window Controller"; + sourceTree = ""; + }; + 4CE8247116E2E98200573141 /* Data Controller */ = { + isa = PBXGroup; + children = ( + 4C75CE3A16CB128700F61A4D /* MPDatabaseController.h */, + 4C75CE3B16CB128700F61A4D /* MPDatabaseController.m */, + 4C431BCB16E2A82700700A81 /* MPPasteBoardController.h */, + 4C431BCC16E2A82700700A81 /* MPPasteBoardController.m */, + ); + name = "Data Controller"; + sourceTree = ""; + }; + 4CE8247216E2E99F00573141 /* Windows */ = { + isa = PBXGroup; + children = ( + 4CD884B615BD47080042BBF8 /* MainWindow.xib */, + 4C431BCE16E2BAB000700A81 /* OverlayWindow.xib */, + ); + name = Windows; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -742,6 +779,7 @@ 4CF5D49716D5B6E900CB78BD /* EntryEditView.xib in Resources */, 4C3FFD9E16DAF60600DF9186 /* FilterBar.xib in Resources */, 4C4E1DC716DC6536007B9B47 /* PathBar.xib in Resources */, + 4C431BCF16E2BAB000700A81 /* OverlayWindow.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -836,6 +874,8 @@ 4C587F2E16E0257B0003718D /* MPButtonBarButton.m in Sources */, 4CDB556416E29A7C00635918 /* MPPathControl.m in Sources */, 4C431BCD16E2A82800700A81 /* MPPasteBoardController.m in Sources */, + 4CE8246F16E2E93400573141 /* MPOverlayWindowController.m in Sources */, + 4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacPass/MPEntryViewController.m b/MacPass/MPEntryViewController.m index dd436a9c..bcbb9243 100644 --- a/MacPass/MPEntryViewController.m +++ b/MacPass/MPEntryViewController.m @@ -13,6 +13,7 @@ #import "MPIconHelper.h" #import "MPMainWindowController.h" #import "MPPasteBoardController.h" +#import "MPOverlayWindowController.h" #import "KdbGroup+MPAdditions.h" #import @@ -83,6 +84,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername"; - (void)_hideStatusBarAnimated:(BOOL)animate; - (void)_copyEntryData:(id)sender; +- (void)_quickCopyEntryData:(id)sender; @end @@ -125,6 +127,8 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername"; [self _hideStatusBarAnimated:NO]; [self.entryTable setDelegate:self]; + [self.entryTable setDoubleAction:@selector(_quickCopyEntryData:)]; + [self.entryTable setTarget:self]; [self _setupEntryMenu]; NSTableColumn *parentColumn = [self.entryTable tableColumns][0]; @@ -378,9 +382,34 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername"; #pragma mark Actions +- (void)_quickCopyEntryData:(id)sender { + NSInteger clickedRow = [self.entryTable clickedRow]; + if(clickedRow < 0 || clickedRow > [[self.entryArrayController arrangedObjects] count]) { + return; + } + KdbEntry *selectedEntry = [self.entryArrayController arrangedObjects][clickedRow]; + NSTableColumn *column = [self.entryTable tableColumns][[self.entryTable clickedColumn]]; + NSString *identifier = [column identifier]; + NSImage *image = nil; + NSString *lable = nil; + if([identifier isEqualToString:MPEntryTablePasswordColumnIdentifier]) { + [[MPPasteBoardController defaultController] copyObjects:@[ selectedEntry.password ]]; + image = [[NSBundle mainBundle] imageForResource:@"00_PasswordTemplate"]; + lable = @"Password copied!"; + } + else if([identifier isEqualToString:MPEntryTableUserNameColumnIdentifier]) { + [[MPPasteBoardController defaultController] copyObjects:@[ selectedEntry.username ]]; + image = [[NSBundle mainBundle] imageForResource:@"09_IdentityTemplate"]; + lable = @"Username copied!"; + } + if(image || lable) { + [[MPOverlayWindowController sharedController] displayOverlayImage:image label:lable atView:self.view]; + } +} + - (void)_copyEntryData:(id)sender { NSInteger clickedRow = [self.entryTable clickedRow]; - if(clickedRow > [[self.entryArrayController arrangedObjects] count]) { + if(clickedRow < 0 || clickedRow > [[self.entryArrayController arrangedObjects] count]) { return; } KdbEntry *selectedEntry = [self.entryArrayController arrangedObjects][clickedRow]; diff --git a/MacPass/MPOverlayView.h b/MacPass/MPOverlayView.h new file mode 100644 index 00000000..f3b830d7 --- /dev/null +++ b/MacPass/MPOverlayView.h @@ -0,0 +1,13 @@ +// +// MPOverlayView.h +// MacPass +// +// Created by Michael Starke on 03.03.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import + +@interface MPOverlayView : NSView + +@end diff --git a/MacPass/MPOverlayView.m b/MacPass/MPOverlayView.m new file mode 100644 index 00000000..b62a8cda --- /dev/null +++ b/MacPass/MPOverlayView.m @@ -0,0 +1,29 @@ +// +// MPOverlayView.m +// MacPass +// +// Created by Michael Starke on 03.03.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import "MPOverlayView.h" + +@implementation MPOverlayView + +- (void)drawRect:(NSRect)dirtyRect { + [[NSGraphicsContext currentContext] saveGraphicsState]; + [[NSColor clearColor] set]; + NSRectFill([self bounds]); + NSColor *backgroundColor = [NSColor colorWithCalibratedWhite:0 alpha:0.7]; + NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:10 yRadius:10]; + [backgroundColor set]; + [path fill]; + + [[NSGraphicsContext currentContext] restoreGraphicsState]; +} + +- (BOOL)isOpaque { + return NO; +} + +@end diff --git a/MacPass/MPOverlayWindowController.h b/MacPass/MPOverlayWindowController.h new file mode 100644 index 00000000..d823855b --- /dev/null +++ b/MacPass/MPOverlayWindowController.h @@ -0,0 +1,20 @@ +// +// MPOverlayWindowController.h +// MacPass +// +// Created by Michael Starke on 03.03.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import + +@interface MPOverlayWindowController : NSWindowController + ++ (MPOverlayWindowController *)sharedController; + +/* + Displays an overlay centered at the given view. The Windows is added as a childwindow to the view window + */ +- (void)displayOverlayImage:(NSImage *)imageOrNil label:(NSString *)labelOrNil atView:(NSView *)view; + +@end diff --git a/MacPass/MPOverlayWindowController.m b/MacPass/MPOverlayWindowController.m new file mode 100644 index 00000000..cfda71db --- /dev/null +++ b/MacPass/MPOverlayWindowController.m @@ -0,0 +1,87 @@ +// +// MPOverlayWindowController.m +// MacPass +// +// Created by Michael Starke on 03.03.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import "MPOverlayWindowController.h" +#import "MPOverlayView.h" + +@interface MPOverlayWindowController () + +@property (assign) BOOL isAnimating; +@property (assign) IBOutlet NSImageView *imageView; +@property (assign) IBOutlet NSTextField *textField; + +@end + +@implementation MPOverlayWindowController + ++ (MPOverlayWindowController *)sharedController { + static MPOverlayWindowController *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[MPOverlayWindowController alloc] initWithWindowNibName:@"OverlayWindow"]; + }); + return sharedInstance; +} + +- (id)initWithWindow:(NSWindow *)window { + self = [super initWithWindow:window]; + if (self) { + // Initialization code here. + } + return self; +} + +- (void)windowDidLoad { + [super windowDidLoad]; + [self.window setStyleMask:NSBorderlessWindowMask]; + [self.window setAlphaValue:0]; + [self.window setOpaque:NO]; + [self.window setHasShadow:NO]; + [[self.textField cell] setBackgroundStyle:NSBackgroundStyleLowered]; + [[self.imageView cell] setBackgroundStyle:NSBackgroundStyleLowered]; + [[self.imageView cell] setImageAlignment:NSImageAlignCenter]; +} + +- (void)displayOverlayImage:(NSImage *)imageOrNil label:(NSString *)labelOrNil atView:(NSView *)view { + /* make window transparent */ + + [self.window setAlphaValue:0]; + [self.window setIsVisible:YES]; + + /* setup any provided images and labels*/ + [self.imageView setImage:imageOrNil]; + if(labelOrNil) { + [self.textField setStringValue:labelOrNil]; + } + else { + [self.textField setStringValue:@""]; + } + [self.textField sizeToFit]; + /* + Center in view + */ + if(view) { + NSWindow *parentWindow = [view window]; + NSRect parentFrame = [parentWindow frame]; + NSRect myFrame = [self.window frame]; + NSPoint newOrigin = parentFrame.origin; + newOrigin.x += 0.5 * (parentFrame.size.width - myFrame.size.width); + newOrigin.y += 0.5 * (parentFrame.size.height - myFrame.size.height); + [self.window setFrameOrigin:newOrigin]; + [parentWindow addChildWindow:self.window ordered:NSWindowAbove]; + [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { + context.duration = 0.2; + [[self.window animator]setAlphaValue:1]; + } completionHandler:^{ + [self.window performSelector:@selector(close) withObject:nil afterDelay:0.5]; + }]; + + } +} + +@end diff --git a/MacPass/MPPasteBoardController.m b/MacPass/MPPasteBoardController.m index 7bf6190b..456e32f7 100644 --- a/MacPass/MPPasteBoardController.m +++ b/MacPass/MPPasteBoardController.m @@ -74,7 +74,7 @@ [[NSPasteboard generalPasteboard] clearContents]; [[NSPasteboard generalPasteboard] writeObjects:objects]; self.isEmpty = NO; - [self performSelector:@selector(clearContents) withObject:nil afterDelay:self.clearTimeout]; + [self performSelector:@selector(_clearPasteboardContents) withObject:nil afterDelay:self.clearTimeout]; } - (void)_clearPasteboardContents { diff --git a/MacPass/MacPass-Info.plist b/MacPass/MacPass-Info.plist index 1d8f3ecf..f3066d84 100644 --- a/MacPass/MacPass-Info.plist +++ b/MacPass/MacPass-Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 37F + 3B6 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright diff --git a/MacPass/OverlayWindow.xib b/MacPass/OverlayWindow.xib new file mode 100644 index 00000000..110237f0 --- /dev/null +++ b/MacPass/OverlayWindow.xib @@ -0,0 +1,540 @@ + + + + 1080 + 12C3103 + 3084 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSCustomObject + NSImageCell + NSImageView + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + MPOverlayWindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 207}, {151, 131}} + 1685586944 + Window + NSWindow + + + + + 256 + + + + 268 + {{53, 20}, {45, 19}} + + + _NS:1535 + YES + + 68157504 + 306189312 + Label + + LucidaGrande + 14 + 16 + + _NS:1535 + + + 6 + System + windowFrameTextColor + + 3 + MQA + + + + 1 + MSAxIDEAA + + + NO + + + + 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 + + {{43, 47}, {64, 64}} + + + + _NS:9 + YES + + 134217728 + 33554432 + + NSImage + NSActionTemplate + + _NS:9 + 0 + 3 + 0 + NO + + NO + YES + + + {151, 131} + + + + _NS:20 + + {{0, 0}, {1920, 1058}} + {10000000000000, 10000000000000} + YES + + + + + + + textField + + + + 60 + + + + window + + + + 61 + + + + imageView + + + + 89 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 27 + + + + + + + + 28 + + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 1 + + 6 + 1 + + 20 + + 1000 + + 9 + 40 + 3 + + + + 5 + 1 + + 5 + 1 + + 20 + + 1000 + + 9 + 40 + 3 + + + + 4 + 1 + + 4 + 1 + + 20 + + 1000 + + 9 + 40 + 3 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 9 + 0 + + 9 + 1 + + 0.0 + + 1000 + + 5 + 22 + 2 + + + + + + + + 35 + + + + + + 7 + 1 + + 0 + 1 + + 39 + + 1000 + + 9 + 40 + 1 + + + + + + 36 + + + + + 56 + + + + + 57 + + + + + 58 + + + + + 68 + + + + + + 7 + 0 + + 0 + 1 + + 64 + + 1000 + + 3 + 9 + 1 + + + + + + 69 + + + + + 78 + + + + + 83 + + + + + 84 + + + + + 85 + + + + + 86 + + + + + 87 + + + + + 88 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + MPOverlayView + + + + + + + + + + + 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 + + + + + + 90 + + + + + MPOverlayView + NSView + + IBProjectSource + ./Classes/MPOverlayView.h + + + + MPOverlayWindowController + NSWindowController + + NSImageView + NSTextField + + + + imageView + NSImageView + + + textField + NSTextField + + + + IBProjectSource + ./Classes/MPOverlayWindowController.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + + NSActionTemplate + {15, 15} + + YES + +