Index: views/controls/combobox/native_combobox_views.cc |
diff --git a/views/controls/combobox/native_combobox_views.cc b/views/controls/combobox/native_combobox_views.cc |
deleted file mode 100644 |
index f48f9bd4dc9120657d08d576cc6e2b8d5db2e4c1..0000000000000000000000000000000000000000 |
--- a/views/controls/combobox/native_combobox_views.cc |
+++ /dev/null |
@@ -1,386 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "views/controls/combobox/native_combobox_views.h" |
- |
-#include <algorithm> |
- |
-#include "base/command_line.h" |
-#include "base/utf_string_conversions.h" |
-#include "ui/base/keycodes/keyboard_codes.h" |
-#include "ui/base/models/combobox_model.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/canvas.h" |
-#include "ui/gfx/canvas_skia.h" |
-#include "ui/gfx/font.h" |
-#include "ui/gfx/path.h" |
-#include "ui/views/widget/root_view.h" |
-#include "ui/views/widget/widget.h" |
-#include "views/background.h" |
-#include "views/border.h" |
-#include "views/controls/combobox/combobox.h" |
-#include "views/controls/focusable_border.h" |
-#include "views/controls/menu/menu_runner.h" |
-#include "views/controls/menu/submenu_view.h" |
- |
-#if defined(OS_LINUX) |
-#include "ui/gfx/gtk_util.h" |
-#endif |
- |
-namespace { |
- |
-// Define the size of the insets. |
-const int kTopInsetSize = 4; |
-const int kLeftInsetSize = 4; |
-const int kBottomInsetSize = 4; |
-const int kRightInsetSize = 4; |
- |
-// Limit how small a combobox can be. |
-const int kMinComboboxWidth = 148; |
- |
-// Size of the combobox arrow. |
-const int kComboboxArrowSize = 9; |
-const int kComboboxArrowOffset = 7; |
-const int kComboboxArrowMargin = 12; |
- |
-// Color settings for text and border. |
-// These are tentative, and should be derived from theme, system |
-// settings and current settings. |
-const SkColor kDefaultBorderColor = SK_ColorGRAY; |
-const SkColor kTextColor = SK_ColorBLACK; |
- |
-// Define the id of the first item in the menu (since it needs to be > 0) |
-const int kFirstMenuItemId = 1000; |
- |
-} // namespace |
- |
-namespace views { |
- |
-const char NativeComboboxViews::kViewClassName[] = |
- "views/NativeComboboxViews"; |
- |
-NativeComboboxViews::NativeComboboxViews(Combobox* parent) |
- : combobox_(parent), |
- text_border_(new FocusableBorder()), |
- dropdown_open_(false), |
- selected_item_(-1), |
- content_width_(0), |
- content_height_(0) { |
- set_border(text_border_); |
-} |
- |
-NativeComboboxViews::~NativeComboboxViews() { |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeComboboxViews, View overrides: |
- |
-bool NativeComboboxViews::OnMousePressed(const views::MouseEvent& mouse_event) { |
- combobox_->RequestFocus(); |
- if (mouse_event.IsLeftMouseButton()) { |
- UpdateFromModel(); |
- ShowDropDownMenu(); |
- } |
- |
- return true; |
-} |
- |
-bool NativeComboboxViews::OnMouseDragged(const views::MouseEvent& mouse_event) { |
- return true; |
-} |
- |
-bool NativeComboboxViews::OnKeyPressed(const views::KeyEvent& key_event) { |
- // TODO(oshima): handle IME. |
- DCHECK(key_event.type() == ui::ET_KEY_PRESSED); |
- |
- // Check if we are in the default state (-1) and set to first item. |
- if(selected_item_ == -1) |
- selected_item_ = 0; |
- |
- int new_item = selected_item_; |
- switch(key_event.key_code()){ |
- |
- // move to the next element if any |
- case ui::VKEY_DOWN: |
- if (new_item < (combobox_->model()->GetItemCount() - 1)) |
- new_item++; |
- break; |
- |
- // move to the end of the list |
- case ui::VKEY_END: |
- case ui::VKEY_NEXT: |
- new_item = combobox_->model()->GetItemCount() - 1; |
- break; |
- |
- // move to the top of the list |
- case ui::VKEY_HOME: |
- case ui::VKEY_PRIOR: |
- new_item = 0; |
- break; |
- |
- // move to the previous element if any |
- case ui::VKEY_UP: |
- if (new_item > 0) |
- new_item--; |
- break; |
- |
- default: |
- return false; |
- |
- } |
- |
- if(new_item != selected_item_) { |
- selected_item_ = new_item; |
- combobox_->SelectionChanged(); |
- SchedulePaint(); |
- } |
- |
- return true; |
-} |
- |
-bool NativeComboboxViews::OnKeyReleased(const views::KeyEvent& key_event) { |
- return true; |
-} |
- |
-void NativeComboboxViews::OnPaint(gfx::Canvas* canvas) { |
- text_border_->set_has_focus(combobox_->HasFocus()); |
- OnPaintBackground(canvas); |
- PaintText(canvas); |
- OnPaintBorder(canvas); |
-} |
- |
-void NativeComboboxViews::OnFocus() { |
- NOTREACHED(); |
-} |
- |
-void NativeComboboxViews::OnBlur() { |
- NOTREACHED(); |
-} |
- |
-///////////////////////////////////////////////////////////////// |
-// NativeComboboxViews, NativeComboboxWrapper overrides: |
- |
-void NativeComboboxViews::UpdateFromModel() { |
- int max_width = 0; |
- const gfx::Font &font = GetFont(); |
- |
- MenuItemView* menu = new MenuItemView(this); |
- // MenuRunner owns |menu|. |
- dropdown_list_menu_runner_.reset(new MenuRunner(menu)); |
- |
- int num_items = combobox_->model()->GetItemCount(); |
- for (int i = 0; i < num_items; ++i) { |
- string16 text = combobox_->model()->GetItemAt(i); |
- |
- // Inserting the Unicode formatting characters if necessary so that the |
- // text is displayed correctly in right-to-left UIs. |
- base::i18n::AdjustStringForLocaleDirection(&text); |
- |
- menu->AppendMenuItem(i + kFirstMenuItemId, text, MenuItemView::NORMAL); |
- max_width = std::max(max_width, font.GetStringWidth(text)); |
- } |
- |
- content_width_ = max_width; |
- content_height_ = font.GetFontSize(); |
-} |
- |
-void NativeComboboxViews::UpdateSelectedItem() { |
- selected_item_ = combobox_->selected_item(); |
-} |
- |
-void NativeComboboxViews::UpdateEnabled() { |
- SetEnabled(combobox_->IsEnabled()); |
-} |
- |
-int NativeComboboxViews::GetSelectedItem() const { |
- return selected_item_; |
-} |
- |
-bool NativeComboboxViews::IsDropdownOpen() const { |
- return dropdown_open_; |
-} |
- |
-gfx::Size NativeComboboxViews::GetPreferredSize() { |
- if (content_width_ == 0) |
- UpdateFromModel(); |
- |
- // TODO(saintlou) the preferred size will drive the local bounds |
- // which in turn is used to set the minimum width for the dropdown |
- gfx::Insets insets = GetInsets(); |
- return gfx::Size(std::min(kMinComboboxWidth, |
- content_width_ + 2 * (insets.width())), |
- content_height_ + 2 * (insets.height())); |
-} |
- |
-View* NativeComboboxViews::GetView() { |
- return this; |
-} |
- |
-void NativeComboboxViews::SetFocus() { |
- text_border_->set_has_focus(true); |
-} |
- |
-bool NativeComboboxViews::HandleKeyPressed(const KeyEvent& e) { |
- return OnKeyPressed(e); |
-} |
- |
-bool NativeComboboxViews::HandleKeyReleased(const KeyEvent& e) { |
- return true; |
-} |
- |
-void NativeComboboxViews::HandleFocus() { |
- SchedulePaint(); |
-} |
- |
-void NativeComboboxViews::HandleBlur() { |
-} |
- |
-gfx::NativeView NativeComboboxViews::GetTestingHandle() const { |
- NOTREACHED(); |
- return NULL; |
-} |
- |
-///////////////////////////////////////////////////////////////// |
-// NativeComboboxViews, views::MenuDelegate overrides: |
-// (note that the id received is offset by kFirstMenuItemId) |
- |
-bool NativeComboboxViews::IsItemChecked(int id) const { |
- return false; |
-} |
- |
-bool NativeComboboxViews::IsCommandEnabled(int id) const { |
- return true; |
-} |
- |
-void NativeComboboxViews::ExecuteCommand(int id) { |
- // revert menu offset to map back to combobox model |
- id -= kFirstMenuItemId; |
- DCHECK_LT(id, combobox_->model()->GetItemCount()); |
- selected_item_ = id; |
- combobox_->SelectionChanged(); |
- SchedulePaint(); |
-} |
- |
-bool NativeComboboxViews::GetAccelerator(int id, ui::Accelerator* accel) { |
- return false; |
-} |
- |
-///////////////////////////////////////////////////////////////// |
-// NativeComboboxViews private methods: |
- |
-const gfx::Font& NativeComboboxViews::GetFont() const { |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- return rb.GetFont(ResourceBundle::BaseFont); |
-} |
- |
-// tip_x and tip_y are the coordinates of the tip of an arrow head which is |
-// drawn as an isoscele triangle |
-// shift_x and shift_y are offset from tip_x and tip_y to specify the relative |
-// positions of the 2 equal angles (ie not the angle at the tip of the arrow) |
-// Note: the width of the base (the side opposite the tip) is 2 * shift_x |
-void NativeComboboxViews::DrawArrow(gfx::Canvas* canvas, |
- int tip_x, |
- int tip_y, |
- int shift_x, |
- int shift_y) const { |
- SkPaint paint; |
- paint.setStyle(SkPaint::kStrokeAndFill_Style); |
- paint.setColor(kTextColor); |
- paint.setAntiAlias(true); |
- gfx::Path path; |
- path.incReserve(4); |
- path.moveTo(SkIntToScalar(tip_x), SkIntToScalar(tip_y)); |
- path.lineTo(SkIntToScalar(tip_x + shift_x), SkIntToScalar(tip_y + shift_y)); |
- path.lineTo(SkIntToScalar(tip_x - shift_x), SkIntToScalar(tip_y + shift_y)); |
- path.close(); |
- canvas->GetSkCanvas()->drawPath(path, paint); |
-} |
- |
- |
-void NativeComboboxViews::PaintText(gfx::Canvas* canvas) { |
- gfx::Insets insets = GetInsets(); |
- |
- canvas->Save(); |
- canvas->ClipRect(GetContentsBounds()); |
- |
- int x = insets.left(); |
- int y = insets.top(); |
- int text_height = height() - insets.height(); |
- SkColor text_color = kTextColor; |
- |
- int index = GetSelectedItem(); |
- if (index < 0 || index > combobox_->model()->GetItemCount()) |
- index = 0; |
- string16 text = combobox_->model()->GetItemAt(index); |
- |
- const gfx::Font& font = GetFont(); |
- int width = font.GetStringWidth(text); |
- |
- canvas->DrawStringInt(text, font, text_color, x, y, width, text_height); |
- |
- // draw the double arrow |
- gfx::Rect lb = GetLocalBounds(); |
- DrawArrow(canvas, |
- lb.width() - (kComboboxArrowSize / 2) - kComboboxArrowOffset, |
- lb.height() / 2 - kComboboxArrowSize, |
- kComboboxArrowSize / 2, |
- kComboboxArrowSize - 2); |
- DrawArrow(canvas, |
- lb.width() - (kComboboxArrowSize / 2) - kComboboxArrowOffset, |
- lb.height() / 2 + kComboboxArrowSize, |
- -kComboboxArrowSize / 2, |
- -(kComboboxArrowSize - 2)); |
- |
- // draw the margin |
- canvas->DrawLineInt(kDefaultBorderColor, |
- lb.width() - kComboboxArrowSize - kComboboxArrowMargin, |
- kTopInsetSize, |
- lb.width() - kComboboxArrowSize - kComboboxArrowMargin, |
- lb.height() - kBottomInsetSize); |
- |
- canvas->Restore(); |
-} |
- |
-void NativeComboboxViews::ShowDropDownMenu() { |
- |
- if (!dropdown_list_menu_runner_.get()) |
- UpdateFromModel(); |
- |
- // Extend the menu to the width of the combobox. |
- SubmenuView* submenu = dropdown_list_menu_runner_->GetMenu()->CreateSubmenu(); |
- submenu->set_minimum_preferred_width(size().width()); |
- |
- gfx::Rect lb = GetLocalBounds(); |
- gfx::Point menu_position(lb.origin()); |
- View::ConvertPointToScreen(this, &menu_position); |
- if (menu_position.x() < 0) |
- menu_position.set_x(0); |
- |
- gfx::Rect bounds(menu_position, lb.size()); |
- |
- dropdown_open_ = true; |
- if (dropdown_list_menu_runner_->RunMenuAt( |
- NULL, NULL, bounds, MenuItemView::TOPLEFT, |
- MenuRunner::HAS_MNEMONICS) == MenuRunner::MENU_DELETED) |
- return; |
- dropdown_open_ = false; |
- |
- // Need to explicitly clear mouse handler so that events get sent |
- // properly after the menu finishes running. If we don't do this, then |
- // the first click to other parts of the UI is eaten. |
- SetMouseHandler(NULL); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeComboboxWrapper, public: |
- |
-#if defined(USE_AURA) |
-// static |
-NativeComboboxWrapper* NativeComboboxWrapper::CreateWrapper( |
- Combobox* combobox) { |
- return new NativeComboboxViews(combobox); |
-} |
-#endif |
- |
-} // namespace views |