Commit b54abea8 authored by Felix Paul Kühne's avatar Felix Paul Kühne

Add a UI and a data backend for Dropbox (close #8573)

fully functional

TODO: prettify UI, add progress indicators for longer lasting operations

http://cl.ly/image/240A1o0P0B1a
parent 3a1f0041
......@@ -145,6 +145,16 @@
<string>smb</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLName</key>
<string>Dropbox</string>
<key>CFBundleURLSchemes</key>
<array>
<string>db-a60fc6qj9zdg7bw</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>1.0</string>
......
......@@ -26,6 +26,7 @@
@property (strong, nonatomic) IBOutlet UISwitch *httpUploadServerSwitch;
@property (strong, nonatomic) IBOutlet UILabel *httpUploadLabel;
@property (strong, nonatomic) IBOutlet UILabel *httpUploadServerLocationLabel;
@property (strong, nonatomic) IBOutlet UIButton *dropboxButton;
@property (strong, nonatomic) IBOutlet UIView *openURLView;
@property (strong, nonatomic) IBOutlet UITextField *openURLField;
......@@ -35,6 +36,7 @@
- (IBAction)openAboutPanel:(id)sender;
- (IBAction)openNetworkStream:(id)sender;
- (IBAction)downloadFromHTTPServer:(id)sender;
- (IBAction)showDropbox:(id)sender;
- (IBAction)showSettings:(id)sender;
- (IBAction)toggleHTTPServer:(id)sender;
......
......@@ -228,4 +228,16 @@
self.httpUploadServerLocationLabel.text = NSLocalizedString(@"HTTP_UPLOAD_SERVER_OFF", @"");
}
- (IBAction)showDropbox:(id)sender
{
VLCAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
appDelegate.dropboxTableViewController.modalPresentationStyle = UIModalPresentationFormSheet;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:appDelegate.dropboxTableViewController];
navController.navigationBarHidden = NO;
navController.navigationBar.barStyle = UIBarStyleBlack;
[self presentModalViewController:navController animated:YES];
}
@end
......@@ -6,7 +6,7 @@
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "VLCDropboxTableViewController.h"
@class VLCPlaylistViewController;
@class PAPasscodeViewController;
......@@ -19,6 +19,7 @@
- (void)updateMediaList;
@property (nonatomic, readonly) VLCPlaylistViewController *playlistViewController;
@property (nonatomic, readonly) VLCDropboxTableViewController *dropboxTableViewController;
@property (nonatomic, strong) UIWindow *window;
......
......@@ -41,11 +41,19 @@
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
[self.window makeKeyAndVisible];
_dropboxTableViewController = [[VLCDropboxTableViewController alloc] initWithNibName:@"VLCDropboxTableViewController" bundle:nil];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([[DBSession sharedSession] handleOpenURL:url]) {
NSLog(@"dropbox URL handled");
[self.dropboxTableViewController updateViewAfterSessionChange];
return YES;
}
if (_playlistViewController && url != nil) {
APLog(@"%@ requested %@ to be opened", sourceApplication, url);
......@@ -114,7 +122,7 @@
NSMutableArray *filePaths = [NSMutableArray arrayWithCapacity:[foundFiles count]];
NSURL *fileURL;
for (NSString *fileName in foundFiles) {
if ([fileName rangeOfString:@"\\.(3gp|3gp|3gp2|3gpp|amv|asf|avi|axv|divx|dv|flv|f4v|gvi|gxf|m1v|m2p|m2t|m2ts|m2v|m4v|mks|mkv|moov|mov|mp2v|mp4|mpeg|mpeg1|mpeg2|mpeg4|mpg|mpv|mt2s|mts|mxf|nsv|nuv|oga|ogg|ogm|ogv|ogx|spx|ps|qt|rar|rec|rm|rmvb|tod|ts|tts|vob|vro|webm|wm|wmv|wtv|xesc)$" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch].length != 0) {
if ([fileName rangeOfString:kSupportedFileExtensions options:NSRegularExpressionSearch|NSCaseInsensitiveSearch].length != 0) {
[filePaths addObject:[directoryPath stringByAppendingPathComponent:fileName]];
/* exclude media files from backup (QA1719) */
......
......@@ -18,4 +18,6 @@
#define kVLCSettingVerboseOutputOnValue @"--verbose=3"
#define kVLCSettingVerboseOutputOffValue @"--verbose=0"
#define kVLCSettingTextEncoding @"subsdec-encoding"
#define kVLCSettingTextEncodingDefaultValue @"Windows-1252"
\ No newline at end of file
#define kVLCSettingTextEncodingDefaultValue @"Windows-1252"
#define kSupportedFileExtensions @"\\.(3gp|3gp|3gp2|3gpp|amv|asf|avi|axv|divx|dv|flv|f4v|gvi|gxf|m1v|m2p|m2t|m2ts|m2v|m4v|mks|mkv|moov|mov|mp2v|mp4|mpeg|mpeg1|mpeg2|mpeg4|mpg|mpv|mt2s|mts|mxf|nsv|nuv|oga|ogg|ogm|ogv|ogx|spx|ps|qt|rar|rec|rm|rmvb|tod|ts|tts|vob|vro|webm|wm|wmv|wtv|xesc)$"
\ No newline at end of file
//
// VLCDropboxController.h
// VLC for iOS
//
// Created by Felix Paul Kühne on 23.05.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
#import <DropboxSDK/DropboxSDK.h>
@protocol VLCDropboxController
@required
- (void)mediaListUpdated;
@end
@interface VLCDropboxController : NSObject <DBRestClientDelegate, DBSessionDelegate, DBNetworkRequestDelegate>
@property (nonatomic, retain) id delegate;
@property (nonatomic, readonly) NSArray *currentListFiles;
@property (nonatomic, readonly) BOOL sessionIsLinked;
- (void)startSession;
- (void)logout;
- (void)requestDirectoryListingAtPath:(NSString *)path;
- (void)downloadFileToDocumentFolder:(DBMetadata *)file;
@end
//
// VLCDropboxController.m
// VLC for iOS
//
// Created by Felix Paul Kühne on 23.05.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
#import "VLCDropboxController.h"
#import "VLCAppDelegate.h"
@interface VLCDropboxController ()
{
DBRestClient *_restClient;
NSArray *_currentFileList;
NSInteger _outstandingNetworkRequests;
}
@end
@implementation VLCDropboxController
#pragma mark - session handling
- (void)startSession
{
}
- (void)logout
{
[[DBSession sharedSession] unlinkAll];
}
- (BOOL)sessionIsLinked
{
return [[DBSession sharedSession] isLinked];
}
- (DBRestClient *)restClient {
if (!_restClient) {
_restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
_restClient.delegate = self;
}
return _restClient;
}
#pragma mark - file management
- (void)requestDirectoryListingAtPath:(NSString *)path
{
if (self.sessionIsLinked)
[[self restClient] loadMetadata:path];
}
- (void)downloadFileToDocumentFolder:(DBMetadata *)file
{
if (!file.isDirectory) {
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [searchPaths[0] stringByAppendingString:file.filename];
//FIXME: add UI hook to display activity
[[self restClient] loadFile:file.path intoPath:filePath];
}
}
#pragma mark - restClient delegate
- (BOOL)_supportedFileExtension:(NSString *)filename
{
if ([filename rangeOfString:kSupportedFileExtensions options:NSRegularExpressionSearch|NSCaseInsensitiveSearch].length != 0)
return YES;
return NO;
}
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
NSMutableArray *listOfGoodFilesAndFolders = [[NSMutableArray alloc] init];
if (metadata.isDirectory) {
NSArray *contents = metadata.contents;
NSUInteger metaDataCount = metadata.contents.count;
for (NSUInteger x = 0; x < metaDataCount; x++) {
DBMetadata *file = contents[x];
if ([file isDirectory] || [self _supportedFileExtension:file.filename])
[listOfGoodFilesAndFolders addObject:file];
}
}
_currentFileList = [NSArray arrayWithArray:listOfGoodFilesAndFolders];
APLog(@"found filtered metadata for %i files", _currentFileList.count);
if ([self.delegate respondsToSelector:@selector(mediaListUpdated)])
[self.delegate mediaListUpdated];
}
- (void)restClient:(DBRestClient *)client loadMetadataFailedWithError:(NSError *)error
{
APLog(@"DBMetadata download failed with error %i", error.code);
}
- (void)restClient:(DBRestClient*)client loadedFile:(NSString*)localPath
{
/* update library now that we got a file */
VLCAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate updateMediaList];
}
- (void)restClient:(DBRestClient*)client loadFileFailedWithError:(NSError*)error
{
APLog(@"DBFile download failed with error %i", error.code);
}
- (void)restClient:(DBRestClient*)client loadProgress:(CGFloat)progress forFile:(NSString*)destPath
{
APLog(@"Download progress for DBFile '%@' %f", destPath.lastPathComponent, progress);
}
#pragma mark - DBSession delegate
- (void)sessionDidReceiveAuthorizationFailure:(DBSession *)session userId:(NSString *)userId
{
APLog(@"DBSession received authorization failure with user ID %@", userId);
}
#pragma mark - DBNetworkRequest delegate
- (void)networkRequestStarted
{
_outstandingNetworkRequests++;
if (_outstandingNetworkRequests == 1)
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
}
- (void)networkRequestStopped
{
_outstandingNetworkRequests--;
if (_outstandingNetworkRequests == 0)
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
#pragma mark - VLC internal communication and delegate
- (NSArray *)currentListFiles
{
return _currentFileList;
}
@end
//
// VLCDropboxTableViewCell.h
// VLC for iOS
//
// Created by Felix Paul Kühne on 24.05.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
#import <DropboxSDK/DropboxSDK.h>
@interface VLCDropboxTableViewCell : UITableViewCell
@property (nonatomic, strong) IBOutlet UILabel *titleLabel;
@property (nonatomic, strong) IBOutlet UILabel *subtitleLabel;
@property (nonatomic, strong) IBOutlet UIImageView *thumbnailView;
@property (nonatomic, strong) IBOutlet UIImageView *itemIsaFolderView;
@property (nonatomic, retain) DBMetadata *fileMetadata;
+ (VLCDropboxTableViewCell *)cellWithReuseIdentifier:(NSString *)ident;
+ (CGFloat)heightOfCell;
@end
//
// VLCDropboxTableViewCell.m
// VLC for iOS
//
// Created by Felix Paul Kühne on 24.05.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
#import "VLCDropboxTableViewCell.h"
@implementation VLCDropboxTableViewCell
+ (VLCDropboxTableViewCell *)cellWithReuseIdentifier:(NSString *)ident
{
NSArray *nibContentArray = [[NSBundle mainBundle] loadNibNamed:@"VLCDropboxTableViewCell" owner:nil options:nil];
NSAssert([nibContentArray count] == 1, @"meh");
NSAssert([[nibContentArray lastObject] isKindOfClass:[VLCDropboxTableViewCell class]], @"meh meh");
VLCDropboxTableViewCell *cell = (VLCDropboxTableViewCell *)[nibContentArray lastObject];
CGRect frame = [cell frame];
UIView *background = [[UIView alloc] initWithFrame:frame];
background.backgroundColor = [UIColor colorWithWhite:.05 alpha:1.];
cell.backgroundView = background;
UIView *highlightedBackground = [[UIView alloc] initWithFrame:frame];
highlightedBackground.backgroundColor = [UIColor colorWithWhite:.2 alpha:1.];
cell.selectedBackgroundView = highlightedBackground;
return cell;
}
- (void)setFileMetadata:(DBMetadata *)fileMetadata
{
if (fileMetadata != _fileMetadata)
_fileMetadata = fileMetadata;
[self _updatedDisplayedInformation];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (void)_updatedDisplayedInformation
{
self.titleLabel.text = self.fileMetadata.filename;
self.subtitleLabel.text = (self.fileMetadata.totalBytes > 0) ? self.fileMetadata.humanReadableSize : @"";
self.thumbnailView.image = [UIImage imageNamed:self.fileMetadata.icon];
if (!self.thumbnailView.image)
APLog(@"missing icon for type '%@'", self.fileMetadata.icon);
self.itemIsaFolderView.hidden = !self.fileMetadata.isDirectory;
[self setNeedsDisplay];
}
+ (CGFloat)heightOfCell
{
return 80.;
}
@end
//
// VLCDropboxTableViewController.h
// VLC for iOS
//
// Created by Felix Paul Kühne on 24.05.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
#import "VLCDropboxController.h"
@interface VLCDropboxTableViewController : UITableViewController <VLCDropboxController>
@property (nonatomic, strong) IBOutlet UIView *loginToDropboxView;
@property (nonatomic, strong) IBOutlet UIButton *loginToDropboxButton;
- (IBAction)loginToDropboxAction:(id)sender;
- (void)updateViewAfterSessionChange;
@end
//
// VLCDropboxTableViewController.m
// VLC for iOS
//
// Created by Felix Paul Kühne on 24.05.13.
// Copyright (c) 2013 VideoLAN. All rights reserved.
//
#import "VLCDropboxTableViewController.h"
#import "VLCDropboxTableViewCell.h"
#import "VLCDropboxController.h"
#import "VLCAppDelegate.h"
#import "VLCPlaylistViewController.h"
#import <DropboxSDK/DropboxSDK.h>
@interface VLCDropboxTableViewController ()
{
VLCDropboxController *_dropboxController;
NSString *_currentPath;
}
@end
@implementation VLCDropboxTableViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_dropboxController = [[VLCDropboxController alloc] init];
_dropboxController.delegate = self;
#warning Dropbox app secret missing, login will fail
DBSession* dbSession = [[DBSession alloc] initWithAppKey:@"a60fc6qj9zdg7bw" appSecret:@"" root:kDBRootDropbox];
[DBSession setSharedSession:dbSession];
[DBRequest setNetworkRequestDelegate:_dropboxController];
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"BUTTON_DONE", @"") style:UIBarButtonItemStyleDone target:self action:@selector(dismiss:)];
self.navigationItem.rightBarButtonItem = addButton;
self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"dropbox-white"]];
self.tableView.rowHeight = [VLCDropboxTableViewCell heightOfCell];
self.tableView.separatorColor = [UIColor colorWithWhite:.2 alpha:1.];
}
- (void)viewWillAppear:(BOOL)animated
{
[self updateViewAfterSessionChange];
}
- (IBAction)dismiss:(id)sender
{
[self.navigationController dismissModalViewControllerAnimated:YES];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _dropboxController.currentListFiles.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"DropboxCell";
VLCDropboxTableViewCell *cell = (VLCDropboxTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [VLCDropboxTableViewCell cellWithReuseIdentifier:CellIdentifier];
cell.fileMetadata = _dropboxController.currentListFiles[indexPath.row];
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DBMetadata *selectedFile = _dropboxController.currentListFiles[indexPath.row];
if (!selectedFile.isDirectory) {
/* selected item is a proper file, download it */
[_dropboxController downloadFileToDocumentFolder:selectedFile];
} else {
/* dive into subdirectory */
_currentPath = [_currentPath stringByAppendingFormat:@"/%@", selectedFile.filename];
[_dropboxController requestDirectoryListingAtPath:_currentPath];
}
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
}
#pragma mark - dropbox controller delegate
- (void)mediaListUpdated
{
[self.tableView reloadData];
}
#pragma mark - communication with app delegate
- (void)updateViewAfterSessionChange
{
if (![[DBSession sharedSession] isLinked]) {
[self _showLoginPanel];
return;
} else if (self.loginToDropboxView.superview)
[self.loginToDropboxView removeFromSuperview];
_currentPath = @"/";
[_dropboxController requestDirectoryListingAtPath:_currentPath];
}
#pragma mark - login dialog
- (void)_showLoginPanel
{
self.loginToDropboxView.frame = self.tableView.frame;
[self.tableView addSubview:self.loginToDropboxView];
}
- (IBAction)loginToDropboxAction:(id)sender
{
if (!_dropboxController.sessionIsLinked)
[[DBSession sharedSession] linkFromController:self];
else
[_dropboxController logout];
}
@end
......@@ -2,9 +2,9 @@
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1296</int>
<string key="IBDocument.SystemVersion">12D78</string>
<string key="IBDocument.SystemVersion">12E52</string>
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
<string key="IBDocument.AppKitVersion">1187.37</string>
<string key="IBDocument.AppKitVersion">1187.39</string>
<string key="IBDocument.HIToolboxVersion">626.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
......@@ -83,7 +83,7 @@
<string key="NSFrame">{{0, 68}, {320, 60}}</string>
<reference key="NSSuperview" ref="892317093"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="775197480"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<reference key="IBUIBackgroundColor" ref="937037271"/>
<bool key="IBUIOpaque">NO</bool>
......@@ -103,7 +103,7 @@
<object class="IBUIButton" id="665933893">
<reference key="NSNextResponder" ref="892317093"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{0, 220}, {320, 60}}</string>
<string key="NSFrame">{{0, 275}, {320, 60}}</string>
<reference key="NSSuperview" ref="892317093"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1021636329"/>
......@@ -126,7 +126,7 @@
<object class="IBUIButton" id="1021636329">
<reference key="NSNextResponder" ref="892317093"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{0, 288}, {320, 60}}</string>
<string key="NSFrame">{{0, 343}, {320, 60}}</string>
<reference key="NSSuperview" ref="892317093"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
......@@ -145,30 +145,68 @@
<reference key="IBUIFontDescription" ref="886215057"/>
<reference key="IBUIFont" ref="327024238"/>
</object>
<object class="IBUIView" id="775197480">
<object class="IBUIView" id="438150818">
<reference key="NSNextResponder" ref="892317093"/>
<int key="NSvFlags">-2147483348</int>
<string key="NSFrame">{{10, 78}, {40, 40}}</string>
<reference key="NSSuperview" ref="892317093"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwAA</bytes>
</object>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUIButton" id="502729697">
<reference key="NSNextResponder" ref="892317093"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{0, 207}, {320, 60}}</string>
<reference key="NSSuperview" ref="892317093"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<reference key="IBUIBackgroundColor" ref="937037271"/>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
<reference key="IBUIHighlightedTitleColor" ref="878206399"/>
<object class="NSColor" key="IBUINormalTitleColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA</bytes>
</object>
<reference key="IBUINormalTitleShadowColor" ref="1025413593"/>
<object class="NSCustomResource" key="IBUINormalImage">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">dropbox-black.png</string>
</object>
<reference key="IBUIFontDescription" ref="886215057"/>
<reference key="IBUIFont" ref="327024238"/>
</object>
<object class="IBUIView" id="136452396">
<reference key="NSNextResponder" ref="892317093"/>
<int key="NSvFlags">292</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="IBUISwitch" id="333552093">
<reference key="NSNextResponder" ref="775197480"/>
<object class="IBUISwitch" id="854423543">
<reference key="NSNextResponder" ref="136452396"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{208, 16}, {94, 27}}</string>
<reference key="NSSuperview" ref="775197480"/>
<string key="NSFrame">{{208, 5}, {94, 27}}</string>
<reference key="NSSuperview" ref="136452396"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="446179656"/>
<reference key="NSNextKeyView" ref="800651050"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
<int key="IBUIContentHorizontalAlignment">0</int>
<int key="IBUIContentVerticalAlignment">0</int>
</object>
<object class="IBUILabel" id="1058448762">
<reference key="NSNextResponder" ref="775197480"/>
<object class="IBUILabel" id="342130383">
<reference key="NSNextResponder" ref="136452396"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{20, 19}, {195, 21}}</string>
<reference key="NSSuperview" ref="775197480"/>
<string key="NSFrame">{{20, 8}, {195, 21}}</string>
<reference key="NSSuperview" ref="136452396"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="333552093"/>
<reference key="NSNextKeyView" ref="854423543"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
......@@ -187,13 +225,13 @@
<reference key="IBUIFont" ref="327024238"/>
<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
</object>
<object class="IBUILabel" id="446179656">
<reference key="NSNextResponder" ref="775197480"/>
<object class="IBUILabel" id="800651050">
<reference key="NSNextResponder" ref="136452396"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{20, 48}, {280, 21}}</string>
<reference key="NSSuperview" ref="775197480"/>
<string key="NSFrame">{{20, 37}, {280, 21}}</string>
<reference key="NSSuperview" ref="136452396"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="665933893"/>
<reference key="NSNextKeyView" ref="502729697"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
......@@ -212,7 +250,7 @@
<int key="type">1</int>
<double key="pointSize">14</double>
</object>
<object class="NSFont" key="IBUIFont" id="772231698">
<object class="NSFont" key="IBUIFont" id="877247040">
<string key="NSName">Helvetica</string>
<double key="NSSize">14</double>
<int key="NSfFlags">16</int>
......@@ -220,29 +258,16 @@
<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
</object>
</array>
<string key="NSFrame">{{0, 136}, {320, 76}}</string>
<string key="NSFrame">{{0, 136}, {320, 63}}</string>
<reference key="NSSuperview" ref="892317093"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="1058448762"/>
<reference key="NSNextKeyView" ref="342130383"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<reference key="IBUIBackgroundColor" ref="937037271"/>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
</object>
<object class="IBUIView" id="438150818">
<reference key="NSNextResponder" ref="892317093"/>
<int key="NSvFlags">-2147483348</int>
<string key="NSFrame">{{10, 78}, {40, 40}}</string>
<reference key="NSSuperview" ref="892317093"/>
<reference key="NSWindow"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MCAwAA</bytes>
</object>