| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "views/controls/combobox/native_combobox_views.h" | 5 #include "views/controls/combobox/native_combobox_views.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "ui/base/keycodes/keyboard_codes.h" | 10 #include "ui/base/keycodes/keyboard_codes.h" |
| 11 #include "ui/base/models/combobox_model.h" | 11 #include "ui/base/models/combobox_model.h" |
| 12 #include "ui/base/resource/resource_bundle.h" | 12 #include "ui/base/resource/resource_bundle.h" |
| 13 #include "ui/gfx/canvas.h" | 13 #include "ui/gfx/canvas.h" |
| 14 #include "ui/gfx/canvas_skia.h" | 14 #include "ui/gfx/canvas_skia.h" |
| 15 #include "ui/gfx/font.h" | 15 #include "ui/gfx/font.h" |
| 16 #include "ui/gfx/path.h" | 16 #include "ui/gfx/path.h" |
| 17 #include "views/background.h" | 17 #include "views/background.h" |
| 18 #include "views/border.h" | 18 #include "views/border.h" |
| 19 #include "views/controls/combobox/combobox.h" | 19 #include "views/controls/combobox/combobox.h" |
| 20 #include "views/controls/focusable_border.h" | 20 #include "views/controls/focusable_border.h" |
| 21 #include "views/controls/menu/menu_runner.h" |
| 21 #include "views/controls/menu/submenu_view.h" | 22 #include "views/controls/menu/submenu_view.h" |
| 22 #include "views/widget/root_view.h" | 23 #include "views/widget/root_view.h" |
| 23 #include "views/widget/widget.h" | 24 #include "views/widget/widget.h" |
| 24 | 25 |
| 25 #if defined(OS_LINUX) | 26 #if defined(OS_LINUX) |
| 26 #include "ui/gfx/gtk_util.h" | 27 #include "ui/gfx/gtk_util.h" |
| 27 #endif | 28 #endif |
| 28 | 29 |
| 29 namespace { | 30 namespace { |
| 30 | 31 |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 NOTREACHED(); | 157 NOTREACHED(); |
| 157 } | 158 } |
| 158 | 159 |
| 159 ///////////////////////////////////////////////////////////////// | 160 ///////////////////////////////////////////////////////////////// |
| 160 // NativeComboboxViews, NativeComboboxWrapper overrides: | 161 // NativeComboboxViews, NativeComboboxWrapper overrides: |
| 161 | 162 |
| 162 void NativeComboboxViews::UpdateFromModel() { | 163 void NativeComboboxViews::UpdateFromModel() { |
| 163 int max_width = 0; | 164 int max_width = 0; |
| 164 const gfx::Font &font = GetFont(); | 165 const gfx::Font &font = GetFont(); |
| 165 | 166 |
| 166 dropdown_list_menu_.reset(new MenuItemView(this)); | 167 MenuItemView* menu = new MenuItemView(this); |
| 168 // MenuRunner owns |menu|. |
| 169 dropdown_list_menu_runner_.reset(new MenuRunner(menu)); |
| 167 | 170 |
| 168 int num_items = combobox_->model()->GetItemCount(); | 171 int num_items = combobox_->model()->GetItemCount(); |
| 169 for (int i = 0; i < num_items; ++i) { | 172 for (int i = 0; i < num_items; ++i) { |
| 170 string16 text = combobox_->model()->GetItemAt(i); | 173 string16 text = combobox_->model()->GetItemAt(i); |
| 171 | 174 |
| 172 // Inserting the Unicode formatting characters if necessary so that the | 175 // Inserting the Unicode formatting characters if necessary so that the |
| 173 // text is displayed correctly in right-to-left UIs. | 176 // text is displayed correctly in right-to-left UIs. |
| 174 base::i18n::AdjustStringForLocaleDirection(&text); | 177 base::i18n::AdjustStringForLocaleDirection(&text); |
| 175 | 178 |
| 176 dropdown_list_menu_->AppendMenuItem(i + kFirstMenuItemId, UTF16ToWide(text), | 179 menu->AppendMenuItem(i + kFirstMenuItemId, UTF16ToWide(text), |
| 177 MenuItemView::NORMAL); | 180 MenuItemView::NORMAL); |
| 178 max_width = std::max(max_width, font.GetStringWidth(text)); | 181 max_width = std::max(max_width, font.GetStringWidth(text)); |
| 179 } | 182 } |
| 180 | 183 |
| 181 content_width_ = max_width; | 184 content_width_ = max_width; |
| 182 content_height_ = font.GetFontSize(); | 185 content_height_ = font.GetFontSize(); |
| 183 } | 186 } |
| 184 | 187 |
| 185 void NativeComboboxViews::UpdateSelectedItem() { | 188 void NativeComboboxViews::UpdateSelectedItem() { |
| 186 selected_item_ = combobox_->selected_item(); | 189 selected_item_ = combobox_->selected_item(); |
| 187 } | 190 } |
| 188 | 191 |
| 189 void NativeComboboxViews::UpdateEnabled() { | 192 void NativeComboboxViews::UpdateEnabled() { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 lb.width() - kComboboxArrowSize - kComboboxArrowMargin, | 338 lb.width() - kComboboxArrowSize - kComboboxArrowMargin, |
| 336 kTopInsetSize, | 339 kTopInsetSize, |
| 337 lb.width() - kComboboxArrowSize - kComboboxArrowMargin, | 340 lb.width() - kComboboxArrowSize - kComboboxArrowMargin, |
| 338 lb.height() - kBottomInsetSize); | 341 lb.height() - kBottomInsetSize); |
| 339 | 342 |
| 340 canvas->Restore(); | 343 canvas->Restore(); |
| 341 } | 344 } |
| 342 | 345 |
| 343 void NativeComboboxViews::ShowDropDownMenu() { | 346 void NativeComboboxViews::ShowDropDownMenu() { |
| 344 | 347 |
| 345 if (!dropdown_list_menu_.get()) | 348 if (!dropdown_list_menu_runner_.get()) |
| 346 UpdateFromModel(); | 349 UpdateFromModel(); |
| 347 | 350 |
| 348 // Extend the menu to the width of the combobox. | 351 // Extend the menu to the width of the combobox. |
| 349 SubmenuView* submenu = dropdown_list_menu_->CreateSubmenu(); | 352 SubmenuView* submenu = dropdown_list_menu_runner_->GetMenu()->CreateSubmenu(); |
| 350 submenu->set_minimum_preferred_width(size().width()); | 353 submenu->set_minimum_preferred_width(size().width()); |
| 351 | 354 |
| 352 gfx::Rect lb = GetLocalBounds(); | 355 gfx::Rect lb = GetLocalBounds(); |
| 353 gfx::Point menu_position(lb.origin()); | 356 gfx::Point menu_position(lb.origin()); |
| 354 View::ConvertPointToScreen(this, &menu_position); | 357 View::ConvertPointToScreen(this, &menu_position); |
| 355 if (menu_position.x() < 0) | 358 if (menu_position.x() < 0) |
| 356 menu_position.set_x(0); | 359 menu_position.set_x(0); |
| 357 | 360 |
| 358 gfx::Rect bounds(menu_position, lb.size()); | 361 gfx::Rect bounds(menu_position, lb.size()); |
| 359 | 362 |
| 360 dropdown_open_ = true; | 363 dropdown_open_ = true; |
| 361 dropdown_list_menu_->RunMenuAt(NULL, NULL, bounds, MenuItemView::TOPLEFT, | 364 if (dropdown_list_menu_runner_->RunMenuAt( |
| 362 true); | 365 NULL, NULL, bounds, MenuItemView::TOPLEFT, |
| 366 MenuRunner::HAS_MNEMONICS) == MenuRunner::MENU_DELETED) |
| 367 return; |
| 363 dropdown_open_ = false; | 368 dropdown_open_ = false; |
| 364 | 369 |
| 365 // Need to explicitly clear mouse handler so that events get sent | 370 // Need to explicitly clear mouse handler so that events get sent |
| 366 // properly after the menu finishes running. If we don't do this, then | 371 // properly after the menu finishes running. If we don't do this, then |
| 367 // the first click to other parts of the UI is eaten. | 372 // the first click to other parts of the UI is eaten. |
| 368 SetMouseHandler(NULL); | 373 SetMouseHandler(NULL); |
| 369 } | 374 } |
| 370 | 375 |
| 371 } // namespace views | 376 } // namespace views |
| OLD | NEW |