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/views/constrained_window_views.h" | 5 #include "chrome/browser/ui/views/constrained_window_views.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 | 162 |
163 DISALLOW_COPY_AND_ASSIGN(VistaWindowResources); | 163 DISALLOW_COPY_AND_ASSIGN(VistaWindowResources); |
164 }; | 164 }; |
165 | 165 |
166 gfx::ImageSkia* XPWindowResources::images_[]; | 166 gfx::ImageSkia* XPWindowResources::images_[]; |
167 gfx::ImageSkia* VistaWindowResources::images_[]; | 167 gfx::ImageSkia* VistaWindowResources::images_[]; |
168 | 168 |
169 class ConstrainedWindowFrameView : public views::NonClientFrameView, | 169 class ConstrainedWindowFrameView : public views::NonClientFrameView, |
170 public views::ButtonListener { | 170 public views::ButtonListener { |
171 public: | 171 public: |
172 explicit ConstrainedWindowFrameView(ConstrainedWindowViews* container); | 172 ConstrainedWindowFrameView(ConstrainedWindowViews* container, |
| 173 bool browser_is_off_the_record); |
173 virtual ~ConstrainedWindowFrameView(); | 174 virtual ~ConstrainedWindowFrameView(); |
174 | 175 |
175 void UpdateWindowTitle(); | 176 void UpdateWindowTitle(); |
176 | 177 |
177 // Overridden from views::NonClientFrameView: | 178 // Overridden from views::NonClientFrameView: |
178 virtual gfx::Rect GetBoundsForClientView() const OVERRIDE; | 179 virtual gfx::Rect GetBoundsForClientView() const OVERRIDE; |
179 virtual gfx::Rect GetWindowBoundsForClientBounds( | 180 virtual gfx::Rect GetWindowBoundsForClientBounds( |
180 const gfx::Rect& client_bounds) const OVERRIDE; | 181 const gfx::Rect& client_bounds) const OVERRIDE; |
181 virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE; | 182 virtual int NonClientHitTest(const gfx::Point& point) OVERRIDE; |
182 virtual void GetWindowMask(const gfx::Size& size, | 183 virtual void GetWindowMask(const gfx::Size& size, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 void PaintClientEdge(gfx::Canvas* canvas); | 219 void PaintClientEdge(gfx::Canvas* canvas); |
219 | 220 |
220 // Layout various sub-components of this view. | 221 // Layout various sub-components of this view. |
221 void LayoutWindowControls(); | 222 void LayoutWindowControls(); |
222 void LayoutTitleBar(); | 223 void LayoutTitleBar(); |
223 | 224 |
224 // Returns the bounds of the client area for the specified view size. | 225 // Returns the bounds of the client area for the specified view size. |
225 gfx::Rect CalculateClientAreaBounds(int width, int height) const; | 226 gfx::Rect CalculateClientAreaBounds(int width, int height) const; |
226 | 227 |
227 SkColor GetTitleColor() const { | 228 SkColor GetTitleColor() const { |
228 return container_->owner()->GetBrowserContext()->IsOffTheRecord() | 229 return browser_is_off_the_record_ |
229 #if defined(OS_WIN) && !defined(USE_AURA) | 230 #if defined(OS_WIN) && !defined(USE_AURA) |
230 || !ui::win::IsAeroGlassEnabled() | 231 || !ui::win::IsAeroGlassEnabled() |
231 #endif | 232 #endif |
232 ? SK_ColorWHITE : SK_ColorBLACK; | 233 ? SK_ColorWHITE : SK_ColorBLACK; |
233 } | 234 } |
234 | 235 |
235 // Loads the appropriate set of WindowResources for the frame view. | 236 // Loads the appropriate set of WindowResources for the frame view. |
236 void InitWindowResources(); | 237 void InitWindowResources(); |
237 | 238 |
238 ConstrainedWindowViews* container_; | 239 ConstrainedWindowViews* container_; |
239 | 240 |
| 241 bool browser_is_off_the_record_; |
| 242 |
240 scoped_ptr<views::WindowResources> resources_; | 243 scoped_ptr<views::WindowResources> resources_; |
241 | 244 |
242 gfx::Rect title_bounds_; | 245 gfx::Rect title_bounds_; |
243 | 246 |
244 views::ImageButton* close_button_; | 247 views::ImageButton* close_button_; |
245 | 248 |
246 // The bounds of the ClientView. | 249 // The bounds of the ClientView. |
247 gfx::Rect client_view_bounds_; | 250 gfx::Rect client_view_bounds_; |
248 | 251 |
249 // Background painter for the frame. | 252 // Background painter for the frame. |
(...skipping 29 matching lines...) Expand all Loading... |
279 // The title text starts 2 px from the right edge of the left frame border. | 282 // The title text starts 2 px from the right edge of the left frame border. |
280 const int kTitleLeftSpacing = 2; | 283 const int kTitleLeftSpacing = 2; |
281 // There is a 5 px gap between the title text and the caption buttons. | 284 // There is a 5 px gap between the title text and the caption buttons. |
282 const int kTitleCaptionSpacing = 5; | 285 const int kTitleCaptionSpacing = 5; |
283 | 286 |
284 const SkColor kContentsBorderShadow = SkColorSetARGB(51, 0, 0, 0); | 287 const SkColor kContentsBorderShadow = SkColorSetARGB(51, 0, 0, 0); |
285 | 288 |
286 } // namespace | 289 } // namespace |
287 | 290 |
288 ConstrainedWindowFrameView::ConstrainedWindowFrameView( | 291 ConstrainedWindowFrameView::ConstrainedWindowFrameView( |
289 ConstrainedWindowViews* container) | 292 ConstrainedWindowViews* container, bool browser_is_off_the_record) |
290 : NonClientFrameView(), | 293 : NonClientFrameView(), |
291 container_(container), | 294 container_(container), |
| 295 browser_is_off_the_record_(browser_is_off_the_record), |
292 close_button_(new views::ImageButton(this)), | 296 close_button_(new views::ImageButton(this)), |
293 frame_background_(new views::FrameBackground()) { | 297 frame_background_(new views::FrameBackground()) { |
294 InitClass(); | 298 InitClass(); |
295 InitWindowResources(); | 299 InitWindowResources(); |
296 | 300 |
297 // Constrained windows always use the custom frame - they just have a | 301 // Constrained windows always use the custom frame - they just have a |
298 // different set of images. | 302 // different set of images. |
299 container->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM); | 303 container->set_frame_type(views::Widget::FRAME_TYPE_FORCE_CUSTOM); |
300 | 304 |
301 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 305 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 container_->CloseWebContentsModalDialog(); | 557 container_->CloseWebContentsModalDialog(); |
554 } | 558 } |
555 | 559 |
556 private: | 560 private: |
557 ConstrainedWindowViews* container_; // not owned | 561 ConstrainedWindowViews* container_; // not owned |
558 DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowFrameViewAsh); | 562 DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowFrameViewAsh); |
559 }; | 563 }; |
560 #endif // defined(USE_ASH) | 564 #endif // defined(USE_ASH) |
561 | 565 |
562 ConstrainedWindowViews::ConstrainedWindowViews( | 566 ConstrainedWindowViews::ConstrainedWindowViews( |
563 content::WebContents* web_contents, | 567 gfx::NativeView parent, |
| 568 bool off_the_record, |
564 views::WidgetDelegate* widget_delegate) | 569 views::WidgetDelegate* widget_delegate) |
565 : web_contents_(web_contents), | 570 : off_the_record_(off_the_record) { |
566 ALLOW_THIS_IN_INITIALIZER_LIST(native_constrained_window_( | |
567 NativeConstrainedWindow::CreateNativeConstrainedWindow(this))) { | |
568 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); | 571 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); |
569 params.delegate = widget_delegate; | 572 params.delegate = widget_delegate; |
570 params.native_widget = native_constrained_window_->AsNativeWidget(); | |
571 params.child = true; | 573 params.child = true; |
572 | 574 |
573 params.parent = web_contents_->GetNativeView(); | 575 params.parent = parent; |
574 | 576 |
575 #if defined(USE_ASH) | 577 #if defined(USE_ASH) |
576 // Ash window headers can be transparent. | 578 // Ash window headers can be transparent. |
577 params.transparent = true; | 579 params.transparent = true; |
578 views::corewm::SetChildWindowVisibilityChangesAnimated(params.parent); | |
579 // No animations should get performed on the window since that will re-order | |
580 // the window stack which will then cause many problems. | |
581 if (params.parent && params.parent->parent()) { | |
582 params.parent->parent()->SetProperty(aura::client::kAnimationsDisabledKey, | |
583 true); | |
584 } | |
585 #endif | 580 #endif |
| 581 |
586 Init(params); | 582 Init(params); |
587 | |
588 WebContentsModalDialogManager* web_contents_modal_dialog_manager = | |
589 WebContentsModalDialogManager::FromWebContents(web_contents_); | |
590 web_contents_modal_dialog_manager->AddDialog(this); | |
591 #if defined(USE_ASH) | |
592 GetNativeWindow()->SetProperty(ash::kConstrainedWindowKey, true); | |
593 views::corewm::SetModalParent(GetNativeWindow(), | |
594 web_contents_->GetView()->GetNativeView()); | |
595 #endif | |
596 } | 583 } |
597 | 584 |
598 ConstrainedWindowViews::~ConstrainedWindowViews() { | 585 ConstrainedWindowViews::~ConstrainedWindowViews() { |
599 } | 586 } |
600 | 587 |
601 void ConstrainedWindowViews::ShowWebContentsModalDialog() { | 588 void ConstrainedWindowViews::ShowWebContentsModalDialog() { |
602 Show(); | 589 Show(); |
603 FocusWebContentsModalDialog(); | 590 FocusWebContentsModalDialog(); |
604 } | 591 } |
605 | 592 |
606 void ConstrainedWindowViews::CloseWebContentsModalDialog() { | 593 void ConstrainedWindowViews::CloseWebContentsModalDialog() { |
607 #if defined(USE_ASH) | |
608 gfx::NativeView view = web_contents_->GetNativeView(); | |
609 // Allow the parent to animate again. | |
610 if (view && view->parent()) | |
611 view->parent()->ClearProperty(aura::client::kAnimationsDisabledKey); | |
612 #endif | |
613 WebContentsModalDialogManager* web_contents_modal_dialog_manager = | |
614 WebContentsModalDialogManager::FromWebContents(web_contents_); | |
615 web_contents_modal_dialog_manager->WillClose(this); | |
616 Close(); | 594 Close(); |
617 } | 595 } |
618 | 596 |
619 void ConstrainedWindowViews::FocusWebContentsModalDialog() { | 597 void ConstrainedWindowViews::FocusWebContentsModalDialog() { |
620 if (widget_delegate() && widget_delegate()->GetInitiallyFocusedView()) | 598 if (widget_delegate() && widget_delegate()->GetInitiallyFocusedView()) |
621 widget_delegate()->GetInitiallyFocusedView()->RequestFocus(); | 599 widget_delegate()->GetInitiallyFocusedView()->RequestFocus(); |
622 #if defined(USE_ASH) | 600 #if defined(USE_ASH) |
623 // We don't necessarily have a RootWindow yet. | 601 // We don't necessarily have a RootWindow yet. |
624 if (GetNativeView()->GetRootWindow()) | 602 if (GetNativeView()->GetRootWindow()) |
625 GetNativeView()->Focus(); | 603 GetNativeView()->Focus(); |
626 #endif | 604 #endif |
627 } | 605 } |
628 | 606 |
629 void ConstrainedWindowViews::PulseWebContentsModalDialog() { | 607 void ConstrainedWindowViews::PulseWebContentsModalDialog() { |
630 } | 608 } |
631 | 609 |
632 gfx::NativeWindow ConstrainedWindowViews::GetNativeWindow() { | 610 gfx::NativeWindow ConstrainedWindowViews::GetNativeWindow() { |
633 return Widget::GetNativeWindow(); | 611 return Widget::GetNativeWindow(); |
634 } | 612 } |
635 | 613 |
| 614 ConstrainedWindowViews* ConstrainedWindowViews::Create( |
| 615 content::WebContents* web_contents, |
| 616 views::WidgetDelegate* widget_delegate) { |
| 617 WebContentsModalDialogManager* manager = |
| 618 WebContentsModalDialogManager::FromWebContents(web_contents); |
| 619 ConstrainedWindowViews* dialog = new ConstrainedWindowViews( |
| 620 web_contents->GetNativeView(), |
| 621 web_contents->GetBrowserContext()->IsOffTheRecord(), |
| 622 widget_delegate); |
| 623 manager->AddDialog(dialog); |
| 624 return dialog; |
| 625 } |
| 626 |
636 views::NonClientFrameView* ConstrainedWindowViews::CreateNonClientFrameView() { | 627 views::NonClientFrameView* ConstrainedWindowViews::CreateNonClientFrameView() { |
637 if (views::DialogDelegate::UseNewStyle()) | 628 if (views::DialogDelegate::UseNewStyle()) |
638 return new views::DialogFrameView(widget_delegate()->GetWindowTitle()); | 629 return new views::DialogFrameView(widget_delegate()->GetWindowTitle()); |
639 #if defined(USE_ASH) | 630 #if defined(USE_ASH) |
640 ConstrainedWindowFrameViewAsh* frame = new ConstrainedWindowFrameViewAsh; | 631 ConstrainedWindowFrameViewAsh* frame = new ConstrainedWindowFrameViewAsh; |
641 frame->Init(this); | 632 frame->Init(this); |
642 return frame; | 633 return frame; |
643 #endif | 634 #endif |
644 return new ConstrainedWindowFrameView(this); | 635 return new ConstrainedWindowFrameView(this, off_the_record_); |
645 } | 636 } |
646 | |
647 void ConstrainedWindowViews::OnNativeConstrainedWindowDestroyed() { | |
648 WebContentsModalDialogManager* web_contents_modal_dialog_manager = | |
649 WebContentsModalDialogManager::FromWebContents(web_contents_); | |
650 web_contents_modal_dialog_manager->WillClose(this); | |
651 } | |
652 | |
653 void ConstrainedWindowViews::OnNativeConstrainedWindowMouseActivate() { | |
654 Activate(); | |
655 } | |
656 | |
657 views::internal::NativeWidgetDelegate* | |
658 ConstrainedWindowViews::AsNativeWidgetDelegate() { | |
659 return this; | |
660 } | |
661 | |
662 int ConstrainedWindowViews::GetNonClientComponent(const gfx::Point& point) { | |
663 // Prevent a constrained window to be moved by the user. | |
664 return HTNOWHERE; | |
665 } | |
OLD | NEW |