OLD | NEW |
| (Empty) |
1 // Copyright 2015 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 #include "chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h" | |
6 | |
7 #include <stddef.h> | |
8 | |
9 #include <memory> | |
10 | |
11 #include "base/macros.h" | |
12 #include "base/memory/ptr_util.h" | |
13 #include "base/strings/string16.h" | |
14 #include "chrome/browser/chooser_controller/chooser_controller.h" | |
15 #include "chrome/browser/ui/browser.h" | |
16 #include "chrome/browser/ui/browser_window.h" | |
17 #include "chrome/browser/ui/views/device_chooser_content_view.h" | |
18 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h" | |
19 #include "chrome/browser/ui/views/frame/browser_view.h" | |
20 #include "chrome/browser/ui/views/frame/top_container_view.h" | |
21 #include "chrome/browser/ui/views/location_bar/location_bar_view.h" | |
22 #include "chrome/browser/ui/views/location_bar/location_icon_view.h" | |
23 #include "chrome/browser/ui/website_settings/chooser_bubble_delegate.h" | |
24 #include "components/bubble/bubble_controller.h" | |
25 #include "ui/views/controls/image_view.h" | |
26 #include "ui/views/controls/link.h" | |
27 #include "ui/views/controls/styled_label.h" | |
28 #include "ui/views/controls/table/table_view_observer.h" | |
29 #include "ui/views/window/dialog_client_view.h" | |
30 | |
31 std::unique_ptr<BubbleUi> ChooserBubbleDelegate::BuildBubbleUi() { | |
32 return base::MakeUnique<ChooserBubbleUiView>(browser_, | |
33 std::move(chooser_controller_)); | |
34 } | |
35 | |
36 /////////////////////////////////////////////////////////////////////////////// | |
37 // View implementation for the chooser bubble. | |
38 class ChooserBubbleUiViewDelegate : public views::BubbleDialogDelegateView, | |
39 public views::TableViewObserver { | |
40 public: | |
41 ChooserBubbleUiViewDelegate( | |
42 views::View* anchor_view, | |
43 views::BubbleBorder::Arrow anchor_arrow, | |
44 std::unique_ptr<ChooserController> chooser_controller); | |
45 ~ChooserBubbleUiViewDelegate() override; | |
46 | |
47 // views::WidgetDelegate: | |
48 base::string16 GetWindowTitle() const override; | |
49 | |
50 // views::DialogDelegate: | |
51 base::string16 GetDialogButtonLabel(ui::DialogButton button) const override; | |
52 bool IsDialogButtonEnabled(ui::DialogButton button) const override; | |
53 views::View* CreateFootnoteView() override; | |
54 bool Accept() override; | |
55 bool Cancel() override; | |
56 bool Close() override; | |
57 | |
58 // views::DialogDelegateView: | |
59 views::View* GetContentsView() override; | |
60 views::Widget* GetWidget() override; | |
61 const views::Widget* GetWidget() const override; | |
62 | |
63 // views::TableViewObserver: | |
64 void OnSelectionChanged() override; | |
65 | |
66 // Updates the anchor's arrow and view. Also repositions the bubble so it's | |
67 // displayed in the correct location. | |
68 void UpdateAnchor(views::View* anchor_view, | |
69 views::BubbleBorder::Arrow anchor_arrow); | |
70 | |
71 void set_bubble_reference(BubbleReference bubble_reference); | |
72 void UpdateTableView() const; | |
73 | |
74 private: | |
75 DeviceChooserContentView* device_chooser_content_view_; | |
76 BubbleReference bubble_reference_; | |
77 | |
78 DISALLOW_COPY_AND_ASSIGN(ChooserBubbleUiViewDelegate); | |
79 }; | |
80 | |
81 ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate( | |
82 views::View* anchor_view, | |
83 views::BubbleBorder::Arrow anchor_arrow, | |
84 std::unique_ptr<ChooserController> chooser_controller) | |
85 : views::BubbleDialogDelegateView(anchor_view, anchor_arrow), | |
86 device_chooser_content_view_(nullptr) { | |
87 // ------------------------------------ | |
88 // | Chooser bubble title | | |
89 // | -------------------------------- | | |
90 // | | option 0 | | | |
91 // | | option 1 | | | |
92 // | | option 2 | | | |
93 // | | | | | |
94 // | | | | | |
95 // | | | | | |
96 // | -------------------------------- | | |
97 // | [ Connect ] [ Cancel ] | | |
98 // |----------------------------------| | |
99 // | Get help | | |
100 // ------------------------------------ | |
101 | |
102 device_chooser_content_view_ = | |
103 new DeviceChooserContentView(this, std::move(chooser_controller)); | |
104 } | |
105 | |
106 ChooserBubbleUiViewDelegate::~ChooserBubbleUiViewDelegate() {} | |
107 | |
108 base::string16 ChooserBubbleUiViewDelegate::GetWindowTitle() const { | |
109 return device_chooser_content_view_->GetWindowTitle(); | |
110 } | |
111 | |
112 base::string16 ChooserBubbleUiViewDelegate::GetDialogButtonLabel( | |
113 ui::DialogButton button) const { | |
114 return device_chooser_content_view_->GetDialogButtonLabel(button); | |
115 } | |
116 | |
117 bool ChooserBubbleUiViewDelegate::IsDialogButtonEnabled( | |
118 ui::DialogButton button) const { | |
119 return device_chooser_content_view_->IsDialogButtonEnabled(button); | |
120 } | |
121 | |
122 views::View* ChooserBubbleUiViewDelegate::CreateFootnoteView() { | |
123 return device_chooser_content_view_->footnote_link(); | |
124 } | |
125 | |
126 bool ChooserBubbleUiViewDelegate::Accept() { | |
127 device_chooser_content_view_->Accept(); | |
128 if (bubble_reference_) | |
129 bubble_reference_->CloseBubble(BUBBLE_CLOSE_ACCEPTED); | |
130 return true; | |
131 } | |
132 | |
133 bool ChooserBubbleUiViewDelegate::Cancel() { | |
134 device_chooser_content_view_->Cancel(); | |
135 if (bubble_reference_) | |
136 bubble_reference_->CloseBubble(BUBBLE_CLOSE_CANCELED); | |
137 return true; | |
138 } | |
139 | |
140 bool ChooserBubbleUiViewDelegate::Close() { | |
141 device_chooser_content_view_->Close(); | |
142 return true; | |
143 } | |
144 | |
145 views::View* ChooserBubbleUiViewDelegate::GetContentsView() { | |
146 return device_chooser_content_view_; | |
147 } | |
148 | |
149 views::Widget* ChooserBubbleUiViewDelegate::GetWidget() { | |
150 return device_chooser_content_view_->GetWidget(); | |
151 } | |
152 | |
153 const views::Widget* ChooserBubbleUiViewDelegate::GetWidget() const { | |
154 return device_chooser_content_view_->GetWidget(); | |
155 } | |
156 | |
157 void ChooserBubbleUiViewDelegate::OnSelectionChanged() { | |
158 GetDialogClientView()->UpdateDialogButtons(); | |
159 } | |
160 | |
161 void ChooserBubbleUiViewDelegate::UpdateAnchor( | |
162 views::View* anchor_view, | |
163 views::BubbleBorder::Arrow anchor_arrow) { | |
164 if (GetAnchorView() == anchor_view && arrow() == anchor_arrow) | |
165 return; | |
166 | |
167 set_arrow(anchor_arrow); | |
168 | |
169 // Reposition the bubble based on the updated arrow and view. | |
170 SetAnchorView(anchor_view); | |
171 } | |
172 | |
173 void ChooserBubbleUiViewDelegate::set_bubble_reference( | |
174 BubbleReference bubble_reference) { | |
175 bubble_reference_ = bubble_reference; | |
176 DCHECK(bubble_reference_); | |
177 } | |
178 | |
179 void ChooserBubbleUiViewDelegate::UpdateTableView() const { | |
180 device_chooser_content_view_->UpdateTableView(); | |
181 } | |
182 | |
183 ////////////////////////////////////////////////////////////////////////////// | |
184 // ChooserBubbleUiView | |
185 ChooserBubbleUiView::ChooserBubbleUiView( | |
186 Browser* browser, | |
187 std::unique_ptr<ChooserController> chooser_controller) | |
188 : browser_(browser), chooser_bubble_ui_view_delegate_(nullptr) { | |
189 DCHECK(browser_); | |
190 DCHECK(chooser_controller); | |
191 chooser_bubble_ui_view_delegate_ = new ChooserBubbleUiViewDelegate( | |
192 GetAnchorView(), GetAnchorArrow(), std::move(chooser_controller)); | |
193 } | |
194 | |
195 ChooserBubbleUiView::~ChooserBubbleUiView() {} | |
196 | |
197 void ChooserBubbleUiView::Show(BubbleReference bubble_reference) { | |
198 chooser_bubble_ui_view_delegate_->set_bubble_reference(bubble_reference); | |
199 | |
200 // Set |parent_window| because some valid anchors can become hidden. | |
201 views::Widget* widget = views::Widget::GetWidgetForNativeWindow( | |
202 browser_->window()->GetNativeWindow()); | |
203 chooser_bubble_ui_view_delegate_->set_parent_window(widget->GetNativeView()); | |
204 | |
205 views::BubbleDialogDelegateView::CreateBubble( | |
206 chooser_bubble_ui_view_delegate_) | |
207 ->Show(); | |
208 | |
209 chooser_bubble_ui_view_delegate_->UpdateTableView(); | |
210 } | |
211 | |
212 void ChooserBubbleUiView::Close() {} | |
213 | |
214 void ChooserBubbleUiView::UpdateAnchorPosition() { | |
215 chooser_bubble_ui_view_delegate_->UpdateAnchor(GetAnchorView(), | |
216 GetAnchorArrow()); | |
217 } | |
218 | |
219 views::View* ChooserBubbleUiView::GetAnchorView() { | |
220 BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); | |
221 | |
222 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) | |
223 return browser_view->GetLocationBarView() | |
224 ->location_icon_view() | |
225 ->GetImageView(); | |
226 | |
227 if (browser_view->IsFullscreenBubbleVisible()) | |
228 return browser_view->exclusive_access_bubble()->GetView(); | |
229 | |
230 return browser_view->top_container(); | |
231 } | |
232 | |
233 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() { | |
234 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) | |
235 return views::BubbleBorder::TOP_LEFT; | |
236 return views::BubbleBorder::NONE; | |
237 } | |
OLD | NEW |