Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.mm

Issue 2741413005: [ObjC ARC] Converts ios/chrome/browser/ui/bookmarks:bookmarks_arc to ARC. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.h" 5 #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <vector> 8 #include <vector>
9 9
10 #import "base/ios/weak_nsobject.h"
11 #include "base/logging.h" 10 #include "base/logging.h"
12 #include "base/mac/objc_property_releaser.h"
13 #include "base/mac/scoped_nsobject.h"
14 #include "base/strings/sys_string_conversions.h" 11 #include "base/strings/sys_string_conversions.h"
15 #include "components/bookmarks/browser/bookmark_model.h" 12 #include "components/bookmarks/browser/bookmark_model.h"
16 #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller. h" 13 #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller. h"
17 #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_table_view_cell.h" 14 #import "ios/chrome/browser/ui/bookmarks/bookmark_folder_table_view_cell.h"
18 #import "ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h" 15 #import "ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h"
19 #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h" 16 #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h"
20 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" 17 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
21 #import "ios/chrome/browser/ui/icons/chrome_icon.h" 18 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
22 #import "ios/chrome/browser/ui/material_components/utils.h" 19 #import "ios/chrome/browser/ui/material_components/utils.h"
23 #include "ios/chrome/grit/ios_strings.h" 20 #include "ios/chrome/grit/ios_strings.h"
24 #import "ios/third_party/material_components_ios/src/components/AppBar/src/Mater ialAppBar.h" 21 #import "ios/third_party/material_components_ios/src/components/AppBar/src/Mater ialAppBar.h"
25 #include "ui/base/l10n/l10n_util_mac.h" 22 #include "ui/base/l10n/l10n_util_mac.h"
26 23
24 #if !defined(__has_feature) || !__has_feature(objc_arc)
25 #error "This file requires ARC support."
26 #endif
27
27 using bookmarks::BookmarkNode; 28 using bookmarks::BookmarkNode;
28 29
29 namespace { 30 namespace {
30 31
31 // The height of every folder cell. 32 // The height of every folder cell.
32 const CGFloat kFolderCellHeight = 48.0; 33 const CGFloat kFolderCellHeight = 48.0;
33 34
34 // Height of section headers/footers. 35 // Height of section headers/footers.
35 const CGFloat kSectionHeaderHeight = 8.0; 36 const CGFloat kSectionHeaderHeight = 8.0;
36 const CGFloat kSectionFooterHeight = 8.0; 37 const CGFloat kSectionFooterHeight = 8.0;
(...skipping 10 matching lines...) Expand all
47 } // namespace 48 } // namespace
48 49
49 @interface BookmarkFolderViewController ()< 50 @interface BookmarkFolderViewController ()<
50 BookmarkFolderEditorViewControllerDelegate, 51 BookmarkFolderEditorViewControllerDelegate,
51 BookmarkModelBridgeObserver, 52 BookmarkModelBridgeObserver,
52 UITableViewDataSource, 53 UITableViewDataSource,
53 UITableViewDelegate> { 54 UITableViewDelegate> {
54 std::set<const BookmarkNode*> _editedNodes; 55 std::set<const BookmarkNode*> _editedNodes;
55 std::vector<const BookmarkNode*> _folders; 56 std::vector<const BookmarkNode*> _folders;
56 std::unique_ptr<bookmarks::BookmarkModelBridge> _modelBridge; 57 std::unique_ptr<bookmarks::BookmarkModelBridge> _modelBridge;
57 base::scoped_nsobject<MDCAppBar> _appBar; 58 MDCAppBar* _appBar;
58 base::mac::ObjCPropertyReleaser
59 _propertyReleaser_BookmarkFolderViewController;
60 } 59 }
61 60
62 // Should the controller setup Cancel and Done buttons instead of a back button. 61 // Should the controller setup Cancel and Done buttons instead of a back button.
63 @property(nonatomic, assign) BOOL allowsCancel; 62 @property(nonatomic, assign) BOOL allowsCancel;
64 63
65 // Should the controller setup a new-folder button. 64 // Should the controller setup a new-folder button.
66 @property(nonatomic, assign) BOOL allowsNewFolders; 65 @property(nonatomic, assign) BOOL allowsNewFolders;
67 66
68 // Reference to the main bookmark model. 67 // Reference to the main bookmark model.
69 @property(nonatomic, assign) bookmarks::BookmarkModel* bookmarkModel; 68 @property(nonatomic, assign) bookmarks::BookmarkModel* bookmarkModel;
70 69
71 // The currently selected folder. 70 // The currently selected folder.
72 @property(nonatomic, readonly) const BookmarkNode* selectedFolder; 71 @property(nonatomic, readonly) const BookmarkNode* selectedFolder;
73 72
74 // The view controller to present when creating a new folder. 73 // The view controller to present when creating a new folder.
75 @property(nonatomic, retain) 74 @property(nonatomic, strong)
76 BookmarkFolderEditorViewController* folderAddController; 75 BookmarkFolderEditorViewController* folderAddController;
77 76
78 // A linear list of folders. 77 // A linear list of folders.
79 @property(nonatomic, assign, readonly) 78 @property(nonatomic, assign, readonly)
80 const std::vector<const BookmarkNode*>& folders; 79 const std::vector<const BookmarkNode*>& folders;
81 80
82 // The table view that displays the options and folders. 81 // The table view that displays the options and folders.
83 @property(nonatomic, retain) UITableView* tableView; 82 @property(nonatomic, strong) UITableView* tableView;
84 83
85 // Returns the cell for the default section and the given |row|. 84 // Returns the cell for the default section and the given |row|.
86 - (BookmarkFolderTableViewCell*)defaultSectionCellForRow:(NSInteger)row; 85 - (BookmarkFolderTableViewCell*)defaultSectionCellForRow:(NSInteger)row;
87 86
88 // Returns a folder cell for the folder at |row| in |self.folders|. 87 // Returns a folder cell for the folder at |row| in |self.folders|.
89 - (BookmarkFolderTableViewCell*)folderSectionCellForRow:(NSInteger)row; 88 - (BookmarkFolderTableViewCell*)folderSectionCellForRow:(NSInteger)row;
90 89
91 // Reloads the folder list. 90 // Reloads the folder list.
92 - (void)reloadFolders; 91 - (void)reloadFolders;
93 92
(...skipping 25 matching lines...) Expand all
119 allowsNewFolders:(BOOL)allowsNewFolders 118 allowsNewFolders:(BOOL)allowsNewFolders
120 editedNodes: 119 editedNodes:
121 (const std::set<const BookmarkNode*>&)nodes 120 (const std::set<const BookmarkNode*>&)nodes
122 allowsCancel:(BOOL)allowsCancel 121 allowsCancel:(BOOL)allowsCancel
123 selectedFolder:(const BookmarkNode*)selectedFolder { 122 selectedFolder:(const BookmarkNode*)selectedFolder {
124 DCHECK(bookmarkModel); 123 DCHECK(bookmarkModel);
125 DCHECK(bookmarkModel->loaded()); 124 DCHECK(bookmarkModel->loaded());
126 DCHECK(selectedFolder == NULL || selectedFolder->is_folder()); 125 DCHECK(selectedFolder == NULL || selectedFolder->is_folder());
127 self = [super initWithNibName:nil bundle:nil]; 126 self = [super initWithNibName:nil bundle:nil];
128 if (self) { 127 if (self) {
129 _propertyReleaser_BookmarkFolderViewController.Init(
130 self, [BookmarkFolderViewController class]);
131 _allowsCancel = allowsCancel; 128 _allowsCancel = allowsCancel;
132 _allowsNewFolders = allowsNewFolders; 129 _allowsNewFolders = allowsNewFolders;
133 _bookmarkModel = bookmarkModel; 130 _bookmarkModel = bookmarkModel;
134 _editedNodes = nodes; 131 _editedNodes = nodes;
135 _selectedFolder = selectedFolder; 132 _selectedFolder = selectedFolder;
136 133
137 // Set up the bookmark model oberver. 134 // Set up the bookmark model oberver.
138 _modelBridge.reset( 135 _modelBridge.reset(
139 new bookmarks::BookmarkModelBridge(self, _bookmarkModel)); 136 new bookmarks::BookmarkModelBridge(self, _bookmarkModel));
140 137
141 _appBar.reset([[MDCAppBar alloc] init]); 138 _appBar = [[MDCAppBar alloc] init];
142 [self addChildViewController:[_appBar headerViewController]]; 139 [self addChildViewController:[_appBar headerViewController]];
143 } 140 }
144 return self; 141 return self;
145 } 142 }
146 143
147 - (void)changeSelectedFolder:(const BookmarkNode*)selectedFolder { 144 - (void)changeSelectedFolder:(const BookmarkNode*)selectedFolder {
148 DCHECK(selectedFolder); 145 DCHECK(selectedFolder);
149 DCHECK(selectedFolder->is_folder()); 146 DCHECK(selectedFolder->is_folder());
150 _selectedFolder = selectedFolder; 147 _selectedFolder = selectedFolder;
151 [self.tableView reloadData]; 148 [self.tableView reloadData];
152 } 149 }
153 150
154 - (void)dealloc { 151 - (void)dealloc {
155 _tableView.dataSource = nil; 152 _tableView.dataSource = nil;
156 _tableView.delegate = nil; 153 _tableView.delegate = nil;
157 _folderAddController.delegate = nil; 154 _folderAddController.delegate = nil;
158 [super dealloc];
159 } 155 }
160 156
161 - (UIStatusBarStyle)preferredStatusBarStyle { 157 - (UIStatusBarStyle)preferredStatusBarStyle {
162 return UIStatusBarStyleDefault; 158 return UIStatusBarStyleDefault;
163 } 159 }
164 160
165 #pragma mark - View lifecycle 161 #pragma mark - View lifecycle
166 162
167 - (void)viewDidLoad { 163 - (void)viewDidLoad {
168 [super viewDidLoad]; 164 [super viewDidLoad];
169 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { 165 if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
170 [self setEdgesForExtendedLayout:UIRectEdgeNone]; 166 [self setEdgesForExtendedLayout:UIRectEdgeNone];
171 } 167 }
172 self.view.backgroundColor = [UIColor whiteColor]; 168 self.view.backgroundColor = [UIColor whiteColor];
173 self.view.accessibilityIdentifier = @"Folder Picker"; 169 self.view.accessibilityIdentifier = @"Folder Picker";
174 170
175 self.title = l10n_util::GetNSString(IDS_IOS_BOOKMARK_CHOOSE_GROUP_BUTTON); 171 self.title = l10n_util::GetNSString(IDS_IOS_BOOKMARK_CHOOSE_GROUP_BUTTON);
176 172
177 base::scoped_nsobject<UIBarButtonItem> doneItem([[UIBarButtonItem alloc] 173 UIBarButtonItem* doneItem = [[UIBarButtonItem alloc]
178 initWithTitle:l10n_util::GetNSString( 174 initWithTitle:l10n_util::GetNSString(
179 IDS_IOS_BOOKMARK_EDIT_MODE_EXIT_MOBILE) 175 IDS_IOS_BOOKMARK_EDIT_MODE_EXIT_MOBILE)
180 style:UIBarButtonItemStylePlain 176 style:UIBarButtonItemStylePlain
181 target:self 177 target:self
182 action:@selector(done:)]); 178 action:@selector(done:)];
183 doneItem.get().accessibilityIdentifier = @"Done"; 179 doneItem.accessibilityIdentifier = @"Done";
184 self.navigationItem.rightBarButtonItem = doneItem; 180 self.navigationItem.rightBarButtonItem = doneItem;
185 181
186 if (self.allowsCancel) { 182 if (self.allowsCancel) {
187 UIBarButtonItem* cancelItem = 183 UIBarButtonItem* cancelItem =
188 [ChromeIcon templateBarButtonItemWithImage:[ChromeIcon closeIcon] 184 [ChromeIcon templateBarButtonItemWithImage:[ChromeIcon closeIcon]
189 target:self 185 target:self
190 action:@selector(cancel:)]; 186 action:@selector(cancel:)];
191 cancelItem.accessibilityLabel = 187 cancelItem.accessibilityLabel =
192 l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_CANCEL_BUTTON_LABEL); 188 l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_CANCEL_BUTTON_LABEL);
193 cancelItem.accessibilityIdentifier = @"Cancel"; 189 cancelItem.accessibilityIdentifier = @"Cancel";
194 self.navigationItem.leftBarButtonItem = cancelItem; 190 self.navigationItem.leftBarButtonItem = cancelItem;
195 } else { 191 } else {
196 UIBarButtonItem* backItem = 192 UIBarButtonItem* backItem =
197 [ChromeIcon templateBarButtonItemWithImage:[ChromeIcon backIcon] 193 [ChromeIcon templateBarButtonItemWithImage:[ChromeIcon backIcon]
198 target:self 194 target:self
199 action:@selector(back:)]; 195 action:@selector(back:)];
200 backItem.accessibilityLabel = 196 backItem.accessibilityLabel =
201 l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_BACK_LABEL); 197 l10n_util::GetNSString(IDS_IOS_BOOKMARK_NEW_BACK_LABEL);
202 backItem.accessibilityIdentifier = @"Back"; 198 backItem.accessibilityIdentifier = @"Back";
203 self.navigationItem.leftBarButtonItem = backItem; 199 self.navigationItem.leftBarButtonItem = backItem;
204 } 200 }
205 201
206 // The table view. 202 // The table view.
207 base::scoped_nsobject<UITableView> tableView([[UITableView alloc] 203 UITableView* tableView =
208 initWithFrame:self.view.bounds 204 [[UITableView alloc] initWithFrame:self.view.bounds
209 style:UITableViewStylePlain]); 205 style:UITableViewStylePlain];
210 tableView.get().dataSource = self; 206 tableView.dataSource = self;
211 tableView.get().delegate = self; 207 tableView.delegate = self;
212 tableView.get().autoresizingMask = 208 tableView.autoresizingMask =
213 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 209 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
214 tableView.get().separatorStyle = UITableViewCellSeparatorStyleNone; 210 tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
215 [self.view addSubview:tableView]; 211 [self.view addSubview:tableView];
216 [self.view sendSubviewToBack:tableView]; 212 [self.view sendSubviewToBack:tableView];
217 self.tableView = tableView; 213 self.tableView = tableView;
218 214
219 // Add the app bar to the view hierarchy. This must be done last, so that the 215 // Add the app bar to the view hierarchy. This must be done last, so that the
220 // app bar's views are the frontmost. 216 // app bar's views are the frontmost.
221 ConfigureAppBarWithCardStyle(_appBar); 217 ConfigureAppBarWithCardStyle(_appBar);
222 [_appBar headerViewController].headerView.trackingScrollView = self.tableView; 218 [_appBar headerViewController].headerView.trackingScrollView = self.tableView;
223 [_appBar addSubviewsToParent]; 219 [_appBar addSubviewsToParent];
224 } 220 }
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 } 326 }
331 NOTREACHED(); 327 NOTREACHED();
332 return 0; 328 return 0;
333 } 329 }
334 330
335 - (UIView*)tableView:(UITableView*)tableView 331 - (UIView*)tableView:(UITableView*)tableView
336 viewForHeaderInSection:(NSInteger)section { 332 viewForHeaderInSection:(NSInteger)section {
337 CGRect headerViewFrame = 333 CGRect headerViewFrame =
338 CGRectMake(0, 0, CGRectGetWidth(tableView.frame), 334 CGRectMake(0, 0, CGRectGetWidth(tableView.frame),
339 [self tableView:tableView heightForHeaderInSection:section]); 335 [self tableView:tableView heightForHeaderInSection:section]);
340 UIView* headerView = 336 UIView* headerView = [[UIView alloc] initWithFrame:headerViewFrame];
341 [[[UIView alloc] initWithFrame:headerViewFrame] autorelease];
342 if (section == BookmarkFolderSectionFolders && 337 if (section == BookmarkFolderSectionFolders &&
343 [self shouldShowDefaultSection]) { 338 [self shouldShowDefaultSection]) {
344 CGRect separatorFrame = 339 CGRect separatorFrame =
345 CGRectMake(0, 0, CGRectGetWidth(headerView.bounds), 340 CGRectMake(0, 0, CGRectGetWidth(headerView.bounds),
346 1.0 / [[UIScreen mainScreen] scale]); // 1-pixel divider. 341 1.0 / [[UIScreen mainScreen] scale]); // 1-pixel divider.
347 base::scoped_nsobject<UIView> separator( 342 UIView* separator = [[UIView alloc] initWithFrame:separatorFrame];
348 [[UIView alloc] initWithFrame:separatorFrame]); 343 separator.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin |
349 separator.get().autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | 344 UIViewAutoresizingFlexibleWidth;
350 UIViewAutoresizingFlexibleWidth; 345 separator.backgroundColor = bookmark_utils_ios::separatorColor();
351 separator.get().backgroundColor = bookmark_utils_ios::separatorColor();
352 [headerView addSubview:separator]; 346 [headerView addSubview:separator];
353 } 347 }
354 return headerView; 348 return headerView;
355 } 349 }
356 350
357 - (CGFloat)tableView:(UITableView*)tableView 351 - (CGFloat)tableView:(UITableView*)tableView
358 heightForFooterInSection:(NSInteger)section { 352 heightForFooterInSection:(NSInteger)section {
359 switch (static_cast<BookmarkFolderSection>(section)) { 353 switch (static_cast<BookmarkFolderSection>(section)) {
360 case BookmarkFolderSectionDefault: 354 case BookmarkFolderSectionDefault:
361 return [self shouldShowDefaultSection] ? kSectionFooterHeight : 0; 355 return [self shouldShowDefaultSection] ? kSectionFooterHeight : 0;
362 356
363 case BookmarkFolderSectionFolders: 357 case BookmarkFolderSectionFolders:
364 return kSectionFooterHeight; 358 return kSectionFooterHeight;
365 } 359 }
366 NOTREACHED(); 360 NOTREACHED();
367 return 0; 361 return 0;
368 } 362 }
369 363
370 - (UIView*)tableView:(UITableView*)tableView 364 - (UIView*)tableView:(UITableView*)tableView
371 viewForFooterInSection:(NSInteger)section { 365 viewForFooterInSection:(NSInteger)section {
372 return [[[UIView alloc] init] autorelease]; 366 return [[UIView alloc] init];
373 } 367 }
374 368
375 - (void)tableView:(UITableView*)tableView 369 - (void)tableView:(UITableView*)tableView
376 didSelectRowAtIndexPath:(NSIndexPath*)indexPath { 370 didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
377 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 371 [tableView deselectRowAtIndexPath:indexPath animated:YES];
378 switch (static_cast<BookmarkFolderSection>(indexPath.section)) { 372 switch (static_cast<BookmarkFolderSection>(indexPath.section)) {
379 case BookmarkFolderSectionDefault: 373 case BookmarkFolderSectionDefault:
380 [self pushFolderAddViewController]; 374 [self pushFolderAddViewController];
381 break; 375 break;
382 376
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 [BookmarkFolderEditorViewController 525 [BookmarkFolderEditorViewController
532 folderCreatorWithBookmarkModel:self.bookmarkModel 526 folderCreatorWithBookmarkModel:self.bookmarkModel
533 parentFolder:self.selectedFolder]; 527 parentFolder:self.selectedFolder];
534 folderCreator.delegate = self; 528 folderCreator.delegate = self;
535 [self.navigationController pushViewController:folderCreator animated:YES]; 529 [self.navigationController pushViewController:folderCreator animated:YES];
536 self.folderAddController = folderCreator; 530 self.folderAddController = folderCreator;
537 } 531 }
538 532
539 - (void)delayedNotifyDelegateOfSelection { 533 - (void)delayedNotifyDelegateOfSelection {
540 self.view.userInteractionEnabled = NO; 534 self.view.userInteractionEnabled = NO;
541 base::WeakNSObject<BookmarkFolderViewController> weakSelf(self); 535 __weak BookmarkFolderViewController* weakSelf = self;
542 dispatch_after( 536 dispatch_after(
543 dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), 537 dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)),
544 dispatch_get_main_queue(), ^{ 538 dispatch_get_main_queue(), ^{
545 base::scoped_nsobject<BookmarkFolderViewController> strongSelf( 539 BookmarkFolderViewController* strongSelf = weakSelf;
546 [weakSelf retain]);
547 // Early return if the controller has been deallocated. 540 // Early return if the controller has been deallocated.
548 if (!strongSelf) 541 if (!strongSelf)
549 return; 542 return;
550 strongSelf.get().view.userInteractionEnabled = YES; 543 strongSelf.view.userInteractionEnabled = YES;
551 [strongSelf done:nil]; 544 [strongSelf done:nil];
552 }); 545 });
553 } 546 }
554 547
555 @end 548 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698