Skip to content
Snippets Groups Projects
Commit c1f96660 authored by Alexandre Lision's avatar Alexandre Lision
Browse files

accounts: import/export

Allow import/export of accounts in the preferences.
PathPasswordWC is a generic modal window asking for a path and a
password. It is used for both export and import UI.

Tuleap: #335
Change-Id: Ic478140e64b51d10672ef466509326fc17be2712
parent 51ff149a
No related branches found
No related tags found
No related merge requests found
...@@ -96,6 +96,8 @@ SET(ringclient_CONTROLLERS ...@@ -96,6 +96,8 @@ SET(ringclient_CONTROLLERS
src/AccSecurityVC.h src/AccSecurityVC.h
src/CertificateWC.mm src/CertificateWC.mm
src/CertificateWC.h src/CertificateWC.h
src/PathPasswordWC.mm
src/PathPasswordWC.h
src/AudioPrefsVC.mm src/AudioPrefsVC.mm
src/AudioPrefsVC.h src/AudioPrefsVC.h
src/AccountsVC.mm src/AccountsVC.mm
...@@ -169,6 +171,7 @@ SET(ringclient_XIBS ...@@ -169,6 +171,7 @@ SET(ringclient_XIBS
PreferencesWindow PreferencesWindow
RingWizard RingWizard
CertificateWindow CertificateWindow
PathPasswordWindow
PersonLinker PersonLinker
Broker Broker
Conversation) Conversation)
......
...@@ -16,62 +16,47 @@ ...@@ -16,62 +16,47 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/ */
#define ALIAS_TAG 0
#define HOSTNAME_TAG 1
#define USERNAME_TAG 2
#define PASSWORD_TAG 3
#define USERAGENT_TAG 4
#import "AccGeneralVC.h" #import "AccGeneralVC.h"
#import <accountmodel.h> #import <accountmodel.h>
#import <protocolmodel.h> #import <protocolmodel.h>
#import <qitemselectionmodel.h> #import <qitemselectionmodel.h>
@interface AccGeneralVC () @interface AccGeneralVC () {
@property (assign) IBOutlet NSView *boxingParameters;
@property (assign) IBOutlet NSView *boxingCommon;
@property (assign) IBOutlet NSTextField *aliasTextField; __unsafe_unretained IBOutlet NSTextField *aliasTextField;
@property (assign) IBOutlet NSTextField *typeLabel;
@property (assign) IBOutlet NSTextField *serverHostTextField; __unsafe_unretained IBOutlet NSTextField *serverHostTextField;
@property (assign) IBOutlet NSTextField *usernameTextField; __unsafe_unretained IBOutlet NSTextField *usernameTextField;
@property (assign) IBOutlet NSSecureTextField *passwordTextField; __unsafe_unretained IBOutlet NSSecureTextField *passwordTextField;
@property (strong) NSTextField *clearTextField; NSTextField *clearTextField;
@property (assign) IBOutlet NSButton *upnpButton;
@property (assign) IBOutlet NSButton *autoAnswerButton;
@property (assign) IBOutlet NSButton *userAgentButton;
@property (assign) IBOutlet NSTextField *userAgentTextField;
__unsafe_unretained IBOutlet NSButton *upnpButton;
__unsafe_unretained IBOutlet NSButton *autoAnswerButton;
__unsafe_unretained IBOutlet NSButton *userAgentButton;
__unsafe_unretained IBOutlet NSTextField *userAgentTextField;
}
@end @end
@implementation AccGeneralVC @implementation AccGeneralVC
@synthesize typeLabel;
@synthesize boxingParameters; //Tags for views
@synthesize boxingCommon; typedef NS_ENUM(NSInteger, TagViews) {
@synthesize aliasTextField; ALIAS = 0,
@synthesize serverHostTextField; HOSTNAME = 1,
@synthesize usernameTextField; USERNAME = 2,
@synthesize passwordTextField; PASSWORD = 3,
@synthesize clearTextField; USERAGENT = 4,
@synthesize upnpButton; };
@synthesize autoAnswerButton;
@synthesize userAgentButton;
@synthesize userAgentTextField;
- (void)awakeFromNib - (void)awakeFromNib
{ {
NSLog(@"INIT General VC"); NSLog(@"INIT General VC");
[aliasTextField setTag:ALIAS_TAG]; [aliasTextField setTag:TagViews::ALIAS];
[serverHostTextField setTag:HOSTNAME_TAG]; [serverHostTextField setTag:TagViews::HOSTNAME];
[usernameTextField setTag:USERNAME_TAG]; [usernameTextField setTag:TagViews::USERNAME];
[passwordTextField setTag:PASSWORD_TAG]; [passwordTextField setTag:TagViews::PASSWORD];
[userAgentTextField setTag:USERAGENT_TAG]; [userAgentTextField setTag:TagViews::USERAGENT];
QObject::connect(AccountModel::instance().selectionModel(), QObject::connect(AccountModel::instance().selectionModel(),
&QItemSelectionModel::currentChanged, &QItemSelectionModel::currentChanged,
...@@ -82,61 +67,38 @@ ...@@ -82,61 +67,38 @@
}); });
} }
- (Account*) currentAccount
{
auto accIdx = AccountModel::instance().selectionModel()->currentIndex();
return AccountModel::instance().getAccountByModelIndex(accIdx);
}
- (IBAction)toggleUpnp:(NSButton *)sender { - (IBAction)toggleUpnp:(NSButton *)sender {
[self currentAccount]->setUpnpEnabled([sender state] == NSOnState); AccountModel::instance().selectedAccount()->setUpnpEnabled([sender state] == NSOnState);
} }
- (IBAction)toggleAutoAnswer:(NSButton *)sender { - (IBAction)toggleAutoAnswer:(NSButton *)sender {
[self currentAccount]->setAutoAnswer([sender state] == NSOnState); AccountModel::instance().selectedAccount()->setAutoAnswer([sender state] == NSOnState);
} }
- (IBAction)toggleCustomAgent:(NSButton *)sender { - (IBAction)toggleCustomAgent:(NSButton *)sender {
[self.userAgentTextField setEnabled:[sender state] == NSOnState]; [userAgentTextField setEnabled:[sender state] == NSOnState];
[self currentAccount]->setHasCustomUserAgent([sender state] == NSOnState); AccountModel::instance().selectedAccount()->setHasCustomUserAgent([sender state] == NSOnState);
} }
- (void)loadAccount - (void)loadAccount
{ {
auto account = [self currentAccount]; auto account = AccountModel::instance().selectedAccount();
[boxingParameters.subviews setValue:@NO forKeyPath:@"hidden"]; [aliasTextField setStringValue:account->alias().toNSString()];
[serverHostTextField setStringValue:account->hostname().toNSString()];
[self.aliasTextField setStringValue:account->alias().toNSString()]; [usernameTextField setStringValue:account->username().toNSString()];
[self.serverHostTextField setStringValue:account->hostname().toNSString()]; [passwordTextField setStringValue:account->password().toNSString()];
[self.usernameTextField setStringValue:account->username().toNSString()]; [clearTextField setStringValue:account->password().toNSString()];
[self.passwordTextField setStringValue:account->password().toNSString()];
[self.clearTextField setStringValue:account->password().toNSString()]; [upnpButton setState:AccountModel::instance().selectedAccount()->isUpnpEnabled()];
[userAgentButton setState:AccountModel::instance().selectedAccount()->hasCustomUserAgent()];
switch (account->protocol()) { [userAgentTextField setEnabled:AccountModel::instance().selectedAccount()->hasCustomUserAgent()];
case Account::Protocol::SIP: [autoAnswerButton setState:AccountModel::instance().selectedAccount()->isAutoAnswer()];
[self.typeLabel setStringValue:@"SIP"]; [userAgentTextField setStringValue:account->userAgent().toNSString()];
break;
case Account::Protocol::IAX:
[self.typeLabel setStringValue:@"IAX"];
break;
case Account::Protocol::RING:
[self.typeLabel setStringValue:@"RING"];
break;
default:
break;
}
[upnpButton setState:[self currentAccount]->isUpnpEnabled()];
[userAgentButton setState:[self currentAccount]->hasCustomUserAgent()];
[userAgentTextField setEnabled:[self currentAccount]->hasCustomUserAgent()];
[self.autoAnswerButton setState:[self currentAccount]->isAutoAnswer()];
[self.userAgentTextField setStringValue:account->userAgent().toNSString()];
} }
- (IBAction)tryRegistration:(id)sender { - (IBAction)tryRegistration:(id)sender {
[self currentAccount] << Account::EditAction::SAVE; AccountModel::instance().selectedAccount() << Account::EditAction::SAVE;
} }
- (IBAction)showPassword:(NSButton *)sender { - (IBAction)showPassword:(NSButton *)sender {
...@@ -147,7 +109,7 @@ ...@@ -147,7 +109,7 @@
[clearTextField setBounds:passwordTextField.bounds]; [clearTextField setBounds:passwordTextField.bounds];
[clearTextField setStringValue:passwordTextField.stringValue]; [clearTextField setStringValue:passwordTextField.stringValue];
[clearTextField becomeFirstResponder]; [clearTextField becomeFirstResponder];
[boxingParameters addSubview:clearTextField]; [self.view addSubview:clearTextField];
[passwordTextField setHidden:YES]; [passwordTextField setHidden:YES];
} else { } else {
[passwordTextField setStringValue:clearTextField.stringValue]; [passwordTextField setStringValue:clearTextField.stringValue];
...@@ -177,21 +139,21 @@ ...@@ -177,21 +139,21 @@
NSTextField *textField = [notif object]; NSTextField *textField = [notif object];
switch ([textField tag]) { switch ([textField tag]) {
case ALIAS_TAG: case TagViews::ALIAS:
[self currentAccount]->setAlias([[textField stringValue] UTF8String]); AccountModel::instance().selectedAccount()->setAlias([[textField stringValue] UTF8String]);
[self currentAccount]->setDisplayName([[textField stringValue] UTF8String]); AccountModel::instance().selectedAccount()->setDisplayName([[textField stringValue] UTF8String]);
break; break;
case HOSTNAME_TAG: case TagViews::HOSTNAME:
[self currentAccount]->setHostname([[textField stringValue] UTF8String]); AccountModel::instance().selectedAccount()->setHostname([[textField stringValue] UTF8String]);
break; break;
case USERNAME_TAG: case TagViews::USERNAME:
[self currentAccount]->setUsername([[textField stringValue] UTF8String]); AccountModel::instance().selectedAccount()->setUsername([[textField stringValue] UTF8String]);
break; break;
case PASSWORD_TAG: case TagViews::PASSWORD:
[self currentAccount]->setPassword([[textField stringValue] UTF8String]); AccountModel::instance().selectedAccount()->setPassword([[textField stringValue] UTF8String]);
break; break;
case USERAGENT_TAG: case TagViews::USERAGENT:
[self currentAccount]->setUserAgent([[textField stringValue] UTF8String]); AccountModel::instance().selectedAccount()->setUserAgent([[textField stringValue] UTF8String]);
break; break;
default: default:
break; break;
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#import "AccAdvancedVC.h" #import "AccAdvancedVC.h"
#import "AccSecurityVC.h" #import "AccSecurityVC.h"
#import "AccRingVC.h" #import "AccRingVC.h"
#import "PathPasswordWC.h"
// We disabled IAX protocol for now, so don't show it to the user // We disabled IAX protocol for now, so don't show it to the user
class ActiveProtocolModel : public QSortFilterProxyModel class ActiveProtocolModel : public QSortFilterProxyModel
...@@ -51,7 +52,8 @@ public: ...@@ -51,7 +52,8 @@ public:
} }
}; };
@interface AccountsVC () @interface AccountsVC () <PathPasswordDelegate>
@property (assign) IBOutlet NSPopUpButton *protocolList; @property (assign) IBOutlet NSPopUpButton *protocolList;
@property (assign) IBOutlet NSTabView *configPanels; @property (assign) IBOutlet NSTabView *configPanels;
...@@ -65,12 +67,14 @@ public: ...@@ -65,12 +67,14 @@ public:
@property ActiveProtocolModel* proxyProtocolModel; @property ActiveProtocolModel* proxyProtocolModel;
@property (assign) IBOutlet NSOutlineView *accountsListView; @property (assign) IBOutlet NSOutlineView *accountsListView;
@property (assign) IBOutlet NSTabView *accountDetailsView; @property (assign) IBOutlet NSTabView *accountDetailsView;
@property (unsafe_unretained) IBOutlet NSButton* exportAccountButton;
@property AccRingVC* ringVC; @property AccRingVC* ringVC;
@property AccGeneralVC* generalVC; @property AccGeneralVC* generalVC;
@property AccMediaVC* audioVC; @property AccMediaVC* audioVC;
@property AccAdvancedVC* advancedVC; @property AccAdvancedVC* advancedVC;
@property AccSecurityVC* securityVC; @property AccSecurityVC* securityVC;
@property PathPasswordWC* passwordWC;
@end @end
...@@ -86,12 +90,18 @@ public: ...@@ -86,12 +90,18 @@ public:
@synthesize accountDetailsView; @synthesize accountDetailsView;
@synthesize treeController; @synthesize treeController;
@synthesize proxyProtocolModel; @synthesize proxyProtocolModel;
@synthesize passwordWC;
NSInteger const TAG_CHECK = 100; NSInteger const TAG_CHECK = 100;
NSInteger const TAG_NAME = 200; NSInteger const TAG_NAME = 200;
NSInteger const TAG_STATUS = 300; NSInteger const TAG_STATUS = 300;
NSInteger const TAG_TYPE = 400; NSInteger const TAG_TYPE = 400;
typedef NS_ENUM(NSUInteger, Action) {
ACTION_EXPORT = 0,
ACTION_IMPORT = 1,
};
- (void)awakeFromNib - (void)awakeFromNib
{ {
treeController = [[QNSTreeController alloc] initWithQModel:&AccountModel::instance()]; treeController = [[QNSTreeController alloc] initWithQModel:&AccountModel::instance()];
...@@ -233,6 +243,34 @@ NSInteger const TAG_TYPE = 400; ...@@ -233,6 +243,34 @@ NSInteger const TAG_TYPE = 400;
[configPanels insertTabViewItem:advancedTabItem atIndex:2]; [configPanels insertTabViewItem:advancedTabItem atIndex:2];
} }
- (IBAction)exportAccount:(id)sender
{
passwordWC = [[PathPasswordWC alloc] initWithDelegate:self actionCode:Action::ACTION_EXPORT];
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_9
[self.view.window beginSheet:passwordWC.window completionHandler:nil];
#else
[NSApp beginSheet: passwordWC.window
modalForWindow: self.view.window
modalDelegate: self
didEndSelector: nil
contextInfo: nil];
#endif
[passwordWC setAllowFileSelection:NO];
}
- (IBAction)importAccount:(id)sender
{
passwordWC = [[PathPasswordWC alloc] initWithDelegate:self actionCode:Action::ACTION_IMPORT];
#if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_9
[self.view.window beginSheet:passwordWC.window completionHandler:nil];
#else
[NSApp beginSheet: passwordWC.window
modalForWindow: self.view.window
modalDelegate: self
didEndSelector: nil
contextInfo: nil];
#endif
}
- (IBAction)toggleAccount:(NSButton*)sender { - (IBAction)toggleAccount:(NSButton*)sender {
NSInteger row = [accountsListView rowForView:sender]; NSInteger row = [accountsListView rowForView:sender];
...@@ -312,6 +350,7 @@ NSInteger const TAG_TYPE = 400; ...@@ -312,6 +350,7 @@ NSInteger const TAG_TYPE = 400;
- (void)outlineViewSelectionDidChange:(NSNotification *)notification - (void)outlineViewSelectionDidChange:(NSNotification *)notification
{ {
// ask the tree controller for the current selection // ask the tree controller for the current selection
[self.exportAccountButton setEnabled:[[treeController selectedNodes] count] > 0];
if([[treeController selectedNodes] count] > 0) { if([[treeController selectedNodes] count] > 0) {
auto qIdx = [treeController toQIdx:[treeController selectedNodes][0]]; auto qIdx = [treeController toQIdx:[treeController selectedNodes][0]];
//Update details view //Update details view
...@@ -338,6 +377,67 @@ NSInteger const TAG_TYPE = 400; ...@@ -338,6 +377,67 @@ NSInteger const TAG_TYPE = 400;
} }
} }
-(void) didCompleteWithPath:(NSURL*) path Password:(NSString*) password ActionCode:(NSInteger)requestCode
{
switch (requestCode) {
case Action::ACTION_EXPORT:
if(treeController.selectedNodes.count > 0) {
QStringList accounts;
for (id item : [treeController selectedNodes]) {
QModelIndex accIdx = [treeController toQIdx:item];
accounts << AccountModel::instance().getAccountByModelIndex(accIdx)->id();
}
auto finalURL = [path URLByAppendingPathComponent:@"accounts.ring"];
[passwordWC showLoading];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
int result = AccountModel::instance().exportAccounts(accounts, finalURL.path.UTF8String, password.UTF8String);
switch (result) {
case 0:
[[NSWorkspace sharedWorkspace] selectFile:finalURL.path inFileViewerRootedAtPath:@""];
[passwordWC close];
break;
default:
[passwordWC showError:NSLocalizedString(@"An error occured during the export", @"Error shown to the user" )];
break;
}
});
}
break;
case Action::ACTION_IMPORT: {
[passwordWC showLoading];
SEL sel = @selector(importAccountsWithPath:andPassword:);
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:self];
//arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv setArgument:&path atIndex:2];
[inv setArgument:&password atIndex:3];
// Schedule import for next iteration of event loop in order to let us start the loading anim
[inv performSelector:@selector(invoke) withObject:nil afterDelay:0];
}
break;
default:
NSLog(@"Unrecognized action %d", requestCode);
break;
}
}
- (void) importAccountsWithPath:(NSURL*) path andPassword:(NSString*) password
{
int result = AccountModel::instance().importAccounts(path.path.UTF8String, password.UTF8String);
switch (result) {
case 0:
[passwordWC close];
break;
default:
[passwordWC showError:NSLocalizedString(@"An error occured during the import", @"Error shown to the user" )];
break;
}
}
#pragma mark - NSMenuDelegate methods #pragma mark - NSMenuDelegate methods
- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel - (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel
......
/*
* Copyright (C) 2016 Savoir-faire Linux Inc.
* Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#import <Cocoa/Cocoa.h>
@protocol PathPasswordDelegate <NSObject>
@optional
-(void) didCompleteWithPath:(NSURL*) path Password:(NSString*) password;
-(void) didCompleteWithPath:(NSURL*) path Password:(NSString*) password ActionCode:(NSInteger) requestCode;
@end
@interface PathPasswordWC : NSWindowController
/*
* Delegate to inform about completion of the linking process between
* a ContactMethod and a Person.
*/
@property (nonatomic) id <PathPasswordDelegate> delegate;
/*
* caller specific code to identify ongoing action
*/
@property (nonatomic) NSInteger actionCode;
/*
* Custom init
*/
- (id)initWithDelegate:(id <PathPasswordDelegate>) del actionCode:(NSInteger) code;
/**
* password string contained in passwordField.
* This is a KVO method to bind the text with the OK Button
* if password.length is > 0, button is enabled, otherwise disabled
*/
@property (retain) NSString* password;
/**
* Allow the NSPathControl of this window to select files or not
*/
@property (nonatomic) BOOL allowFileSelection;
/*
* Show progress during action completion
*/
- (void)showLoading;
/*
* Display error message to the user
*/
- (void)showError:(NSString*) error;
@end
/*
* Copyright (C) 2016 Savoir-faire Linux Inc.
* Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#import "PathPasswordWC.h"
#import "views/ITProgressIndicator.h"
@interface PathPasswordWC() <NSTextFieldDelegate>{
__unsafe_unretained IBOutlet NSView* errorContainer;
__unsafe_unretained IBOutlet NSTextField* errorLabel;
__unsafe_unretained IBOutlet ITProgressIndicator* progressView;
__unsafe_unretained IBOutlet NSView* pathPasswordContainer;
__unsafe_unretained IBOutlet NSSecureTextField* passwordField;
__unsafe_unretained IBOutlet NSPathControl* path;
}
@end
@implementation PathPasswordWC {
struct {
unsigned int didComplete:1;
unsigned int didCompleteWithActionCode:1;
} delegateRespondsTo;
}
- (id)initWithDelegate:(id <PathPasswordDelegate>) del actionCode:(NSInteger) code
{
if ((self = [super initWithWindowNibName:@"PathPasswordWindow"]) != nil) {
[self setDelegate:del];
self.actionCode = code;
}
return self;
}
- (void)windowDidLoad
{
[super windowDidLoad];
[path setURL: [NSURL fileURLWithPath:NSHomeDirectory()]];
[progressView setNumberOfLines:30];
[progressView setWidthOfLine:2];
[progressView setLengthOfLine:5];
[progressView setInnerMargin:20];
[progressView setHidden:YES];
}
- (void)setDelegate:(id <PathPasswordDelegate>)aDelegate
{
if (self.delegate != aDelegate) {
_delegate = aDelegate;
delegateRespondsTo.didComplete = [self.delegate respondsToSelector:@selector(didCompleteWithPath:Password:)];
delegateRespondsTo.didCompleteWithActionCode = [self.delegate respondsToSelector:@selector(didCompleteWithPath:Password:ActionCode:)];
}
}
- (void) setAllowFileSelection:(BOOL) b
{
_allowFileSelection = b;
[path setAllowedTypes:_allowFileSelection ? nil : [NSArray arrayWithObject:@"public.folder"]];
}
- (IBAction) cancelPressed:(id)sender
{
[NSApp endSheet:self.window];
[self.window orderOut:self];
}
- (IBAction)completeAction:(id)sender
{
if (delegateRespondsTo.didComplete)
[self.delegate didCompleteWithPath:path.URL Password:passwordField.stringValue];
else if (delegateRespondsTo.didCompleteWithActionCode)
[self.delegate didCompleteWithPath:path.URL Password:passwordField.stringValue ActionCode:self.actionCode];
}
- (void)showLoading
{
[progressView setHidden:NO];
[pathPasswordContainer setHidden:YES];
[errorContainer setHidden:YES];
[progressView setAnimates:YES];
}
- (void)showError:(NSString*) error
{
[progressView setHidden:YES];
[pathPasswordContainer setHidden:YES];
[errorContainer setHidden:NO];
[errorLabel setStringValue:error];
}
@end
This diff is collapsed.
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<outlet property="accountsListView" destination="jXv-6I-P9R" id="MzW-0C-PN1"/> <outlet property="accountsListView" destination="jXv-6I-P9R" id="MzW-0C-PN1"/>
<outlet property="advancedTabItem" destination="RT7-u6-bhe" id="eAT-ce-MyD"/> <outlet property="advancedTabItem" destination="RT7-u6-bhe" id="eAT-ce-MyD"/>
<outlet property="configPanels" destination="Jki-s4-F1W" id="nY4-dc-CQg"/> <outlet property="configPanels" destination="Jki-s4-F1W" id="nY4-dc-CQg"/>
<outlet property="exportAccountButton" destination="8zw-sS-2ZT" id="aIw-Go-uB4"/>
<outlet property="generalTabItem" destination="tPR-Ac-N5Y" id="39S-pz-1Xs"/> <outlet property="generalTabItem" destination="tPR-Ac-N5Y" id="39S-pz-1Xs"/>
<outlet property="mediaTabItem" destination="lxr-my-vH8" id="BhJ-cS-yVi"/> <outlet property="mediaTabItem" destination="lxr-my-vH8" id="BhJ-cS-yVi"/>
<outlet property="protocolList" destination="rZv-qd-BGe" id="yU0-6C-Vt1"/> <outlet property="protocolList" destination="rZv-qd-BGe" id="yU0-6C-Vt1"/>
...@@ -64,12 +65,12 @@ ...@@ -64,12 +65,12 @@
</connections> </connections>
</tabView> </tabView>
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="57" horizontalPageScroll="10" verticalLineScroll="57" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZBN-hf-rGe"> <scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="57" horizontalPageScroll="10" verticalLineScroll="57" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZBN-hf-rGe">
<rect key="frame" x="20" y="215" width="250" height="400"/> <rect key="frame" x="20" y="149" width="250" height="400"/>
<clipView key="contentView" id="f8N-NI-2Mk"> <clipView key="contentView" id="f8N-NI-2Mk">
<rect key="frame" x="0.0" y="0.0" width="250" height="400"/> <rect key="frame" x="0.0" y="0.0" width="250" height="400"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" autosaveColumns="NO" rowHeight="55" rowSizeStyle="automatic" viewBased="YES" outlineTableColumn="eOe-f3-q88" id="jXv-6I-P9R" customClass="RingOutlineView"> <outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" autosaveColumns="NO" rowHeight="55" rowSizeStyle="automatic" viewBased="YES" outlineTableColumn="eOe-f3-q88" id="jXv-6I-P9R" customClass="RingOutlineView">
<rect key="frame" x="0.0" y="0.0" width="250" height="0.0"/> <rect key="frame" x="0.0" y="0.0" width="250" height="0.0"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/> <size key="intercellSpacing" width="3" height="2"/>
...@@ -160,20 +161,20 @@ ...@@ -160,20 +161,20 @@
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</clipView> </clipView>
<constraints> <constraints>
<constraint firstAttribute="height" constant="400" id="UBl-FT-gaL"/>
<constraint firstAttribute="width" constant="250" id="aC0-6T-CUo"/> <constraint firstAttribute="width" constant="250" id="aC0-6T-CUo"/>
<constraint firstAttribute="height" constant="400" id="wNL-XJ-NLj"/>
</constraints> </constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="x1l-v5-r0B"> <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="x1l-v5-r0B">
<rect key="frame" x="1" y="119" width="223" height="15"/> <rect key="frame" x="1" y="119" width="223" height="15"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="nVp-Qk-GaJ"> <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="nVp-Qk-GaJ">
<rect key="frame" x="224" y="17" width="15" height="102"/> <rect key="frame" x="234" y="0.0" width="16" height="0.0"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
</scrollView> </scrollView>
<button identifier="RemoveAccount" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="99I-xI-Ioi"> <button identifier="RemoveAccount" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="99I-xI-Ioi">
<rect key="frame" x="14" y="179" width="82" height="32"/> <rect key="frame" x="14" y="113" width="82" height="32"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="21" id="Lcf-3l-7oj"/> <constraint firstAttribute="height" constant="21" id="Lcf-3l-7oj"/>
<constraint firstAttribute="width" constant="70" id="YaI-pj-FUh"/> <constraint firstAttribute="width" constant="70" id="YaI-pj-FUh"/>
...@@ -187,7 +188,7 @@ ...@@ -187,7 +188,7 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zWn-Zy-Uau"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zWn-Zy-Uau">
<rect key="frame" x="14" y="125" width="82" height="32"/> <rect key="frame" x="14" y="562" width="82" height="32"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="70" id="wC2-dX-oeG"/> <constraint firstAttribute="width" constant="70" id="wC2-dX-oeG"/>
</constraints> </constraints>
...@@ -199,8 +200,8 @@ ...@@ -199,8 +200,8 @@
<action selector="addAccount:" target="-2" id="P9N-LS-Ikk"/> <action selector="addAccount:" target="-2" id="P9N-LS-Ikk"/>
</connections> </connections>
</button> </button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9VL-9a-rDg"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9VL-9a-rDg">
<rect key="frame" x="18" y="161" width="107" height="17"/> <rect key="frame" x="18" y="598" width="105" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="41" id="VFE-du-cB1"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="41" id="VFE-du-cB1"/>
</constraints> </constraints>
...@@ -211,7 +212,7 @@ ...@@ -211,7 +212,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rZv-qd-BGe"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rZv-qd-BGe">
<rect key="frame" x="96" y="129" width="177" height="26"/> <rect key="frame" x="96" y="566" width="177" height="26"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" identifier="protocolList" imageScaling="proportionallyDown" inset="2" id="bfy-Lh-jXj"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" identifier="protocolList" imageScaling="proportionallyDown" inset="2" id="bfy-Lh-jXj">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
...@@ -225,8 +226,11 @@ ...@@ -225,8 +226,11 @@
<action selector="protocolSelectedChanged:" target="-2" id="83Y-L0-Bav"/> <action selector="protocolSelectedChanged:" target="-2" id="83Y-L0-Bav"/>
</connections> </connections>
</popUpButton> </popUpButton>
<button verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="IqR-Q4-2bh"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IqR-Q4-2bh">
<rect key="frame" x="196" y="179" width="80" height="32"/> <rect key="frame" x="199" y="113" width="77" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="65" id="QQX-uY-Hq2"/>
</constraints>
<buttonCell key="cell" type="push" title="Down" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Co-ei-tUA"> <buttonCell key="cell" type="push" title="Down" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Co-ei-tUA">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
...@@ -235,8 +239,11 @@ ...@@ -235,8 +239,11 @@
<action selector="moveDown:" target="-2" id="0GS-Xo-bu7"/> <action selector="moveDown:" target="-2" id="0GS-Xo-bu7"/>
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dxk-Wh-H0B"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dxk-Wh-H0B">
<rect key="frame" x="120" y="179" width="80" height="32"/> <rect key="frame" x="126" y="113" width="77" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="65" id="ZIi-di-Z52"/>
</constraints>
<buttonCell key="cell" type="push" title="Up" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="HoA-BH-xam"> <buttonCell key="cell" type="push" title="Up" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="HoA-BH-xam">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
...@@ -245,27 +252,47 @@ ...@@ -245,27 +252,47 @@
<action selector="moveUp:" target="-2" id="Na8-jb-xhV"/> <action selector="moveUp:" target="-2" id="Na8-jb-xhV"/>
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="on2-tl-jhF">
<rect key="frame" x="59" y="50" width="80" height="32"/>
<buttonCell key="cell" type="push" title="Import" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="zov-Bb-Fgp">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="importAccount:" target="-2" id="0Dl-fT-SY4"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8zw-sS-2ZT">
<rect key="frame" x="152" y="50" width="80" height="32"/>
<buttonCell key="cell" type="push" title="Export" bezelStyle="rounded" alignment="center" enabled="NO" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="OeK-Sf-pdc">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="exportAccount:" target="-2" id="AXf-KV-GAn"/>
</connections>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="9VL-9a-rDg" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="6f4-PL-Fhx"/>
<constraint firstAttribute="bottom" secondItem="Jki-s4-F1W" secondAttribute="bottom" constant="20" id="C1O-rd-eUI"/> <constraint firstAttribute="bottom" secondItem="Jki-s4-F1W" secondAttribute="bottom" constant="20" id="C1O-rd-eUI"/>
<constraint firstItem="ZBN-hf-rGe" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="HGs-9d-fQj"/>
<constraint firstItem="9VL-9a-rDg" firstAttribute="top" secondItem="99I-xI-Ioi" secondAttribute="bottom" constant="8" id="Hqz-b8-72b"/>
<constraint firstAttribute="trailing" secondItem="Jki-s4-F1W" secondAttribute="trailing" constant="20" id="J96-3h-sxa"/> <constraint firstAttribute="trailing" secondItem="Jki-s4-F1W" secondAttribute="trailing" constant="20" id="J96-3h-sxa"/>
<constraint firstItem="zWn-Zy-Uau" firstAttribute="top" secondItem="rZv-qd-BGe" secondAttribute="top" id="KqW-8M-1Ad"/> <constraint firstItem="zWn-Zy-Uau" firstAttribute="top" secondItem="rZv-qd-BGe" secondAttribute="top" id="KqW-8M-1Ad"/>
<constraint firstItem="99I-xI-Ioi" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="Mif-e1-csx"/> <constraint firstItem="99I-xI-Ioi" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="Mif-e1-csx"/>
<constraint firstItem="IqR-Q4-2bh" firstAttribute="top" secondItem="ZBN-hf-rGe" secondAttribute="bottom" constant="8" id="MpQ-8y-79O"/> <constraint firstItem="IqR-Q4-2bh" firstAttribute="top" secondItem="ZBN-hf-rGe" secondAttribute="bottom" constant="8" id="MpQ-8y-79O"/>
<constraint firstItem="zWn-Zy-Uau" firstAttribute="leading" secondItem="9VL-9a-rDg" secondAttribute="leading" id="N5s-qp-4jy"/> <constraint firstItem="zWn-Zy-Uau" firstAttribute="leading" secondItem="9VL-9a-rDg" secondAttribute="leading" id="N5s-qp-4jy"/>
<constraint firstItem="zWn-Zy-Uau" firstAttribute="top" secondItem="9VL-9a-rDg" secondAttribute="bottom" constant="8" id="PQk-F1-OVM"/>
<constraint firstItem="zWn-Zy-Uau" firstAttribute="bottom" secondItem="rZv-qd-BGe" secondAttribute="bottom" id="UIa-O1-w7s"/>
<constraint firstItem="rZv-qd-BGe" firstAttribute="trailing" secondItem="ZBN-hf-rGe" secondAttribute="trailing" id="UlG-Hv-ZCc"/> <constraint firstItem="rZv-qd-BGe" firstAttribute="trailing" secondItem="ZBN-hf-rGe" secondAttribute="trailing" id="UlG-Hv-ZCc"/>
<constraint firstItem="ZBN-hf-rGe" firstAttribute="top" secondItem="rZv-qd-BGe" secondAttribute="bottom" constant="20" id="Zpc-1R-BnS"/>
<constraint firstItem="Jki-s4-F1W" firstAttribute="leading" secondItem="ZBN-hf-rGe" secondAttribute="trailing" constant="8" id="Zzg-Tr-BVP"/> <constraint firstItem="Jki-s4-F1W" firstAttribute="leading" secondItem="ZBN-hf-rGe" secondAttribute="trailing" constant="8" id="Zzg-Tr-BVP"/>
<constraint firstItem="Jki-s4-F1W" firstAttribute="leading" secondItem="IqR-Q4-2bh" secondAttribute="trailing" constant="8" id="aSV-XE-k1u"/>
<constraint firstItem="zWn-Zy-Uau" firstAttribute="leading" secondItem="99I-xI-Ioi" secondAttribute="leading" id="b1b-5h-ggf"/> <constraint firstItem="zWn-Zy-Uau" firstAttribute="leading" secondItem="99I-xI-Ioi" secondAttribute="leading" id="b1b-5h-ggf"/>
<constraint firstItem="Jki-s4-F1W" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="fez-KJ-jhG"/> <constraint firstItem="Jki-s4-F1W" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="fez-KJ-jhG"/>
<constraint firstItem="rZv-qd-BGe" firstAttribute="top" secondItem="9VL-9a-rDg" secondAttribute="bottom" constant="8" id="ge2-uV-Gff"/>
<constraint firstItem="zWn-Zy-Uau" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="lRr-SS-K5h"/> <constraint firstItem="zWn-Zy-Uau" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="lRr-SS-K5h"/>
<constraint firstItem="IqR-Q4-2bh" firstAttribute="leading" secondItem="dxk-Wh-H0B" secondAttribute="trailing" constant="8" id="pYF-s0-cSa"/>
<constraint firstItem="99I-xI-Ioi" firstAttribute="top" secondItem="ZBN-hf-rGe" secondAttribute="bottom" constant="8" id="qlR-1N-Pj8"/> <constraint firstItem="99I-xI-Ioi" firstAttribute="top" secondItem="ZBN-hf-rGe" secondAttribute="bottom" constant="8" id="qlR-1N-Pj8"/>
<constraint firstItem="ZBN-hf-rGe" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="u8B-Kk-OHn"/> <constraint firstItem="ZBN-hf-rGe" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="u8B-Kk-OHn"/>
<constraint firstItem="rZv-qd-BGe" firstAttribute="leading" secondItem="zWn-Zy-Uau" secondAttribute="trailing" constant="8" id="y2z-JO-Y63"/> <constraint firstItem="rZv-qd-BGe" firstAttribute="leading" secondItem="zWn-Zy-Uau" secondAttribute="trailing" constant="8" id="y2z-JO-Y63"/>
<constraint firstItem="IqR-Q4-2bh" firstAttribute="leading" secondItem="dxk-Wh-H0B" secondAttribute="trailing" constant="8" id="yYZ-UL-F0F"/>
<constraint firstItem="dxk-Wh-H0B" firstAttribute="top" secondItem="ZBN-hf-rGe" secondAttribute="bottom" constant="8" id="zTd-2r-hid"/> <constraint firstItem="dxk-Wh-H0B" firstAttribute="top" secondItem="ZBN-hf-rGe" secondAttribute="bottom" constant="8" id="zTd-2r-hid"/>
</constraints> </constraints>
<point key="canvasLocation" x="542" y="273.5"/> <point key="canvasLocation" x="542" y="273.5"/>
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9532"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PathPasswordWC">
<connections>
<outlet property="errorContainer" destination="ty1-sj-tT6" id="eEy-Cr-yiw"/>
<outlet property="errorLabel" destination="G1N-th-ZtP" id="PMs-b1-oJo"/>
<outlet property="passwordField" destination="vej-Z8-dOm" id="Ff0-Rb-Al6"/>
<outlet property="path" destination="ww6-ha-GhI" id="gdx-sh-x5J"/>
<outlet property="pathPasswordContainer" destination="xUT-yB-g8Q" id="xyd-vF-fD8"/>
<outlet property="progressView" destination="Ovf-4O-7LZ" id="BgC-sc-6GS"/>
<outlet property="window" destination="QvC-M9-y7g" id="bos-rN-Jgz"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="QvC-M9-y7g">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="351" height="131"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1050"/>
<view key="contentView" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="351" height="131"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<customView hidden="YES" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ovf-4O-7LZ" customClass="ITProgressIndicator">
<rect key="frame" x="140" y="30" width="70" height="70"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xUT-yB-g8Q">
<rect key="frame" x="1" y="0.0" width="350" height="131"/>
<subviews>
<pathControl verticalHuggingPriority="750" fixedFrame="YES" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ww6-ha-GhI">
<rect key="frame" x="84" y="87" width="250" height="26"/>
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="S8N-6a-Pll">
<font key="font" metaFont="system"/>
<url key="url" string="file:///Users/"/>
</pathCell>
</pathControl>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vl7-sD-OLk">
<rect key="frame" x="37" y="93" width="44" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Where" id="9h8-GU-av4">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Bcr-Pl-Fz9">
<rect key="frame" x="18" y="57" width="63" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Password" id="vwh-K9-3O9">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<secureTextField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vej-Z8-dOm">
<rect key="frame" x="87" y="54" width="244" height="22"/>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" placeholderString="Password..." drawsBackground="YES" usesSingleLineMode="YES" id="xqz-Uz-hqU">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</secureTextFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="self.password" id="5cX-yS-4Sl">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
<string key="NSMultipleValuesPlaceholder">Password...</string>
<string key="NSNoSelectionPlaceholder">Password...</string>
<string key="NSNotApplicablePlaceholder">Password...</string>
<string key="NSNullPlaceholder">Password...</string>
</dictionary>
</binding>
<outlet property="delegate" destination="-2" id="UEj-AI-SPU"/>
</connections>
</secureTextField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Yf1-T3-fOf">
<rect key="frame" x="196" y="13" width="82" height="32"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="cSU-aD-OwX">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
<connections>
<action selector="cancelPressed:" target="-2" id="bIl-jp-gRS"/>
</connections>
</button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oXB-Be-LaB">
<rect key="frame" x="278" y="13" width="59" height="32"/>
<buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="rW5-Il-5YD">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="completeAction:" target="-2" id="4me-jZ-4mk"/>
<binding destination="-2" name="enabled" keyPath="self.password.length" id="KN4-nF-wwM"/>
</connections>
</button>
</subviews>
</customView>
<customView hidden="YES" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ty1-sj-tT6">
<rect key="frame" x="0.0" y="0.0" width="350" height="131"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="G1N-th-ZtP">
<rect key="frame" x="18" y="57" width="314" height="17"/>
<textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" alignment="center" placeholderString="error label" id="e7n-Ev-bK7">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cxh-K7-1eh">
<rect key="frame" x="279" y="13" width="59" height="32"/>
<buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="VN1-A3-RIh">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="cancelPressed:" target="-2" id="JTp-N4-Tb8"/>
</connections>
</button>
</subviews>
</customView>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="3wn-SC-48D"/>
</connections>
<point key="canvasLocation" x="-363.5" y="-97.5"/>
</window>
<userDefaultsController representsSharedInstance="YES" id="2A5-Q9-edp"/>
</objects>
</document>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment