| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "ios/chrome/browser/ui/bookmarks/bookmark_menu_item.h" |
| |
| #include "base/hash.h" |
| #include "base/logging.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "components/bookmarks/browser/bookmark_node.h" |
| #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" |
| #include "ios/chrome/grit/ios_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| using bookmarks::BookmarkNode; |
| |
| namespace bookmarks { |
| BOOL NumberIsValidMenuItemType(int number) { |
| // Invalid and deprecated numbers. |
| if (number < 1 || number > MenuItemLast) |
| return NO; |
| MenuItemType type = static_cast<MenuItemType>(number); |
| switch (type) { |
| case MenuItemFolder: |
| return YES; |
| |
| case MenuItemDivider: |
| case MenuItemSectionHeader: |
| return NO; |
| } |
| } |
| } // namespace bookmarks |
| |
| @interface BookmarkMenuItem () |
| // Redefined to be read-write. |
| @property(nonatomic, assign) const BookmarkNode* folder; |
| @property(nonatomic, assign) const BookmarkNode* rootAncestor; |
| // Redefined to be read-write. |
| @property(nonatomic, assign) bookmarks::MenuItemType type; |
| // Redefined to be read-write. |
| @property(nonatomic, copy) NSString* sectionTitle; |
| @end |
| |
| @implementation BookmarkMenuItem |
| @synthesize folder = _folder; |
| @synthesize rootAncestor = _rootAncestor; |
| @synthesize sectionTitle = _sectionTitle; |
| @synthesize type = _type; |
| |
| - (UIAccessibilityTraits)accessibilityTraits { |
| switch (self.type) { |
| case bookmarks::MenuItemFolder: |
| return super.accessibilityTraits |= UIAccessibilityTraitButton; |
| case bookmarks::MenuItemSectionHeader: |
| return super.accessibilityTraits |= UIAccessibilityTraitHeader; |
| case bookmarks::MenuItemDivider: |
| return UIAccessibilityTraitNone; |
| } |
| } |
| |
| - (NSString*)title { |
| switch (self.type) { |
| case bookmarks::MenuItemDivider: |
| return nil; |
| case bookmarks::MenuItemFolder: |
| return bookmark_utils_ios::TitleForBookmarkNode(self.folder); |
| case bookmarks::MenuItemSectionHeader: |
| return self.sectionTitle; |
| } |
| } |
| |
| - (NSString*)titleForMenu { |
| switch (self.type) { |
| case bookmarks::MenuItemDivider: |
| case bookmarks::MenuItemFolder: |
| case bookmarks::MenuItemSectionHeader: |
| return [self title]; |
| } |
| } |
| |
| - (NSString*)titleForNavigationBar { |
| switch (self.type) { |
| case bookmarks::MenuItemDivider: |
| case bookmarks::MenuItemFolder: |
| case bookmarks::MenuItemSectionHeader: |
| return [self title]; |
| } |
| } |
| |
| - (NSString*)accessibilityIdentifier { |
| switch (self.type) { |
| case bookmarks::MenuItemDivider: |
| return nil; |
| case bookmarks::MenuItemFolder: |
| return @"MenuItemFolder"; |
| case bookmarks::MenuItemSectionHeader: |
| return @"MenuItemSectionHeader"; |
| } |
| } |
| |
| - (UIImage*)imagePrimary:(BOOL)primary { |
| switch (self.type) { |
| case bookmarks::MenuItemFolder: |
| if (self.folder->type() == BookmarkNode::BOOKMARK_BAR || |
| self.folder->type() == BookmarkNode::MOBILE || |
| self.folder->type() == BookmarkNode::OTHER_NODE) { |
| if (primary) |
| return [UIImage imageNamed:@"bookmark_blue_folder"]; |
| else |
| return [UIImage imageNamed:@"bookmark_gray_folder"]; |
| } |
| case bookmarks::MenuItemDivider: |
| case bookmarks::MenuItemSectionHeader: |
| return nil; |
| } |
| } |
| |
| - (CGFloat)height { |
| if (self.type == bookmarks::MenuItemDivider) |
| return 1; |
| return 48; |
| } |
| |
| - (BOOL)canBeSelected { |
| switch (self.type) { |
| case bookmarks::MenuItemDivider: |
| case bookmarks::MenuItemSectionHeader: |
| return NO; |
| case bookmarks::MenuItemFolder: |
| return YES; |
| } |
| } |
| |
| - (BOOL)supportsEditing { |
| switch (self.type) { |
| case bookmarks::MenuItemFolder: |
| return YES; |
| case bookmarks::MenuItemDivider: |
| case bookmarks::MenuItemSectionHeader: |
| NOTREACHED(); |
| return NO; |
| } |
| } |
| |
| - (BOOL)isEqual:(id)other { |
| if (other == self) |
| return YES; |
| if (!other || ![other isKindOfClass:[self class]]) |
| return NO; |
| BookmarkMenuItem* otherMenuItem = static_cast<BookmarkMenuItem*>(other); |
| if (self.type != otherMenuItem.type) |
| return NO; |
| |
| switch (self.type) { |
| case bookmarks::MenuItemDivider: |
| return YES; |
| case bookmarks::MenuItemFolder: |
| return self.folder == otherMenuItem.folder; |
| case bookmarks::MenuItemSectionHeader: |
| return self.sectionTitle == otherMenuItem.sectionTitle; |
| } |
| } |
| |
| - (BookmarkMenuItem*)parentItem { |
| if (self.type != bookmarks::MenuItemFolder) |
| return self; |
| BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; |
| item.type = self.type; |
| item.folder = self.rootAncestor; |
| item.rootAncestor = self.rootAncestor; |
| return item; |
| } |
| |
| - (NSUInteger)hash { |
| switch (self.type) { |
| case bookmarks::MenuItemDivider: |
| return self.type; |
| case bookmarks::MenuItemFolder: |
| return self.type + reinterpret_cast<NSUInteger>(self.folder); |
| case bookmarks::MenuItemSectionHeader: |
| return self.type + [self.sectionTitle hash]; |
| } |
| } |
| |
| + (BookmarkMenuItem*)dividerMenuItem { |
| BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; |
| item.type = bookmarks::MenuItemDivider; |
| return item; |
| } |
| |
| + (BookmarkMenuItem*)folderMenuItemForNode:(const BookmarkNode*)node |
| rootAncestor:(const BookmarkNode*)ancestor { |
| BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; |
| item.type = bookmarks::MenuItemFolder; |
| item.folder = node; |
| item.rootAncestor = ancestor; |
| return item; |
| } |
| |
| + (BookmarkMenuItem*)sectionMenuItemWithTitle:(NSString*)title { |
| BookmarkMenuItem* item = [[BookmarkMenuItem alloc] init]; |
| item.type = bookmarks::MenuItemSectionHeader; |
| item.sectionTitle = title; |
| return item; |
| } |
| |
| @end |