| Index: ui/views/controls/combobox/combobox.cc
|
| diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc
|
| index b93b0bb875915527e3dc23fda12569f6f0682c4d..0a3affae4424e1cc55111190ec92b260d50f448e 100644
|
| --- a/ui/views/controls/combobox/combobox.cc
|
| +++ b/ui/views/controls/combobox/combobox.cc
|
| @@ -33,6 +33,7 @@
|
| #include "ui/views/controls/combobox/combobox_listener.h"
|
| #include "ui/views/controls/focusable_border.h"
|
| #include "ui/views/controls/menu/menu_config.h"
|
| +#include "ui/views/controls/menu/menu_model_adapter.h"
|
| #include "ui/views/controls/menu/menu_runner.h"
|
| #include "ui/views/controls/prefix_selector.h"
|
| #include "ui/views/controls/textfield/textfield.h"
|
| @@ -249,15 +250,15 @@ void PaintArrowButton(
|
| const char Combobox::kViewClassName[] = "views/Combobox";
|
|
|
| // Adapts a ui::ComboboxModel to a ui::MenuModel.
|
| -class Combobox::ComboboxMenuModelAdapter : public ui::MenuModel,
|
| - public ui::ComboboxModelObserver {
|
| +class Combobox::ComboboxMenuModel : public ui::MenuModel,
|
| + public ui::ComboboxModelObserver {
|
| public:
|
| - ComboboxMenuModelAdapter(Combobox* owner, ui::ComboboxModel* model)
|
| + ComboboxMenuModel(Combobox* owner, ui::ComboboxModel* model)
|
| : owner_(owner), model_(model) {
|
| model_->AddObserver(this);
|
| }
|
|
|
| - ~ComboboxMenuModelAdapter() override { model_->RemoveObserver(this); }
|
| + ~ComboboxMenuModel() override { model_->RemoveObserver(this); }
|
|
|
| private:
|
| bool UseCheckmarks() const {
|
| @@ -356,7 +357,7 @@ class Combobox::ComboboxMenuModelAdapter : public ui::MenuModel,
|
| Combobox* owner_; // Weak. Owns this.
|
| ui::ComboboxModel* model_; // Weak.
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(ComboboxMenuModelAdapter);
|
| + DISALLOW_COPY_AND_ASSIGN(ComboboxMenuModel);
|
| };
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -368,7 +369,7 @@ Combobox::Combobox(ui::ComboboxModel* model, Style style)
|
| listener_(NULL),
|
| selected_index_(style == STYLE_ACTION ? 0 : model_->GetDefaultIndex()),
|
| invalid_(false),
|
| - menu_model_adapter_(new ComboboxMenuModelAdapter(this, model)),
|
| + menu_model_(new ComboboxMenuModel(this, model)),
|
| text_button_(new TransparentButton(this)),
|
| arrow_button_(new TransparentButton(this)),
|
| size_to_largest_label_(style_ == STYLE_NORMAL),
|
| @@ -846,16 +847,22 @@ void Combobox::ShowDropDownMenu(ui::MenuSourceType source_type) {
|
| // Allow |menu_runner_| to be set by the testing API, but if this method is
|
| // ever invoked recursively, ensure the old menu is closed.
|
| if (!menu_runner_ || menu_runner_->IsRunning()) {
|
| + menu_model_adapter_.reset(new MenuModelAdapter(
|
| + menu_model_.get(), base::Bind(&Combobox::OnMenuClosed,
|
| + base::Unretained(this), original_state)));
|
| menu_runner_.reset(
|
| - new MenuRunner(menu_model_adapter_.get(), MenuRunner::COMBOBOX));
|
| - }
|
| - if (menu_runner_->RunMenuAt(GetWidget(), nullptr, bounds, anchor_position,
|
| - source_type) == MenuRunner::MENU_DELETED) {
|
| - return;
|
| + new MenuRunner(menu_model_adapter_->CreateMenu(),
|
| + MenuRunner::COMBOBOX | MenuRunner::ASYNC));
|
| }
|
| + menu_runner_->RunMenuAt(GetWidget(), nullptr, bounds, anchor_position,
|
| + source_type);
|
| +}
|
| +
|
| +void Combobox::OnMenuClosed(Button::ButtonState original_button_state) {
|
| menu_runner_.reset();
|
| + menu_model_adapter_.reset();
|
| if (arrow_button_)
|
| - arrow_button_->SetState(original_state);
|
| + arrow_button_->SetState(original_button_state);
|
| closed_time_ = base::Time::Now();
|
|
|
| // Need to explicitly clear mouse handler so that events get sent
|
| @@ -891,8 +898,7 @@ gfx::Size Combobox::GetContentSize() const {
|
|
|
| if (size_to_largest_label_ || i == selected_index_) {
|
| width = std::max(
|
| - width,
|
| - gfx::GetStringWidth(menu_model_adapter_->GetLabelAt(i), font_list));
|
| + width, gfx::GetStringWidth(menu_model_->GetLabelAt(i), font_list));
|
| }
|
| }
|
| return gfx::Size(width, font_list.GetHeight());
|
|
|