Index: ui/base/ios/cru_context_menu_controller.mm |
diff --git a/ui/base/ios/cru_context_menu_controller.mm b/ui/base/ios/cru_context_menu_controller.mm |
deleted file mode 100644 |
index d052c99070ab2279a09499754d79e07bb9e327c6..0000000000000000000000000000000000000000 |
--- a/ui/base/ios/cru_context_menu_controller.mm |
+++ /dev/null |
@@ -1,151 +0,0 @@ |
-// 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 "ui/base/ios/cru_context_menu_controller.h" |
- |
-#include <algorithm> |
- |
-#include "base/ios/weak_nsobject.h" |
-#include "base/logging.h" |
-#import "base/mac/scoped_nsobject.h" |
-#include "ui/base/device_form_factor.h" |
-#import "ui/base/ios/cru_context_menu_holder.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/strings/grit/ui_strings.h" |
- |
-// Abstracts system implementation of popovers and action sheets. |
-@protocol CRUContextMenuControllerImpl<NSObject> |
- |
-// Whether the context menu is visible. |
-@property(nonatomic, readonly, getter=isVisible) BOOL visible; |
- |
-// Displays a context menu. |
-- (void)showWithHolder:(CRUContextMenuHolder*)menuHolder |
- atPoint:(CGPoint)localPoint |
- inView:(UIView*)view; |
- |
-// Dismisses displayed context menu. |
-- (void)dismissAnimated:(BOOL)animated |
- completionHandler:(ProceduralBlock)completionHandler; |
- |
-@end |
- |
-// Backs up CRUContextMenuController by using UIAlertController. |
-@interface CRUAlertController : NSObject<CRUContextMenuControllerImpl> { |
- // Weak underlying UIAlertController. |
- base::WeakNSObject<UIAlertController> _alert; |
-} |
-// Redefined to readwrite. |
-@property(nonatomic, readwrite, getter=isVisible) BOOL visible; |
-@end |
- |
-// Displays a context menu. Implements Bridge pattern. |
-@implementation CRUContextMenuController { |
- // Implementation specific for iOS version. |
- base::scoped_nsprotocol<id<CRUContextMenuControllerImpl>> _impl; |
-} |
- |
-- (BOOL)isVisible { |
- return [_impl isVisible]; |
-} |
- |
-- (instancetype)init { |
- self = [super init]; |
- if (self) { |
- _impl.reset([[CRUAlertController alloc] init]); |
- } |
- return self; |
-} |
- |
-- (void)dealloc { |
- [_impl dismissAnimated:NO completionHandler:nil]; |
- [super dealloc]; |
-} |
- |
-- (void)showWithHolder:(CRUContextMenuHolder*)menuHolder |
- atPoint:(CGPoint)point |
- inView:(UIView*)view { |
- DCHECK(menuHolder.itemCount); |
- // Check that the view is still visible on screen, otherwise just return and |
- // don't show the context menu. |
- if (![view window] && ![view isKindOfClass:[UIWindow class]]) |
- return; |
- [_impl showWithHolder:menuHolder atPoint:point inView:view]; |
-} |
- |
-- (void)dismissAnimated:(BOOL)animated |
- completionHandler:(ProceduralBlock)completionHandler { |
- [_impl dismissAnimated:animated completionHandler:completionHandler]; |
-} |
- |
-@end |
- |
-@implementation CRUAlertController |
-@synthesize visible = _visible; |
- |
-- (CGSize)sizeForTitleThatFitsMenuWithHolder:(CRUContextMenuHolder*)menuHolder |
- atPoint:(CGPoint)point |
- inView:(UIView*)view { |
- // Presenting and dismissing a dummy UIAlertController flushes a screen. |
- // As a workaround return an estimation of the space available depending |
- // on the device's type. |
- const CGFloat kAvailableWidth = 320; |
- const CGFloat kAvailableHeightTablet = 200; |
- const CGFloat kAvailableHeightPhone = 100; |
- if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) { |
- return CGSizeMake(kAvailableWidth, kAvailableHeightTablet); |
- } |
- return CGSizeMake(kAvailableWidth, kAvailableHeightPhone); |
-} |
- |
-- (void)showWithHolder:(CRUContextMenuHolder*)menuHolder |
- atPoint:(CGPoint)point |
- inView:(UIView*)view { |
- UIAlertController* alert = [UIAlertController |
- alertControllerWithTitle:menuHolder.menuTitle |
- message:nil |
- preferredStyle:UIAlertControllerStyleActionSheet]; |
- alert.popoverPresentationController.sourceView = view; |
- alert.popoverPresentationController.sourceRect = |
- CGRectMake(point.x, point.y, 1.0, 1.0); |
- |
- // Add the actions. |
- base::WeakNSObject<CRUAlertController> weakSelf(self); |
- [menuHolder.itemTitles enumerateObjectsUsingBlock:^(NSString* itemTitle, |
- NSUInteger itemIndex, |
- BOOL*) { |
- void (^actionHandler)(UIAlertAction*) = ^(UIAlertAction* action) { |
- [menuHolder performActionAtIndex:itemIndex]; |
- [weakSelf setVisible:NO]; |
- }; |
- [alert addAction:[UIAlertAction actionWithTitle:itemTitle |
- style:UIAlertActionStyleDefault |
- handler:actionHandler]]; |
- }]; |
- |
- // Cancel button goes last, to match other browsers. |
- void (^cancelHandler)(UIAlertAction*) = ^(UIAlertAction* action) { |
- [weakSelf setVisible:NO]; |
- }; |
- UIAlertAction* cancel_action = |
- [UIAlertAction actionWithTitle:l10n_util::GetNSString(IDS_APP_CANCEL) |
- style:UIAlertActionStyleCancel |
- handler:cancelHandler]; |
- [alert addAction:cancel_action]; |
- |
- // Present sheet/popover using controller that is added to view hierarchy. |
- UIViewController* topController = view.window.rootViewController; |
- while (topController.presentedViewController) |
- topController = topController.presentedViewController; |
- [topController presentViewController:alert animated:YES completion:nil]; |
- self.visible = YES; |
- _alert.reset(alert); |
-} |
- |
-- (void)dismissAnimated:(BOOL)animated |
- completionHandler:(ProceduralBlock)completionHandler { |
- [_alert dismissViewControllerAnimated:animated completion:completionHandler]; |
-} |
- |
-@end |