Index: ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm |
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8b26faa9ae6dc33ba80adbadef3910acbd731884 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm |
@@ -0,0 +1,237 @@ |
+// Copyright 2012 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/tools_menu/tools_popup_controller.h" |
+ |
+#import <QuartzCore/QuartzCore.h> |
+ |
+#include "base/logging.h" |
+#include "base/mac/scoped_nsobject.h" |
+#include "base/metrics/user_metrics.h" |
+#include "base/metrics/user_metrics_action.h" |
+#include "ios/chrome/browser/ui/commands/ios_command_ids.h" |
+#include "ios/chrome/browser/ui/rtl_geometry.h" |
+#import "ios/chrome/browser/ui/tools_menu/tools_menu_context.h" |
+#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h" |
+#import "ios/chrome/browser/ui/uikit_ui_util.h" |
+ |
+using base::UserMetricsAction; |
+ |
+NSString* const kToolsMenuTableViewId = @"kToolsMenuTableViewId"; |
+ |
+namespace { |
+ |
+const CGFloat kToolsPopupMenuWidth = 280.0; |
+const CGFloat kToolsPopupMenuTrailingOffset = 4; |
+ |
+// Inset for the shadows of the contained views. |
+NS_INLINE UIEdgeInsets TabHistoryPopupMenuInsets() { |
+ return UIEdgeInsetsMake(9, 11, 12, 11); |
+} |
+ |
+} // namespace |
+ |
+@interface ToolsPopupController ()<ToolsPopupTableDelegate> { |
+ base::scoped_nsobject<ToolsMenuViewController> _toolsMenuViewController; |
+ // Container view of the menu items table. |
+ base::scoped_nsobject<UIView> _toolsTableViewContainer; |
+} |
+@end |
+ |
+@implementation ToolsPopupController |
+@synthesize isCurrentPageBookmarked = _isCurrentPageBookmarked; |
+ |
+- (instancetype)initWithContext:(ToolsMenuContext*)context { |
+ DCHECK(context.displayView); |
+ self = [super initWithParentView:context.displayView]; |
+ if (self) { |
+ _toolsMenuViewController.reset([[ToolsMenuViewController alloc] init]); |
+ _toolsTableViewContainer.reset([[_toolsMenuViewController view] retain]); |
+ [_toolsTableViewContainer layer].cornerRadius = 2; |
+ [_toolsTableViewContainer layer].masksToBounds = YES; |
+ [_toolsMenuViewController initializeMenu:context]; |
+ |
+ UIEdgeInsets popupInsets = TabHistoryPopupMenuInsets(); |
+ CGFloat popupWidth = kToolsPopupMenuWidth; |
+ |
+ CGPoint origin = CGPointMake(CGRectGetMidX(context.sourceRect), |
+ CGRectGetMidY(context.sourceRect)); |
+ |
+ CGRect containerBounds = [context.displayView bounds]; |
+ CGFloat minY = CGRectGetMinY(context.sourceRect) - popupInsets.top; |
+ |
+ // The tools popup appears trailing- aligned, but because |
+ // kToolsPopupMenuTrailingOffset is smaller than the popupInsets's trailing |
+ // value, destination needs to be shifted a bit. |
+ CGFloat trailingShift = |
+ UIEdgeInsetsGetTrailing(popupInsets) - kToolsPopupMenuTrailingOffset; |
+ if (UseRTLLayout()) |
+ trailingShift = -trailingShift; |
+ |
+ CGPoint destination = CGPointMake( |
+ CGRectGetTrailingEdge(containerBounds) + trailingShift, minY); |
+ |
+ CGFloat availableHeight = CGRectGetHeight([context.displayView bounds]) - |
+ minY - popupInsets.bottom; |
+ CGFloat optimalHeight = |
+ [_toolsMenuViewController optimalHeight:availableHeight]; |
+ [self setOptimalSize:CGSizeMake(popupWidth, optimalHeight) |
+ atOrigin:destination]; |
+ |
+ CGRect bounds = [[self popupContainer] bounds]; |
+ CGRect frame = UIEdgeInsetsInsetRect(bounds, popupInsets); |
+ |
+ [_toolsTableViewContainer setFrame:frame]; |
+ [[self popupContainer] addSubview:_toolsTableViewContainer]; |
+ |
+ [_toolsMenuViewController setDelegate:self]; |
+ [self fadeInPopupFromSource:origin toDestination:destination]; |
+ |
+ // Insert |toolsButton| above |popupContainer| so it appears stationary. |
+ // Otherwise the tools button will animate with the tools popup. |
+ UIButton* toolsButton = [_toolsMenuViewController toolsButton]; |
+ if (toolsButton) { |
+ UIView* outsideAnimationView = [[self popupContainer] superview]; |
+ const CGFloat buttonWidth = 48; |
+ // |origin| is the center of the tools menu icon in the toolbar; use |
+ // that to determine where the tools button should be placed. |
+ CGPoint buttonCenter = |
+ [context.displayView convertPoint:origin toView:outsideAnimationView]; |
+ CGRect frame = CGRectMake(buttonCenter.x - buttonWidth / 2.0, |
+ buttonCenter.y - buttonWidth / 2.0, buttonWidth, |
+ buttonWidth); |
+ [toolsButton setFrame:frame]; |
+ [toolsButton setImageEdgeInsets:context.toolsButtonInsets]; |
+ [outsideAnimationView addSubview:toolsButton]; |
+ } |
+ } |
+ return self; |
+} |
+ |
+- (void)dealloc { |
+ [_toolsTableViewContainer removeFromSuperview]; |
+ [_toolsMenuViewController setDelegate:nil]; |
+ [super dealloc]; |
+} |
+ |
+- (void)fadeInPopupFromSource:(CGPoint)source |
+ toDestination:(CGPoint)destination { |
+ [_toolsMenuViewController animateContentIn]; |
+ [super fadeInPopupFromSource:source toDestination:destination]; |
+} |
+ |
+- (void)dismissAnimatedWithCompletion:(void (^)(void))completion { |
+ [_toolsMenuViewController hideContent]; |
+ [super dismissAnimatedWithCompletion:completion]; |
+} |
+ |
+- (void)setIsCurrentPageBookmarked:(BOOL)value { |
+ _isCurrentPageBookmarked = value; |
+ [_toolsMenuViewController setIsCurrentPageBookmarked:value]; |
+} |
+ |
+// Informs tools popup menu whether the switch to reader mode is possible. |
+- (void)setCanUseReaderMode:(BOOL)enabled { |
+ [_toolsMenuViewController setCanUseReaderMode:enabled]; |
+} |
+ |
+- (void)setCanUseDesktopUserAgent:(BOOL)enabled { |
+ [_toolsMenuViewController setCanUseDesktopUserAgent:enabled]; |
+} |
+ |
+- (void)setCanShowFindBar:(BOOL)enabled { |
+ [_toolsMenuViewController setCanShowFindBar:enabled]; |
+} |
+ |
+- (void)setCanShowShareMenu:(BOOL)enabled { |
+ [_toolsMenuViewController setCanShowShareMenu:enabled]; |
+} |
+ |
+- (void)setIsTabLoading:(BOOL)isTabLoading { |
+ [_toolsMenuViewController setIsTabLoading:isTabLoading]; |
+} |
+ |
+#pragma mark - ToolsPopupTableDelegate methods |
+ |
+- (void)commandWasSelected:(int)commandID { |
+ // Record the corresponding metric. |
+ switch (commandID) { |
+ case IDC_TEMP_EDIT_BOOKMARK: |
+ base::RecordAction(UserMetricsAction("MobileMenuEditBookmark")); |
+ break; |
+ case IDC_BOOKMARK_PAGE: |
+ base::RecordAction(UserMetricsAction("MobileMenuAddToBookmarks")); |
+ break; |
+ case IDC_CLOSE_ALL_TABS: |
+ base::RecordAction(UserMetricsAction("MobileMenuCloseAllTabs")); |
+ break; |
+ case IDC_CLOSE_ALL_INCOGNITO_TABS: |
+ base::RecordAction(UserMetricsAction("MobileMenuCloseAllIncognitoTabs")); |
+ break; |
+ case IDC_FIND: |
+ base::RecordAction(UserMetricsAction("MobileMenuFindInPage")); |
+ break; |
+ case IDC_HELP_PAGE_VIA_MENU: |
+ base::RecordAction(UserMetricsAction("MobileMenuHelp")); |
+ break; |
+ case IDC_NEW_INCOGNITO_TAB: |
+ base::RecordAction(UserMetricsAction("MobileMenuNewIncognitoTab")); |
+ break; |
+ case IDC_NEW_TAB: |
+ base::RecordAction(UserMetricsAction("MobileMenuNewTab")); |
+ break; |
+ case IDC_OPTIONS: |
+ base::RecordAction(UserMetricsAction("MobileMenuSettings")); |
+ break; |
+ case IDC_RELOAD: |
+ base::RecordAction(UserMetricsAction("MobileMenuReload")); |
+ break; |
+ case IDC_SHARE_PAGE: |
+ base::RecordAction(UserMetricsAction("MobileMenuShare")); |
+ break; |
+ case IDC_REQUEST_DESKTOP_SITE: |
+ base::RecordAction(UserMetricsAction("MobileMenuRequestDesktopSite")); |
+ break; |
+ case IDC_READER_MODE: |
+ base::RecordAction(UserMetricsAction("MobileMenuRequestReaderMode")); |
+ break; |
+ case IDC_SHOW_BOOKMARK_MANAGER: |
+ base::RecordAction(UserMetricsAction("MobileMenuAllBookmarks")); |
+ break; |
+ case IDC_SHOW_HISTORY: |
+ base::RecordAction(UserMetricsAction("MobileMenuHistory")); |
+ break; |
+ case IDC_SHOW_OTHER_DEVICES: |
+ // "Open Tabs" is the original name of the "Other Devices" menu item. |
+ base::RecordAction(UserMetricsAction("MobileMenuOpenTabs")); |
+ break; |
+ case IDC_STOP: |
+ base::RecordAction(UserMetricsAction("MobileMenuStop")); |
+ break; |
+ case IDC_PRINT: |
+ base::RecordAction(UserMetricsAction("MobileMenuPrint")); |
+ break; |
+ case IDC_REPORT_AN_ISSUE: |
+ self.containerView.hidden = YES; |
+ base::RecordAction(UserMetricsAction("MobileMenuReportAnIssue")); |
+ break; |
+ case IDC_VIEW_SOURCE: |
+ // Debug only; no metric. |
+ break; |
+ case IDC_SHOW_TOOLS_MENU: |
+ // Do nothing when tapping the tools menu a second time. |
+ break; |
+ case IDC_SHOW_READING_LIST: |
+ // TODO(crbug.com/582957): Add metric here. |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ |
+ // Close the menu. |
+ [self.delegate dismissPopupMenu:self]; |
+} |
+ |
+@end |