| 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 |