OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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/ui/views/website_settings/chooser_bubble_ui_view.h" | 5 #include "chrome/browser/ui/views/website_settings/chooser_bubble_ui_view.h" |
6 | 6 |
| 7 #include <algorithm> |
7 #include <string> | 8 #include <string> |
8 | 9 |
9 #include "base/macros.h" | 10 #include "base/macros.h" |
10 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
11 #include "base/strings/string16.h" | 12 #include "base/strings/string16.h" |
12 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
13 #include "chrome/browser/ui/browser.h" | 14 #include "chrome/browser/ui/browser.h" |
14 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h" | 15 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h" |
15 #include "chrome/browser/ui/views/frame/browser_view.h" | 16 #include "chrome/browser/ui/views/frame/browser_view.h" |
16 #include "chrome/browser/ui/views/frame/top_container_view.h" | 17 #include "chrome/browser/ui/views/frame/top_container_view.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 ui::TableColumn ChooserTableColumn(int id, const std::string& title) { | 109 ui::TableColumn ChooserTableColumn(int id, const std::string& title) { |
109 ui::TableColumn column; | 110 ui::TableColumn column; |
110 column.id = id; | 111 column.id = id; |
111 column.title = base::ASCIIToUTF16(title.c_str()); | 112 column.title = base::ASCIIToUTF16(title.c_str()); |
112 return column; | 113 return column; |
113 } | 114 } |
114 | 115 |
115 class ChooserTableModel : public ui::TableModel, | 116 class ChooserTableModel : public ui::TableModel, |
116 public ChooserBubbleDelegate::Observer { | 117 public ChooserBubbleDelegate::Observer { |
117 public: | 118 public: |
118 explicit ChooserTableModel(ChooserBubbleDelegate* chooser_bubble_delegate) | 119 explicit ChooserTableModel(ChooserBubbleDelegate* chooser_bubble_delegate); |
119 : observer_(nullptr), chooser_bubble_delegate_(chooser_bubble_delegate) { | |
120 chooser_bubble_delegate_->set_observer(this); | |
121 } | |
122 | 120 |
123 // ui::TableModel: | 121 // ui::TableModel: |
124 int RowCount() override { | 122 int RowCount() override; |
125 const std::vector<base::string16>& device_names = | 123 base::string16 GetText(int row, int column_id) override; |
126 chooser_bubble_delegate_->GetOptions(); | 124 void SetObserver(ui::TableModelObserver* observer) override; |
127 if (device_names.empty()) { | |
128 // Here it returns 1 when there is no device. In this case, the | |
129 // table view still needs to display a text message saying no | |
130 // devices found, so the number of rows is 1. | |
131 return 1; | |
132 } else { | |
133 return static_cast<int>(device_names.size()); | |
134 } | |
135 } | |
136 | 125 |
137 // ui::TableModel: | 126 // ChooserBubbleDelegate::Observer: |
138 base::string16 GetText(int row, int column_id) override { | 127 void OnOptionsInitialized() override; |
139 const std::vector<base::string16>& device_names = | 128 void OnOptionAdded(size_t index) override; |
140 chooser_bubble_delegate_->GetOptions(); | 129 void OnOptionRemoved(size_t index) override; |
141 if (device_names.empty()) { | |
142 DCHECK(row == 0); | |
143 return l10n_util::GetStringUTF16( | |
144 IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT); | |
145 } else if (row >= 0 && row < static_cast<int>(device_names.size())) { | |
146 return device_names[row]; | |
147 } else { | |
148 NOTREACHED(); | |
149 return base::string16(); | |
150 } | |
151 } | |
152 | 130 |
153 // ui::TableModel: | 131 void Update(); |
154 void SetObserver(ui::TableModelObserver* observer) override { | 132 void SetConnectButton(views::LabelButton* connect_button); |
155 observer_ = observer; | |
156 } | |
157 | |
158 // ChooserOptions::Observer: | |
159 void OnOptionsInitialized() override { | |
160 if (observer_) { | |
161 observer_->OnModelChanged(); | |
162 Update(); | |
163 } | |
164 } | |
165 | |
166 // ChooserOptions::Observer: | |
167 void OnOptionAdded(int index) override { | |
168 if (observer_) { | |
169 observer_->OnItemsAdded(index, 1); | |
170 Update(); | |
171 } | |
172 } | |
173 | |
174 // ChooserOptions::Observer: | |
175 void OnOptionRemoved(int index) override { | |
176 if (observer_) { | |
177 observer_->OnItemsRemoved(index, 1); | |
178 Update(); | |
179 } | |
180 } | |
181 | |
182 void Update() { | |
183 views::TableView* table_view = static_cast<views::TableView*>(observer_); | |
184 | |
185 if (chooser_bubble_delegate_->GetOptions().empty()) { | |
186 observer_->OnModelChanged(); | |
187 table_view->SetEnabled(false); | |
188 } else { | |
189 table_view->SetEnabled(true); | |
190 } | |
191 } | |
192 | |
193 void SetConnectButton(views::LabelButton* connect_button) { | |
194 connect_button_ = connect_button; | |
195 } | |
196 | 133 |
197 private: | 134 private: |
198 ui::TableModelObserver* observer_; | 135 ui::TableModelObserver* observer_; |
199 ChooserBubbleDelegate* chooser_bubble_delegate_; | 136 ChooserBubbleDelegate* chooser_bubble_delegate_; |
200 views::LabelButton* connect_button_; | 137 views::LabelButton* connect_button_; |
201 }; | 138 }; |
202 | 139 |
203 ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate( | 140 ChooserBubbleUiViewDelegate::ChooserBubbleUiViewDelegate( |
204 views::View* anchor_view, | 141 views::View* anchor_view, |
205 views::BubbleBorder::Arrow anchor_arrow, | 142 views::BubbleBorder::Arrow anchor_arrow, |
(...skipping 19 matching lines...) Expand all Loading... |
225 chooser_table_model_ = new ChooserTableModel(chooser_bubble_delegate_); | 162 chooser_table_model_ = new ChooserTableModel(chooser_bubble_delegate_); |
226 table_view_ = new views::TableView(chooser_table_model_, table_columns, | 163 table_view_ = new views::TableView(chooser_table_model_, table_columns, |
227 views::TEXT_ONLY, true); | 164 views::TEXT_ONLY, true); |
228 table_view_->set_select_on_remove(false); | 165 table_view_->set_select_on_remove(false); |
229 chooser_table_model_->SetObserver(table_view_); | 166 chooser_table_model_->SetObserver(table_view_); |
230 table_view_->SetObserver(this); | 167 table_view_->SetObserver(this); |
231 layout->AddView(table_view_->CreateParentIfNecessary(), 1, 1, | 168 layout->AddView(table_view_->CreateParentIfNecessary(), 1, 1, |
232 views::GridLayout::FILL, views::GridLayout::FILL, | 169 views::GridLayout::FILL, views::GridLayout::FILL, |
233 kChooserPermissionBubbleWidth, | 170 kChooserPermissionBubbleWidth, |
234 kChooserPermissionBubbleHeight); | 171 kChooserPermissionBubbleHeight); |
235 if (chooser_bubble_delegate_->GetOptions().empty()) { | 172 if (chooser_bubble_delegate_->NumOptions() == 0) { |
236 table_view_->SetEnabled(false); | 173 table_view_->SetEnabled(false); |
237 } | 174 } |
238 | 175 |
239 layout->AddPaddingRow(0, kItemMajorSpacing); | 176 layout->AddPaddingRow(0, kItemMajorSpacing); |
240 | 177 |
241 views::View* button_row = new views::View(); | 178 views::View* button_row = new views::View(); |
242 views::GridLayout* button_layout = new views::GridLayout(button_row); | 179 views::GridLayout* button_layout = new views::GridLayout(button_row); |
243 views::ColumnSet* button_columns = button_layout->AddColumnSet(0); | 180 views::ColumnSet* button_columns = button_layout->AddColumnSet(0); |
244 button_row->SetLayoutManager(button_layout); | 181 button_row->SetLayoutManager(button_layout); |
245 layout->StartRow(1, 0); | 182 layout->StartRow(1, 0); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 views::BubbleBorder::Arrow adjusted_arrow = anchor_arrow; | 274 views::BubbleBorder::Arrow adjusted_arrow = anchor_arrow; |
338 if (base::i18n::IsRTL()) | 275 if (base::i18n::IsRTL()) |
339 adjusted_arrow = views::BubbleBorder::horizontal_mirror(adjusted_arrow); | 276 adjusted_arrow = views::BubbleBorder::horizontal_mirror(adjusted_arrow); |
340 frame->SetBubbleBorder(scoped_ptr<views::BubbleBorder>( | 277 frame->SetBubbleBorder(scoped_ptr<views::BubbleBorder>( |
341 new views::BubbleBorder(adjusted_arrow, shadow(), color()))); | 278 new views::BubbleBorder(adjusted_arrow, shadow(), color()))); |
342 | 279 |
343 // Reposition the bubble based on the updated arrow and view. | 280 // Reposition the bubble based on the updated arrow and view. |
344 SetAnchorView(anchor_view); | 281 SetAnchorView(anchor_view); |
345 } | 282 } |
346 | 283 |
| 284 ChooserTableModel::ChooserTableModel( |
| 285 ChooserBubbleDelegate* chooser_bubble_delegate) |
| 286 : observer_(nullptr), chooser_bubble_delegate_(chooser_bubble_delegate) { |
| 287 chooser_bubble_delegate_->set_observer(this); |
| 288 } |
| 289 |
| 290 int ChooserTableModel::RowCount() { |
| 291 // When there are no devices, the table contains a message saying there |
| 292 // are no devices, so the number of rows is always at least 1. |
| 293 return std::max(static_cast<int>(chooser_bubble_delegate_->NumOptions()), 1); |
| 294 } |
| 295 |
| 296 base::string16 ChooserTableModel::GetText(int row, int column_id) { |
| 297 int num_options = static_cast<int>(chooser_bubble_delegate_->NumOptions()); |
| 298 if (num_options == 0) { |
| 299 DCHECK_EQ(0, row); |
| 300 return l10n_util::GetStringUTF16( |
| 301 IDS_CHOOSER_BUBBLE_NO_DEVICES_FOUND_PROMPT); |
| 302 } |
| 303 |
| 304 DCHECK_GE(row, 0); |
| 305 DCHECK_LT(row, num_options); |
| 306 return chooser_bubble_delegate_->GetOption(static_cast<size_t>(row)); |
| 307 } |
| 308 |
| 309 void ChooserTableModel::SetObserver(ui::TableModelObserver* observer) { |
| 310 observer_ = observer; |
| 311 } |
| 312 |
| 313 void ChooserTableModel::OnOptionsInitialized() { |
| 314 if (observer_) { |
| 315 observer_->OnModelChanged(); |
| 316 Update(); |
| 317 } |
| 318 } |
| 319 |
| 320 void ChooserTableModel::OnOptionAdded(size_t index) { |
| 321 if (observer_) { |
| 322 observer_->OnItemsAdded(static_cast<int>(index), 1); |
| 323 Update(); |
| 324 } |
| 325 } |
| 326 |
| 327 void ChooserTableModel::OnOptionRemoved(size_t index) { |
| 328 if (observer_) { |
| 329 observer_->OnItemsRemoved(static_cast<int>(index), 1); |
| 330 Update(); |
| 331 } |
| 332 } |
| 333 |
| 334 void ChooserTableModel::Update() { |
| 335 views::TableView* table_view = static_cast<views::TableView*>(observer_); |
| 336 |
| 337 if (chooser_bubble_delegate_->NumOptions() == 0) { |
| 338 observer_->OnModelChanged(); |
| 339 table_view->SetEnabled(false); |
| 340 } else { |
| 341 table_view->SetEnabled(true); |
| 342 } |
| 343 } |
| 344 |
| 345 void ChooserTableModel::SetConnectButton(views::LabelButton* connect_button) { |
| 346 connect_button_ = connect_button; |
| 347 } |
| 348 |
347 ////////////////////////////////////////////////////////////////////////////// | 349 ////////////////////////////////////////////////////////////////////////////// |
348 // ChooserBubbleUiView | 350 // ChooserBubbleUiView |
349 | 351 |
350 ChooserBubbleUiView::ChooserBubbleUiView( | 352 ChooserBubbleUiView::ChooserBubbleUiView( |
351 Browser* browser, | 353 Browser* browser, |
352 ChooserBubbleDelegate* chooser_bubble_delegate) | 354 ChooserBubbleDelegate* chooser_bubble_delegate) |
353 : browser_(browser), | 355 : browser_(browser), |
354 chooser_bubble_delegate_(chooser_bubble_delegate), | 356 chooser_bubble_delegate_(chooser_bubble_delegate), |
355 chooser_bubble_ui_view_delegate_(nullptr) { | 357 chooser_bubble_ui_view_delegate_(nullptr) { |
356 DCHECK(browser_); | 358 DCHECK(browser_); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 return browser_view->exclusive_access_bubble()->GetView(); | 400 return browser_view->exclusive_access_bubble()->GetView(); |
399 | 401 |
400 return browser_view->top_container(); | 402 return browser_view->top_container(); |
401 } | 403 } |
402 | 404 |
403 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() { | 405 views::BubbleBorder::Arrow ChooserBubbleUiView::GetAnchorArrow() { |
404 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) | 406 if (browser_->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR)) |
405 return views::BubbleBorder::TOP_LEFT; | 407 return views::BubbleBorder::TOP_LEFT; |
406 return views::BubbleBorder::NONE; | 408 return views::BubbleBorder::NONE; |
407 } | 409 } |
OLD | NEW |