Index: chrome/browser/ui/cocoa/panels/panel_cocoa.mm |
diff --git a/chrome/browser/ui/cocoa/panels/panel_cocoa.mm b/chrome/browser/ui/cocoa/panels/panel_cocoa.mm |
deleted file mode 100644 |
index 51410476c0507df50d11b92863751ae8bfc86854..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/panels/panel_cocoa.mm |
+++ /dev/null |
@@ -1,455 +0,0 @@ |
-// Copyright (c) 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. |
- |
-#include "chrome/browser/ui/cocoa/panels/panel_cocoa.h" |
- |
-#include "base/logging.h" |
-#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h" |
-#import "chrome/browser/ui/cocoa/panels/panel_titlebar_view_cocoa.h" |
-#import "chrome/browser/ui/cocoa/panels/panel_utils_cocoa.h" |
-#import "chrome/browser/ui/cocoa/panels/panel_window_controller_cocoa.h" |
-#include "chrome/browser/ui/panels/panel.h" |
-#include "chrome/browser/ui/panels/stacked_panel_collection.h" |
-#include "content/public/browser/native_web_keyboard_event.h" |
- |
-using content::NativeWebKeyboardEvent; |
-using content::WebContents; |
- |
-// This creates a shim window class, which in turn creates a Cocoa window |
-// controller which in turn creates actual NSWindow by loading a nib. |
-// Overall chain of ownership is: |
-// PanelWindowControllerCocoa -> PanelCocoa -> Panel. |
-// static |
-NativePanel* Panel::CreateNativePanel(Panel* panel, |
- const gfx::Rect& bounds, |
- bool always_on_top) { |
- return new PanelCocoa(panel, bounds, always_on_top); |
-} |
- |
-PanelCocoa::PanelCocoa(Panel* panel, |
- const gfx::Rect& bounds, |
- bool always_on_top) |
- : panel_(panel), |
- bounds_(bounds), |
- always_on_top_(always_on_top), |
- is_shown_(false), |
- attention_request_id_(0), |
- corner_style_(panel::ALL_ROUNDED) { |
- controller_ = [[PanelWindowControllerCocoa alloc] initWithPanel:this]; |
-} |
- |
-PanelCocoa::~PanelCocoa() { |
-} |
- |
-bool PanelCocoa::IsClosed() const { |
- return !controller_; |
-} |
- |
-void PanelCocoa::ShowPanel() { |
- ShowPanelInactive(); |
- ActivatePanel(); |
- |
- // |-makeKeyAndOrderFront:| won't send |-windowDidBecomeKey:| until we |
- // return to the runloop. This causes extension tests that wait for the |
- // active status change notification to fail, so we send an active status |
- // notification here. |
- panel_->OnActiveStateChanged(true); |
-} |
- |
-void PanelCocoa::ShowPanelInactive() { |
- if (IsClosed()) |
- return; |
- |
- // This method may be called several times, meaning 'ensure it's shown'. |
- // Animations don't look good when repeated - hence this flag is needed. |
- if (is_shown_) { |
- return; |
- } |
- // A call to SetPanelBounds() before showing it is required to set |
- // the panel frame properly. |
- SetPanelBoundsInstantly(bounds_); |
- is_shown_ = true; |
- |
- NSRect finalFrame = cocoa_utils::ConvertRectToCocoaCoordinates(bounds_); |
- [controller_ revealAnimatedWithFrame:finalFrame]; |
-} |
- |
-gfx::Rect PanelCocoa::GetPanelBounds() const { |
- return bounds_; |
-} |
- |
-// |bounds| is the platform-independent screen coordinates, with (0,0) at |
-// top-left of the primary screen. |
-void PanelCocoa::SetPanelBounds(const gfx::Rect& bounds) { |
- setBoundsInternal(bounds, true); |
-} |
- |
-void PanelCocoa::SetPanelBoundsInstantly(const gfx::Rect& bounds) { |
- setBoundsInternal(bounds, false); |
-} |
- |
-void PanelCocoa::setBoundsInternal(const gfx::Rect& bounds, bool animate) { |
- // We will call SetPanelBoundsInstantly() once before showing the panel |
- // and it should set the panel frame correctly. |
- if (bounds_ == bounds && is_shown_) |
- return; |
- |
- bounds_ = bounds; |
- |
- // Safely ignore calls to animate bounds before the panel is shown to |
- // prevent the window from loading prematurely. |
- if (animate && !is_shown_) |
- return; |
- |
- NSRect frame = cocoa_utils::ConvertRectToCocoaCoordinates(bounds); |
- [controller_ setPanelFrame:frame animate:animate]; |
-} |
- |
-void PanelCocoa::ClosePanel() { |
- if (IsClosed()) |
- return; |
- |
- NSWindow* window = [controller_ window]; |
- // performClose: contains a nested message loop which can cause reentrancy |
- // if the browser is terminating and closing all the windows. |
- // Use this version that corresponds to protocol of performClose: but does not |
- // spin a nested loop. |
- // TODO(dimich): refactor similar method from BWC and reuse here. |
- if ([controller_ windowShouldClose:window]) { |
- // Make sure that the panel window is not associated with the underlying |
- // stack window because otherwise hiding the panel window could cause all |
- // other panel windows in the same stack to disappear. |
- NSWindow* stackWindow = [window parentWindow]; |
- if (stackWindow) |
- [stackWindow removeChildWindow:window]; |
- |
- [window orderOut:nil]; |
- [window close]; |
- } |
-} |
- |
-void PanelCocoa::ActivatePanel() { |
- if (!is_shown_) |
- return; |
- |
- [controller_ activate]; |
-} |
- |
-void PanelCocoa::DeactivatePanel() { |
- [controller_ deactivate]; |
-} |
- |
-bool PanelCocoa::IsPanelActive() const { |
- // TODO(dcheng): It seems like a lot of these methods can be called before |
- // our NSWindow is created. Do we really need to check in every one of these |
- // methods if the NSWindow is created, or is there a better way to |
- // gracefully handle this? |
- if (!is_shown_) |
- return false; |
- return [[controller_ window] isMainWindow]; |
-} |
- |
-void PanelCocoa::PreventActivationByOS(bool prevent_activation) { |
- [controller_ preventBecomingKeyWindow:prevent_activation]; |
- return; |
-} |
- |
-gfx::NativeWindow PanelCocoa::GetNativePanelWindow() { |
- return [controller_ window]; |
-} |
- |
-void PanelCocoa::UpdatePanelTitleBar() { |
- if (!is_shown_) |
- return; |
- [controller_ updateTitleBar]; |
-} |
- |
-void PanelCocoa::UpdatePanelLoadingAnimations(bool should_animate) { |
- [controller_ updateThrobber:should_animate]; |
-} |
- |
-void PanelCocoa::PanelCut() { |
- // Nothing to do since we do not have panel-specific system menu on Mac. |
-} |
- |
-void PanelCocoa::PanelCopy() { |
- // Nothing to do since we do not have panel-specific system menu on Mac. |
-} |
- |
-void PanelCocoa::PanelPaste() { |
- // Nothing to do since we do not have panel-specific system menu on Mac. |
-} |
- |
-void PanelCocoa::DrawAttention(bool draw_attention) { |
- DCHECK((panel_->attention_mode() & Panel::USE_PANEL_ATTENTION) != 0); |
- |
- PanelTitlebarViewCocoa* titlebar = [controller_ titlebarView]; |
- if (draw_attention) |
- [titlebar drawAttention]; |
- else |
- [titlebar stopDrawingAttention]; |
- |
- if ((panel_->attention_mode() & Panel::USE_SYSTEM_ATTENTION) != 0) { |
- if (draw_attention) { |
- DCHECK(!attention_request_id_); |
- attention_request_id_ = [NSApp requestUserAttention:NSCriticalRequest]; |
- } else { |
- [NSApp cancelUserAttentionRequest:attention_request_id_]; |
- attention_request_id_ = 0; |
- } |
- } |
-} |
- |
-bool PanelCocoa::IsDrawingAttention() const { |
- PanelTitlebarViewCocoa* titlebar = [controller_ titlebarView]; |
- return [titlebar isDrawingAttention]; |
-} |
- |
-void PanelCocoa::HandlePanelKeyboardEvent( |
- const NativeWebKeyboardEvent& event) { |
- if (event.skip_in_browser || event.type == NativeWebKeyboardEvent::Char) |
- return; |
- |
- ChromeEventProcessingWindow* event_window = |
- static_cast<ChromeEventProcessingWindow*>([controller_ window]); |
- DCHECK([event_window isKindOfClass:[ChromeEventProcessingWindow class]]); |
- [event_window redispatchKeyEvent:event.os_event]; |
-} |
- |
-void PanelCocoa::FullScreenModeChanged(bool is_full_screen) { |
- if (!is_shown_) { |
- // If the panel window is not shown due to that a Chrome tab window is in |
- // fullscreen mode when the panel is being created, we need to show the |
- // panel window now. In addition, its titlebar needs to be updated since it |
- // is not done at the panel creation time. |
- if (!is_full_screen) { |
- ShowPanelInactive(); |
- UpdatePanelTitleBar(); |
- } |
- |
- // No need to proceed when the panel window was not shown previously. |
- // We either show the panel window or do not show it depending on current |
- // full screen state. |
- return; |
- } |
- [controller_ fullScreenModeChanged:is_full_screen]; |
-} |
- |
-bool PanelCocoa::IsPanelAlwaysOnTop() const { |
- return always_on_top_; |
-} |
- |
-void PanelCocoa::SetPanelAlwaysOnTop(bool on_top) { |
- if (always_on_top_ == on_top) |
- return; |
- always_on_top_ = on_top; |
- [controller_ updateWindowLevel]; |
- [controller_ updateWindowCollectionBehavior]; |
-} |
- |
-void PanelCocoa::UpdatePanelMinimizeRestoreButtonVisibility() { |
- [controller_ updateTitleBarMinimizeRestoreButtonVisibility]; |
-} |
- |
-void PanelCocoa::SetWindowCornerStyle(panel::CornerStyle corner_style) { |
- corner_style_ = corner_style; |
- |
- // TODO(dimich): investigate how to support it on Mac. |
-} |
- |
-void PanelCocoa::MinimizePanelBySystem() { |
- [controller_ miniaturize]; |
-} |
- |
-bool PanelCocoa::IsPanelMinimizedBySystem() const { |
- return [controller_ isMiniaturized]; |
-} |
- |
-bool PanelCocoa::IsPanelShownOnActiveDesktop() const { |
- return [[controller_ window] isOnActiveSpace]; |
-} |
- |
-void PanelCocoa::ShowShadow(bool show) { |
- [controller_ showShadow:show]; |
-} |
- |
-void PanelCocoa::PanelExpansionStateChanging( |
- Panel::ExpansionState old_state, Panel::ExpansionState new_state) { |
- [controller_ updateWindowLevel:(new_state != Panel::EXPANDED)]; |
-} |
- |
-void PanelCocoa::AttachWebContents(content::WebContents* contents) { |
- [controller_ webContentsInserted:contents]; |
-} |
- |
-void PanelCocoa::DetachWebContents(content::WebContents* contents) { |
- [controller_ webContentsDetached:contents]; |
-} |
- |
-gfx::Size PanelCocoa::WindowSizeFromContentSize( |
- const gfx::Size& content_size) const { |
- NSRect content = NSMakeRect(0, 0, |
- content_size.width(), content_size.height()); |
- NSRect frame = [controller_ frameRectForContentRect:content]; |
- return gfx::Size(NSWidth(frame), NSHeight(frame)); |
-} |
- |
-gfx::Size PanelCocoa::ContentSizeFromWindowSize( |
- const gfx::Size& window_size) const { |
- NSRect frame = NSMakeRect(0, 0, window_size.width(), window_size.height()); |
- NSRect content = [controller_ contentRectForFrameRect:frame]; |
- return gfx::Size(NSWidth(content), NSHeight(content)); |
-} |
- |
-int PanelCocoa::TitleOnlyHeight() const { |
- return [controller_ titlebarHeightInScreenCoordinates]; |
-} |
- |
-Panel* PanelCocoa::panel() const { |
- return panel_.get(); |
-} |
- |
-void PanelCocoa::DidCloseNativeWindow() { |
- DCHECK(!IsClosed()); |
- controller_ = NULL; |
- panel_->OnNativePanelClosed(); |
-} |
- |
-// NativePanelTesting implementation. |
-class CocoaNativePanelTesting : public NativePanelTesting { |
- public: |
- CocoaNativePanelTesting(NativePanel* native_panel); |
- ~CocoaNativePanelTesting() override {} |
- // Overridden from NativePanelTesting |
- void PressLeftMouseButtonTitlebar(const gfx::Point& mouse_location, |
- panel::ClickModifier modifier) override; |
- void ReleaseMouseButtonTitlebar(panel::ClickModifier modifier) override; |
- void DragTitlebar(const gfx::Point& mouse_location) override; |
- void CancelDragTitlebar() override; |
- void FinishDragTitlebar() override; |
- bool VerifyDrawingAttention() const override; |
- bool VerifyActiveState(bool is_active) override; |
- bool VerifyAppIcon() const override; |
- bool VerifySystemMinimizeState() const override; |
- bool IsWindowVisible() const override; |
- bool IsWindowSizeKnown() const override; |
- bool IsAnimatingBounds() const override; |
- bool IsButtonVisible(panel::TitlebarButtonType button_type) const override; |
- panel::CornerStyle GetWindowCornerStyle() const override; |
- bool EnsureApplicationRunOnForeground() override; |
- |
- private: |
- PanelTitlebarViewCocoa* titlebar() const; |
- // Weak, assumed always to outlive this test API object. |
- PanelCocoa* native_panel_window_; |
-}; |
- |
-NativePanelTesting* PanelCocoa::CreateNativePanelTesting() { |
- return new CocoaNativePanelTesting(this); |
-} |
- |
-CocoaNativePanelTesting::CocoaNativePanelTesting(NativePanel* native_panel) |
- : native_panel_window_(static_cast<PanelCocoa*>(native_panel)) { |
-} |
- |
-PanelTitlebarViewCocoa* CocoaNativePanelTesting::titlebar() const { |
- return [native_panel_window_->controller_ titlebarView]; |
-} |
- |
-void CocoaNativePanelTesting::PressLeftMouseButtonTitlebar( |
- const gfx::Point& mouse_location, panel::ClickModifier modifier) { |
- // Convert from platform-indepedent screen coordinates to Cocoa's screen |
- // coordinates because PanelTitlebarViewCocoa method takes Cocoa's screen |
- // coordinates. |
- int modifierFlags = |
- (modifier == panel::APPLY_TO_ALL ? NSShiftKeyMask : 0); |
- [titlebar() pressLeftMouseButtonTitlebar: |
- cocoa_utils::ConvertPointToCocoaCoordinates(mouse_location) |
- modifiers:modifierFlags]; |
-} |
- |
-void CocoaNativePanelTesting::ReleaseMouseButtonTitlebar( |
- panel::ClickModifier modifier) { |
- int modifierFlags = |
- (modifier == panel::APPLY_TO_ALL ? NSShiftKeyMask : 0); |
- [titlebar() releaseLeftMouseButtonTitlebar:modifierFlags]; |
-} |
- |
-void CocoaNativePanelTesting::DragTitlebar(const gfx::Point& mouse_location) { |
- // Convert from platform-indepedent screen coordinates to Cocoa's screen |
- // coordinates because PanelTitlebarViewCocoa method takes Cocoa's screen |
- // coordinates. |
- [titlebar() dragTitlebar: |
- cocoa_utils::ConvertPointToCocoaCoordinates(mouse_location)]; |
-} |
- |
-void CocoaNativePanelTesting::CancelDragTitlebar() { |
- [titlebar() cancelDragTitlebar]; |
-} |
- |
-void CocoaNativePanelTesting::FinishDragTitlebar() { |
- [titlebar() finishDragTitlebar]; |
-} |
- |
-bool CocoaNativePanelTesting::VerifyDrawingAttention() const { |
- return [titlebar() isDrawingAttention]; |
-} |
- |
-bool CocoaNativePanelTesting::VerifyActiveState(bool is_active) { |
- // TODO(jianli): to be implemented. |
- return false; |
-} |
- |
-bool CocoaNativePanelTesting::VerifyAppIcon() const { |
- // Nothing to do since panel does not show dock icon. |
- return true; |
-} |
- |
-bool CocoaNativePanelTesting::VerifySystemMinimizeState() const { |
- // TODO(jianli): to be implemented. |
- return true; |
-} |
- |
-bool CocoaNativePanelTesting::IsWindowVisible() const { |
- return [[native_panel_window_->controller_ window] isVisible]; |
-} |
- |
-bool CocoaNativePanelTesting::IsWindowSizeKnown() const { |
- return true; |
-} |
- |
-bool CocoaNativePanelTesting::IsAnimatingBounds() const { |
- if ([native_panel_window_->controller_ isAnimatingBounds]) |
- return true; |
- StackedPanelCollection* stack = native_panel_window_->panel()->stack(); |
- if (!stack) |
- return false; |
- return stack->IsAnimatingPanelBounds(native_panel_window_->panel()); |
-} |
- |
-bool CocoaNativePanelTesting::IsButtonVisible( |
- panel::TitlebarButtonType button_type) const { |
- switch (button_type) { |
- case panel::CLOSE_BUTTON: |
- return ![[titlebar() closeButton] isHidden]; |
- case panel::MINIMIZE_BUTTON: |
- return ![[titlebar() minimizeButton] isHidden]; |
- case panel::RESTORE_BUTTON: |
- return ![[titlebar() restoreButton] isHidden]; |
- default: |
- NOTREACHED(); |
- } |
- return false; |
-} |
- |
-panel::CornerStyle CocoaNativePanelTesting::GetWindowCornerStyle() const { |
- return native_panel_window_->corner_style_; |
-} |
- |
-bool CocoaNativePanelTesting::EnsureApplicationRunOnForeground() { |
- if ([NSApp isActive]) |
- return true; |
- [NSApp activateIgnoringOtherApps:YES]; |
- return [NSApp isActive]; |
-} |