From 7ab3ad25415d914b7320885c0ae817b069e48a4e Mon Sep 17 00:00:00 2001 From: Hirami Date: Sat, 14 Apr 2012 22:03:59 +0900 Subject: [PATCH] Add move file --- iOS/Tombo/Tombo.xcodeproj/project.pbxproj | 6 ++ iOS/Tombo/Tombo/DetailViewController.h | 4 +- iOS/Tombo/Tombo/DetailViewController.m | 54 ++++++++++++++---- iOS/Tombo/Tombo/MasterViewController.m | 9 +++ iOS/Tombo/Tombo/MoveViewController.h | 18 ++++++ iOS/Tombo/Tombo/MoveViewController.m | 59 ++++++++++++++++++++ iOS/Tombo/Tombo/Storage.h | 8 +++ iOS/Tombo/Tombo/Storage.m | 55 ++++++++++++++++++- .../Tombo/en.lproj/MainStoryboard_iPad.storyboard | 64 +++++++++++++++++++++- .../en.lproj/MainStoryboard_iPhone.storyboard | 63 ++++++++++++++++++++- 10 files changed, 325 insertions(+), 15 deletions(-) create mode 100644 iOS/Tombo/Tombo/MoveViewController.h create mode 100644 iOS/Tombo/Tombo/MoveViewController.m diff --git a/iOS/Tombo/Tombo.xcodeproj/project.pbxproj b/iOS/Tombo/Tombo.xcodeproj/project.pbxproj index a1dd6d9..bc14c5e 100644 --- a/iOS/Tombo/Tombo.xcodeproj/project.pbxproj +++ b/iOS/Tombo/Tombo.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 9243C826153487640092B506 /* key-48.png in Resources */ = {isa = PBXBuildFile; fileRef = 9243C824153487640092B506 /* key-48.png */; }; 9243C83115352EB20092B506 /* SinglePasswordDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 9243C83015352EB20092B506 /* SinglePasswordDialog.m */; }; 9244E4D115397C300028FD10 /* FileItemTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 9244E4D015397C300028FD10 /* FileItemTest.m */; }; + 9244E4DD1539B3250028FD10 /* MoveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9244E4DC1539B3250028FD10 /* MoveViewController.m */; }; 92DE332D151E277D00AD06EC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332C151E277D00AD06EC /* UIKit.framework */; }; 92DE332F151E277D00AD06EC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332E151E277D00AD06EC /* Foundation.framework */; }; 92DE3331151E277D00AD06EC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE3330151E277D00AD06EC /* CoreGraphics.framework */; }; @@ -72,6 +73,8 @@ 9243C83015352EB20092B506 /* SinglePasswordDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SinglePasswordDialog.m; sourceTree = ""; }; 9244E4CF15397C300028FD10 /* FileItemTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileItemTest.h; sourceTree = ""; }; 9244E4D015397C300028FD10 /* FileItemTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileItemTest.m; sourceTree = ""; }; + 9244E4DB1539B3250028FD10 /* MoveViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoveViewController.h; sourceTree = ""; }; + 9244E4DC1539B3250028FD10 /* MoveViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MoveViewController.m; sourceTree = ""; }; 92DE3328151E277D00AD06EC /* Tombo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tombo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 92DE332C151E277D00AD06EC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 92DE332E151E277D00AD06EC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -184,6 +187,8 @@ 9243C7B41529D8610092B506 /* DetailViewController.m */, 922F592815295FAA009B1E32 /* EditViewController.h */, 922F592915295FAA009B1E32 /* EditViewController.m */, + 9244E4DB1539B3250028FD10 /* MoveViewController.h */, + 9244E4DC1539B3250028FD10 /* MoveViewController.m */, 92DE3333151E277D00AD06EC /* Supporting Files */, 92DE33841522998700AD06EC /* Storage.h */, 92DE33851522998700AD06EC /* Storage.m */, @@ -371,6 +376,7 @@ 9243C7ED1531ADA80092B506 /* CryptCore.m in Sources */, 9243C820153443B90092B506 /* PasswordManager.m in Sources */, 9243C83115352EB20092B506 /* SinglePasswordDialog.m in Sources */, + 9244E4DD1539B3250028FD10 /* MoveViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/iOS/Tombo/Tombo/DetailViewController.h b/iOS/Tombo/Tombo/DetailViewController.h index c058fbb..8526d1f 100644 --- a/iOS/Tombo/Tombo/DetailViewController.h +++ b/iOS/Tombo/Tombo/DetailViewController.h @@ -1,5 +1,6 @@ #import #import "FileItem.h" +#import "MoveViewController.h" @class MasterViewController; @class Storage; @@ -12,7 +13,7 @@ * Used on iPad only. */ -@interface DetailViewController : UIViewController +@interface DetailViewController : UIViewController @property (weak, nonatomic) FileItem *item; @property (weak, nonatomic) Storage *storage; @@ -29,4 +30,5 @@ */ @protocol DetailViewControllerDelegate -(void)detailViewFileItemChanged:(FileItem*)oldItem to:(FileItem *)newItem; +-(void)detailViewFileItemRemoved:(FileItem *)item; @end \ No newline at end of file diff --git a/iOS/Tombo/Tombo/DetailViewController.m b/iOS/Tombo/Tombo/DetailViewController.m index 0999aa2..58a52d3 100644 --- a/iOS/Tombo/Tombo/DetailViewController.m +++ b/iOS/Tombo/Tombo/DetailViewController.m @@ -31,23 +31,32 @@ [super viewDidLoad]; [self.navigationController setToolbarHidden:NO]; - NSString *btnTitle; if (self.item != nil) { - if (self.item.isCrypt) { - btnTitle = @"Decrypt"; - } else { - btnTitle = @"Encrypt"; - } - UIBarButtonItem *cryptBtn = [[UIBarButtonItem alloc] initWithTitle:btnTitle - style:UIBarButtonItemStyleBordered - target:self - action:@selector(crypt:)]; - [self setToolbarItems:[NSArray arrayWithObjects:cryptBtn, nil] animated:YES]; + [self setupToolbar]; } [self loadNote]; } +- (void)setupToolbar { + NSString *btnTitle; + if (self.item.isCrypt) { + btnTitle = @"Decrypt"; + } else { + btnTitle = @"Encrypt"; + } + UIBarButtonItem *cryptBtn = [[UIBarButtonItem alloc] initWithTitle:btnTitle + style:UIBarButtonItemStyleBordered + target:self + action:@selector(crypt:)]; + UIBarButtonItem *moveBtn = [[UIBarButtonItem alloc] initWithTitle:@"Move" + style:UIBarButtonItemStyleBordered + target:self + action:@selector(move:)]; + [self setToolbarItems:[NSArray arrayWithObjects:cryptBtn, moveBtn, nil] animated:NO]; + +} + - (void)viewDidUnload { [self setText:nil]; @@ -68,6 +77,10 @@ edit.detailItem = self.item; edit.delegate = self.master; + } else if ([[segue identifier] isEqualToString:@"moveNote"]) { + MoveViewController *move = (MoveViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0]; + move.delegate = self; + move.folders = [self.storage listFolders]; } } @@ -109,6 +122,10 @@ } } +- (void)move:(id)sender { + [self performSegueWithIdentifier:@"moveNote" sender:self]; +} + - (void)loadNote { if (!self.item) return; @@ -135,7 +152,22 @@ // On iPhone and call by segue, self.text is nil because view is not loaded yet. if (self.text) { [self loadNote]; + [self setupToolbar]; } } } + +#pragma mark - MoveViewControllerDelegate + +- (void)moveViewControllerCancel:(MoveViewController *)view { + [self dismissModalViewControllerAnimated:YES]; +} + +- (void)moveViewControllerSelect:(MoveViewController *)view path:(NSString *)path { + NSString *toPath = [self.storage moveFrom:self.item toPath:path]; + [self.delegate detailViewFileItemRemoved:self.item]; + self.item.path = toPath; + [self dismissModalViewControllerAnimated:YES]; +} + @end diff --git a/iOS/Tombo/Tombo/MasterViewController.m b/iOS/Tombo/Tombo/MasterViewController.m index 3079b58..cbff266 100644 --- a/iOS/Tombo/Tombo/MasterViewController.m +++ b/iOS/Tombo/Tombo/MasterViewController.m @@ -56,6 +56,11 @@ storage = [Storage init]; } + // Init detailview for iPad. + self.detailViewController.storage = storage; + self.detailViewController.passwordManager = passwordManager; + self.detailViewController.delegate = self; + // Load initial items. [self insertItems]; } @@ -361,4 +366,8 @@ [self insertItem:newItem]; } +-(void)detailViewFileItemRemoved:(FileItem *)item { + [self deleteItem:item]; +} + @end diff --git a/iOS/Tombo/Tombo/MoveViewController.h b/iOS/Tombo/Tombo/MoveViewController.h new file mode 100644 index 0000000..0f16606 --- /dev/null +++ b/iOS/Tombo/Tombo/MoveViewController.h @@ -0,0 +1,18 @@ +#import + +@protocol MoveViewControllerDelegate; + +@interface MoveViewController : UITableViewController + +@property (weak,nonatomic) id delegate; +@property (strong, nonatomic) NSArray *folders; + +- (IBAction)cancel:(id)sender; + +@end + +@protocol MoveViewControllerDelegate + +- (void)moveViewControllerCancel:(MoveViewController *)view; +- (void)moveViewControllerSelect:(MoveViewController *)view path:(NSString *)path; +@end diff --git a/iOS/Tombo/Tombo/MoveViewController.m b/iOS/Tombo/Tombo/MoveViewController.m new file mode 100644 index 0000000..927182d --- /dev/null +++ b/iOS/Tombo/Tombo/MoveViewController.m @@ -0,0 +1,59 @@ +#import "MoveViewController.h" + +@interface MoveViewController () + +@end + +@implementation MoveViewController { + UIImage *imgFolder; +} + +@synthesize delegate = _delegate; +@synthesize folders = _folders; + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + imgFolder = [UIImage imageNamed:@"Folder-32"]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +- (IBAction)cancel:(id)sender { + if (self.delegate) [self.delegate moveViewControllerCancel:self]; +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [self.folders count]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *CellIdentifier = @"Cell"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + + NSString *folder = [self.folders objectAtIndex:indexPath.row]; + cell.textLabel.text = folder; + cell.imageView.image = imgFolder; + return cell; +} + +#pragma mark - Table view delegate + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + NSString *path = [self.folders objectAtIndex:indexPath.row]; + if (self.delegate) [self.delegate moveViewControllerSelect:self path:path]; +} + +@end diff --git a/iOS/Tombo/Tombo/Storage.h b/iOS/Tombo/Tombo/Storage.h index a72480f..22013d1 100644 --- a/iOS/Tombo/Tombo/Storage.h +++ b/iOS/Tombo/Tombo/Storage.h @@ -30,6 +30,11 @@ */ -(BOOL)isTopDir; +/* + * Enumerate top directory recursively and return array of NSString. + */ +- (NSArray *)listFolders; + -(FileItem*)newItem; @@ -55,4 +60,7 @@ - (FileItem *)encrypt:(NSString *)key item:(FileItem*)item; - (FileItem *)decrypt:(NSString *)key item:(FileItem*)item; +- (void)moveFrom:(FileItem *)from to:(FileItem *)to; +- (NSString *)moveFrom:(FileItem *)from toPath:(NSString *)to; + @end diff --git a/iOS/Tombo/Tombo/Storage.m b/iOS/Tombo/Tombo/Storage.m index 23acb2a..78f96b9 100644 --- a/iOS/Tombo/Tombo/Storage.m +++ b/iOS/Tombo/Tombo/Storage.m @@ -50,6 +50,36 @@ return result; } +- (NSArray *)listFolders { + NSMutableArray *result = [NSMutableArray arrayWithCapacity:10]; + + [result addObject:@"/"]; + [self listFoldersRec:result path:@"/"]; + NSComparator compr = ^(id a, id b) { + NSString *strA = (NSString *)a; + NSString *strB = (NSString *)b; + return [strA compare:strB]; + }; + return [result sortedArrayUsingComparator:compr]; +} + +- (void)listFoldersRec:(NSMutableArray *)result path:(NSString *)path { + NSError *error = nil; + NSString *partPath = [documentRoot stringByAppendingString:path]; + NSArray *files = [fileManager contentsOfDirectoryAtPath:partPath + error:&error]; + + for (NSString *f in files) { + BOOL bDir = NO; + NSString *p = [partPath stringByAppendingString:f]; + [fileManager fileExistsAtPath:p isDirectory:&bDir]; + if (!bDir) continue; + NSString *pFolder = [path stringByAppendingString:f]; + [result addObject:pFolder]; + [self listFoldersRec:result path:[pFolder stringByAppendingString:@"/"]]; + } +} + -(void)chdir:(NSString *)subdir { NSString *newCurrent = [currentDirectory stringByAppendingPathComponent:subdir]; self.currentDirectory = [newCurrent stringByAppendingString:@"/"]; @@ -295,7 +325,6 @@ } - (FileItem *)decrypt:(NSString *)key item:(FileItem*)item { - // TODO: implement NSData *encData = [NSData dataWithContentsOfFile:item.path]; NSError *error = nil; NSData *plainData = [CryptCore decrypt:key data:encData error:&error]; @@ -313,4 +342,28 @@ return newItem; } +- (void)moveFrom:(FileItem *)from to:(FileItem *)to { + NSString *name = [from.path lastPathComponent]; + NSMutableString *toPath = [[NSMutableString alloc]initWithCapacity:200]; + [toPath appendString:to.path]; + [toPath appendString:@"/"]; + [toPath appendString:name]; + + NSError *error = nil; + [fileManager moveItemAtPath:from.path toPath:toPath error:&error]; +} + +- (NSString *)moveFrom:(FileItem *)from toPath:(NSString *)to { + NSString *name = [from.path lastPathComponent]; + NSMutableString *toPath = [[NSMutableString alloc]initWithCapacity:200]; + [toPath appendString:documentRoot]; + [toPath appendString:to]; + [toPath appendString:@"/"]; + [toPath appendString:name]; + + NSError *error = nil; + [fileManager moveItemAtPath:from.path toPath:toPath error:&error]; + return toPath; +} + @end diff --git a/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPad.storyboard b/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPad.storyboard index f652f97..378ee1f 100644 --- a/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPad.storyboard +++ b/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPad.storyboard @@ -51,11 +51,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -192,6 +230,24 @@ + + + + + + + + + + + + + + + + + + @@ -211,6 +267,12 @@ + + + + + + @@ -218,6 +280,6 @@ - + \ No newline at end of file diff --git a/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPhone.storyboard b/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPhone.storyboard index 9b89b21..90c5ca2 100644 --- a/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPhone.storyboard +++ b/iOS/Tombo/Tombo/en.lproj/MainStoryboard_iPhone.storyboard @@ -57,7 +57,7 @@ - + @@ -100,6 +100,7 @@ + @@ -143,6 +144,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -161,6 +198,24 @@ + + + + + + + + + + + + + + + + + + @@ -180,6 +235,12 @@ + + + + + + -- 2.11.0