desktop_media_picker_views.h revision 116680a4aac90f2aa7413d9095a592090648e557
125b3c049e70834cf33790a28643ab058b507b35cBen Cheng// Copyright 2014 The Chromium Authors. All rights reserved. 225b3c049e70834cf33790a28643ab058b507b35cBen Cheng// Use of this source code is governed by a BSD-style license that can be 325b3c049e70834cf33790a28643ab058b507b35cBen Cheng// found in the LICENSE file. 425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#ifndef CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_ 625b3c049e70834cf33790a28643ab058b507b35cBen Cheng#define CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_ 725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 825b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "chrome/browser/media/desktop_media_list_observer.h" 925b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "chrome/browser/media/desktop_media_picker.h" 1025b3c049e70834cf33790a28643ab058b507b35cBen Cheng#include "ui/views/window/dialog_delegate.h" 1125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1225b3c049e70834cf33790a28643ab058b507b35cBen Chengnamespace views { 1325b3c049e70834cf33790a28643ab058b507b35cBen Chengclass ImageView; 1425b3c049e70834cf33790a28643ab058b507b35cBen Chengclass Label; 1525b3c049e70834cf33790a28643ab058b507b35cBen Cheng} // namespace views 1625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 1725b3c049e70834cf33790a28643ab058b507b35cBen Chengclass DesktopMediaPickerDialogView; 1825b3c049e70834cf33790a28643ab058b507b35cBen Chengclass DesktopMediaPickerViews; 1925b3c049e70834cf33790a28643ab058b507b35cBen Chengclass DesktopMediaSourceView; 2025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 2125b3c049e70834cf33790a28643ab058b507b35cBen Cheng// View that shows a list of desktop media sources available from 2225b3c049e70834cf33790a28643ab058b507b35cBen Cheng// DesktopMediaList. 2325b3c049e70834cf33790a28643ab058b507b35cBen Chengclass DesktopMediaListView : public views::View, 2425b3c049e70834cf33790a28643ab058b507b35cBen Cheng public DesktopMediaListObserver { 2525b3c049e70834cf33790a28643ab058b507b35cBen Cheng public: 2625b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaListView(DesktopMediaPickerDialogView* parent, 2725b3c049e70834cf33790a28643ab058b507b35cBen Cheng scoped_ptr<DesktopMediaList> media_list); 2825b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual ~DesktopMediaListView(); 2925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3025b3c049e70834cf33790a28643ab058b507b35cBen Cheng void StartUpdating(content::DesktopMediaID::Id dialog_window_id); 3125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3225b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Called by DesktopMediaSourceView when selection has changed. 3325b3c049e70834cf33790a28643ab058b507b35cBen Cheng void OnSelectionChanged(); 3425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3525b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Called by DesktopMediaSourceView when a source has been double-clicked. 3625b3c049e70834cf33790a28643ab058b507b35cBen Cheng void OnDoubleClick(); 3725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 3825b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Returns currently selected source. 3925b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaSourceView* GetSelection(); 4025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4125b3c049e70834cf33790a28643ab058b507b35cBen Cheng // views::View overrides. 4225b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual gfx::Size GetPreferredSize() const OVERRIDE; 4325b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void Layout() OVERRIDE; 4425b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE; 4525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 4625b3c049e70834cf33790a28643ab058b507b35cBen Cheng private: 4725b3c049e70834cf33790a28643ab058b507b35cBen Cheng // DesktopMediaList::Observer interface 4825b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnSourceAdded(int index) OVERRIDE; 4925b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnSourceRemoved(int index) OVERRIDE; 5025b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnSourceMoved(int old_index, int new_index) OVERRIDE; 5125b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnSourceNameChanged(int index) OVERRIDE; 5225b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnSourceThumbnailChanged(int index) OVERRIDE; 5325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5425b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaPickerDialogView* parent_; 5525b3c049e70834cf33790a28643ab058b507b35cBen Cheng scoped_ptr<DesktopMediaList> media_list_; 5625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 5725b3c049e70834cf33790a28643ab058b507b35cBen Cheng DISALLOW_COPY_AND_ASSIGN(DesktopMediaListView); 5825b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 5925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6025b3c049e70834cf33790a28643ab058b507b35cBen Cheng// View used for each item in DesktopMediaListView. Shows a single desktop media 6125b3c049e70834cf33790a28643ab058b507b35cBen Cheng// source as a thumbnail with the title under it. 6225b3c049e70834cf33790a28643ab058b507b35cBen Chengclass DesktopMediaSourceView : public views::View { 6325b3c049e70834cf33790a28643ab058b507b35cBen Cheng public: 6425b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaSourceView(DesktopMediaListView* parent, 6525b3c049e70834cf33790a28643ab058b507b35cBen Cheng content::DesktopMediaID source_id); 6625b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual ~DesktopMediaSourceView(); 6725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 6825b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Updates thumbnail and title from |source|. 6925b3c049e70834cf33790a28643ab058b507b35cBen Cheng void SetName(const base::string16& name); 7025b3c049e70834cf33790a28643ab058b507b35cBen Cheng void SetThumbnail(const gfx::ImageSkia& thumbnail); 7125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7225b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Id for the source shown by this View. 7325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const content::DesktopMediaID& source_id() const { return source_id_; } 7425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7525b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Returns true if the source is selected. 7625b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool is_selected() const { return selected_; } 7725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 7825b3c049e70834cf33790a28643ab058b507b35cBen Cheng // views::View interface. 7925b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual const char* GetClassName() const OVERRIDE; 8025b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void Layout() OVERRIDE; 8125b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual views::View* GetSelectedViewForGroup(int group) OVERRIDE; 8225b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual bool IsGroupFocusTraversable() const OVERRIDE; 8325b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 8425b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnFocus() OVERRIDE; 8525b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnBlur() OVERRIDE; 8625b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 8725b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 8825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 8925b3c049e70834cf33790a28643ab058b507b35cBen Cheng private: 9025b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Updates selection state of the element. If |selected| is true then also 9125b3c049e70834cf33790a28643ab058b507b35cBen Cheng // calls SetSelected(false) for the source view that was selected before that 9225b3c049e70834cf33790a28643ab058b507b35cBen Cheng // (if any). 9325b3c049e70834cf33790a28643ab058b507b35cBen Cheng void SetSelected(bool selected); 9425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9525b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaListView* parent_; 9625b3c049e70834cf33790a28643ab058b507b35cBen Cheng content::DesktopMediaID source_id_; 9725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 9825b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::ImageView* image_view_; 9925b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::Label* label_; 10025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10125b3c049e70834cf33790a28643ab058b507b35cBen Cheng bool selected_; 10225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10325b3c049e70834cf33790a28643ab058b507b35cBen Cheng DISALLOW_COPY_AND_ASSIGN(DesktopMediaSourceView); 10425b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 10525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 10625b3c049e70834cf33790a28643ab058b507b35cBen Cheng// Dialog view used for DesktopMediaPickerViews. 10725b3c049e70834cf33790a28643ab058b507b35cBen Chengclass DesktopMediaPickerDialogView : public views::DialogDelegateView { 10825b3c049e70834cf33790a28643ab058b507b35cBen Cheng public: 10925b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaPickerDialogView(content::WebContents* parent_web_contents, 11025b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::NativeWindow context, 11125b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::NativeWindow parent_window, 11225b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaPickerViews* parent, 11325b3c049e70834cf33790a28643ab058b507b35cBen Cheng const base::string16& app_name, 11425b3c049e70834cf33790a28643ab058b507b35cBen Cheng const base::string16& target_name, 11525b3c049e70834cf33790a28643ab058b507b35cBen Cheng scoped_ptr<DesktopMediaList> media_list); 11625b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual ~DesktopMediaPickerDialogView(); 11725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 11825b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Called by parent (DesktopMediaPickerViews) when it's destroyed. 11925b3c049e70834cf33790a28643ab058b507b35cBen Cheng void DetachParent(); 12025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12125b3c049e70834cf33790a28643ab058b507b35cBen Cheng // Called by DesktopMediaListView. 12225b3c049e70834cf33790a28643ab058b507b35cBen Cheng void OnSelectionChanged(); 12325b3c049e70834cf33790a28643ab058b507b35cBen Cheng void OnDoubleClick(); 12425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12525b3c049e70834cf33790a28643ab058b507b35cBen Cheng // views::View overrides. 12625b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual gfx::Size GetPreferredSize() const OVERRIDE; 12725b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void Layout() OVERRIDE; 12825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 12925b3c049e70834cf33790a28643ab058b507b35cBen Cheng // views::DialogDelegateView overrides. 13025b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual ui::ModalType GetModalType() const OVERRIDE; 13125b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual base::string16 GetWindowTitle() const OVERRIDE; 13225b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE; 13325b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual base::string16 GetDialogButtonLabel( 13425b3c049e70834cf33790a28643ab058b507b35cBen Cheng ui::DialogButton button) const OVERRIDE; 13525b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual bool Accept() OVERRIDE; 13625b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void DeleteDelegate() OVERRIDE; 13725b3c049e70834cf33790a28643ab058b507b35cBen Cheng 13825b3c049e70834cf33790a28643ab058b507b35cBen Cheng void OnMediaListRowsChanged(); 13925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14025b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaSourceView* GetMediaSourceViewForTesting(int index) const; 14125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14225b3c049e70834cf33790a28643ab058b507b35cBen Cheng private: 14325b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaPickerViews* parent_; 14425b3c049e70834cf33790a28643ab058b507b35cBen Cheng base::string16 app_name_; 14525b3c049e70834cf33790a28643ab058b507b35cBen Cheng 14625b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::Label* label_; 14725b3c049e70834cf33790a28643ab058b507b35cBen Cheng views::ScrollView* scroll_view_; 14825b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaListView* list_view_; 14925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15025b3c049e70834cf33790a28643ab058b507b35cBen Cheng DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerDialogView); 15125b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 15225b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15325b3c049e70834cf33790a28643ab058b507b35cBen Cheng// Implementation of DesktopMediaPicker for Views. 15425b3c049e70834cf33790a28643ab058b507b35cBen Chengclass DesktopMediaPickerViews : public DesktopMediaPicker { 15525b3c049e70834cf33790a28643ab058b507b35cBen Cheng public: 15625b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaPickerViews(); 15725b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual ~DesktopMediaPickerViews(); 15825b3c049e70834cf33790a28643ab058b507b35cBen Cheng 15925b3c049e70834cf33790a28643ab058b507b35cBen Cheng void NotifyDialogResult(content::DesktopMediaID source); 16025b3c049e70834cf33790a28643ab058b507b35cBen Cheng 16125b3c049e70834cf33790a28643ab058b507b35cBen Cheng // DesktopMediaPicker overrides. 16225b3c049e70834cf33790a28643ab058b507b35cBen Cheng virtual void Show(content::WebContents* web_contents, 16325b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::NativeWindow context, 16425b3c049e70834cf33790a28643ab058b507b35cBen Cheng gfx::NativeWindow parent, 16525b3c049e70834cf33790a28643ab058b507b35cBen Cheng const base::string16& app_name, 16625b3c049e70834cf33790a28643ab058b507b35cBen Cheng const base::string16& target_name, 16725b3c049e70834cf33790a28643ab058b507b35cBen Cheng scoped_ptr<DesktopMediaList> media_list, 16825b3c049e70834cf33790a28643ab058b507b35cBen Cheng const DoneCallback& done_callback) OVERRIDE; 16925b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17025b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaPickerDialogView* GetDialogViewForTesting() const { 17125b3c049e70834cf33790a28643ab058b507b35cBen Cheng return dialog_; 17225b3c049e70834cf33790a28643ab058b507b35cBen Cheng } 17325b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17425b3c049e70834cf33790a28643ab058b507b35cBen Cheng private: 17525b3c049e70834cf33790a28643ab058b507b35cBen Cheng DoneCallback callback_; 17625b3c049e70834cf33790a28643ab058b507b35cBen Cheng 17725b3c049e70834cf33790a28643ab058b507b35cBen Cheng // The |dialog_| is owned by the corresponding views::Widget instance. 17825b3c049e70834cf33790a28643ab058b507b35cBen Cheng // When DesktopMediaPickerViews is destroyed the |dialog_| is destroyed 17925b3c049e70834cf33790a28643ab058b507b35cBen Cheng // asynchronously by closing the widget. 18025b3c049e70834cf33790a28643ab058b507b35cBen Cheng DesktopMediaPickerDialogView* dialog_; 18125b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18225b3c049e70834cf33790a28643ab058b507b35cBen Cheng DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerViews); 18325b3c049e70834cf33790a28643ab058b507b35cBen Cheng}; 18425b3c049e70834cf33790a28643ab058b507b35cBen Cheng 18525b3c049e70834cf33790a28643ab058b507b35cBen Cheng#endif // CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_ 18625b3c049e70834cf33790a28643ab058b507b35cBen Cheng