Index: chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm |
diff --git a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm b/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm |
deleted file mode 100644 |
index f7e8f1ee5a946911bf429f9a0128f12b71888193..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm |
+++ /dev/null |
@@ -1,333 +0,0 @@ |
-// Copyright 2015 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 "chrome/browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h" |
- |
-#include <stddef.h> |
- |
-#include <algorithm> |
-#include <cmath> |
- |
-#include "base/mac/scoped_nsobject.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/strings/sys_string_conversions.h" |
-#include "chrome/browser/chooser_controller/chooser_controller.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#import "chrome/browser/ui/cocoa/base_bubble_controller.h" |
-#import "chrome/browser/ui/cocoa/browser_window_controller.h" |
-#import "chrome/browser/ui/cocoa/browser_window_utils.h" |
-#import "chrome/browser/ui/cocoa/device_chooser_content_view_cocoa.h" |
-#import "chrome/browser/ui/cocoa/info_bubble_view.h" |
-#import "chrome/browser/ui/cocoa/info_bubble_window.h" |
-#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
-#include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" |
-#include "components/bubble/bubble_controller.h" |
-#include "content/public/browser/native_web_keyboard_event.h" |
-#include "ui/base/cocoa/cocoa_base_utils.h" |
-#include "ui/base/cocoa/window_size_constants.h" |
- |
-std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { |
- return base::MakeUnique<ChooserBubbleUiCocoa>(browser_, |
- std::move(chooser_controller_)); |
-} |
- |
-@interface ChooserBubbleUiController |
- : BaseBubbleController<NSTableViewDataSource, NSTableViewDelegate> { |
- @private |
- // Bridge to the C++ class that created this object. |
- ChooserBubbleUiCocoa* bridge_; // Weak. |
- bool buttonPressed_; |
- |
- base::scoped_nsobject<DeviceChooserContentViewCocoa> |
- deviceChooserContentView_; |
- NSTableView* tableView_; // Weak. |
- NSButton* connectButton_; // Weak. |
- NSButton* cancelButton_; // Weak. |
- |
- Browser* browser_; // Weak. |
-} |
- |
-// Designated initializer. |browser| and |bridge| must both be non-nil. |
-- (id)initWithBrowser:(Browser*)browser |
- chooserController:(std::unique_ptr<ChooserController>)chooserController |
- bridge:(ChooserBubbleUiCocoa*)bridge; |
- |
-// Makes the bubble visible. |
-- (void)show; |
- |
-// Will reposition the bubble based in case the anchor or parent should change. |
-- (void)updateAnchorPosition; |
- |
-// Will calculate the expected anchor point for this bubble. |
-// Should only be used outside this class for tests. |
-- (NSPoint)getExpectedAnchorPoint; |
- |
-// Returns true if the browser has support for the location bar. |
-// Should only be used outside this class for tests. |
-- (bool)hasLocationBar; |
- |
-// Update |tableView_| when chooser options changed. |
-- (void)updateTableView; |
- |
-// Determines if the bubble has an anchor in a corner or no anchor at all. |
-- (info_bubble::BubbleArrowLocation)getExpectedArrowLocation; |
- |
-// Returns the expected parent for this bubble. |
-- (NSWindow*)getExpectedParentWindow; |
- |
-// Called when the "Connect" button is pressed. |
-- (void)onConnect:(id)sender; |
- |
-// Called when the "Cancel" button is pressed. |
-- (void)onCancel:(id)sender; |
- |
-@end |
- |
-@implementation ChooserBubbleUiController |
- |
-- (id)initWithBrowser:(Browser*)browser |
- chooserController:(std::unique_ptr<ChooserController>)chooserController |
- bridge:(ChooserBubbleUiCocoa*)bridge { |
- DCHECK(browser); |
- DCHECK(chooserController); |
- DCHECK(bridge); |
- |
- browser_ = browser; |
- |
- base::scoped_nsobject<InfoBubbleWindow> window([[InfoBubbleWindow alloc] |
- initWithContentRect:ui::kWindowSizeDeterminedLater |
- styleMask:NSBorderlessWindowMask |
- backing:NSBackingStoreBuffered |
- defer:NO]); |
- [window setAllowedAnimations:info_bubble::kAnimateNone]; |
- [window setReleasedWhenClosed:NO]; |
- if ((self = [super initWithWindow:window |
- parentWindow:[self getExpectedParentWindow] |
- anchoredAt:NSZeroPoint])) { |
- [self setShouldCloseOnResignKey:YES]; |
- [self setShouldOpenAsKeyWindow:YES]; |
- [[self bubble] setArrowLocation:[self getExpectedArrowLocation]]; |
- bridge_ = bridge; |
- NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; |
- [center addObserver:self |
- selector:@selector(parentWindowDidMove:) |
- name:NSWindowDidMoveNotification |
- object:[self getExpectedParentWindow]]; |
- |
- base::string16 chooserTitle = chooserController->GetTitle(); |
- deviceChooserContentView_.reset([[DeviceChooserContentViewCocoa alloc] |
- initWithChooserTitle:base::SysUTF16ToNSString(chooserTitle) |
- chooserController:std::move(chooserController)]); |
- |
- tableView_ = [deviceChooserContentView_ tableView]; |
- connectButton_ = [deviceChooserContentView_ connectButton]; |
- cancelButton_ = [deviceChooserContentView_ cancelButton]; |
- |
- [connectButton_ setTarget:self]; |
- [connectButton_ setAction:@selector(onConnect:)]; |
- [cancelButton_ setTarget:self]; |
- [cancelButton_ setAction:@selector(onCancel:)]; |
- [tableView_ setDelegate:self]; |
- [tableView_ setDataSource:self]; |
- |
- [[[self window] contentView] addSubview:deviceChooserContentView_.get()]; |
- } |
- |
- return self; |
-} |
- |
-- (void)windowWillClose:(NSNotification*)notification { |
- [[NSNotificationCenter defaultCenter] |
- removeObserver:self |
- name:NSWindowDidMoveNotification |
- object:nil]; |
- if (!buttonPressed_) |
- [deviceChooserContentView_ close]; |
- bridge_->OnBubbleClosing(); |
- [super windowWillClose:notification]; |
-} |
- |
-- (void)parentWindowWillToggleFullScreen:(NSNotification*)notification { |
- // Override the base class implementation, which would have closed the bubble. |
-} |
- |
-- (void)parentWindowDidResize:(NSNotification*)notification { |
- [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
-} |
- |
-- (void)parentWindowDidMove:(NSNotification*)notification { |
- DCHECK(bridge_); |
- [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
-} |
- |
-- (void)show { |
- NSRect bubbleFrame = |
- [[self window] frameRectForContentRect:[deviceChooserContentView_ frame]]; |
- if ([[self window] isVisible]) { |
- // Unfortunately, calling -setFrame followed by -setFrameOrigin (called |
- // within -setAnchorPoint) causes flickering. Avoid the flickering by |
- // manually adjusting the new frame's origin so that the top left stays the |
- // same, and only calling -setFrame. |
- NSRect currentWindowFrame = [[self window] frame]; |
- bubbleFrame.origin = currentWindowFrame.origin; |
- bubbleFrame.origin.y = bubbleFrame.origin.y + |
- currentWindowFrame.size.height - |
- bubbleFrame.size.height; |
- [[self window] setFrame:bubbleFrame display:YES]; |
- } else { |
- [[self window] setFrame:bubbleFrame display:NO]; |
- [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
- [self showWindow:nil]; |
- [[self window] makeFirstResponder:nil]; |
- [[self window] setInitialFirstResponder:tableView_]; |
- } |
-} |
- |
-- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView { |
- return [deviceChooserContentView_ numberOfOptions]; |
-} |
- |
-- (NSView*)tableView:(NSTableView*)tableView |
- viewForTableColumn:(NSTableColumn*)tableColumn |
- row:(NSInteger)row { |
- return [deviceChooserContentView_ createTableRowView:row].autorelease(); |
-} |
- |
-- (BOOL)tableView:(NSTableView*)aTableView |
- shouldEditTableColumn:(NSTableColumn*)aTableColumn |
- row:(NSInteger)rowIndex { |
- return NO; |
-} |
- |
-- (CGFloat)tableView:(NSTableView*)tableView heightOfRow:(NSInteger)row { |
- return [deviceChooserContentView_ tableRowViewHeight:row]; |
-} |
- |
-- (void)updateTableView { |
- [deviceChooserContentView_ updateTableView]; |
-} |
- |
-- (void)tableViewSelectionDidChange:(NSNotification*)aNotification { |
- [deviceChooserContentView_ updateContentRowColor]; |
- [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; |
-} |
- |
-// Selection changes (while the mouse button is still down). |
-- (void)tableViewSelectionIsChanging:(NSNotification*)aNotification { |
- [deviceChooserContentView_ updateContentRowColor]; |
- [connectButton_ setEnabled:[tableView_ numberOfSelectedRows] > 0]; |
-} |
- |
-- (void)updateAnchorPosition { |
- [self setParentWindow:[self getExpectedParentWindow]]; |
- [self setAnchorPoint:[self getExpectedAnchorPoint]]; |
-} |
- |
-- (NSPoint)getExpectedAnchorPoint { |
- NSPoint anchor; |
- if ([self hasLocationBar]) { |
- LocationBarViewMac* locationBar = |
- [[[self getExpectedParentWindow] windowController] locationBarBridge]; |
- anchor = locationBar->GetPageInfoBubblePoint(); |
- } else { |
- // Center the bubble if there's no location bar. |
- NSRect contentFrame = [[[self getExpectedParentWindow] contentView] frame]; |
- anchor = NSMakePoint(NSMidX(contentFrame), NSMaxY(contentFrame)); |
- } |
- |
- return ui::ConvertPointFromWindowToScreen([self getExpectedParentWindow], |
- anchor); |
-} |
- |
-- (bool)hasLocationBar { |
- return browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR); |
-} |
- |
-- (info_bubble::BubbleArrowLocation)getExpectedArrowLocation { |
- return [self hasLocationBar] ? info_bubble::kTopLeading |
- : info_bubble::kNoArrow; |
-} |
- |
-- (NSWindow*)getExpectedParentWindow { |
- DCHECK(browser_->window()); |
- return browser_->window()->GetNativeWindow(); |
-} |
- |
-+ (CGFloat)matchWidthsOf:(NSView*)viewA andOf:(NSView*)viewB { |
- NSRect frameA = [viewA frame]; |
- NSRect frameB = [viewB frame]; |
- CGFloat width = std::max(NSWidth(frameA), NSWidth(frameB)); |
- [viewA setFrameSize:NSMakeSize(width, NSHeight(frameA))]; |
- [viewB setFrameSize:NSMakeSize(width, NSHeight(frameB))]; |
- return width; |
-} |
- |
-+ (void)alignCenterOf:(NSView*)viewA verticallyToCenterOf:(NSView*)viewB { |
- NSRect frameA = [viewA frame]; |
- NSRect frameB = [viewB frame]; |
- frameA.origin.y = |
- NSMinY(frameB) + std::floor((NSHeight(frameB) - NSHeight(frameA)) / 2); |
- [viewA setFrameOrigin:frameA.origin]; |
-} |
- |
-- (void)onConnect:(id)sender { |
- buttonPressed_ = true; |
- [deviceChooserContentView_ accept]; |
- if (self.bubbleReference) |
- self.bubbleReference->CloseBubble(BUBBLE_CLOSE_ACCEPTED); |
- [self close]; |
-} |
- |
-- (void)onCancel:(id)sender { |
- buttonPressed_ = true; |
- [deviceChooserContentView_ cancel]; |
- if (self.bubbleReference) |
- self.bubbleReference->CloseBubble(BUBBLE_CLOSE_CANCELED); |
- [self close]; |
-} |
- |
-@end |
- |
-ChooserBubbleUiCocoa::ChooserBubbleUiCocoa( |
- Browser* browser, |
- std::unique_ptr<ChooserController> chooser_controller) |
- : browser_(browser), |
- chooser_bubble_ui_controller_(nil) { |
- DCHECK(browser_); |
- DCHECK(chooser_controller); |
- chooser_bubble_ui_controller_ = [[ChooserBubbleUiController alloc] |
- initWithBrowser:browser_ |
- chooserController:std::move(chooser_controller) |
- bridge:this]; |
-} |
- |
-ChooserBubbleUiCocoa::~ChooserBubbleUiCocoa() { |
- if (chooser_bubble_ui_controller_) { |
- [chooser_bubble_ui_controller_ close]; |
- chooser_bubble_ui_controller_ = nil; |
- } |
-} |
- |
-void ChooserBubbleUiCocoa::Show(BubbleReference bubble_reference) { |
- [chooser_bubble_ui_controller_ setBubbleReference:bubble_reference]; |
- [chooser_bubble_ui_controller_ show]; |
- [chooser_bubble_ui_controller_ updateTableView]; |
-} |
- |
-void ChooserBubbleUiCocoa::Close() { |
- if (chooser_bubble_ui_controller_) { |
- [chooser_bubble_ui_controller_ close]; |
- chooser_bubble_ui_controller_ = nil; |
- } |
-} |
- |
-void ChooserBubbleUiCocoa::UpdateAnchorPosition() { |
- if (chooser_bubble_ui_controller_) |
- [chooser_bubble_ui_controller_ updateAnchorPosition]; |
-} |
- |
-void ChooserBubbleUiCocoa::OnBubbleClosing() { |
- chooser_bubble_ui_controller_ = nil; |
-} |