Upstream version 10.38.208.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / desktop_media_picker_views.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_
6 #define CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_
7
8 #include "chrome/browser/media/desktop_media_list_observer.h"
9 #include "chrome/browser/media/desktop_media_picker.h"
10 #include "ui/views/window/dialog_delegate.h"
11
12 namespace views {
13 class ImageView;
14 class Label;
15 }  // namespace views
16
17 class DesktopMediaPickerDialogView;
18 class DesktopMediaPickerViews;
19 class DesktopMediaSourceView;
20
21 // View that shows a list of desktop media sources available from
22 // DesktopMediaList.
23 class DesktopMediaListView : public views::View,
24                              public DesktopMediaListObserver {
25  public:
26   DesktopMediaListView(DesktopMediaPickerDialogView* parent,
27                        scoped_ptr<DesktopMediaList> media_list);
28   virtual ~DesktopMediaListView();
29
30   void StartUpdating(content::DesktopMediaID::Id dialog_window_id);
31
32   // Called by DesktopMediaSourceView when selection has changed.
33   void OnSelectionChanged();
34
35   // Called by DesktopMediaSourceView when a source has been double-clicked.
36   void OnDoubleClick();
37
38   // Returns currently selected source.
39   DesktopMediaSourceView* GetSelection();
40
41   // views::View overrides.
42   virtual gfx::Size GetPreferredSize() const OVERRIDE;
43   virtual void Layout() OVERRIDE;
44   virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
45
46  private:
47   // DesktopMediaList::Observer interface
48   virtual void OnSourceAdded(int index) OVERRIDE;
49   virtual void OnSourceRemoved(int index) OVERRIDE;
50   virtual void OnSourceMoved(int old_index, int new_index) OVERRIDE;
51   virtual void OnSourceNameChanged(int index) OVERRIDE;
52   virtual void OnSourceThumbnailChanged(int index) OVERRIDE;
53
54   DesktopMediaPickerDialogView* parent_;
55   scoped_ptr<DesktopMediaList> media_list_;
56
57   DISALLOW_COPY_AND_ASSIGN(DesktopMediaListView);
58 };
59
60 // View used for each item in DesktopMediaListView. Shows a single desktop media
61 // source as a thumbnail with the title under it.
62 class DesktopMediaSourceView : public views::View {
63  public:
64   DesktopMediaSourceView(DesktopMediaListView* parent,
65                          content::DesktopMediaID source_id);
66   virtual ~DesktopMediaSourceView();
67
68   // Updates thumbnail and title from |source|.
69   void SetName(const base::string16& name);
70   void SetThumbnail(const gfx::ImageSkia& thumbnail);
71
72   // Id for the source shown by this View.
73   const content::DesktopMediaID& source_id() const { return source_id_; }
74
75   // Returns true if the source is selected.
76   bool is_selected() const { return selected_; }
77
78   // views::View interface.
79   virtual const char* GetClassName() const OVERRIDE;
80   virtual void Layout() OVERRIDE;
81   virtual views::View* GetSelectedViewForGroup(int group) OVERRIDE;
82   virtual bool IsGroupFocusTraversable() const OVERRIDE;
83   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
84   virtual void OnFocus() OVERRIDE;
85   virtual void OnBlur() OVERRIDE;
86   virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
87   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
88
89  private:
90   // Updates selection state of the element. If |selected| is true then also
91   // calls SetSelected(false) for the source view that was selected before that
92   // (if any).
93   void SetSelected(bool selected);
94
95   DesktopMediaListView* parent_;
96   content::DesktopMediaID source_id_;
97
98   views::ImageView* image_view_;
99   views::Label* label_;
100
101   bool selected_;
102
103   DISALLOW_COPY_AND_ASSIGN(DesktopMediaSourceView);
104 };
105
106 // Dialog view used for DesktopMediaPickerViews.
107 class DesktopMediaPickerDialogView : public views::DialogDelegateView {
108  public:
109   DesktopMediaPickerDialogView(content::WebContents* parent_web_contents,
110                                gfx::NativeWindow context,
111                                DesktopMediaPickerViews* parent,
112                                const base::string16& app_name,
113                                const base::string16& target_name,
114                                scoped_ptr<DesktopMediaList> media_list);
115   virtual ~DesktopMediaPickerDialogView();
116
117   // Called by parent (DesktopMediaPickerViews) when it's destroyed.
118   void DetachParent();
119
120   // Called by DesktopMediaListView.
121   void OnSelectionChanged();
122   void OnDoubleClick();
123
124   // views::View overrides.
125   virtual gfx::Size GetPreferredSize() const OVERRIDE;
126   virtual void Layout() OVERRIDE;
127
128   // views::DialogDelegateView overrides.
129   virtual ui::ModalType GetModalType() const OVERRIDE;
130   virtual base::string16 GetWindowTitle() const OVERRIDE;
131   virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE;
132   virtual base::string16 GetDialogButtonLabel(
133       ui::DialogButton button) const OVERRIDE;
134   virtual bool Accept() OVERRIDE;
135   virtual void DeleteDelegate() OVERRIDE;
136
137   void OnMediaListRowsChanged();
138
139   DesktopMediaSourceView* GetMediaSourceViewForTesting(int index) const;
140
141  private:
142   DesktopMediaPickerViews* parent_;
143   base::string16 app_name_;
144
145   views::Label* label_;
146   views::ScrollView* scroll_view_;
147   DesktopMediaListView* list_view_;
148
149   DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerDialogView);
150 };
151
152 // Implementation of DesktopMediaPicker for Views.
153 class DesktopMediaPickerViews : public DesktopMediaPicker {
154  public:
155   DesktopMediaPickerViews();
156   virtual ~DesktopMediaPickerViews();
157
158   void NotifyDialogResult(content::DesktopMediaID source);
159
160   // DesktopMediaPicker overrides.
161   virtual void Show(content::WebContents* web_contents,
162                     gfx::NativeWindow context,
163                     gfx::NativeWindow parent,
164                     const base::string16& app_name,
165                     const base::string16& target_name,
166                     scoped_ptr<DesktopMediaList> media_list,
167                     const DoneCallback& done_callback) OVERRIDE;
168
169   DesktopMediaPickerDialogView* GetDialogViewForTesting() const {
170     return dialog_;
171   }
172
173  private:
174   DoneCallback callback_;
175
176   // The |dialog_| is owned by the corresponding views::Widget instance.
177   // When DesktopMediaPickerViews is destroyed the |dialog_| is destroyed
178   // asynchronously by closing the widget.
179   DesktopMediaPickerDialogView* dialog_;
180
181   DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerViews);
182 };
183
184 #endif  // CHROME_BROWSER_UI_VIEWS_DESKTOP_MEDIA_PICKER_VIEWS_H_