objects = {
/* Begin PBXBuildFile section */
+ 9228CF2815298F7200E20355 /* EditCancelAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 9228CF2715298F7200E20355 /* EditCancelAlert.m */; };
+ 922F592A15295FAA009B1E32 /* EditViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 922F592915295FAA009B1E32 /* EditViewController.m */; };
+ 9243C7B51529D8610092B506 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9243C7B41529D8610092B506 /* DetailViewController.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 */; };
92DE3340151E277D00AD06EC /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92DE333E151E277D00AD06EC /* MainStoryboard_iPhone.storyboard */; };
92DE3343151E277D00AD06EC /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92DE3341151E277D00AD06EC /* MainStoryboard_iPad.storyboard */; };
92DE3346151E277D00AD06EC /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE3345151E277D00AD06EC /* MasterViewController.m */; };
- 92DE3349151E277D00AD06EC /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE3348151E277D00AD06EC /* DetailViewController.m */; };
92DE3351151E277E00AD06EC /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE3350151E277E00AD06EC /* SenTestingKit.framework */; };
92DE3352151E277E00AD06EC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332C151E277D00AD06EC /* UIKit.framework */; };
92DE3353151E277E00AD06EC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92DE332E151E277D00AD06EC /* Foundation.framework */; };
92DE335B151E277E00AD06EC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 92DE3359151E277E00AD06EC /* InfoPlist.strings */; };
92DE335E151E277E00AD06EC /* TomboTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE335D151E277E00AD06EC /* TomboTests.m */; };
92DE33861522998700AD06EC /* Storage.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE33851522998700AD06EC /* Storage.m */; };
- 92DE338D1522F61200AD06EC /* CustomSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE338C1522F61200AD06EC /* CustomSegue.m */; };
92DE33901522FFEC00AD06EC /* FileItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DE338F1522FFEB00AD06EC /* FileItem.m */; };
92DE339F15231CFC00AD06EC /* Folder-32.png in Resources */ = {isa = PBXBuildFile; fileRef = 92DE339B15231CFC00AD06EC /* Folder-32.png */; };
92DE33A015231CFC00AD06EC /* Folder-48.png in Resources */ = {isa = PBXBuildFile; fileRef = 92DE339C15231CFC00AD06EC /* Folder-48.png */; };
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
+ 9228CF2615298F7200E20355 /* EditCancelAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditCancelAlert.h; sourceTree = "<group>"; };
+ 9228CF2715298F7200E20355 /* EditCancelAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditCancelAlert.m; sourceTree = "<group>"; };
+ 922F592815295FAA009B1E32 /* EditViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditViewController.h; sourceTree = "<group>"; };
+ 922F592915295FAA009B1E32 /* EditViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditViewController.m; sourceTree = "<group>"; };
+ 9243C7B31529D8610092B506 /* DetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
+ 9243C7B41529D8610092B506 /* DetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
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; };
92DE3342151E277D00AD06EC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
92DE3344151E277D00AD06EC /* MasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = "<group>"; };
92DE3345151E277D00AD06EC /* MasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = "<group>"; };
- 92DE3347151E277D00AD06EC /* DetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = "<group>"; };
- 92DE3348151E277D00AD06EC /* DetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = "<group>"; };
92DE334F151E277E00AD06EC /* TomboTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TomboTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
92DE3350151E277E00AD06EC /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };
92DE3358151E277E00AD06EC /* TomboTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TomboTests-Info.plist"; sourceTree = "<group>"; };
92DE335D151E277E00AD06EC /* TomboTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TomboTests.m; sourceTree = "<group>"; };
92DE33841522998700AD06EC /* Storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Storage.h; sourceTree = "<group>"; };
92DE33851522998700AD06EC /* Storage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Storage.m; sourceTree = "<group>"; };
- 92DE338B1522F61200AD06EC /* CustomSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomSegue.h; sourceTree = "<group>"; };
- 92DE338C1522F61200AD06EC /* CustomSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomSegue.m; sourceTree = "<group>"; };
92DE338E1522FFEB00AD06EC /* FileItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileItem.h; sourceTree = "<group>"; };
92DE338F1522FFEB00AD06EC /* FileItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileItem.m; sourceTree = "<group>"; };
92DE339B15231CFC00AD06EC /* Folder-32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Folder-32.png"; sourceTree = "<group>"; };
92DE3341151E277D00AD06EC /* MainStoryboard_iPad.storyboard */,
92DE3344151E277D00AD06EC /* MasterViewController.h */,
92DE3345151E277D00AD06EC /* MasterViewController.m */,
- 92DE3347151E277D00AD06EC /* DetailViewController.h */,
- 92DE3348151E277D00AD06EC /* DetailViewController.m */,
+ 922F592815295FAA009B1E32 /* EditViewController.h */,
+ 922F592915295FAA009B1E32 /* EditViewController.m */,
+ 9228CF2615298F7200E20355 /* EditCancelAlert.h */,
+ 9228CF2715298F7200E20355 /* EditCancelAlert.m */,
92DE3333151E277D00AD06EC /* Supporting Files */,
92DE33841522998700AD06EC /* Storage.h */,
92DE33851522998700AD06EC /* Storage.m */,
92DE338E1522FFEB00AD06EC /* FileItem.h */,
92DE338F1522FFEB00AD06EC /* FileItem.m */,
- 92DE338B1522F61200AD06EC /* CustomSegue.h */,
- 92DE338C1522F61200AD06EC /* CustomSegue.m */,
+ 9243C7B31529D8610092B506 /* DetailViewController.h */,
+ 9243C7B41529D8610092B506 /* DetailViewController.m */,
);
path = Tombo;
sourceTree = "<group>";
92DE3339151E277D00AD06EC /* main.m in Sources */,
92DE333D151E277D00AD06EC /* AppDelegate.m in Sources */,
92DE3346151E277D00AD06EC /* MasterViewController.m in Sources */,
- 92DE3349151E277D00AD06EC /* DetailViewController.m in Sources */,
92DE33861522998700AD06EC /* Storage.m in Sources */,
- 92DE338D1522F61200AD06EC /* CustomSegue.m in Sources */,
92DE33901522FFEC00AD06EC /* FileItem.m in Sources */,
+ 922F592A15295FAA009B1E32 /* EditViewController.m in Sources */,
+ 9228CF2815298F7200E20355 /* EditCancelAlert.m in Sources */,
+ 9243C7B51529D8610092B506 /* DetailViewController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
+++ /dev/null
-/*
- * Custom segue
- *
- * if isStop is set to YES, transition is disabled.
- * This segue is used by MainStoryboard_iPhone.
- */
-#import <UIKit/UIKit.h>
-
-@interface CustomSegue : UIStoryboardSegue
-
-@property BOOL isStop;
-
-@end
+++ /dev/null
-#import "CustomSegue.h"
-
-@implementation CustomSegue
-
-@synthesize isStop;
-
-- (void)perform {
- if (self.isStop) return;
-
- UINavigationController *ctrl = [self.sourceViewController navigationController];
- [ctrl pushViewController:self.destinationViewController
- animated:YES];
-}
-@end
#import <UIKit/UIKit.h>
#import "FileItem.h"
-#import "Storage.h"
-@interface DetailViewController : UIViewController <UISplitViewControllerDelegate,UITextViewDelegate>
+@class MasterViewController;
+/*
+ * Right pane of split view.
+ * Used on iPad only.
+ */
-@property (strong, nonatomic) FileItem *detailItem;
-@property (strong, nonatomic) Storage *storage;
+@interface DetailViewController : UIViewController
-@property (weak, nonatomic) IBOutlet UITextView *detailText;
+@property (strong, nonatomic) FileItem *item;
+@property (weak, nonatomic) MasterViewController *master;
+
+@property (weak, nonatomic) IBOutlet UITextView *text;
@end
#import "DetailViewController.h"
+#import "EditViewController.h"
#import "MasterViewController.h"
-@interface DetailViewController () {
- BOOL isModify;
-}
-@property (strong, nonatomic) UIPopoverController *masterPopoverController;
-- (void)configureView;
+@interface DetailViewController ()
+
@end
@implementation DetailViewController
+@synthesize text = _text;
+@synthesize item = _item;
+@synthesize master = _master;
-@synthesize detailItem = _detailItem;
-@synthesize storage;
-@synthesize detailText = _detailText;
-@synthesize masterPopoverController = _masterPopoverController;
-
-#pragma mark - Managing the detail item
-
-- (void)setDetailItem:(id)newDetailItem
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
- if (_detailItem != newDetailItem) {
- // save current note
- [self save];
-
- // set item
- _detailItem = newDetailItem;
-
- // Update the view.
- [self configureView];
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
}
-
- if (self.masterPopoverController != nil) {
- [self.masterPopoverController dismissPopoverAnimated:YES];
- }
-}
-
-- (void)configureView
-{
- NSString *noteData;
- if (self.detailItem && self.detailItem.path) {
- NSError *error;
- noteData = [NSString stringWithContentsOfFile:self.detailItem.path
- encoding:NSUTF8StringEncoding
- error:&error];
- if (error) return;
- } else {
- noteData = @"";
- }
- self.detailText.text = noteData;
+ return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
- [notify addObserver:self
- selector:@selector(keyboardDidShow:)
- name:UIKeyboardDidShowNotification
- object:nil];
-
- [notify addObserver:self
- selector:@selector(keyboardDidHide:)
- name:UIKeyboardDidHideNotification
- object:nil];
-
- self.detailText.delegate = self;
- [self configureView];
- isModify = NO;
+ // Do any additional setup after loading the view.
}
- (void)viewDidUnload
{
- [self setDetailText:nil];
- self.detailItem = nil;
- self.storage = nil;
+ [self setText:nil];
[super viewDidUnload];
-}
-
-- (void)viewWillDisappear:(BOOL)animated {
- // Leaving detail view
- [self save];
- [super viewWillDisappear: animated];
+ // Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
- if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
- return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
- } else {
- return YES;
- }
+ return YES;
}
-- (void)textViewDidChange:(UITextView *)textView {
- isModify = YES;
-}
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+ if ([[segue identifier] isEqualToString:@"editNote"]) {
+ EditViewController *edit = (EditViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
+ edit.detailItem = self.item;
+ edit.delegate = self.master;
-- (void)save {
- if (!isModify) return;
-
- NSString *note = self.detailText.text;
- FileItem *newPath = [storage save:note item: self.detailItem];
- isModify = NO;
-
- MasterViewController *master;
-
- if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
- UINavigationController *v = [self.splitViewController.viewControllers objectAtIndex:0];
- NSArray *a = v.viewControllers;
- master = [a objectAtIndex:0];
- } else {
- // To notify master view, retract reference from navigation controller.
- master = [self.navigationController.viewControllers objectAtIndex:0];
- }
-
- if (self.detailItem.name) {
- // item exists
- if (self.detailItem != newPath) {
- [master itemChanged: self.detailItem to:newPath];
- }
- } else {
- // new item
- [master itemAdded: newPath];
}
}
-#pragma mark - Notification handler
-
-- (void)keyboardDidShow:(NSNotification*)notification {
- NSDictionary *info = [notification userInfo];
-
- CGRect beginRect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:nil];
- CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
- CGRect frame = self.detailText.frame;
-
- if (beginRect.size.height == rect.size.height) {
- // slide in
- frame.size.height -= rect.size.height;
+- (void)setItem:(FileItem *)item {
+ if (self.item == item) return;
+ if (item.isNewItem) {
+ self.text.text = @"";
} else {
- // keyboard change
- frame.size.height -= (rect.size.height - beginRect.size.height);
+ NSError *error;
+ NSString *note = [NSString stringWithContentsOfFile:item.path
+ encoding:NSUTF8StringEncoding
+ error:&error];
+ if (error) {
+ self.text.text = @"";
+ } else {
+ self.text.text = note;
+ }
}
- self.detailText.frame = frame;
-
-}
-
-- (void)keyboardDidHide:(NSNotification*)notification {
-
- NSDictionary *info = [notification userInfo];
-
- CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
- CGRect frame = self.detailText.frame;
-
- frame.size.height += rect.size.height;
- self.detailText.frame = frame;
-}
-
-#pragma mark - Split view
-
-- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
-{
- barButtonItem.title = NSLocalizedString(@"Master", @"Master");
- [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
- self.masterPopoverController = popoverController;
+ _item = item;
}
-
-- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
-{
- // Called when the view is shown again in the split view, invalidating the button and popover controller.
- [self.navigationItem setLeftBarButtonItem:nil animated:YES];
- self.masterPopoverController = nil;
-}
-
@end
--- /dev/null
+#import <UIKit/UIKit.h>
+
+@interface EditCancelAlert : UIAlertView
+@end
--- /dev/null
+#import "EditCancelAlert.h"
+
+@implementation EditCancelAlert
+@end
--- /dev/null
+#import <UIKit/UIKit.h>
+#import "FileItem.h"
+#import "Storage.h"
+
+@protocol EditViewControllerDelegate;
+
+@interface EditViewController : UIViewController <UITextViewDelegate>
+
+@property (weak, nonatomic) id <EditViewControllerDelegate> delegate;
+@property (strong, nonatomic) FileItem *detailItem;
+@property (nonatomic) BOOL isModify;
+
+@property (weak, nonatomic) IBOutlet UITextView *detailText;
+
+- (IBAction)done:(id)sender;
+- (IBAction)cancel:(id)sender;
+
+@end
+
+@protocol EditViewControllerDelegate <NSObject>
+- (void)editViewControllerDidCancel:(EditViewController*)controller;
+- (void)editViewControllerDidFinish:(EditViewController *)controller;
+@end
\ No newline at end of file
--- /dev/null
+#import "EditViewController.h"
+#import "MasterViewController.h"
+
+@interface EditViewController () {
+}
+@end
+
+@implementation EditViewController
+
+@synthesize detailItem = _detailItem;
+@synthesize detailText = _detalText;
+@synthesize delegate = _delegate;
+@synthesize isModify = _isModify;
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)setDetailItem:(id)newDetailItem
+{
+ if (_detailItem != newDetailItem) {
+ // set item
+ _detailItem = newDetailItem;
+
+ // Update the view.
+ [self configureView];
+ }
+}
+
+- (void)configureView {
+ NSString *noteData;
+ if (self.detailItem && self.detailItem.path) {
+ NSError *error;
+ noteData = [NSString stringWithContentsOfFile:self.detailItem.path
+ encoding:NSUTF8StringEncoding
+ error:&error];
+ if (error) return;
+ } else {
+ noteData = @"";
+ }
+ self.detailText.text = noteData;
+}
+
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ // Do any additional setup after loading the view, typically from a nib.
+ NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
+ [notify addObserver:self
+ selector:@selector(keyboardDidShow:)
+ name:UIKeyboardDidShowNotification
+ object:nil];
+
+ [notify addObserver:self
+ selector:@selector(keyboardDidHide:)
+ name:UIKeyboardDidHideNotification
+ object:nil];
+
+ self.detailText.delegate = self;
+ [self configureView];
+ self.isModify = NO;
+}
+
+- (void)viewDidUnload {
+ [self setDetailText:nil];
+ self.detailItem = nil;
+ [super viewDidUnload];
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
+ return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
+ } else {
+ return YES;
+ }
+}
+- (void)textViewDidChange:(UITextView *)textView {
+ self.isModify = YES;
+}
+
+#pragma mark - Notification handler
+
+- (void)keyboardDidShow:(NSNotification*)notification {
+ NSDictionary *info = [notification userInfo];
+
+ CGRect beginRect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:nil];
+ CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
+ CGRect frame = self.detailText.frame;
+
+ if (beginRect.size.height == rect.size.height) {
+ // slide in
+ frame.size.height -= rect.size.height;
+ } else {
+ // keyboard change
+ frame.size.height -= (rect.size.height - beginRect.size.height);
+ }
+ self.detailText.frame = frame;
+
+}
+
+- (void)keyboardDidHide:(NSNotification*)notification {
+
+ NSDictionary *info = [notification userInfo];
+
+ CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
+ CGRect frame = self.detailText.frame;
+
+ frame.size.height += rect.size.height;
+ self.detailText.frame = frame;
+}
+
+#pragma mark - Action handler
+
+- (IBAction)cancel:(id)sender {
+ [[self delegate] editViewControllerDidCancel:self];
+}
+- (IBAction)done:(id)sender {
+ [[self delegate] editViewControllerDidFinish:self];
+}
+
+@end
+(id)allocWithName:(NSString *)name;
+- (BOOL)isNewItem;
+
@end
return fileItem;
}
+- (BOOL)isNewItem {
+ return self.name == nil;
+}
@end
#import <UIKit/UIKit.h>
#import "FileItem.h"
-
+#import "EditViewController.h"
@class DetailViewController;
-@interface MasterViewController : UITableViewController
+@interface MasterViewController : UITableViewController <EditViewControllerDelegate>
@property (strong, nonatomic) DetailViewController *detailViewController;
-
-// Call back handler for detail view.
-- (void)itemChanged:(FileItem *)from to:(FileItem *)to;
-- (void)itemAdded: (FileItem *)item;
@end
#import "MasterViewController.h"
+#import "EditViewController.h"
#import "DetailViewController.h"
+#import "EditCancelAlert.h"
#import "Storage.h"
-#import "CustomSegue.h"
#import "FileItem.h"
-@interface MasterViewController () {
+@interface MasterViewController () <UIAlertViewDelegate, UITableViewDelegate> {
NSMutableArray *_objects;
Storage *storage;
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
-// self.navigationItem.leftBarButtonItem = self.editButtonItem;
-
- UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
- target:self
- action:@selector(openNewNote:)];
- self.navigationItem.rightBarButtonItem = addButton;
self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
-
+ self.detailViewController.master = self;
+
imgFolder = nil;
imgDocument = nil;
if (!storage) {
storage = [Storage init];
}
- self.detailViewController.storage = storage;
- self.detailViewController.detailItem = [storage newItem];
// Load initial items.
[self insertItems];
[self performSegueWithIdentifier:@"newNote" sender:self];
} else {
// iPad : Clear detail view.
- [self.detailViewController setDetailItem:nil];
-
}
}
}
*/
-- (void)transitDetailView:(NSIndexPath *)indexPath controller:(DetailViewController*)controller {
+// Select Row(iPhone/iPad)
+// set item for iPad
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+// if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
+// [self transitDetailView:indexPath controller:self.detailViewController];
+// }
FileItem *item = [_objects objectAtIndex:indexPath.row];
if (item.isUp) {
// switch view items
[self removeAllItems];
[storage updir];
- [self insertItems];
+ [self insertItems];
} else if (item.isDirectory) {
- // switch view items
[self removeAllItems];
[storage chdir: item.name];
- [self insertItems];
-
+ [self insertItems];
} else {
- [controller setDetailItem:item];
- [controller setStorage: storage];
- }
-
-}
-
-// Select Row(iPhone/iPad)
-// set item for iPad
-- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
-{
- if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
- [self transitDetailView:indexPath controller:self.detailViewController];
+ if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
+ self.detailViewController.item = item;
+ } else {
+ [self performSegueWithIdentifier:@"editNote" sender:self];
+ }
}
}
// set item (for iPhone)
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
- if ([[segue identifier] isEqualToString:@"showDetail"]) {
- NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
+ if ([[segue identifier] isEqualToString:@"newNote"]) {
+ EditViewController *edit = (EditViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
+ edit.detailItem = [storage newItem];
+ edit.delegate = self;
+ } else if ([[segue identifier] isEqualToString:@"editNote"]) {
+ // This path is used only iPhone
+ EditViewController *edit = (EditViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
+ NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
FileItem *item = [_objects objectAtIndex:indexPath.row];
- if (item.isUp || item.isDirectory) {
- CustomSegue *customSegue = (CustomSegue*)segue;
- customSegue.isStop = YES;
+ edit.detailItem = item;
+ edit.delegate = self;
+ }
+}
+
+#pragma mark - EditViewControllerDelegate
+
+- (void)editViewControllerDidFinish:(EditViewController *)controller {
+ if (controller.isModify) {
+ // save note
+ if (![controller.detailItem isNewItem]) {
+ [self deleteItem:controller.detailItem];
}
- [self transitDetailView:indexPath controller:[segue destinationViewController]];
- } else if ([[segue identifier] isEqualToString:@"newNote"]) {
- // When open new document, detailItem is newItem.
- DetailViewController *detail = [segue destinationViewController];
- detail.detailItem = [storage newItem];
- detail.storage = storage;
+ NSString *note = controller.detailText.text;
+ FileItem *item = [storage save:note item:controller.detailItem];
+ controller.isModify = NO;
+
+ self.detailViewController.item = item;
+
+ [self insertItem:item];
}
+ [self dismissModalViewControllerAnimated:YES];
}
-- (void)itemChanged:(FileItem *)from to:(FileItem *)to {
- // Remove old item and insert new item
- [self deleteItem: from];
- [self insertItem: to];
+- (void)editViewControllerDidCancel:(EditViewController *)controller {
+ if (controller.isModify) {
+ UIAlertView *alert = [[EditCancelAlert alloc] initWithTitle:@"Confirm"
+ message:@"Note is modified. Are you sure to discard changes?" delegate:self
+ cancelButtonTitle:@"OK"
+ otherButtonTitles:@"Cancel", nil];
+ [alert show];
+ } else {
+ [self dismissModalViewControllerAnimated:YES];
+ }
}
-- (void)itemAdded:(FileItem *)item {
- // Simply insert a item.
- [self insertItem: item];
+#pragma mark - AlertViewDelegate
+
+-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
+ if ([alertView isKindOfClass:[EditCancelAlert class]]) {
+ if (buttonIndex == 0) {
+ [self dismissModalViewControllerAnimated:YES];
+ }
+ }
}
@end
<dependencies>
<deployment defaultVersion="1296" identifier="iOS"/>
<development defaultVersion="4200" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1179"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1181"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
</connections>
</navigationController>
</objects>
- <point key="canvasLocation" x="448" y="-630"/>
+ <point key="canvasLocation" x="116" y="-494"/>
</scene>
<!--Detail View Controller - Detail-->
<scene sceneID="16">
<rect key="frame" x="0.0" y="64" width="703" height="704"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
- <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" id="I5K-hl-l4m">
+ <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" editable="NO" id="I5K-hl-l4m">
<rect key="frame" x="0.0" y="0.0" width="703" height="704"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
</view>
<toolbarItems/>
- <navigationItem key="navigationItem" title="Detail" id="53"/>
+ <navigationItem key="navigationItem" title="Detail" id="53">
+ <barButtonItem key="rightBarButtonItem" systemItem="edit" id="9dq-bI-Dm0">
+ <connections>
+ <segue destination="rXN-9x-iCW" kind="modal" identifier="editNote" id="Kjf-1o-2Ik"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
<connections>
- <outlet property="detailText" destination="I5K-hl-l4m" id="Mze-kK-DLs"/>
+ <outlet property="text" destination="I5K-hl-l4m" id="efg-OY-fpX"/>
</connections>
</viewController>
</objects>
- <point key="canvasLocation" x="448" y="248"/>
+ <point key="canvasLocation" x="1025" y="-1397"/>
</scene>
<!--Split View Controller-->
<scene sceneID="18">
</connections>
</splitViewController>
</objects>
- <point key="canvasLocation" x="-687" y="-630"/>
+ <point key="canvasLocation" x="-1135" y="-950"/>
</scene>
<!--Master View Controller - Master-->
<scene sceneID="24">
<outlet property="delegate" destination="19" id="21"/>
</connections>
</tableView>
- <navigationItem key="navigationItem" title="Master" id="40"/>
+ <navigationItem key="navigationItem" title="Master" id="40">
+ <barButtonItem key="rightBarButtonItem" systemItem="add" id="J5P-yO-cEM">
+ <connections>
+ <segue destination="rXN-9x-iCW" kind="modal" identifier="newNote" id="pK5-mO-z6F"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
</tableViewController>
</objects>
- <point key="canvasLocation" x="859" y="-631"/>
+ <point key="canvasLocation" x="527" y="-495"/>
+ </scene>
+ <!--Edit View Controller-->
+ <scene sceneID="iZX-2r-fjn">
+ <objects>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="5BA-Ef-J8x" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ <viewController id="bDQ-AH-j4Y" customClass="EditViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="5tE-qu-kqz">
+ <rect key="frame" x="0.0" y="64" width="1024" height="704"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" id="si7-dS-nro">
+ <rect key="frame" x="0.0" y="0.0" width="1024" height="704"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
+ </textView>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics" orientation="landscapeRight"/>
+ </view>
+ <navigationItem key="navigationItem" id="sUV-LL-8ot">
+ <barButtonItem key="leftBarButtonItem" systemItem="cancel" id="eka-xh-Nup">
+ <connections>
+ <action selector="cancel:" destination="bDQ-AH-j4Y" id="Nwu-CN-MDQ"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem key="rightBarButtonItem" systemItem="done" id="Wbk-WE-vas">
+ <connections>
+ <action selector="done:" destination="bDQ-AH-j4Y" id="PR7-VL-kO8"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
+ <connections>
+ <outlet property="detailText" destination="si7-dS-nro" id="Cyl-Qi-jTW"/>
+ </connections>
+ </viewController>
+ </objects>
+ <point key="canvasLocation" x="1994" y="490"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="50">
</connections>
</navigationController>
</objects>
- <point key="canvasLocation" x="-366" y="248"/>
+ <point key="canvasLocation" x="116" y="-1397"/>
+ </scene>
+ <!--Navigation Controller-->
+ <scene sceneID="rOf-2X-6ce">
+ <objects>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="JBX-0N-sNc" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ <navigationController id="rXN-9x-iCW" sceneMemberID="viewController">
+ <toolbarItems/>
+ <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="iYu-AH-jaY">
+ <rect key="frame" x="0.0" y="0.0" width="768" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </navigationBar>
+ <nil name="viewControllers"/>
+ <connections>
+ <segue destination="bDQ-AH-j4Y" kind="relationship" relationship="rootViewController" id="HpA-Et-NYA"/>
+ </connections>
+ </navigationController>
+ </objects>
+ <point key="canvasLocation" x="1025" y="-494"/>
</scene>
</scenes>
+ <classes>
+ <class className="DetailViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/DetailViewController.h"/>
+ <relationships>
+ <relationship kind="outlet" name="text" candidateClass="UITextView"/>
+ </relationships>
+ </class>
+ <class className="EditViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EditViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="cancel:"/>
+ <relationship kind="action" name="done:"/>
+ <relationship kind="outlet" name="detailText" candidateClass="UITextView"/>
+ </relationships>
+ </class>
+ <class className="MasterViewController" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/MasterViewController.h"/>
+ </class>
+ </classes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination"/>
</simulatedMetricsContainer>
+ <inferredMetricsTieBreakers>
+ <segue reference="Kjf-1o-2Ik"/>
+ </inferredMetricsTieBreakers>
</document>
\ No newline at end of file
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
- <connections>
- <segue destination="21" kind="custom" identifier="showDetail" customClass="CustomSegue" id="jZb-fq-zAk"/>
- </connections>
</tableViewCell>
</prototypes>
<sections/>
<outlet property="delegate" destination="12" id="15"/>
</connections>
</tableView>
- <navigationItem key="navigationItem" title="Master" id="36"/>
+ <navigationItem key="navigationItem" title="Master" id="36">
+ <barButtonItem key="rightBarButtonItem" systemItem="add" id="agb-4g-a59">
+ <connections>
+ <segue destination="7bR-lH-lJ9" kind="modal" identifier="newNote" id="HlC-by-ur5"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
<connections>
- <segue destination="21" kind="push" identifier="newNote" id="0ct-gM-2FR"/>
+ <segue destination="7bR-lH-lJ9" kind="modal" identifier="editNote" id="aht-5S-Kxw"/>
</connections>
</tableViewController>
</objects>
<point key="canvasLocation" x="459" y="64"/>
</scene>
- <!--Detail View Controller - Detail-->
- <scene sceneID="24">
+ <!--Edit View Controller-->
+ <scene sceneID="bJI-fW-9UV">
<objects>
- <placeholder placeholderIdentifier="IBFirstResponder" id="23" sceneMemberID="firstResponder"/>
- <viewController storyboardIdentifier="" title="Detail" id="21" customClass="DetailViewController" sceneMemberID="viewController">
- <view key="view" contentMode="scaleToFill" id="22">
+ <placeholder placeholderIdentifier="IBFirstResponder" id="dlo-yF-tdt" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ <viewController id="Rsp-rs-tJf" customClass="EditViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="ZAM-9z-zxC">
<rect key="frame" x="0.0" y="64" width="320" height="416"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
- <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="dcM-3R-DB6">
+ <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="Xrk-0H-B8o">
<rect key="frame" x="0.0" y="0.0" width="320" height="416"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
- <navigationItem key="navigationItem" title="Detail" id="26"/>
+ <navigationItem key="navigationItem" id="euJ-qc-bbH">
+ <barButtonItem key="leftBarButtonItem" systemItem="cancel" id="kPQ-0x-DwA">
+ <connections>
+ <action selector="cancel:" destination="Rsp-rs-tJf" id="JJ8-d2-ftv"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem key="rightBarButtonItem" systemItem="done" id="5xl-w3-ddR">
+ <connections>
+ <action selector="done:" destination="Rsp-rs-tJf" id="R7k-Mi-Ig3"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
<connections>
- <outlet property="detailText" destination="dcM-3R-DB6" id="xjt-Km-MjC"/>
+ <outlet property="detailText" destination="Xrk-0H-B8o" id="hTl-cP-FEX"/>
</connections>
</viewController>
</objects>
- <point key="canvasLocation" x="902" y="64"/>
+ <point key="canvasLocation" x="1350" y="64"/>
+ </scene>
+ <!--Navigation Controller-->
+ <scene sceneID="a6N-vh-sA4">
+ <objects>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="aKO-h7-hUd" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ <navigationController id="7bR-lH-lJ9" sceneMemberID="viewController">
+ <toolbarItems/>
+ <navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="cJU-5A-2mE">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </navigationBar>
+ <nil name="viewControllers"/>
+ <connections>
+ <segue destination="Rsp-rs-tJf" kind="relationship" relationship="rootViewController" id="1U0-Gk-BfO"/>
+ </connections>
+ </navigationController>
+ </objects>
+ <point key="canvasLocation" x="891" y="64"/>
</scene>
</scenes>
<classes>
- <class className="DetailViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/DetailViewController.h"/>
+ <class className="EditViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EditViewController.h"/>
<relationships>
+ <relationship kind="action" name="cancel:"/>
+ <relationship kind="action" name="done:"/>
<relationship kind="outlet" name="detailText" candidateClass="UITextView"/>
</relationships>
</class>
<simulatedScreenMetrics key="destination"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
- <segue reference="0ct-gM-2FR"/>
+ <segue reference="aht-5S-Kxw"/>
</inferredMetricsTieBreakers>
</document>
\ No newline at end of file