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