| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/media/desktop_media_picker.h" | 5 #include "chrome/browser/media/desktop_media_picker.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "chrome/browser/media/desktop_media_list.h" | 8 #include "chrome/browser/media/desktop_media_list.h" |
| 9 #include "chrome/browser/media/desktop_media_list_observer.h" | 9 #include "chrome/browser/media/desktop_media_list_observer.h" |
| 10 #include "chrome/browser/ui/ash/ash_util.h" | 10 #include "chrome/browser/ui/ash/ash_util.h" |
| 11 #include "components/web_modal/web_contents_modal_dialog_host.h" | 11 #include "chrome/browser/ui/views/constrained_window_views.h" |
| 12 #include "components/web_modal/web_contents_modal_dialog_manager.h" | 12 #include "components/web_modal/web_contents_modal_dialog_manager.h" |
| 13 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" | |
| 14 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 15 #include "grit/generated_resources.h" | 14 #include "grit/generated_resources.h" |
| 16 #include "ui/aura/window_tree_host.h" | 15 #include "ui/aura/window_tree_host.h" |
| 17 #include "ui/base/l10n/l10n_util.h" | 16 #include "ui/base/l10n/l10n_util.h" |
| 18 #include "ui/events/keycodes/keyboard_codes.h" | 17 #include "ui/events/keycodes/keyboard_codes.h" |
| 19 #include "ui/gfx/canvas.h" | 18 #include "ui/gfx/canvas.h" |
| 20 #include "ui/native_theme/native_theme.h" | 19 #include "ui/native_theme/native_theme.h" |
| 21 #include "ui/views/background.h" | 20 #include "ui/views/background.h" |
| 22 #include "ui/views/controls/image_view.h" | 21 #include "ui/views/controls/image_view.h" |
| 23 #include "ui/views/controls/label.h" | 22 #include "ui/views/controls/label.h" |
| 24 #include "ui/views/controls/scroll_view.h" | 23 #include "ui/views/controls/scroll_view.h" |
| 25 #include "ui/views/layout/box_layout.h" | 24 #include "ui/views/layout/box_layout.h" |
| 26 #include "ui/views/layout/layout_constants.h" | 25 #include "ui/views/layout/layout_constants.h" |
| 27 #include "ui/views/widget/widget.h" | 26 #include "ui/views/widget/widget.h" |
| 28 #include "ui/views/window/dialog_client_view.h" | 27 #include "ui/views/window/dialog_client_view.h" |
| 29 #include "ui/views/window/dialog_delegate.h" | 28 #include "ui/views/window/dialog_delegate.h" |
| 30 #include "ui/wm/core/shadow_types.h" | 29 #include "ui/wm/core/shadow_types.h" |
| 31 | 30 |
| 32 using content::DesktopMediaID; | 31 using content::DesktopMediaID; |
| 33 using web_modal::WebContentsModalDialogManager; | |
| 34 using web_modal::WebContentsModalDialogManagerDelegate; | |
| 35 | 32 |
| 36 namespace { | 33 namespace { |
| 37 | 34 |
| 38 const int kThumbnailWidth = 160; | 35 const int kThumbnailWidth = 160; |
| 39 const int kThumbnailHeight = 100; | 36 const int kThumbnailHeight = 100; |
| 40 const int kThumbnailMargin = 10; | 37 const int kThumbnailMargin = 10; |
| 41 const int kLabelHeight = 40; | 38 const int kLabelHeight = 40; |
| 42 const int kListItemWidth = kThumbnailMargin * 2 + kThumbnailWidth; | 39 const int kListItemWidth = kThumbnailMargin * 2 + kThumbnailWidth; |
| 43 const int kListItemHeight = | 40 const int kListItemHeight = |
| 44 kThumbnailMargin * 2 + kThumbnailHeight + kLabelHeight; | 41 kThumbnailMargin * 2 + kThumbnailHeight + kLabelHeight; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 | 163 |
| 167 // Called by DesktopMediaListView. | 164 // Called by DesktopMediaListView. |
| 168 void OnSelectionChanged(); | 165 void OnSelectionChanged(); |
| 169 void OnDoubleClick(); | 166 void OnDoubleClick(); |
| 170 | 167 |
| 171 // views::View overrides. | 168 // views::View overrides. |
| 172 virtual gfx::Size GetPreferredSize() const OVERRIDE; | 169 virtual gfx::Size GetPreferredSize() const OVERRIDE; |
| 173 virtual void Layout() OVERRIDE; | 170 virtual void Layout() OVERRIDE; |
| 174 | 171 |
| 175 // views::DialogDelegateView overrides. | 172 // views::DialogDelegateView overrides. |
| 173 virtual ui::ModalType GetModalType() const OVERRIDE; |
| 176 virtual base::string16 GetWindowTitle() const OVERRIDE; | 174 virtual base::string16 GetWindowTitle() const OVERRIDE; |
| 177 virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE; | 175 virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE; |
| 178 virtual base::string16 GetDialogButtonLabel( | 176 virtual base::string16 GetDialogButtonLabel( |
| 179 ui::DialogButton button) const OVERRIDE; | 177 ui::DialogButton button) const OVERRIDE; |
| 180 virtual bool Accept() OVERRIDE; | 178 virtual bool Accept() OVERRIDE; |
| 181 virtual void DeleteDelegate() OVERRIDE; | 179 virtual void DeleteDelegate() OVERRIDE; |
| 182 | 180 |
| 183 private: | 181 private: |
| 184 DesktopMediaPickerViews* parent_; | 182 DesktopMediaPickerViews* parent_; |
| 185 base::string16 app_name_; | 183 base::string16 app_name_; |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 AddChildView(label_); | 514 AddChildView(label_); |
| 517 | 515 |
| 518 scroll_view_->SetContents(list_view_); | 516 scroll_view_->SetContents(list_view_); |
| 519 AddChildView(scroll_view_); | 517 AddChildView(scroll_view_); |
| 520 | 518 |
| 521 // If |parent_web_contents| is set, the picker will be shown modal to the | 519 // If |parent_web_contents| is set, the picker will be shown modal to the |
| 522 // web contents. Otherwise, a new dialog widget inside |parent_window| will be | 520 // web contents. Otherwise, a new dialog widget inside |parent_window| will be |
| 523 // created for the picker. Note that |parent_window| may also be NULL if | 521 // created for the picker. Note that |parent_window| may also be NULL if |
| 524 // parent web contents is not set. In this case the picker will be parented | 522 // parent web contents is not set. In this case the picker will be parented |
| 525 // by a root window. | 523 // by a root window. |
| 526 WebContentsModalDialogManager* web_contents_modal_dialog_manager = NULL; | 524 views::Widget* widget = NULL; |
| 527 if (parent_web_contents) { | 525 if (parent_web_contents) |
| 528 web_contents_modal_dialog_manager = | 526 widget = CreateWebModalDialogViews(this, parent_web_contents); |
| 529 WebContentsModalDialogManager::FromWebContents(parent_web_contents); | 527 else |
| 530 DCHECK(web_contents_modal_dialog_manager); | 528 widget = DialogDelegate::CreateDialogWidget(this, context, parent_window); |
| 531 WebContentsModalDialogManagerDelegate* delegate = | |
| 532 web_contents_modal_dialog_manager->delegate(); | |
| 533 DCHECK(delegate); | |
| 534 views::Widget::CreateWindowAsFramelessChild( | |
| 535 this, | |
| 536 delegate->GetWebContentsModalDialogHost()->GetHostView()); | |
| 537 } else { | |
| 538 DialogDelegate::CreateDialogWidget(this, context, parent_window); | |
| 539 } | |
| 540 | 529 |
| 541 // DesktopMediaList needs to know the ID of the picker window which | 530 // DesktopMediaList needs to know the ID of the picker window which |
| 542 // matches the ID it gets from the OS. Depending on the OS and configuration | 531 // matches the ID it gets from the OS. Depending on the OS and configuration |
| 543 // we get this ID differently. | 532 // we get this ID differently. |
| 544 content::DesktopMediaID::Id dialog_window_id = 0; | 533 content::DesktopMediaID::Id dialog_window_id = 0; |
| 545 | |
| 546 #if defined(USE_ASH) | 534 #if defined(USE_ASH) |
| 547 if (chrome::IsNativeWindowInAsh(GetWidget()->GetNativeWindow())) { | 535 if (chrome::IsNativeWindowInAsh(widget->GetNativeWindow())) { |
| 548 dialog_window_id = content::DesktopMediaID::RegisterAuraWindow( | 536 dialog_window_id = content::DesktopMediaID::RegisterAuraWindow( |
| 549 GetWidget()->GetNativeWindow()).id; | 537 widget->GetNativeWindow()).id; |
| 550 } else | 538 DCHECK_NE(dialog_window_id, 0); |
| 539 } |
| 551 #endif | 540 #endif |
| 552 { | 541 if (dialog_window_id == 0) { |
| 553 dialog_window_id = AcceleratedWidgetToDesktopMediaId( | 542 dialog_window_id = AcceleratedWidgetToDesktopMediaId( |
| 554 GetWidget()->GetNativeWindow()->GetHost()-> | 543 widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget()); |
| 555 GetAcceleratedWidget()); | |
| 556 } | 544 } |
| 557 | 545 |
| 558 list_view_->StartUpdating(dialog_window_id); | 546 list_view_->StartUpdating(dialog_window_id); |
| 559 | 547 |
| 560 if (parent_web_contents) { | 548 if (parent_web_contents) { |
| 561 web_contents_modal_dialog_manager->ShowModalDialog( | 549 web_modal::WebContentsModalDialogManager* manager = |
| 562 GetWidget()->GetNativeView()); | 550 web_modal::WebContentsModalDialogManager::FromWebContents( |
| 551 parent_web_contents); |
| 552 manager->ShowModalDialog(widget->GetNativeView()); |
| 563 } else { | 553 } else { |
| 564 GetWidget()->Show(); | 554 widget->Show(); |
| 565 } | 555 } |
| 566 } | 556 } |
| 567 | 557 |
| 568 DesktopMediaPickerDialogView::~DesktopMediaPickerDialogView() {} | 558 DesktopMediaPickerDialogView::~DesktopMediaPickerDialogView() {} |
| 569 | 559 |
| 570 void DesktopMediaPickerDialogView::DetachParent() { | 560 void DesktopMediaPickerDialogView::DetachParent() { |
| 571 parent_ = NULL; | 561 parent_ = NULL; |
| 572 } | 562 } |
| 573 | 563 |
| 574 gfx::Size DesktopMediaPickerDialogView::GetPreferredSize() const { | 564 gfx::Size DesktopMediaPickerDialogView::GetPreferredSize() const { |
| 575 return gfx::Size(600, 500); | 565 return gfx::Size(600, 500); |
| 576 } | 566 } |
| 577 | 567 |
| 578 void DesktopMediaPickerDialogView::Layout() { | 568 void DesktopMediaPickerDialogView::Layout() { |
| 579 gfx::Rect rect = GetLocalBounds(); | 569 gfx::Rect rect = GetLocalBounds(); |
| 580 rect.Inset(views::kPanelHorizMargin, views::kPanelVertMargin); | 570 rect.Inset(views::kPanelHorizMargin, views::kPanelVertMargin); |
| 581 | 571 |
| 582 gfx::Rect label_rect(rect.x(), rect.y(), rect.width(), | 572 gfx::Rect label_rect(rect.x(), rect.y(), rect.width(), |
| 583 label_->GetHeightForWidth(rect.width())); | 573 label_->GetHeightForWidth(rect.width())); |
| 584 label_->SetBoundsRect(label_rect); | 574 label_->SetBoundsRect(label_rect); |
| 585 | 575 |
| 586 int scroll_view_top = label_rect.bottom() + views::kPanelVerticalSpacing; | 576 int scroll_view_top = label_rect.bottom() + views::kPanelVerticalSpacing; |
| 587 scroll_view_->SetBounds( | 577 scroll_view_->SetBounds( |
| 588 rect.x(), scroll_view_top, | 578 rect.x(), scroll_view_top, |
| 589 rect.width(), rect.height() - scroll_view_top); | 579 rect.width(), rect.height() - scroll_view_top); |
| 590 } | 580 } |
| 591 | 581 |
| 582 ui::ModalType DesktopMediaPickerDialogView::GetModalType() const { |
| 583 return ui::MODAL_TYPE_CHILD; |
| 584 } |
| 585 |
| 592 base::string16 DesktopMediaPickerDialogView::GetWindowTitle() const { | 586 base::string16 DesktopMediaPickerDialogView::GetWindowTitle() const { |
| 593 return l10n_util::GetStringFUTF16(IDS_DESKTOP_MEDIA_PICKER_TITLE, app_name_); | 587 return l10n_util::GetStringFUTF16(IDS_DESKTOP_MEDIA_PICKER_TITLE, app_name_); |
| 594 } | 588 } |
| 595 | 589 |
| 596 bool DesktopMediaPickerDialogView::IsDialogButtonEnabled( | 590 bool DesktopMediaPickerDialogView::IsDialogButtonEnabled( |
| 597 ui::DialogButton button) const { | 591 ui::DialogButton button) const { |
| 598 if (button == ui::DIALOG_BUTTON_OK) | 592 if (button == ui::DIALOG_BUTTON_OK) |
| 599 return list_view_->GetSelection() != NULL; | 593 return list_view_->GetSelection() != NULL; |
| 600 return true; | 594 return true; |
| 601 } | 595 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 632 | 626 |
| 633 void DesktopMediaPickerDialogView::OnSelectionChanged() { | 627 void DesktopMediaPickerDialogView::OnSelectionChanged() { |
| 634 GetDialogClientView()->UpdateDialogButtons(); | 628 GetDialogClientView()->UpdateDialogButtons(); |
| 635 } | 629 } |
| 636 | 630 |
| 637 void DesktopMediaPickerDialogView::OnDoubleClick() { | 631 void DesktopMediaPickerDialogView::OnDoubleClick() { |
| 638 // This will call Accept() and close the dialog. | 632 // This will call Accept() and close the dialog. |
| 639 GetDialogClientView()->AcceptWindow(); | 633 GetDialogClientView()->AcceptWindow(); |
| 640 } | 634 } |
| 641 | 635 |
| 642 DesktopMediaPickerViews::DesktopMediaPickerViews() | 636 DesktopMediaPickerViews::DesktopMediaPickerViews() : dialog_(NULL) { |
| 643 : dialog_(NULL) { | |
| 644 } | 637 } |
| 645 | 638 |
| 646 DesktopMediaPickerViews::~DesktopMediaPickerViews() { | 639 DesktopMediaPickerViews::~DesktopMediaPickerViews() { |
| 647 if (dialog_) { | 640 if (dialog_) { |
| 648 dialog_->DetachParent(); | 641 dialog_->DetachParent(); |
| 649 dialog_->GetWidget()->Close(); | 642 dialog_->GetWidget()->Close(); |
| 650 } | 643 } |
| 651 } | 644 } |
| 652 | 645 |
| 653 void DesktopMediaPickerViews::Show(content::WebContents* web_contents, | 646 void DesktopMediaPickerViews::Show(content::WebContents* web_contents, |
| 654 gfx::NativeWindow context, | 647 gfx::NativeWindow context, |
| 655 gfx::NativeWindow parent, | 648 gfx::NativeWindow parent, |
| 656 const base::string16& app_name, | 649 const base::string16& app_name, |
| 657 const base::string16& target_name, | 650 const base::string16& target_name, |
| 658 scoped_ptr<DesktopMediaList> media_list, | 651 scoped_ptr<DesktopMediaList> media_list, |
| 659 const DoneCallback& done_callback) { | 652 const DoneCallback& done_callback) { |
| 660 callback_ = done_callback; | 653 callback_ = done_callback; |
| 661 dialog_ = new DesktopMediaPickerDialogView( | 654 dialog_ = new DesktopMediaPickerDialogView( |
| 662 web_contents, context, parent, this, app_name, target_name, | 655 web_contents, context, parent, this, app_name, target_name, |
| 663 media_list.Pass()); | 656 media_list.Pass()); |
| 664 } | 657 } |
| 665 | 658 |
| 666 void DesktopMediaPickerViews::NotifyDialogResult( | 659 void DesktopMediaPickerViews::NotifyDialogResult(DesktopMediaID source) { |
| 667 DesktopMediaID source) { | |
| 668 // Once this method is called the |dialog_| will close and destroy itself. | 660 // Once this method is called the |dialog_| will close and destroy itself. |
| 669 dialog_->DetachParent(); | 661 dialog_->DetachParent(); |
| 670 dialog_ = NULL; | 662 dialog_ = NULL; |
| 671 | 663 |
| 672 DCHECK(!callback_.is_null()); | 664 DCHECK(!callback_.is_null()); |
| 673 | 665 |
| 674 // Notify the |callback_| asynchronously because it may need to destroy | 666 // Notify the |callback_| asynchronously because it may need to destroy |
| 675 // DesktopMediaPicker. | 667 // DesktopMediaPicker. |
| 676 content::BrowserThread::PostTask( | 668 content::BrowserThread::PostTask( |
| 677 content::BrowserThread::UI, FROM_HERE, | 669 content::BrowserThread::UI, FROM_HERE, |
| 678 base::Bind(callback_, source)); | 670 base::Bind(callback_, source)); |
| 679 callback_.Reset(); | 671 callback_.Reset(); |
| 680 } | 672 } |
| 681 | 673 |
| 682 } // namespace | 674 } // namespace |
| 683 | 675 |
| 684 // static | 676 // static |
| 685 scoped_ptr<DesktopMediaPicker> DesktopMediaPicker::Create() { | 677 scoped_ptr<DesktopMediaPicker> DesktopMediaPicker::Create() { |
| 686 return scoped_ptr<DesktopMediaPicker>(new DesktopMediaPickerViews()); | 678 return scoped_ptr<DesktopMediaPicker>(new DesktopMediaPickerViews()); |
| 687 } | 679 } |
| OLD | NEW |