| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/panels/panel_browser_window_cocoa.h" | 5 #include "chrome/browser/ui/panels/panel_browser_window_cocoa.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "chrome/browser/tabs/tab_strip_model.h" | 8 #include "chrome/browser/tabs/tab_strip_model.h" |
| 9 #include "chrome/browser/ui/browser.h" | 9 #include "chrome/browser/ui/browser.h" |
| 10 #include "chrome/browser/ui/browser_list.h" | 10 #include "chrome/browser/ui/browser_list.h" |
| 11 #include "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h" | 11 #include "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h" |
| 12 #import "chrome/browser/ui/cocoa/browser_window_utils.h" | 12 #import "chrome/browser/ui/cocoa/browser_window_utils.h" |
| 13 #include "chrome/browser/ui/panels/panel.h" | 13 #include "chrome/browser/ui/panels/panel.h" |
| 14 #include "chrome/browser/ui/panels/panel_manager.h" | 14 #include "chrome/browser/ui/panels/panel_manager.h" |
| 15 #import "chrome/browser/ui/panels/panel_titlebar_view_cocoa.h" | 15 #import "chrome/browser/ui/panels/panel_titlebar_view_cocoa.h" |
| 16 #import "chrome/browser/ui/panels/panel_utils_cocoa.h" |
| 16 #import "chrome/browser/ui/panels/panel_window_controller_cocoa.h" | 17 #import "chrome/browser/ui/panels/panel_window_controller_cocoa.h" |
| 17 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 18 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 18 #include "content/public/browser/native_web_keyboard_event.h" | 19 #include "content/public/browser/native_web_keyboard_event.h" |
| 19 | 20 |
| 20 using content::WebContents; | 21 using content::WebContents; |
| 21 | 22 |
| 22 namespace { | 23 namespace { |
| 23 | 24 |
| 24 // Use this instead of 0 for minimum size of a window when doing opening and | 25 // Use this instead of 0 for minimum size of a window when doing opening and |
| 25 // closing animations, since OSX window manager does not like 0-sized windows | 26 // closing animations, since OSX window manager does not like 0-sized windows |
| 26 // (according to avi@). | 27 // (according to avi@). |
| 27 const int kMinimumWindowSize = 1; | 28 const int kMinimumWindowSize = 1; |
| 28 | 29 |
| 29 // TODO(dcheng): Move elsewhere so BrowserWindowCocoa can use them too. | |
| 30 // Converts global screen coordinates in platfrom-independent coordinates | |
| 31 // (with the (0,0) in the top-left corner of the primary screen) to the Cocoa | |
| 32 // screen coordinates (with (0,0) in the low-left corner). | |
| 33 NSRect ConvertCoordinatesToCocoa(const gfx::Rect& bounds) { | |
| 34 // Flip coordinates based on the primary screen. | |
| 35 NSScreen* screen = [[NSScreen screens] objectAtIndex:0]; | |
| 36 | |
| 37 return NSMakeRect( | |
| 38 bounds.x(), NSHeight([screen frame]) - bounds.height() - bounds.y(), | |
| 39 bounds.width(), bounds.height()); | |
| 40 } | |
| 41 | |
| 42 } // namespace | 30 } // namespace |
| 43 | 31 |
| 44 // This creates a shim window class, which in turn creates a Cocoa window | 32 // This creates a shim window class, which in turn creates a Cocoa window |
| 45 // controller which in turn creates actual NSWindow by loading a nib. | 33 // controller which in turn creates actual NSWindow by loading a nib. |
| 46 // Overall chain of ownership is: | 34 // Overall chain of ownership is: |
| 47 // PanelWindowControllerCocoa -> PanelBrowserWindowCocoa -> Panel. | 35 // PanelWindowControllerCocoa -> PanelBrowserWindowCocoa -> Panel. |
| 48 NativePanel* Panel::CreateNativePanel(Browser* browser, Panel* panel, | 36 NativePanel* Panel::CreateNativePanel(Browser* browser, Panel* panel, |
| 49 const gfx::Rect& bounds) { | 37 const gfx::Rect& bounds) { |
| 50 return new PanelBrowserWindowCocoa(browser, panel, bounds); | 38 return new PanelBrowserWindowCocoa(browser, panel, bounds); |
| 51 } | 39 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 // Browser calls this several times, meaning 'ensure it's shown'. | 78 // Browser calls this several times, meaning 'ensure it's shown'. |
| 91 // Animations don't look good when repeated - hence this flag is needed. | 79 // Animations don't look good when repeated - hence this flag is needed. |
| 92 if (is_shown_) { | 80 if (is_shown_) { |
| 93 return; | 81 return; |
| 94 } | 82 } |
| 95 // A call to SetPanelBounds() before showing it is required to set | 83 // A call to SetPanelBounds() before showing it is required to set |
| 96 // the panel frame properly. | 84 // the panel frame properly. |
| 97 SetPanelBoundsInstantly(bounds_); | 85 SetPanelBoundsInstantly(bounds_); |
| 98 is_shown_ = true; | 86 is_shown_ = true; |
| 99 | 87 |
| 100 NSRect finalFrame = ConvertCoordinatesToCocoa(bounds_); | 88 NSRect finalFrame = cocoa_utils::ConvertRectToCocoaCoordinates(bounds_); |
| 101 [controller_ revealAnimatedWithFrame:finalFrame]; | 89 [controller_ revealAnimatedWithFrame:finalFrame]; |
| 102 } | 90 } |
| 103 | 91 |
| 104 gfx::Rect PanelBrowserWindowCocoa::GetPanelBounds() const { | 92 gfx::Rect PanelBrowserWindowCocoa::GetPanelBounds() const { |
| 105 return bounds_; | 93 return bounds_; |
| 106 } | 94 } |
| 107 | 95 |
| 108 // |bounds| is the platform-independent screen coordinates, with (0,0) at | 96 // |bounds| is the platform-independent screen coordinates, with (0,0) at |
| 109 // top-left of the primary screen. | 97 // top-left of the primary screen. |
| 110 void PanelBrowserWindowCocoa::SetPanelBounds(const gfx::Rect& bounds) { | 98 void PanelBrowserWindowCocoa::SetPanelBounds(const gfx::Rect& bounds) { |
| 111 setBoundsInternal(bounds, true); | 99 setBoundsInternal(bounds, true); |
| 112 } | 100 } |
| 113 | 101 |
| 114 void PanelBrowserWindowCocoa::SetPanelBoundsInstantly(const gfx::Rect& bounds) { | 102 void PanelBrowserWindowCocoa::SetPanelBoundsInstantly(const gfx::Rect& bounds) { |
| 115 setBoundsInternal(bounds, false); | 103 setBoundsInternal(bounds, false); |
| 116 } | 104 } |
| 117 | 105 |
| 118 void PanelBrowserWindowCocoa::setBoundsInternal(const gfx::Rect& bounds, | 106 void PanelBrowserWindowCocoa::setBoundsInternal(const gfx::Rect& bounds, |
| 119 bool animate) { | 107 bool animate) { |
| 120 // We will call SetPanelBoundsInstantly() once before showing the panel | 108 // We will call SetPanelBoundsInstantly() once before showing the panel |
| 121 // and it should set the panel frame correctly. | 109 // and it should set the panel frame correctly. |
| 122 if (bounds_ == bounds && is_shown_) | 110 if (bounds_ == bounds && is_shown_) |
| 123 return; | 111 return; |
| 124 | 112 |
| 125 bounds_ = bounds; | 113 bounds_ = bounds; |
| 126 | 114 |
| 127 NSRect frame = ConvertCoordinatesToCocoa(bounds); | 115 NSRect frame = cocoa_utils::ConvertRectToCocoaCoordinates(bounds); |
| 128 [controller_ setPanelFrame:frame animate:animate]; | 116 [controller_ setPanelFrame:frame animate:animate]; |
| 129 } | 117 } |
| 130 | 118 |
| 131 void PanelBrowserWindowCocoa::ClosePanel() { | 119 void PanelBrowserWindowCocoa::ClosePanel() { |
| 132 if (isClosed()) | 120 if (isClosed()) |
| 133 return; | 121 return; |
| 134 | 122 |
| 135 NSWindow* window = [controller_ window]; | 123 NSWindow* window = [controller_ window]; |
| 136 [window performClose:controller_]; | 124 [window performClose:controller_]; |
| 137 } | 125 } |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 int index) { | 296 int index) { |
| 309 [controller_ tabDetached:contents->web_contents()]; | 297 [controller_ tabDetached:contents->web_contents()]; |
| 310 } | 298 } |
| 311 | 299 |
| 312 // NativePanelTesting implementation. | 300 // NativePanelTesting implementation. |
| 313 class NativePanelTestingCocoa : public NativePanelTesting { | 301 class NativePanelTestingCocoa : public NativePanelTesting { |
| 314 public: | 302 public: |
| 315 NativePanelTestingCocoa(NativePanel* native_panel); | 303 NativePanelTestingCocoa(NativePanel* native_panel); |
| 316 virtual ~NativePanelTestingCocoa() { } | 304 virtual ~NativePanelTestingCocoa() { } |
| 317 // Overridden from NativePanelTesting | 305 // Overridden from NativePanelTesting |
| 318 virtual void PressLeftMouseButtonTitlebar(const gfx::Point& point) OVERRIDE; | 306 virtual void PressLeftMouseButtonTitlebar( |
| 307 const gfx::Point& mouse_location) OVERRIDE; |
| 319 virtual void ReleaseMouseButtonTitlebar() OVERRIDE; | 308 virtual void ReleaseMouseButtonTitlebar() OVERRIDE; |
| 320 virtual void DragTitlebar(int delta_x, int delta_y) OVERRIDE; | 309 virtual void DragTitlebar(const gfx::Point& mouse_location) OVERRIDE; |
| 321 virtual void CancelDragTitlebar() OVERRIDE; | 310 virtual void CancelDragTitlebar() OVERRIDE; |
| 322 virtual void FinishDragTitlebar() OVERRIDE; | 311 virtual void FinishDragTitlebar() OVERRIDE; |
| 323 virtual bool VerifyDrawingAttention() const OVERRIDE; | 312 virtual bool VerifyDrawingAttention() const OVERRIDE; |
| 324 virtual bool VerifyActiveState(bool is_active) OVERRIDE; | 313 virtual bool VerifyActiveState(bool is_active) OVERRIDE; |
| 325 virtual bool IsWindowSizeKnown() const OVERRIDE; | 314 virtual bool IsWindowSizeKnown() const OVERRIDE; |
| 326 virtual bool IsAnimatingBounds() const OVERRIDE; | 315 virtual bool IsAnimatingBounds() const OVERRIDE; |
| 327 | 316 |
| 328 private: | 317 private: |
| 329 PanelTitlebarViewCocoa* titlebar() const; | 318 PanelTitlebarViewCocoa* titlebar() const; |
| 330 // Weak, assumed always to outlive this test API object. | 319 // Weak, assumed always to outlive this test API object. |
| 331 PanelBrowserWindowCocoa* native_panel_window_; | 320 PanelBrowserWindowCocoa* native_panel_window_; |
| 332 }; | 321 }; |
| 333 | 322 |
| 334 // static | 323 // static |
| 335 NativePanelTesting* NativePanelTesting::Create(NativePanel* native_panel) { | 324 NativePanelTesting* NativePanelTesting::Create(NativePanel* native_panel) { |
| 336 return new NativePanelTestingCocoa(native_panel); | 325 return new NativePanelTestingCocoa(native_panel); |
| 337 } | 326 } |
| 338 | 327 |
| 339 NativePanelTestingCocoa::NativePanelTestingCocoa(NativePanel* native_panel) | 328 NativePanelTestingCocoa::NativePanelTestingCocoa(NativePanel* native_panel) |
| 340 : native_panel_window_(static_cast<PanelBrowserWindowCocoa*>(native_panel)) { | 329 : native_panel_window_(static_cast<PanelBrowserWindowCocoa*>(native_panel)) { |
| 341 } | 330 } |
| 342 | 331 |
| 343 PanelTitlebarViewCocoa* NativePanelTestingCocoa::titlebar() const { | 332 PanelTitlebarViewCocoa* NativePanelTestingCocoa::titlebar() const { |
| 344 return [native_panel_window_->controller_ titlebarView]; | 333 return [native_panel_window_->controller_ titlebarView]; |
| 345 } | 334 } |
| 346 | 335 |
| 347 void NativePanelTestingCocoa::PressLeftMouseButtonTitlebar( | 336 void NativePanelTestingCocoa::PressLeftMouseButtonTitlebar( |
| 348 const gfx::Point& point) { | 337 const gfx::Point& mouse_location) { |
| 349 [titlebar() pressLeftMouseButtonTitlebar]; | 338 [titlebar() pressLeftMouseButtonTitlebar: |
| 339 cocoa_utils::ConvertPointToCocoaCoordinates(mouse_location)]; |
| 350 } | 340 } |
| 351 | 341 |
| 352 void NativePanelTestingCocoa::ReleaseMouseButtonTitlebar() { | 342 void NativePanelTestingCocoa::ReleaseMouseButtonTitlebar() { |
| 353 [titlebar() releaseLeftMouseButtonTitlebar]; | 343 [titlebar() releaseLeftMouseButtonTitlebar]; |
| 354 } | 344 } |
| 355 | 345 |
| 356 void NativePanelTestingCocoa::DragTitlebar(int delta_x, int delta_y) { | 346 void NativePanelTestingCocoa::DragTitlebar(const gfx::Point& mouse_location) { |
| 357 [titlebar() dragTitlebarDeltaX:delta_x deltaY:delta_y]; | 347 [titlebar() dragTitlebar:ConvertPointToCocoaCoordinates(mouse_location)]; |
| 358 } | 348 } |
| 359 | 349 |
| 360 void NativePanelTestingCocoa::CancelDragTitlebar() { | 350 void NativePanelTestingCocoa::CancelDragTitlebar() { |
| 361 [titlebar() cancelDragTitlebar]; | 351 [titlebar() cancelDragTitlebar]; |
| 362 } | 352 } |
| 363 | 353 |
| 364 void NativePanelTestingCocoa::FinishDragTitlebar() { | 354 void NativePanelTestingCocoa::FinishDragTitlebar() { |
| 365 [titlebar() finishDragTitlebar]; | 355 [titlebar() finishDragTitlebar]; |
| 366 } | 356 } |
| 367 | 357 |
| 368 bool NativePanelTestingCocoa::VerifyDrawingAttention() const { | 358 bool NativePanelTestingCocoa::VerifyDrawingAttention() const { |
| 369 return [titlebar() isDrawingAttention]; | 359 return [titlebar() isDrawingAttention]; |
| 370 } | 360 } |
| 371 | 361 |
| 372 bool NativePanelTestingCocoa::VerifyActiveState(bool is_active) { | 362 bool NativePanelTestingCocoa::VerifyActiveState(bool is_active) { |
| 373 // TODO(jianli): to be implemented. | 363 // TODO(jianli): to be implemented. |
| 374 return false; | 364 return false; |
| 375 } | 365 } |
| 376 | 366 |
| 377 bool NativePanelTestingCocoa::IsWindowSizeKnown() const { | 367 bool NativePanelTestingCocoa::IsWindowSizeKnown() const { |
| 378 return true; | 368 return true; |
| 379 } | 369 } |
| 380 | 370 |
| 381 bool NativePanelTestingCocoa::IsAnimatingBounds() const { | 371 bool NativePanelTestingCocoa::IsAnimatingBounds() const { |
| 382 return [native_panel_window_->controller_ isAnimatingBounds]; | 372 return [native_panel_window_->controller_ isAnimatingBounds]; |
| 383 } | 373 } |
| OLD | NEW |