OSDN Git Service

Add move file
[tombo/Tombo.git] / iOS / Tombo / Tombo / DetailViewController.m
1 #import "DetailViewController.h"
2 #import "EditViewController.h"
3 #import "MasterViewController.h"
4 #import "PasswordManager.h"
5 #import "Storage.h"
6
7 @interface DetailViewController ()
8
9 @end
10
11 @implementation DetailViewController
12 @synthesize text = _text;
13 @synthesize item = _item;
14 @synthesize master = _master;
15 @synthesize storage = _storage;
16 @synthesize passwordManager = _passwordManager;
17 @synthesize delegate = _delegate;
18
19 #pragma mark - framework
20 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
21 {
22     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
23     if (self) {
24         // Custom initialization
25     }
26     return self;
27 }
28
29 - (void)viewDidLoad
30 {
31     [super viewDidLoad];
32     
33     [self.navigationController setToolbarHidden:NO];
34     if (self.item != nil) {
35         [self setupToolbar];
36     }
37     
38     [self loadNote];
39 }
40
41 - (void)setupToolbar {
42     NSString *btnTitle;
43     if (self.item.isCrypt) {
44         btnTitle = @"Decrypt";
45     } else {
46         btnTitle = @"Encrypt";
47     }
48     UIBarButtonItem *cryptBtn = [[UIBarButtonItem alloc] initWithTitle:btnTitle
49                                                                  style:UIBarButtonItemStyleBordered
50                                                                 target:self
51                                                                 action:@selector(crypt:)];
52     UIBarButtonItem *moveBtn = [[UIBarButtonItem alloc] initWithTitle:@"Move"
53                                                                 style:UIBarButtonItemStyleBordered
54                                                                target:self 
55                                                                action:@selector(move:)];
56     [self setToolbarItems:[NSArray arrayWithObjects:cryptBtn, moveBtn, nil] animated:NO];
57     
58 }
59
60 - (void)viewDidUnload
61 {
62     [self setText:nil];
63     [self setText:nil];
64     [super viewDidUnload];
65     // Release any retained subviews of the main view.
66 }
67
68 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
69 {
70         return YES;
71 }
72
73 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
74     if ([[segue identifier] isEqualToString:@"editNote"]) {
75         EditViewController *edit = (EditViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
76         self.item.body = self.text.text;
77         
78         edit.detailItem = self.item;
79         edit.delegate = self.master;
80     } else if ([[segue identifier] isEqualToString:@"moveNote"]) {
81         MoveViewController *move = (MoveViewController*)[[[segue destinationViewController] viewControllers] objectAtIndex:0];
82         move.delegate = self;
83         move.folders = [self.storage listFolders];
84     }
85 }
86
87 #pragma mark - Logic
88
89 - (void)crypt:(id)sender {
90     if (self.item.isCrypt) {
91         // Decrypting
92         /*
93         void (^callback)(NSString *) = ^(NSString *password) {
94             FileItem *newItem = [self.storage decrypt:password item:self.item];
95             if (newItem) {
96                 [self.delegate detailViewFileItemChanged:self.item to:newItem];
97                 self.item = newItem;
98             }
99         };
100         // Callback request to passwordManager.
101         [self.passwordManager requestPassword:callback];
102          */
103         if ([self.passwordManager preparePassword]) {
104             FileItem *newItem = [self.storage decrypt:self.passwordManager.password item:self.item];
105             if (newItem) {
106                 [self.delegate detailViewFileItemChanged:self.item to:newItem];
107                 self.item = newItem;
108             } else {
109                 UIAlertView *decFail = [[UIAlertView alloc]initWithTitle:@"Info" message:@"Decrypt failed." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
110                 [decFail show];
111             }
112         }
113     } else {
114         // Encrypting
115         if ([self.passwordManager preparePasswordConfirm]) {
116             FileItem *newItem = [self.storage encrypt:self.passwordManager.password item:self.item];
117             if (newItem) {
118                 [self.delegate detailViewFileItemChanged:self.item to:newItem];
119                 self.item = newItem;
120             }
121         }
122     }
123 }
124
125 - (void)move:(id)sender {
126     [self performSegueWithIdentifier:@"moveNote" sender:self];
127 }
128
129 - (void)loadNote {
130     if (!self.item) return;
131     
132     if (self.item.isCrypt) {
133         NSString *note = [Storage loadCryptFile:self.item.path password:self.passwordManager.password];
134         if (note) {
135             self.text.text = note;
136         }
137     } else {
138         NSString *note = [Storage load:self.item.path];
139         if (note) {
140             self.text.text = note;
141         } else {
142             self.text.text = @"";
143         }
144     }
145 }
146
147 - (void)setItem:(FileItem *)item {
148     _item = item;
149     if (item.isNewItem) {
150         self.text.text = @"";
151     } else {
152         // On iPhone and call by segue, self.text is nil because view is not loaded yet.
153         if (self.text) {
154             [self loadNote];
155             [self setupToolbar];
156         }
157     }
158 }
159
160 #pragma mark - MoveViewControllerDelegate
161
162 - (void)moveViewControllerCancel:(MoveViewController *)view {
163     [self dismissModalViewControllerAnimated:YES];
164 }
165
166 - (void)moveViewControllerSelect:(MoveViewController *)view path:(NSString *)path {
167     NSString *toPath = [self.storage moveFrom:self.item toPath:path];
168     [self.delegate detailViewFileItemRemoved:self.item];
169     self.item.path = toPath;
170     [self dismissModalViewControllerAnimated:YES];
171 }
172
173 @end