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