OSDN Git Service

Improve detail view window size control.
[tombo/Tombo.git] / iOS / Tombo / Tombo / DetailViewController.m
1 #import "DetailViewController.h"
2 #import "MasterViewController.h"
3
4 @interface DetailViewController () {
5     BOOL isModify;
6 }
7 @property (strong, nonatomic) UIPopoverController *masterPopoverController;
8 - (void)configureView;
9 @end
10
11 @implementation DetailViewController
12
13 @synthesize detailItem = _detailItem;
14 @synthesize storage;
15 @synthesize detailText = _detailText;
16 @synthesize masterPopoverController = _masterPopoverController;
17
18 #pragma mark - Managing the detail item
19
20 - (void)setDetailItem:(id)newDetailItem
21 {
22     if (_detailItem != newDetailItem) {
23         _detailItem = newDetailItem;
24         
25         // Update the view.
26         [self configureView];
27     }
28
29     if (self.masterPopoverController != nil) {
30         [self.masterPopoverController dismissPopoverAnimated:YES];
31     }        
32 }
33
34 - (void)configureView
35 {
36     NSString *noteData;
37     if (self.detailItem && self.detailItem.path) {
38         NSError *error;
39         noteData = [NSString stringWithContentsOfFile:self.detailItem.path 
40                                              encoding:NSUTF8StringEncoding
41                                                 error:&error];
42         if (error) return;
43     } else {
44         noteData = @"";
45     }
46     self.detailText.text = noteData;
47 }
48
49 - (void)viewDidLoad
50 {
51     [super viewDidLoad];
52         // Do any additional setup after loading the view, typically from a nib.
53     NSNotificationCenter *notify = [NSNotificationCenter defaultCenter];
54     [notify addObserver:self 
55                selector:@selector(keyboardDidShow:) 
56                    name:UIKeyboardDidShowNotification 
57                  object:nil];
58     
59     [notify addObserver:self
60                selector:@selector(keyboardDidHide:)
61                    name:UIKeyboardDidHideNotification
62                  object:nil];
63
64     self.detailText.delegate = self;
65     [self configureView];
66     isModify = NO;
67 }
68
69 - (void)viewDidUnload
70 {
71     [self setDetailText:nil];
72     self.detailItem = nil;
73     self.storage = nil;
74     [super viewDidUnload];
75 }
76
77 - (void)viewWillDisappear:(BOOL)animated {
78     // Leaving detail view
79     if (isModify) {
80         NSString *note = self.detailText.text;    
81         FileItem *newPath = [storage save:note item: self.detailItem];
82         
83         // To notify master view, retract reference from navigation controller.
84         MasterViewController *master = [self.navigationController.viewControllers objectAtIndex:0];
85         
86         if (self.detailItem.name) {
87             // item exists
88             if (self.detailItem != newPath) {
89                 [master itemChanged: self.detailItem to:newPath];
90             }
91         } else {
92             // new item
93             [master itemAdded: newPath];
94         }
95     }
96     
97     [super viewWillDisappear: animated];
98 }
99
100 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
101 {
102     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
103         return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
104     } else {
105         return YES;
106     }
107 }
108
109 - (void)textViewDidChange:(UITextView *)textView {
110     isModify = YES;
111 }
112
113 #pragma mark - Notification handler
114
115 - (void)keyboardDidShow:(NSNotification*)notification {
116     NSDictionary *info = [notification userInfo];
117     
118     CGRect beginRect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:nil];
119     CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
120     CGRect frame = self.detailText.frame;
121     
122     if (beginRect.size.height == rect.size.height) {
123         // slide in
124         frame.size.height -= rect.size.height;
125     } else {
126         // keyboard change
127         frame.size.height -= (rect.size.height - beginRect.size.height);
128     }
129     self.detailText.frame = frame;
130
131 }
132
133 - (void)keyboardDidHide:(NSNotification*)notification {
134
135     NSDictionary *info = [notification userInfo];
136     
137     CGRect rect = [self.detailText convertRect:[[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
138     CGRect frame = self.detailText.frame;
139
140     frame.size.height += rect.size.height;
141     self.detailText.frame = frame;
142 }
143
144 #pragma mark - Split view
145
146 - (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
147 {
148     barButtonItem.title = NSLocalizedString(@"Master", @"Master");
149     [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
150     self.masterPopoverController = popoverController;
151 }
152
153 - (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
154 {
155     // Called when the view is shown again in the split view, invalidating the button and popover controller.
156     [self.navigationItem setLeftBarButtonItem:nil animated:YES];
157     self.masterPopoverController = nil;
158 }
159
160 @end