Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial revision.

  • Loading branch information...
commit fee102d0b5b38eb4b8aac571b2ecf7afe8bc3d3d 0 parents
Jim Dovey authored
6 .gitignore
@@ -0,0 +1,6 @@
+*~
+.DS_Store
+build
+*.xcodeproj/*.pbxuser
+*.xcodeproj/*.mode1
+*.xcodeproj/*.mode1v3
18 Classes/CustomFormatters.h
@@ -0,0 +1,18 @@
+//
+// CustomFormatters.h
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright 2010 Kobo Inc. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface OSTypeFormatter : NSFormatter
+@end
+
+@interface POSIXPermissionsFormatter : NSFormatter
+@end
+
+@interface BooleanFormatter : NSFormatter
+@end
159 Classes/CustomFormatters.m
@@ -0,0 +1,159 @@
+//
+// CustomFormatters.m
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright 2010 Kobo Inc. All rights reserved.
+//
+
+#import "CustomFormatters.h"
+#import <Endian.h>
+#import <sys/stat.h>
+
+@implementation OSTypeFormatter
+
+- (NSString *) stringForObjectValue: (id) obj
+{
+ if ( [obj isKindOfClass: [NSValue class]] == NO )
+ return ( nil );
+
+ OSType osType = 0;
+ [obj getValue: &osType];
+
+#if TARGET_RT_LITTLE_ENDIAN
+ osType = Endian32_Swap(osType);
+#endif
+
+ char str[5];
+ memcpy(str, &osType, sizeof(osType));
+ str[4] = '\0';
+
+ return ( [NSString stringWithUTF8String: str] );
+}
+
+- (BOOL) getObjectValue: (id *) obj forString: (NSString *) string errorDescription: (NSString **) error
+{
+ if ( [string length] != 4 )
+ return ( NO );
+
+ OSType osType = 0;
+ const char * str = [string UTF8String];
+ osType = OSReadBigInt32(str, 0); // this will swap for us as appropriate
+
+ if ( obj != NULL )
+ *obj = [NSNumber numberWithUnsignedInt: osType];
+ return ( YES );
+}
+
+- (NSAttributedString *) attributedStringForObjectValue: (id) obj withDefaultAttributes: (NSDictionary *) attrs
+{
+ return ( [[[NSAttributedString alloc] initWithString: [self stringForObjectValue: obj] attributes: attrs] autorelease] );
+}
+
+@end
+
+@implementation POSIXPermissionsFormatter
+
+- (NSString *) stringForObjectValue: (id) obj
+{
+ if ( [obj isKindOfClass: [NSNumber class]] == NO )
+ return ( nil );
+
+ unsigned int perms = [obj unsignedIntValue];
+ char buf[11];
+ memset(buf, '-', 10);
+ buf[10] = '\0';
+
+ char type = '-';
+ switch ( perms & S_IFMT )
+ {
+ case S_IFBLK:
+ type = 'b';
+ break;
+
+ case S_IFCHR:
+ type = 'c';
+ break;
+
+ case S_IFDIR:
+ type = 'd';
+ break;
+
+ case S_IFIFO:
+ case S_IFSOCK:
+ type = 's';
+ break;
+
+ case S_IFREG:
+ default:
+ break;
+
+ case S_IFLNK:
+ type = 'l';
+ break;
+
+ case S_IFWHT:
+ type = 'w';
+ break;
+ }
+
+ buf[0] = type;
+
+ if ( perms & S_IRUSR )
+ buf[1] = 'r';
+ if ( perms & S_IWUSR )
+ buf[2] = 'w';
+ if ( perms & S_IXUSR )
+ buf[3] = 'x';
+ if ( perms & S_IRGRP )
+ buf[4] = 'r';
+ if ( perms & S_IWGRP )
+ buf[5] = 'w';
+ if ( perms & S_IXGRP )
+ buf[6] = 'x';
+ if ( perms & S_IROTH )
+ buf[7] = 'r';
+ if ( perms & S_IWOTH )
+ buf[8] = 'w';
+ if ( perms & S_IXOTH )
+ buf[9] = 'x';
+
+ return ( [NSString stringWithUTF8String: buf] );
+}
+
+- (BOOL) getObjectValue: (id *) obj forString: (NSString *) string errorDescription: (NSString **) error
+{
+ return ( NO );
+}
+
+- (NSAttributedString *) attributedStringForObjectValue: (id) obj withDefaultAttributes: (NSDictionary *) attrs
+{
+ return ( [[[NSAttributedString alloc] initWithString: [self stringForObjectValue: obj] attributes: attrs] autorelease] );
+}
+
+@end
+
+@implementation BooleanFormatter
+
+- (NSString *) stringForObjectValue: (id) obj
+{
+ if ( [obj boolValue] )
+ return ( NSLocalizedString(@"Yes", @"") );
+
+ return ( NSLocalizedString(@"No", @"") );
+}
+
+- (BOOL) getObjectValue: (id *) obj forString: (NSString *) string errorDescription: (NSString **) error
+{
+ if ( obj != NULL )
+ *obj = [NSNumber numberWithBool: [string boolValue]];
+ return ( YES );
+}
+
+- (NSAttributedString *) attributedStringForObjectValue: (id) obj withDefaultAttributes: (NSDictionary *) attrs
+{
+ return ( [[[NSAttributedString alloc] initWithString: [self stringForObjectValue: obj] attributes: attrs] autorelease] );
+}
+
+@end
+
29 Classes/DetailViewController.h
@@ -0,0 +1,29 @@
+//
+// DetailViewController.h
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright Kobo Inc. 2010. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate, UITableViewDataSource, UITableViewDelegate> {
+
+ UIPopoverController *popoverController;
+ UIToolbar *toolbar;
+ UIBarItem *titleBarItem;
+
+ NSDictionary * detailItem;
+
+ UITableView *detailTableView;
+
+ NSMutableArray * _tableData;
+}
+
+@property (nonatomic, retain) IBOutlet UIToolbar *toolbar;
+@property (nonatomic, retain) IBOutlet UIBarItem *titleBarItem;
+@property (nonatomic, copy) NSDictionary * detailItem;
+@property (nonatomic, retain) IBOutlet UITableView *detailTableView;
+
+@end
336 Classes/DetailViewController.m
@@ -0,0 +1,336 @@
+//
+// DetailViewController.m
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright Kobo Inc. 2010. All rights reserved.
+//
+
+#import "DetailViewController.h"
+#import "RootViewController.h"
+#import "CustomFormatters.h"
+
+enum
+{
+ kSectionFileBasicDetails,
+ kSectionFilePermissions,
+ kSectionFinderInfo,
+
+ kNumSections
+};
+
+static NSArray * BasicDetailKeys = nil;
+static NSArray * PermissionDetailKeys = nil;
+static NSArray * FinderInfoKeys = nil;
+
+static NSDictionary * LocalizedNames = nil;
+
+static NSSet * PermissionsNumberTypes = nil;
+static NSSet * OSTypeNumberTypes = nil;
+static NSSet * BooleanNumberTypes = nil;
+
+static NSFormatter * gOSTypeFormatter = nil;
+static NSFormatter * gPermissionsFormatter = nil;
+static NSFormatter * gBooleanFormatter = nil;
+
+@interface DetailViewController ()
+@property (nonatomic, retain) UIPopoverController *popoverController;
+- (void)configureView;
+@end
+
+@implementation DetailViewController
+
+@synthesize toolbar, popoverController, detailItem, detailTableView, titleBarItem;
+
++ (void) initialize
+{
+ if ( self != [DetailViewController class] )
+ return;
+
+ BasicDetailKeys = [[NSArray alloc] initWithObjects: NSFileType, NSFileSize, NSFileModificationDate, NSFileReferenceCount, NSFileDeviceIdentifier, NSFileSystemNumber, NSFileSystemFileNumber, NSFileBusy, nil];
+ PermissionDetailKeys = [[NSArray alloc] initWithObjects: NSFileOwnerAccountName, NSFileOwnerAccountID, NSFileGroupOwnerAccountName, NSFileGroupOwnerAccountID, NSFilePosixPermissions, nil];
+ FinderInfoKeys = [[NSArray alloc] initWithObjects: NSFileExtensionHidden, NSFileHFSCreatorCode, NSFileHFSTypeCode, NSFileImmutable, NSFileAppendOnly, NSFileCreationDate, nil];
+
+ LocalizedNames = [[NSDictionary alloc] initWithObjectsAndKeys: NSLocalizedString(@"File Type", @""), NSFileType,
+ NSLocalizedString(@"Directory", @""), NSFileTypeDirectory,
+ NSLocalizedString(@"File", @""), NSFileTypeRegular,
+ NSLocalizedString(@"Symbolic Link", @""), NSFileTypeSymbolicLink,
+ NSLocalizedString(@"Socket", @""), NSFileTypeSocket,
+ NSLocalizedString(@"Character Special", @""), NSFileTypeCharacterSpecial,
+ NSLocalizedString(@"Block Special", @""), NSFileTypeBlockSpecial,
+ NSLocalizedString(@"Unkown", @""), NSFileTypeUnknown,
+ NSLocalizedString(@"Size", @""), NSFileSize,
+ NSLocalizedString(@"Modification Date", @""), NSFileModificationDate,
+ NSLocalizedString(@"Reference Count", @""), NSFileReferenceCount,
+ NSLocalizedString(@"Device ID", @""), NSFileDeviceIdentifier,
+ NSLocalizedString(@"Owner", @""), NSFileOwnerAccountName,
+ NSLocalizedString(@"Group", @""), NSFileGroupOwnerAccountName,
+ NSLocalizedString(@"Permissions", @""), NSFilePosixPermissions,
+ NSLocalizedString(@"FileSystem Number", @""), NSFileSystemNumber,
+ NSLocalizedString(@"File Number", @""), NSFileSystemFileNumber,
+ NSLocalizedString(@"Extension Hidden", @""), NSFileExtensionHidden,
+ NSLocalizedString(@"Creator Code", @""), NSFileHFSCreatorCode,
+ NSLocalizedString(@"Type Code", @""), NSFileHFSTypeCode,
+ NSLocalizedString(@"Immutable", @""), NSFileImmutable,
+ NSLocalizedString(@"Append Only", @""), NSFileAppendOnly,
+ NSLocalizedString(@"Creation Date", @""), NSFileCreationDate,
+ NSLocalizedString(@"Owner ID", @""), NSFileOwnerAccountID,
+ NSLocalizedString(@"Group ID", @""), NSFileGroupOwnerAccountID,
+ nil];
+
+ PermissionsNumberTypes = [[NSSet alloc] initWithObjects: NSFilePosixPermissions, nil];
+ OSTypeNumberTypes = [[NSSet alloc] initWithObjects: NSFileHFSTypeCode, NSFileHFSCreatorCode, nil];
+ BooleanNumberTypes = [[NSSet alloc] initWithObjects: NSFileExtensionHidden, NSFileImmutable, NSFileAppendOnly, nil];
+
+ gOSTypeFormatter = [[OSTypeFormatter alloc] init];
+ gBooleanFormatter = [[BooleanFormatter alloc] init];
+ gPermissionsFormatter = [[POSIXPermissionsFormatter alloc] init];
+}
+
+#pragma mark -
+#pragma mark Managing the detail item
+
+/*
+ When setting the detail item, update the view and dismiss the popover controller if it's showing.
+ */
+- (void) setDetailItem: (NSDictionary *) newDetailItem
+{
+ if (detailItem != newDetailItem)
+ {
+ [detailItem release];
+ detailItem = [newDetailItem copy];
+
+ // Update the view.
+ [self configureView];
+ }
+
+ if (popoverController != nil) {
+ [popoverController dismissPopoverAnimated:YES];
+ }
+}
+
+- (void) configureView
+{
+ if ( _tableData == nil )
+ _tableData = [[NSMutableArray alloc] init];
+ else
+ [_tableData removeAllObjects];
+
+ [_tableData addObject: [NSMutableArray arrayWithCapacity: [BasicDetailKeys count]]];
+ [_tableData addObject: [NSMutableArray arrayWithCapacity: [PermissionDetailKeys count]]];
+ [_tableData addObject: [NSMutableArray arrayWithCapacity: [FinderInfoKeys count]]];
+
+ if ( detailItem == [NSNull null] )
+ {
+ [self.detailTableView reloadData];
+ return;
+ }
+
+ NSSet * allKeys = [NSSet setWithArray: [detailItem allKeys]];
+ NSArray * keySets = [NSArray arrayWithObjects: BasicDetailKeys, PermissionDetailKeys, FinderInfoKeys, nil];
+
+ NSUInteger idx = 0;
+ for ( NSMutableArray * array in _tableData )
+ {
+ NSArray * check = [keySets objectAtIndex: idx++];
+
+ for ( NSString * key in check )
+ {
+ if ( [allKeys containsObject: key] == NO )
+ continue;
+
+ id value = [detailItem objectForKey: key];
+ NSString * str = nil;
+ if ( [value isKindOfClass: [NSString class]] )
+ {
+ str = value;
+ }
+ else if ( [PermissionsNumberTypes containsObject: key] )
+ {
+ str = [gPermissionsFormatter stringForObjectValue: value];
+ }
+ else if ( [OSTypeNumberTypes containsObject: key] )
+ {
+ str = [gOSTypeFormatter stringForObjectValue: value];
+ }
+ else if ( [BooleanNumberTypes containsObject: key] )
+ {
+ str = [gBooleanFormatter stringForObjectValue: value];
+ }
+ else
+ {
+ str = [value description];
+ }
+
+ NSString * localizedKey = [LocalizedNames objectForKey: key];
+ if ( localizedKey == nil )
+ localizedKey = key;
+
+ NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys: str, @"detail", localizedKey, @"title", nil];
+ [array addObject: dict];
+ }
+ }
+
+ [self.detailTableView reloadData];
+}
+
+
+#pragma mark -
+#pragma mark Split view support
+
+- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc {
+
+ barButtonItem.title = @"Root List";
+ NSMutableArray *items = [[toolbar items] mutableCopy];
+ [items insertObject:barButtonItem atIndex:0];
+ [toolbar setItems:items animated:YES];
+ [items release];
+ self.popoverController = pc;
+}
+
+
+// Called when the view is shown again in the split view, invalidating the button and popover controller.
+- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
+
+ NSMutableArray *items = [[toolbar items] mutableCopy];
+ [items removeObjectAtIndex:0];
+ [toolbar setItems:items animated:YES];
+ [items release];
+ self.popoverController = nil;
+}
+
+
+#pragma mark -
+#pragma mark Rotation support
+
+// Ensure that the view controller supports rotation and that the split view can therefore show in both portrait and landscape.
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ return YES;
+}
+
+#pragma mark -
+#pragma mark Table view data source
+
+- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
+{
+ return ( kNumSections );
+}
+
+- (NSInteger) tableView: (UITableView *) table numberOfRowsInSection: (NSInteger) section
+{
+ return ( [[_tableData objectAtIndex: section] count] );
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ static NSString *CellIdentifier = @"FolderDetailCellIdentifier";
+
+ // Dequeue or create a cell of the appropriate type.
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ if (cell == nil)
+ {
+ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
+ cell.selectionStyle = UITableViewCellSelectionStyleNone;
+ cell.accessoryType = UITableViewCellAccessoryNone;
+ }
+
+ // Configure the cell.
+
+ NSDictionary * dict = [[_tableData objectAtIndex: indexPath.section] objectAtIndex: indexPath.row];
+
+ cell.textLabel.text = [dict objectForKey: @"title"];
+ cell.detailTextLabel.text = [dict objectForKey: @"detail"];
+
+ return ( cell );
+}
+
+- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section
+{
+ switch ( section )
+ {
+ case kSectionFileBasicDetails:
+ return ( NSLocalizedString(@"Basic Details", @"") );
+
+ case kSectionFilePermissions:
+ return ( NSLocalizedString(@"Access Permissions", @"") );
+
+ case kSectionFinderInfo:
+ return ( NSLocalizedString(@"Finder Info", @"") );
+
+ default:
+ break;
+ }
+
+ return ( nil );
+}
+
+- (NSString *) tableView: (UITableView *) tableView titleForFooterInSection: (NSInteger) section
+{
+ if ( (section == kNumSections-1) && (detailItem == [NSNull null]) )
+ return ( NSLocalizedString(@"No Information Available", @"") );
+
+ return ( nil );
+}
+
+#pragma mark -
+#pragma mark View lifecycle
+
+- (void) setTitle: (NSString *) aTitle
+{
+ [super setTitle: aTitle];
+ self.titleBarItem.title = aTitle;
+}
+
+// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ self.titleBarItem.title = self.title;
+ [self.detailTableView reloadData];
+}
+
+/*
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+}
+*/
+/*
+- (void)viewDidAppear:(BOOL)animated {
+ [super viewDidAppear:animated];
+}
+*/
+/*
+- (void)viewWillDisappear:(BOOL)animated {
+ [super viewWillDisappear:animated];
+}
+*/
+/*
+- (void)viewDidDisappear:(BOOL)animated {
+ [super viewDidDisappear:animated];
+}
+*/
+
+- (void) viewDidUnload
+{
+ // Release any retained subviews of the main view.
+ // e.g. self.myOutlet = nil;
+ self.popoverController = nil;
+ self.toolbar = nil;
+ self.detailTableView = nil;
+}
+
+#pragma mark -
+#pragma mark Memory management
+
+- (void) dealloc
+{
+ [popoverController release];
+ [toolbar release];
+
+ [detailItem release];
+ [detailTableView release];
+ [_tableData release];
+ [super dealloc];
+}
+
+@end
25 Classes/RootViewController.h
@@ -0,0 +1,25 @@
+//
+// RootViewController.h
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright Kobo Inc. 2010. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@class DetailViewController;
+
+@interface RootViewController : UITableViewController
+{
+ DetailViewController *detailViewController;
+
+ NSString * folderPath;
+ NSArray * _folderContents;
+ NSMutableArray * _attributes;
+}
+
+@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController;
+@property (nonatomic, copy) NSString *folderPath;
+
+@end
182 Classes/RootViewController.m
@@ -0,0 +1,182 @@
+//
+// RootViewController.m
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright Kobo Inc. 2010. All rights reserved.
+//
+
+#import "RootViewController.h"
+#import "DetailViewController.h"
+#import "UIAlertView+NSError.h"
+
+@implementation RootViewController
+
+@synthesize detailViewController, folderPath;
+
+
+#pragma mark -
+#pragma mark View lifecycle
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ self.clearsSelectionOnViewWillAppear = NO;
+ self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0);
+
+ if ( self.folderPath == nil )
+ self.folderPath = @"/";
+
+ // load the contents of the specified folder
+ NSError * error = nil;
+ _folderContents = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath: self.folderPath error: &error] copy];
+ if ( error != nil )
+ {
+ [UIAlertView showAlertForError: error];
+ return;
+ }
+
+ // fetch attributes
+ BOOL shownError = NO;
+ _attributes = [[NSMutableArray alloc] initWithCapacity: [_folderContents count]];
+ for ( NSString * filename in _folderContents )
+ {
+ error = nil;
+ NSString * path = [self.folderPath stringByAppendingPathComponent: filename];
+
+ NSDictionary * dict = [[NSFileManager defaultManager] attributesOfItemAtPath: path error: &error];
+ if ( error != nil )
+ {
+ if ( shownError == NO )
+ {
+ shownError = YES;
+ [UIAlertView showAlertForError: error];
+ }
+
+ [_attributes addObject: [NSNull null]];
+ }
+ else
+ {
+ [_attributes addObject: dict];
+ }
+ }
+
+ [self.tableView reloadData];
+}
+
+/*
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+}
+*/
+
+- (void) viewDidAppear: (BOOL) animated
+{
+ [super viewDidAppear:animated];
+
+ NSIndexPath * selected = [self.tableView indexPathForSelectedRow];
+ if ( selected != nil )
+ self.detailViewController.detailItem = [_attributes objectAtIndex: selected.row];
+}
+
+// Ensure that the view controller supports rotation and that the split view can therefore show in both portrait and landscape.
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ return YES;
+}
+
+
+#pragma mark -
+#pragma mark Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView {
+ // Return the number of sections.
+ return 1;
+}
+
+
+- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {
+ // Return the number of rows in the section.
+ return ( [_folderContents count] );
+}
+
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ static NSString *CellIdentifier = @"FolderItemCellIdentifier";
+
+ // Dequeue or create a cell of the appropriate type.
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ if (cell == nil)
+ {
+ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
+ }
+
+ // Configure the cell.
+ id obj = [_attributes objectAtIndex: indexPath.row];
+ if ( obj == [NSNull null] )
+ {
+ cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
+ }
+ else if ( [[obj fileType] isEqualToString: NSFileTypeDirectory] )
+ {
+ cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
+ }
+ else
+ {
+ cell.accessoryType = UITableViewCellAccessoryNone;
+ }
+
+ cell.textLabel.text = [_folderContents objectAtIndex: indexPath.row];
+
+ return ( cell );
+}
+
+#pragma mark -
+#pragma mark Table view delegate
+
+- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ /*
+ When a row is selected, set the detail view controller's detail item to the item associated with the selected row.
+ */
+ self.detailViewController.detailItem = [_attributes objectAtIndex: indexPath.row];
+ self.detailViewController.title = [_folderContents objectAtIndex: indexPath.row];
+}
+
+- (void) tableView: (UITableView *) aTableView accessoryButtonTappedForRowWithIndexPath: (NSIndexPath *) indexPath
+{
+ RootViewController * subController = [[RootViewController alloc] initWithStyle: UITableViewStylePlain];
+ subController.detailViewController = self.detailViewController;
+ subController.folderPath = [self.folderPath stringByAppendingPathComponent: [_folderContents objectAtIndex: indexPath.row]];
+
+ [self.navigationController pushViewController: subController animated: YES];
+
+ [subController release];
+}
+
+#pragma mark -
+#pragma mark Memory management
+
+- (void) viewDidUnload
+{
+ // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
+ // For example: self.myOutlet = nil;
+ [_folderContents release];
+ [_attributes release];
+ _folderContents = nil;
+ _attributes = nil;
+}
+
+
+- (void) dealloc
+{
+ [detailViewController release];
+ [folderPath release];
+ [_folderContents release];
+ [_attributes release];
+ [super dealloc];
+}
+
+
+@end
+
13 Classes/UIAlertView+NSError.h
@@ -0,0 +1,13 @@
+//
+// UIAlertView+NSError.h
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright 2010 Kobo Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface UIAlertView (NSError)
++ (void) showAlertForError: (NSError *) error;
+@end
36 Classes/UIAlertView+NSError.m
@@ -0,0 +1,36 @@
+//
+// UIAlertView+NSError.m
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright 2010 Kobo Inc. All rights reserved.
+//
+
+#import "UIAlertView+NSError.h"
+
+@implementation UIAlertView (NSError)
+
++ (void) showAlertForError: (NSError *) error
+{
+ UIAlertView * alert = [[self alloc] init];
+ NSDictionary * userInfo = [error userInfo];
+
+ NSString * failureReason = [userInfo objectForKey: NSLocalizedFailureReasonErrorKey];
+
+ if ( failureReason != nil )
+ {
+ alert.message = failureReason;
+ alert.title = [error localizedDescription];
+ }
+ else
+ {
+ alert.title = NSLocalizedString(@"An Error Occurred", @"Alert Title");
+ alert.message = [error localizedDescription];
+ }
+
+ alert.cancelButtonIndex = [alert addButtonWithTitle: NSLocalizedString(@"OK", @"Button Title")];
+
+ [alert performSelectorOnMainThread: @selector(show) withObject: nil waitUntilDone: NO];
+}
+
+@end
31 Classes/iPad_FilesystemAppDelegate.h
@@ -0,0 +1,31 @@
+//
+// iPad_FilesystemAppDelegate.h
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright Kobo Inc. 2010. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+
+@class RootViewController;
+@class DetailViewController;
+
+@interface iPad_FilesystemAppDelegate : NSObject <UIApplicationDelegate> {
+
+ UIWindow *window;
+
+ UISplitViewController *splitViewController;
+
+ RootViewController *rootViewController;
+ DetailViewController *detailViewController;
+}
+
+@property (nonatomic, retain) IBOutlet UIWindow *window;
+
+@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;
+@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;
+@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController;
+
+@end
52 Classes/iPad_FilesystemAppDelegate.m
@@ -0,0 +1,52 @@
+//
+// iPad_FilesystemAppDelegate.m
+// iPad Filesystem
+//
+// Created by Jim Dovey on 10-05-10.
+// Copyright Kobo Inc. 2010. All rights reserved.
+//
+
+#import "iPad_FilesystemAppDelegate.h"
+
+
+#import "RootViewController.h"
+#import "DetailViewController.h"
+
+
+@implementation iPad_FilesystemAppDelegate
+
+@synthesize window, splitViewController, rootViewController, detailViewController;
+
+
+#pragma mark -
+#pragma mark Application lifecycle
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+
+ // Override point for customization after app launch
+
+ // Add the split view controller's view to the window and display.
+ [window addSubview:splitViewController.view];
+ [window makeKeyAndVisible];
+
+ return YES;
+}
+
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+ // Save data if appropriate
+}
+
+
+#pragma mark -
+#pragma mark Memory management
+
+- (void)dealloc {
+ [splitViewController release];
+ [window release];
+ [super dealloc];
+}
+
+
+@end
+
539 DetailView.xib
@@ -0,0 +1,539 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">800</int>
+ <string key="IBDocument.SystemVersion">10D573</string>
+ <string key="IBDocument.InterfaceBuilderVersion">762</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">460.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">87</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="73"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBProxyObject" id="606714003">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBUIView" id="647120888">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBUIToolbar" id="410698538">
+ <reference key="NSNextResponder" ref="647120888"/>
+ <int key="NSvFlags">290</int>
+ <string key="NSFrameSize">{768, 44}</string>
+ <reference key="NSSuperview" ref="647120888"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <object class="NSMutableArray" key="IBUIItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBUIBarButtonItem" id="453623040">
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <reference key="IBUIToolbar" ref="410698538"/>
+ <int key="IBUISystemItemIdentifier">5</int>
+ </object>
+ <object class="IBUIBarButtonItem" id="807031169">
+ <string key="IBUITitle">Title</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <reference key="IBUIToolbar" ref="410698538"/>
+ </object>
+ <object class="IBUIBarButtonItem" id="911971624">
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <reference key="IBUIToolbar" ref="410698538"/>
+ <int key="IBUISystemItemIdentifier">5</int>
+ </object>
+ </object>
+ </object>
+ <object class="IBUITableView" id="2426519">
+ <reference key="NSNextResponder" ref="647120888"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrame">{{0, 44}, {768, 960}}</string>
+ <reference key="NSSuperview" ref="647120888"/>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBUIBouncesZoom">NO</bool>
+ <int key="IBUIStyle">1</int>
+ <int key="IBUISeparatorStyle">2</int>
+ <int key="IBUISectionIndexMinimumDisplayRowCount">0</int>
+ <bool key="IBUIShowsSelectionImmediatelyOnTouchBegin">YES</bool>
+ <float key="IBUIRowHeight">44</float>
+ <float key="IBUISectionHeaderHeight">10</float>
+ <float key="IBUISectionFooterHeight">10</float>
+ </object>
+ </object>
+ <string key="NSFrameSize">{768, 1004}</string>
+ <reference key="NSSuperview"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics">
+ <int key="IBUIStatusBarStyle">2</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="647120888"/>
+ </object>
+ <int key="connectionID">12</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">toolbar</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="410698538"/>
+ </object>
+ <int key="connectionID">65</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">detailTableView</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="2426519"/>
+ </object>
+ <int key="connectionID">68</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="2426519"/>
+ <reference key="destination" ref="841351856"/>
+ </object>
+ <int key="connectionID">69</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="2426519"/>
+ <reference key="destination" ref="841351856"/>
+ </object>
+ <int key="connectionID">70</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">titleBarItem</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="807031169"/>
+ </object>
+ <int key="connectionID">74</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="841351856"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="606714003"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">8</int>
+ <reference key="object" ref="647120888"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="410698538"/>
+ <reference ref="2426519"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">63</int>
+ <reference key="object" ref="410698538"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="453623040"/>
+ <reference ref="911971624"/>
+ <reference ref="807031169"/>
+ </object>
+ <reference key="parent" ref="647120888"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">67</int>
+ <reference key="object" ref="2426519"/>
+ <reference key="parent" ref="647120888"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">71</int>
+ <reference key="object" ref="453623040"/>
+ <reference key="parent" ref="410698538"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">72</int>
+ <reference key="object" ref="911971624"/>
+ <reference key="parent" ref="410698538"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">73</int>
+ <reference key="object" ref="807031169"/>
+ <reference key="parent" ref="410698538"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.CustomClassName</string>
+ <string>-2.CustomClassName</string>
+ <string>63.IBPluginDependency</string>
+ <string>67.IBPluginDependency</string>
+ <string>71.IBPluginDependency</string>
+ <string>72.IBPluginDependency</string>
+ <string>73.IBPluginDependency</string>
+ <string>8.IBEditorWindowLastContentRect</string>
+ <string>8.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>DetailViewController</string>
+ <string>UIResponder</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string>{{579, 232}, {768, 1024}}</string>
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">74</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">DetailViewController</string>
+ <string key="superclassName">UIViewController</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>detailTableView</string>
+ <string>titleBarItem</string>
+ <string>toolbar</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>UITableView</string>
+ <string>UIBarItem</string>
+ <string>UIToolbar</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/DetailViewController.h</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSNetServices.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSPort.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSStream.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSXMLParser.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="786211723">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIBarButtonItem</string>
+ <string key="superclassName">UIBarItem</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIBarButtonItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIBarItem</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIBarItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIResponder</string>
+ <string key="superclassName">NSObject</string>
+ <reference key="sourceIdentifier" ref="786211723"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIScrollView</string>
+ <string key="superclassName">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIScrollView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UISearchBar</string>
+ <string key="superclassName">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UISearchDisplayController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UITableView</string>
+ <string key="superclassName">UIScrollView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UITableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIToolbar</string>
+ <string key="superclassName">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIToolbar.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <string key="superclassName">UIResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <string key="superclassName">UIResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
+ </object>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+ <integer value="800" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
+ <integer value="3100" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">iPad Filesystem.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <string key="IBCocoaTouchPluginVersion">87</string>
+ </data>
+</archive>
9 LICENSE
@@ -0,0 +1,9 @@
+Copyright (c) 2010, Jim Dovey.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
579 MainWindow.xib
@@ -0,0 +1,579 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">800</int>
+ <string key="IBDocument.SystemVersion">10D559</string>
+ <string key="IBDocument.InterfaceBuilderVersion">761</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">460.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">84</string>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.EditedObjectIDs"/>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <dictionary class="NSMutableDictionary" key="IBDocument.Metadata"/>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <object class="IBProxyObject" id="841351856">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBProxyObject" id="606714003">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBUIWindow" id="673453472">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrameSize">{768, 1024}</string>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAxIDEAA</bytes>
+ </object>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics">
+ <int key="IBUIStatusBarStyle">2</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBUIResizesToFullScreen">YES</bool>
+ </object>
+ <object class="IBUICustomObject" id="963208320">
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <object class="IBUISplitViewController" id="1001026670">
+ <array key="IBUIToolbarItems" id="0"/>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics">
+ <int key="IBUIStatusBarStyle">2</int>
+ </object>
+ <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
+ <int key="interfaceOrientation">3</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBUIHorizontal">YES</bool>
+ <object class="IBUINavigationController" key="IBUIMasterViewController" id="500269011">
+ <reference key="IBUIParentViewController" ref="1001026670"/>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics">
+ <int key="IBUIStatusBarStyle">2</int>
+ </object>
+ <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
+ <int key="interfaceOrientation">1</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBUIHorizontal">NO</bool>
+ <object class="IBUINavigationBar" key="IBUINavigationBar" id="663704304">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{0, 0}</string>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <bool key="IBUIMultipleTouchEnabled">YES</bool>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <array class="NSMutableArray" key="IBUIViewControllers">
+ <object class="IBUITableViewController" id="720143809">
+ <object class="IBUINavigationItem" key="IBUINavigationItem" id="441316548">
+ <string key="IBUITitle">Root View Controller</string>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ </object>
+ <reference key="IBUIParentViewController" ref="500269011"/>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics">
+ <int key="IBUIStatusBarStyle">2</int>
+ </object>
+ <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
+ <int key="interfaceOrientation">1</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBUIHorizontal">NO</bool>
+ </object>
+ </array>
+ </object>
+ <object class="IBUIViewController" key="IBUIDetailViewController" id="23693665">
+ <reference key="IBUIToolbarItems" ref="0"/>
+ <reference key="IBUIParentViewController" ref="1001026670"/>
+ <string key="IBUINibName">DetailView</string>
+ <object class="IBUISimulatedOrientationMetrics" key="IBUISimulatedOrientationMetrics">
+ <int key="interfaceOrientation">1</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <bool key="IBUIHorizontal">NO</bool>
+ </object>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="963208320"/>
+ <reference key="destination" ref="673453472"/>
+ </object>
+ <int key="connectionID">4</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="841351856"/>
+ <reference key="destination" ref="963208320"/>
+ </object>
+ <int key="connectionID">17</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">splitViewController</string>
+ <reference key="source" ref="963208320"/>
+ <reference key="destination" ref="1001026670"/>
+ </object>
+ <int key="connectionID">43</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">rootViewController</string>
+ <reference key="source" ref="963208320"/>
+ <reference key="destination" ref="720143809"/>
+ </object>
+ <int key="connectionID">44</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">detailViewController</string>
+ <reference key="source" ref="963208320"/>
+ <reference key="destination" ref="23693665"/>
+ </object>
+ <int key="connectionID">45</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">detailViewController</string>
+ <reference key="source" ref="720143809"/>
+ <reference key="destination" ref="23693665"/>
+ </object>
+ <int key="connectionID">46</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1001026670"/>
+ <reference key="destination" ref="23693665"/>
+ </object>
+ <int key="connectionID">49</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="841351856"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="606714003"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="673453472"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="963208320"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">37</int>
+ <reference key="object" ref="1001026670"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="500269011"/>
+ <reference ref="23693665"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">38</int>
+ <reference key="object" ref="500269011"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="720143809"/>
+ <reference ref="663704304"/>
+ </array>
+ <reference key="parent" ref="1001026670"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">39</int>
+ <reference key="object" ref="23693665"/>
+ <reference key="parent" ref="1001026670"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">40</int>
+ <reference key="object" ref="720143809"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="441316548"/>
+ </array>
+ <reference key="parent" ref="500269011"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">41</int>
+ <reference key="object" ref="663704304"/>
+ <reference key="parent" ref="500269011"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">42</int>
+ <reference key="object" ref="441316548"/>
+ <reference key="parent" ref="720143809"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">UIApplication</string>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="2.IBEditorWindowLastContentRect">{{190, 57}, {783, 799}}</string>
+ <string key="2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="3.CustomClassName">iPad_FilesystemAppDelegate</string>
+ <string key="3.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="37.IBEditorWindowLastContentRect">{{794, 594}, {1024, 768}}</string>
+ <string key="37.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="38.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="39.CustomClassName">DetailViewController</string>
+ <string key="39.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="40.CustomClassName">RootViewController</string>
+ <string key="40.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="41.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="42.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">49</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">DetailViewController</string>
+ <string key="superclassName">UIViewController</string>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="detailItem">id</string>
+ <string key="toolbar">UINavigationBar</string>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/DetailViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">detailViewController</string>
+ <string key="NS.object.0">DetailViewController</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/RootViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">RootViewController</string>
+ <string key="superclassName">UITableViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">iPad_FilesystemAppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="detailViewController">DetailViewController</string>
+ <string key="rootViewController">RootViewController</string>
+ <string key="splitViewController">UISplitViewController</string>
+ <string key="window">UIWindow</string>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Classes/iPad_FilesystemAppDelegate.h</string>
+ </object>
+ </object>
+ </array>
+ <array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSNetServices.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSPort.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSStream.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSXMLParser.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIAccessibility.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UINibLoading.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="786211723">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIResponder.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIApplication</string>
+ <string key="superclassName">UIResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIApplication.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIBarButtonItem</string>
+ <string key="superclassName">UIBarItem</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIBarButtonItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIBarItem</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIBarItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UINavigationBar</string>
+ <string key="superclassName">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="43289516">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UINavigationBar.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UINavigationController</string>
+ <string key="superclassName">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="378153758">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UINavigationController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UINavigationItem</string>
+ <string key="superclassName">NSObject</string>
+ <reference key="sourceIdentifier" ref="43289516"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIResponder</string>
+ <string key="superclassName">NSObject</string>
+ <reference key="sourceIdentifier" ref="786211723"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UISearchBar</string>
+ <string key="superclassName">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UISearchBar.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UISearchDisplayController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UISearchDisplayController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UISplitViewController</string>
+ <string key="superclassName">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="208428891">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UISplitViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UITableViewController</string>
+ <string key="superclassName">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UITableViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UITextField.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIView</string>
+ <string key="superclassName">UIResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <reference key="sourceIdentifier" ref="378153758"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIPopoverController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <reference key="sourceIdentifier" ref="208428891"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UITabBarController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIViewController</string>
+ <string key="superclassName">UIResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIViewController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">UIWindow</string>
+ <string key="superclassName">UIView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">UIKit.framework/Headers/UIWindow.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBIPadFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+ <integer value="800" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
+ <integer value="3200" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <string key="IBDocument.LastKnownRelativeProjectPath">iPad Filesystem.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <string key="IBCocoaTouchPluginVersion">84</string>
+ </data>
+</archive>
17 README.textile
@@ -0,0 +1,17 @@
+h1=. iPad Filesystem
+
+p=. Version 1.0 -- 10 May 2010
+
+p=. By "Jim Dovey":mailto:jimdovey@mac.com <br />
+
+h2=. Licensing
+
+Released under the New BSD License. See 'LICENSE' for more information.
+
+h3. About
+
+A simple application which implements a filesystem browser for the iPad, using a UISplitView to do its work.
+
+h3. Usage
+
+In the overview pane, select an item to view its filesystem data (from *NSFileManager*) in the detail pane. To advance into a folder, click the blue disclosure button to the right of its name in the overview table.
280 iPad Filesystem.xcodeproj/project.pbxproj
@@ -0,0 +1,280 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1D3623260D0F684500981E51 /* iPad_FilesystemAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* iPad_FilesystemAppDelegate.m */; };
+ 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
+ 2804200B108E984D000629CD /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28042008108E984D000629CD /* RootViewController.m */; };
+ 2804200C108E984D000629CD /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2804200A108E984D000629CD /* DetailViewController.m */; };
+ 2804203C108E9BAB000629CD /* DetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2804203B108E9BAB000629CD /* DetailView.xib */; };
+ 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; };
+ 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD735F0D9D9599002E5188 /* MainWindow.xib */; };
+ 382EA9EB11985F4F004DA8F9 /* UIAlertView+NSError.m in Sources */ = {isa = PBXBuildFile; fileRef = 382EA9EA11985F4F004DA8F9 /* UIAlertView+NSError.m */; };
+ 382EAA061198700C004DA8F9 /* CustomFormatters.m in Sources */ = {isa = PBXBuildFile; fileRef = 382EAA051198700C004DA8F9 /* CustomFormatters.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ 1D3623240D0F684500981E51 /* iPad_FilesystemAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPad_FilesystemAppDelegate.h; sourceTree = "<group>"; };
+ 1D3623250D0F684500981E51 /* iPad_FilesystemAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iPad_FilesystemAppDelegate.m; sourceTree = "<group>"; };
+ 1D6058910D05DD3D006BFB54 /* iPad Filesystem.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iPad Filesystem.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ 28042007108E984D000629CD /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootViewController.h; sourceTree = "<group>"; };
+ 28042008108E984D000629CD /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = "<group>"; };
+ 28042009108E984D000629CD /* DetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
+ 2804200A108E984D000629CD /* DetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
+ 2804203B108E9BAB000629CD /* DetailView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DetailView.xib; sourceTree = "<group>"; };
+ 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
+ 28A0AAE50D9B0CCF005BE974 /* iPad_Filesystem_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPad_Filesystem_Prefix.pch; sourceTree = "<group>"; };
+ 28AD735F0D9D9599002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 382EA9E911985F4F004DA8F9 /* UIAlertView+NSError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIAlertView+NSError.h"; sourceTree = "<group>"; };
+ 382EA9EA11985F4F004DA8F9 /* UIAlertView+NSError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIAlertView+NSError.m"; sourceTree = "<group>"; };
+ 382EAA041198700C004DA8F9 /* CustomFormatters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomFormatters.h; sourceTree = "<group>"; };
+ 382EAA051198700C004DA8F9 /* CustomFormatters.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomFormatters.m; sourceTree = "<group>"; };
+ 8D1107310486CEB800E47090 /* iPad_Filesystem-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "iPad_Filesystem-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
+ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
+ 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 1D3623240D0F684500981E51 /* iPad_FilesystemAppDelegate.h */,