diff options
author | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-24 02:18:05 +0000 |
---|---|---|
committer | tfarina@chromium.org <tfarina@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-24 02:18:05 +0000 |
commit | 89539dec77e9c1625d6616c4060b474e0ebd46bd (patch) | |
tree | 29acfb1a6c654d790f7ca181d6669da8a3db0277 /views | |
parent | bf4d7d1f03aadbe74fcf2d5a555d645e02854ab6 (diff) | |
download | chromium_src-89539dec77e9c1625d6616c4060b474e0ebd46bd.zip chromium_src-89539dec77e9c1625d6616c4060b474e0ebd46bd.tar.gz chromium_src-89539dec77e9c1625d6616c4060b474e0ebd46bd.tar.bz2 |
views: Move combobox directory to ui/views/controls/.
BUG=104039
R=ben@chromium.org
Review URL: http://codereview.chromium.org/8682011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111478 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/controls/combobox/combobox.cc | 143 | ||||
-rw-r--r-- | views/controls/combobox/combobox.h | 102 | ||||
-rw-r--r-- | views/controls/combobox/combobox_listener.h | 28 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_gtk.cc | 228 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_gtk.h | 64 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_views.cc | 386 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_views.h | 104 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_views_unittest.cc | 166 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_win.cc | 215 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_win.h | 58 | ||||
-rw-r--r-- | views/controls/combobox/native_combobox_wrapper.h | 71 | ||||
-rw-r--r-- | views/controls/native_control_win.cc | 2 | ||||
-rw-r--r-- | views/views.gyp | 24 |
13 files changed, 13 insertions, 1578 deletions
diff --git a/views/controls/combobox/combobox.cc b/views/controls/combobox/combobox.cc deleted file mode 100644 index 022e710..0000000 --- a/views/controls/combobox/combobox.cc +++ /dev/null @@ -1,143 +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/combobox.h" - -#include "base/logging.h" -#include "base/utf_string_conversions.h" -#include "ui/base/accessibility/accessible_view_state.h" -#include "ui/base/keycodes/keyboard_codes.h" -#include "ui/base/models/combobox_model.h" -#include "ui/views/widget/widget.h" -#include "views/controls/combobox/combobox_listener.h" -#include "views/controls/native/native_view_host.h" - -namespace views { - -// static -const char Combobox::kViewClassName[] = "views/Combobox"; - -//////////////////////////////////////////////////////////////////////////////// -// Combobox, public: - -Combobox::Combobox(ui::ComboboxModel* model) - : native_wrapper_(NULL), - model_(model), - listener_(NULL), - selected_item_(0) { - set_focusable(true); -} - -Combobox::~Combobox() { -} - -void Combobox::ModelChanged() { - selected_item_ = std::min(0, model_->GetItemCount()); - if (native_wrapper_) - native_wrapper_->UpdateFromModel(); - PreferredSizeChanged(); -} - -void Combobox::SetSelectedItem(int index) { - selected_item_ = index; - if (native_wrapper_) - native_wrapper_->UpdateSelectedItem(); -} - -void Combobox::SelectionChanged() { - int prev_selected_item = selected_item_; - selected_item_ = native_wrapper_->GetSelectedItem(); - if (listener_) - listener_->ItemChanged(this, prev_selected_item, selected_item_); - if (GetWidget()) { - GetWidget()->NotifyAccessibilityEvent( - this, ui::AccessibilityTypes::EVENT_VALUE_CHANGED, false); - } -} - -void Combobox::SetAccessibleName(const string16& name) { - accessible_name_ = name; -} - -//////////////////////////////////////////////////////////////////////////////// -// Combobox, View overrides: - -gfx::Size Combobox::GetPreferredSize() { - if (native_wrapper_) - return native_wrapper_->GetPreferredSize(); - return gfx::Size(); -} - -void Combobox::Layout() { - if (native_wrapper_) { - native_wrapper_->GetView()->SetBounds(0, 0, width(), height()); - native_wrapper_->GetView()->Layout(); - } -} - -void Combobox::OnEnabledChanged() { - View::OnEnabledChanged(); - if (native_wrapper_) - native_wrapper_->UpdateEnabled(); -} - -// VKEY_ESCAPE should be handled by this view when the drop down list is active. -// In other words, the list should be closed instead of the dialog. -bool Combobox::SkipDefaultKeyEventProcessing(const KeyEvent& e) { - if (e.key_code() != ui::VKEY_ESCAPE || - e.IsShiftDown() || e.IsControlDown() || e.IsAltDown()) { - return false; - } - return native_wrapper_ && native_wrapper_->IsDropdownOpen(); -} - -void Combobox::OnPaintFocusBorder(gfx::Canvas* canvas) { - if (NativeViewHost::kRenderNativeControlFocus) - View::OnPaintFocusBorder(canvas); -} - -bool Combobox::OnKeyPressed(const views::KeyEvent& e) { - return native_wrapper_ && native_wrapper_->HandleKeyPressed(e); -} - -bool Combobox::OnKeyReleased(const views::KeyEvent& e) { - return native_wrapper_ && native_wrapper_->HandleKeyReleased(e); -} - -void Combobox::OnFocus() { - // Forward the focus to the wrapper. - if (native_wrapper_) - native_wrapper_->SetFocus(); - else - View::OnFocus(); // Will focus the RootView window (so we still get - // keyboard messages). -} - -void Combobox::OnBlur() { - if (native_wrapper_) - native_wrapper_->HandleBlur(); -} - -void Combobox::GetAccessibleState(ui::AccessibleViewState* state) { - state->role = ui::AccessibilityTypes::ROLE_COMBOBOX; - state->name = accessible_name_; - state->value = model_->GetItemAt(selected_item_); - state->index = selected_item(); - state->count = model()->GetItemCount(); -} - -void Combobox::ViewHierarchyChanged(bool is_add, View* parent, View* child) { - if (is_add && !native_wrapper_ && GetWidget()) { - // The native wrapper's lifetime will be managed by the view hierarchy after - // we call AddChildView. - native_wrapper_ = NativeComboboxWrapper::CreateWrapper(this); - AddChildView(native_wrapper_->GetView()); - } -} - -std::string Combobox::GetClassName() const { - return kViewClassName; -} - -} // namespace views diff --git a/views/controls/combobox/combobox.h b/views/controls/combobox/combobox.h deleted file mode 100644 index 8579122..0000000 --- a/views/controls/combobox/combobox.h +++ /dev/null @@ -1,102 +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. - -#ifndef VIEWS_CONTROLS_COMBOBOX_COMBOBOX_H_ -#define VIEWS_CONTROLS_COMBOBOX_COMBOBOX_H_ -#pragma once - -#include <string> - -#include "ui/gfx/native_widget_types.h" -#include "views/controls/combobox/native_combobox_wrapper.h" -#include "views/view.h" - -namespace ui { -class ComboboxModel; -} - -namespace views { - -class ComboboxListener; - -// A non-editable combo-box (aka a drop-down list) -class VIEWS_EXPORT Combobox : public View { - public: - // The combobox's class name. - static const char kViewClassName[]; - - // |model| is not owned by the combo box. - explicit Combobox(ui::ComboboxModel* model); - virtual ~Combobox(); - - // Register |listener| for item change events. - void set_listener(ComboboxListener* listener) { - listener_ = listener; - } - - // Inform the combo box that its model changed. - void ModelChanged(); - - // Gets/Sets the selected item. - int selected_item() const { return selected_item_; } - void SetSelectedItem(int index); - - // Called when the combo box's selection is changed by the user. - void SelectionChanged(); - - // Accessor for |model_|. - ui::ComboboxModel* model() const { return model_; } - - // Set the accessible name of the combo box. - void SetAccessibleName(const string16& name); - - // Provided only for testing: - gfx::NativeView GetTestingHandle() const { - return native_wrapper_ ? native_wrapper_->GetTestingHandle() : NULL; - } - NativeComboboxWrapper* GetNativeWrapperForTesting() const { - return native_wrapper_; - } - - // Overridden from View: - virtual gfx::Size GetPreferredSize() OVERRIDE; - virtual void Layout() OVERRIDE; - virtual void OnEnabledChanged() OVERRIDE; - virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& e) OVERRIDE; - virtual void OnPaintFocusBorder(gfx::Canvas* canvas) OVERRIDE; - virtual bool OnKeyPressed(const views::KeyEvent& e) OVERRIDE; - virtual bool OnKeyReleased(const views::KeyEvent& e) OVERRIDE; - virtual void OnFocus() OVERRIDE; - virtual void OnBlur() OVERRIDE; - virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; - - protected: - // Overridden from View: - virtual void ViewHierarchyChanged(bool is_add, - View* parent, - View* child) OVERRIDE; - virtual std::string GetClassName() const OVERRIDE; - - // The object that actually implements the native combobox. - NativeComboboxWrapper* native_wrapper_; - - private: - // Our model. - ui::ComboboxModel* model_; - - // The combobox's listener. Notified when the selected item change. - ComboboxListener* listener_; - - // The current selection. - int selected_item_; - - // The accessible name of the text field. - string16 accessible_name_; - - DISALLOW_COPY_AND_ASSIGN(Combobox); -}; - -} // namespace views - -#endif // VIEWS_CONTROLS_COMBOBOX_COMBOBOX_H_ diff --git a/views/controls/combobox/combobox_listener.h b/views/controls/combobox/combobox_listener.h deleted file mode 100644 index 3453ce1..0000000 --- a/views/controls/combobox/combobox_listener.h +++ /dev/null @@ -1,28 +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. - -#ifndef VIEWS_CONTROLS_COMBOBOX_COMBOBOX_LISTENER_H_ -#define VIEWS_CONTROLS_COMBOBOX_COMBOBOX_LISTENER_H_ -#pragma once - -namespace views { - -class Combobox; - -// An interface implemented by an object to let it know that the selected item -// of a combobox changed. -class ComboboxListener { - public: - // This is invoked once the selected item changed. - virtual void ItemChanged(Combobox* combo_box, - int prev_index, - int new_index) = 0; - - protected: - virtual ~ComboboxListener() {} -}; - -} // namespace views - -#endif // VIEWS_CONTROLS_COMBOBOX_COMBOBOX_LISTENER_H_ diff --git a/views/controls/combobox/native_combobox_gtk.cc b/views/controls/combobox/native_combobox_gtk.cc deleted file mode 100644 index 810ff42..0000000 --- a/views/controls/combobox/native_combobox_gtk.cc +++ /dev/null @@ -1,228 +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_gtk.h" - -#include <gtk/gtk.h> - -#include <algorithm> - -#include "base/message_loop.h" -#include "base/utf_string_conversions.h" -#include "ui/base/models/combobox_model.h" -#include "ui/views/widget/widget.h" -#include "views/controls/combobox/combobox.h" -#include "views/controls/combobox/native_combobox_views.h" -#include "views/views_delegate.h" - -namespace views { - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxGtk, public: - -NativeComboboxGtk::NativeComboboxGtk(Combobox* combobox) - : combobox_(combobox), - menu_(NULL) { - set_focus_view(combobox); -} - -NativeComboboxGtk::~NativeComboboxGtk() { -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxGtk, NativeComboboxWrapper implementation: - -void NativeComboboxGtk::UpdateFromModel() { - if (!native_view()) - return; - - preferred_size_ = gfx::Size(); - - GtkListStore* store = - GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(native_view()))); - ui::ComboboxModel* model = combobox_->model(); - int count = model->GetItemCount(); - gtk_list_store_clear(store); - GtkTreeIter iter; - while (count-- > 0) { - gtk_list_store_prepend(store, &iter); - gtk_list_store_set(store, &iter, - 0, UTF16ToUTF8(model->GetItemAt(count)).c_str(), - -1); - } -} - -void NativeComboboxGtk::UpdateSelectedItem() { - if (!native_view()) - return; - gtk_combo_box_set_active( - GTK_COMBO_BOX(native_view()), combobox_->selected_item()); -} - -void NativeComboboxGtk::UpdateEnabled() { - SetEnabled(combobox_->IsEnabled()); -} - -int NativeComboboxGtk::GetSelectedItem() const { - if (!native_view()) - return 0; - return gtk_combo_box_get_active(GTK_COMBO_BOX(native_view())); -} - -bool NativeComboboxGtk::IsDropdownOpen() const { - if (!native_view()) - return false; - gboolean popup_shown; - g_object_get(G_OBJECT(native_view()), "popup-shown", &popup_shown, NULL); - return popup_shown; -} - -gfx::Size NativeComboboxGtk::GetPreferredSize() { - if (!native_view()) - return gfx::Size(); - - if (preferred_size_.IsEmpty()) { - GtkRequisition size_request = { 0, 0 }; - gtk_widget_size_request(native_view(), &size_request); - // TODO(oshima|scott): we may not need ::max to 29. revisit this. - preferred_size_.SetSize(size_request.width, - std::max(size_request.height, 29)); - } - return preferred_size_; -} - -View* NativeComboboxGtk::GetView() { - return this; -} - -void NativeComboboxGtk::SetFocus() { - OnFocus(); -} - -bool NativeComboboxGtk::HandleKeyPressed(const views::KeyEvent& event) { - return false; -} - -bool NativeComboboxGtk::HandleKeyReleased(const views::KeyEvent& event) { - return false; -} - -void NativeComboboxGtk::HandleFocus() { -} - -void NativeComboboxGtk::HandleBlur() { -} - -gfx::NativeView NativeComboboxGtk::GetTestingHandle() const { - return native_view(); -} - - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxGtk, NativeControlGtk overrides: -void NativeComboboxGtk::CreateNativeControl() { - GtkListStore* store = gtk_list_store_new(1, G_TYPE_STRING); - GtkWidget* widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); - g_object_unref(G_OBJECT(store)); - - GtkCellRenderer* cell = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), cell, TRUE); - gtk_cell_layout_set_attributes( - GTK_CELL_LAYOUT(widget), cell, "text", 0, NULL); - g_signal_connect(widget, "changed", - G_CALLBACK(CallChangedThunk), this); - g_signal_connect_after(widget, "popup", - G_CALLBACK(CallPopUpThunk), this); - - // Get the menu associated with the combo box and listen to events on it. - GList* menu_list = gtk_menu_get_for_attach_widget(widget); - if (menu_list) { - menu_ = reinterpret_cast<GtkMenu*>(menu_list->data); - g_signal_connect_after(menu_, "move-current", - G_CALLBACK(CallMenuMoveCurrentThunk), this); - } - - NativeControlCreated(widget); -} - -void NativeComboboxGtk::NativeControlCreated(GtkWidget* native_control) { - NativeControlGtk::NativeControlCreated(native_control); - // Set the initial state of the combobox. - UpdateFromModel(); - UpdateEnabled(); - UpdateSelectedItem(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxGtk, private: -void NativeComboboxGtk::SelectionChanged() { - combobox_->SelectionChanged(); -} - -void NativeComboboxGtk::FocusedMenuItemChanged() { - DCHECK(menu_); - GtkWidget* menu_item = GTK_MENU_SHELL(menu_)->active_menu_item; - if (!menu_item) - return; - - // Figure out the item index and total number of items. - GList* items = gtk_container_get_children(GTK_CONTAINER(menu_)); - guint count = g_list_length(items); - int index = g_list_index(items, static_cast<gconstpointer>(menu_item)); - - // Get the menu item's label. - std::string name; - GList* children = gtk_container_get_children(GTK_CONTAINER(menu_item)); - for (GList* l = g_list_first(children); l != NULL; l = g_list_next(l)) { - GtkWidget* child = static_cast<GtkWidget*>(l->data); - if (GTK_IS_CELL_VIEW(child)) { - GtkCellView* cell_view = GTK_CELL_VIEW(child); - GtkTreePath* path = gtk_cell_view_get_displayed_row(cell_view); - GtkTreeModel* model = NULL; - model = gtk_cell_view_get_model(cell_view); - GtkTreeIter iter; - if (model && gtk_tree_model_get_iter(model, &iter, path)) { - GValue value = { 0 }; - gtk_tree_model_get_value(model, &iter, 0, &value); - name = g_value_get_string(&value); - break; - } - } - } - - if (ViewsDelegate::views_delegate) { - ViewsDelegate::views_delegate->NotifyMenuItemFocused(string16(), - UTF8ToUTF16(name), - index, - count, - false); - } -} - -void NativeComboboxGtk::CallChanged(GtkWidget* widget) { - SelectionChanged(); -} - -gboolean NativeComboboxGtk::CallPopUp(GtkWidget* widget) { - FocusedMenuItemChanged(); - return false; -} - -void NativeComboboxGtk::CallMenuMoveCurrent( - GtkWidget* menu, GtkMenuDirectionType focus_direction) { - FocusedMenuItemChanged(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxWrapper, public: - -// static -NativeComboboxWrapper* NativeComboboxWrapper::CreateWrapper( - Combobox* combobox) { - if (Widget::IsPureViews()) - return new NativeComboboxViews(combobox); - return new NativeComboboxGtk(combobox); -} - -} // namespace views diff --git a/views/controls/combobox/native_combobox_gtk.h b/views/controls/combobox/native_combobox_gtk.h deleted file mode 100644 index a55bb91..0000000 --- a/views/controls/combobox/native_combobox_gtk.h +++ /dev/null @@ -1,64 +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. - -#ifndef VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_GTK_H_ -#define VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_GTK_H_ -#pragma once - -#include "ui/base/gtk/gtk_signal.h" -#include "views/controls/combobox/native_combobox_wrapper.h" -#include "views/controls/native_control_gtk.h" - -namespace views { - -class NativeComboboxGtk : public NativeControlGtk, - public NativeComboboxWrapper { - public: - explicit NativeComboboxGtk(Combobox* combobox); - virtual ~NativeComboboxGtk(); - - // Overridden from NativeComboboxWrapper: - virtual void UpdateFromModel() OVERRIDE; - virtual void UpdateSelectedItem() OVERRIDE; - virtual void UpdateEnabled() OVERRIDE; - virtual int GetSelectedItem() const OVERRIDE; - virtual bool IsDropdownOpen() const OVERRIDE; - virtual gfx::Size GetPreferredSize() OVERRIDE; - virtual View* GetView() OVERRIDE; - virtual void SetFocus() OVERRIDE; - virtual bool HandleKeyPressed(const views::KeyEvent& event) OVERRIDE; - virtual bool HandleKeyReleased(const views::KeyEvent& event) OVERRIDE; - virtual void HandleFocus() OVERRIDE; - virtual void HandleBlur() OVERRIDE; - virtual gfx::NativeView GetTestingHandle() const OVERRIDE; - - protected: - // Overridden from NativeControlGtk: - virtual void CreateNativeControl() OVERRIDE; - virtual void NativeControlCreated(GtkWidget* widget) OVERRIDE; - - private: - void SelectionChanged(); - void FocusedMenuItemChanged(); - - CHROMEGTK_CALLBACK_0(NativeComboboxGtk, void, CallChanged); - CHROMEGTK_CALLBACK_0(NativeComboboxGtk, gboolean, CallPopUp); - CHROMEGTK_CALLBACK_1(NativeComboboxGtk, void, CallMenuMoveCurrent, - GtkMenuDirectionType); - - // The combobox we are bound to. - Combobox* combobox_; - - // The combo box's pop-up menu. - GtkMenu* menu_; - - // The preferred size from the last size_request. - gfx::Size preferred_size_; - - DISALLOW_COPY_AND_ASSIGN(NativeComboboxGtk); -}; - -} // namespace views - -#endif // VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_GTK_H_ diff --git a/views/controls/combobox/native_combobox_views.cc b/views/controls/combobox/native_combobox_views.cc deleted file mode 100644 index f48f9bd..0000000 --- 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 diff --git a/views/controls/combobox/native_combobox_views.h b/views/controls/combobox/native_combobox_views.h deleted file mode 100644 index 9a87259..0000000 --- a/views/controls/combobox/native_combobox_views.h +++ /dev/null @@ -1,104 +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. - -#ifndef VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_VIEWS_H_ -#define VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_VIEWS_H_ -#pragma once - -#include "views/controls/combobox/native_combobox_wrapper.h" -#include "views/controls/menu/menu_delegate.h" -#include "views/view.h" - -namespace gfx { -class Canvas; -class Font; -} - -namespace views { - -class KeyEvent; -class FocusableBorder; -class MenuRunner; - -// A views/skia only implementation of NativeComboboxWrapper. -// No platform specific code is used. -class NativeComboboxViews : public views::View, - public NativeComboboxWrapper, - public views::MenuDelegate { - public: - explicit NativeComboboxViews(Combobox* parent); - virtual ~NativeComboboxViews(); - - // views::View overrides: - virtual bool OnMousePressed(const views::MouseEvent& mouse_event) OVERRIDE; - virtual bool OnMouseDragged(const views::MouseEvent& mouse_event) OVERRIDE; - virtual bool OnKeyPressed(const views::KeyEvent& key_event) OVERRIDE; - virtual bool OnKeyReleased(const views::KeyEvent& key_event) OVERRIDE; - virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; - virtual void OnFocus() OVERRIDE; - virtual void OnBlur() OVERRIDE; - - // NativeComboboxWrapper overrides: - virtual void UpdateFromModel() OVERRIDE; - virtual void UpdateSelectedItem() OVERRIDE; - virtual void UpdateEnabled() OVERRIDE; - virtual int GetSelectedItem() const OVERRIDE; - virtual bool IsDropdownOpen() const OVERRIDE; - virtual gfx::Size GetPreferredSize() OVERRIDE; - virtual View* GetView() OVERRIDE; - virtual void SetFocus() OVERRIDE; - virtual bool HandleKeyPressed(const views::KeyEvent& event) OVERRIDE; - virtual bool HandleKeyReleased(const views::KeyEvent& event) OVERRIDE; - virtual void HandleFocus() OVERRIDE; - virtual void HandleBlur() OVERRIDE; - virtual gfx::NativeView GetTestingHandle() const OVERRIDE; - - // MenuDelegate overrides: - virtual bool IsItemChecked(int id) const OVERRIDE; - virtual bool IsCommandEnabled(int id) const OVERRIDE; - virtual void ExecuteCommand(int id) OVERRIDE; - virtual bool GetAccelerator(int id, ui::Accelerator* accelerator) OVERRIDE; - - // class name of internal - static const char kViewClassName[]; - - private: - // Returns the Combobox's font. - const gfx::Font& GetFont() const; - - // Draw an arrow - void DrawArrow(gfx::Canvas* canvas, - int tip_x, int tip_y, int shift_x, int shift_y) const; - - // Draw the selected value of the drop down list - void PaintText(gfx::Canvas* canvas); - - // Show the drop down list - void ShowDropDownMenu(); - - // The parent combobox, the owner of this object. - Combobox* combobox_; - - // The reference to the border class. The object is owned by View::border_. - FocusableBorder* text_border_; - - // Responsible for showing the context menu. - scoped_ptr<MenuRunner> dropdown_list_menu_runner_; - - // Is the drop down list showing - bool dropdown_open_; - - // Index in the model of the selected item: -1 => none - int selected_item_; - - // The maximum dimensions of the content in the dropdown - int content_width_; - int content_height_; - - DISALLOW_COPY_AND_ASSIGN(NativeComboboxViews); -}; - -} // namespace views - -#endif // VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_VIEWS_H_ diff --git a/views/controls/combobox/native_combobox_views_unittest.cc b/views/controls/combobox/native_combobox_views_unittest.cc deleted file mode 100644 index 30b03e1..0000000 --- a/views/controls/combobox/native_combobox_views_unittest.cc +++ /dev/null @@ -1,166 +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 "base/utf_string_conversions.h" -#include "ui/base/keycodes/keyboard_codes.h" -#include "ui/base/models/combobox_model.h" -#include "ui/views/ime/mock_input_method.h" -#include "ui/views/test/views_test_base.h" -#include "ui/views/widget/native_widget_private.h" -#include "ui/views/widget/widget.h" -#include "views/controls/combobox/combobox.h" -#include "views/controls/combobox/native_combobox_views.h" - -namespace { - -// A wrapper of Combobox to intercept the result of OnKeyPressed() and -// OnKeyReleased() methods. -class TestCombobox : public views::Combobox { - public: - TestCombobox(ui::ComboboxModel* model) - : Combobox(model), - key_handled_(false), - key_received_(false) { - } - - virtual bool OnKeyPressed(const views::KeyEvent& e) OVERRIDE { - key_received_ = true; - key_handled_ = views::Combobox::OnKeyPressed(e); - return key_handled_; - } - - virtual bool OnKeyReleased(const views::KeyEvent& e) OVERRIDE { - key_received_ = true; - key_handled_ = views::Combobox::OnKeyReleased(e); - return key_handled_; - } - - bool key_handled() const { return key_handled_; } - bool key_received() const { return key_received_; } - - void clear() { - key_received_ = key_handled_ = false; - } - - private: - bool key_handled_; - bool key_received_; - - DISALLOW_COPY_AND_ASSIGN(TestCombobox); -}; - -// A concrete class is needed to test the combobox -class TestComboboxModel : public ui::ComboboxModel { - public: - TestComboboxModel() {} - virtual ~TestComboboxModel() {} - virtual int GetItemCount() { - return 4; - } - virtual string16 GetItemAt(int index) { - EXPECT_GE(index, 0); - EXPECT_LT(index, GetItemCount()); - return string16(); - } - private: - DISALLOW_COPY_AND_ASSIGN(TestComboboxModel); -}; - -} // namespace - -namespace views { - -class NativeComboboxViewsTest : public ViewsTestBase { - public: - NativeComboboxViewsTest() - : widget_(NULL), - combobox_(NULL), - combobox_view_(NULL), - model_(NULL), - input_method_(NULL) { - } - - // ::testing::Test: - virtual void SetUp() { - ViewsTestBase::SetUp(); - Widget::SetPureViews(true); - } - - virtual void TearDown() { - Widget::SetPureViews(false); - if (widget_) - widget_->Close(); - ViewsTestBase::TearDown(); - } - - void InitCombobox() { - model_.reset(new TestComboboxModel()); - - ASSERT_FALSE(combobox_); - combobox_ = new TestCombobox(model_.get()); - combobox_->set_id(1); - - widget_ = new Widget; - Widget::InitParams params(Widget::InitParams::TYPE_POPUP); - params.bounds = gfx::Rect(100, 100, 100, 100); - widget_->Init(params); - View* container = new View(); - widget_->SetContentsView(container); - container->AddChildView(combobox_); - - combobox_view_ = static_cast<NativeComboboxViews*>( - combobox_->GetNativeWrapperForTesting()); - ASSERT_TRUE(combobox_view_); - - input_method_ = new MockInputMethod(); - widget_->ReplaceInputMethod(input_method_); - - // Assumes the Widget is always focused. - input_method_->OnFocus(); - - combobox_->RequestFocus(); - } - - protected: - void SendKeyEvent(ui::KeyboardCode key_code) { - KeyEvent event(ui::ET_KEY_PRESSED, key_code, 0); - input_method_->DispatchKeyEvent(event); - } - - View* GetFocusedView() { - return widget_->GetFocusManager()->GetFocusedView(); - } - - // We need widget to populate wrapper class. - Widget* widget_; - - // combobox_ will be allocated InitCombobox() and then owned by widget_. - TestCombobox* combobox_; - - // combobox_view_ is the pointer to the pure Views interface of combobox_. - NativeComboboxViews* combobox_view_; - - // Combobox does not take ownership of model_, which needs to be scoped. - scoped_ptr<ui::ComboboxModel> model_; - - // For testing input method related behaviors. - MockInputMethod* input_method_; -}; - -TEST_F(NativeComboboxViewsTest, KeyTest) { - InitCombobox(); - SendKeyEvent(ui::VKEY_END); - EXPECT_EQ(combobox_->selected_item() + 1, model_->GetItemCount()); - SendKeyEvent(ui::VKEY_HOME); - EXPECT_EQ(combobox_->selected_item(), 0); - SendKeyEvent(ui::VKEY_DOWN); - SendKeyEvent(ui::VKEY_DOWN); - EXPECT_EQ(combobox_->selected_item(), 2); - SendKeyEvent(ui::VKEY_RIGHT); - EXPECT_EQ(combobox_->selected_item(), 2); - SendKeyEvent(ui::VKEY_LEFT); - EXPECT_EQ(combobox_->selected_item(), 2); -} - -} // namespace views diff --git a/views/controls/combobox/native_combobox_win.cc b/views/controls/combobox/native_combobox_win.cc deleted file mode 100644 index 151cab4..0000000 --- a/views/controls/combobox/native_combobox_win.cc +++ /dev/null @@ -1,215 +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_win.h" - -#include "base/i18n/rtl.h" -#include "base/utf_string_conversions.h" -#include "ui/base/models/combobox_model.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/base/win/hwnd_util.h" -#include "ui/gfx/font.h" -#include "ui/gfx/native_theme_win.h" -#include "ui/views/widget/widget.h" -#include "views/controls/combobox/combobox.h" -#include "views/controls/combobox/native_combobox_views.h" - -namespace views { - -// Limit how small a combobox can be. -static const int kMinComboboxWidth = 148; - -// Add a couple extra pixels to the widths of comboboxes and combobox -// dropdowns so that text isn't too crowded. -static const int kComboboxExtraPaddingX = 6; - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxWin, public: - -NativeComboboxWin::NativeComboboxWin(Combobox* combobox) - : combobox_(combobox), - content_width_(0) { - // Associates the actual HWND with the combobox so it is the one considered as - // having the focus (not the wrapper) when the HWND is focused directly (with - // a click for example). - set_focus_view(combobox); -} - -NativeComboboxWin::~NativeComboboxWin() { -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxWin, NativeComboboxWrapper implementation: - -void NativeComboboxWin::UpdateFromModel() { - SendMessage(native_view(), CB_RESETCONTENT, 0, 0); - gfx::Font font = ResourceBundle::GetSharedInstance().GetFont( - ResourceBundle::BaseFont); - int max_width = 0; - 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); - - SendMessage(native_view(), CB_ADDSTRING, 0, - reinterpret_cast<LPARAM>(UTF16ToWide(text).c_str())); - max_width = std::max(max_width, font.GetStringWidth(text)); - } - content_width_ = max_width; - - if (num_items > 0) { - SendMessage(native_view(), CB_SETCURSEL, combobox_->selected_item(), 0); - - // Set the width for the drop down while accounting for the scrollbar and - // borders. - if (num_items > ComboBox_GetMinVisible(native_view())) - max_width += GetSystemMetrics(SM_CXVSCROLL); - // SM_CXEDGE would not be correct here, since the dropdown is flat, not 3D. - int kComboboxDropdownBorderSize = 1; - max_width += 2 * kComboboxDropdownBorderSize + kComboboxExtraPaddingX; - SendMessage(native_view(), CB_SETDROPPEDWIDTH, max_width, 0); - } -} - -void NativeComboboxWin::UpdateSelectedItem() { - // Note that we use CB_SETCURSEL and not CB_SELECTSTRING because on RTL - // locales the strings we get from our ComboBox::Model might be augmented - // with Unicode directionality marks before we insert them into the combo box - // and therefore we can not assume that the string we get from - // ComboBox::Model can be safely searched for and selected (which is what - // CB_SELECTSTRING does). - SendMessage(native_view(), CB_SETCURSEL, combobox_->selected_item(), 0); -} - -void NativeComboboxWin::UpdateEnabled() { - SetEnabled(combobox_->IsEnabled()); -} - -int NativeComboboxWin::GetSelectedItem() const { - LRESULT selected_item = SendMessage(native_view(), CB_GETCURSEL, 0, 0); - return selected_item != CB_ERR ? selected_item : -1; -} - -bool NativeComboboxWin::IsDropdownOpen() const { - return SendMessage(native_view(), CB_GETDROPPEDSTATE, 0, 0) != 0; -} - -gfx::Size NativeComboboxWin::GetPreferredSize() { - COMBOBOXINFO cbi = { 0 }; - cbi.cbSize = sizeof(cbi); - // Note: Don't use CB_GETCOMBOBOXINFO since that crashes on WOW64 systems - // when you have a global message hook installed. - GetComboBoxInfo(native_view(), &cbi); - gfx::Rect rect_item(cbi.rcItem); - gfx::Rect rect_button(cbi.rcButton); - gfx::Size border = gfx::NativeThemeWin::instance()->GetThemeBorderSize( - gfx::NativeThemeWin::MENULIST); - - // The padding value of '3' is the xy offset from the corner of the control - // to the corner of rcItem. It does not seem to be queryable from the theme. - // It is consistent on all versions of Windows from 2K to Vista, and is - // invariant with respect to the combobox border size. We could conceivably - // get this number from rect_item.x, but it seems fragile to depend on - // position here, inside of the layout code. - const int kItemOffset = 3; - int item_to_button_distance = std::max(kItemOffset - border.width(), 0); - - // The cx computation can be read as measuring from left to right. - int pref_width = std::max(kItemOffset + content_width_ + - kComboboxExtraPaddingX + - item_to_button_distance + rect_button.width() + - border.width(), kMinComboboxWidth); - // The two arguments to ::max below should be typically be equal. - int pref_height = std::max(rect_item.height() + 2 * kItemOffset, - rect_button.height() + 2 * border.height()); - return gfx::Size(pref_width, pref_height); -} - -View* NativeComboboxWin::GetView() { - return this; -} - -void NativeComboboxWin::SetFocus() { - OnFocus(); -} - -bool NativeComboboxWin::HandleKeyPressed(const views::KeyEvent& event) { - return false; -} - -bool NativeComboboxWin::HandleKeyReleased(const views::KeyEvent& event) { - return false; -} - -void NativeComboboxWin::HandleFocus() { -} - -void NativeComboboxWin::HandleBlur() { -} - -gfx::NativeView NativeComboboxWin::GetTestingHandle() const { - return native_view(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxWin, NativeControlWin overrides: - -bool NativeComboboxWin::ProcessMessage(UINT message, - WPARAM w_param, - LPARAM l_param, - LRESULT* result) { - if (message == WM_COMMAND && HIWORD(w_param) == CBN_SELCHANGE) { - combobox_->SelectionChanged(); - *result = 0; - return true; - } - return NativeControlWin::ProcessMessage(message, w_param, l_param, result); -} - -void NativeComboboxWin::CreateNativeControl() { - // It's ok to add WS_VSCROLL. The scrollbar will show up only when necessary - // as long as we don't use CBS_DISABLENOSCROLL. - // See http://msdn.microsoft.com/en-us/library/7h63bxbe(VS.80).aspx - DWORD flags = WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | - CBS_DROPDOWNLIST | WS_VSCROLL; - HWND control_hwnd = ::CreateWindowEx(GetAdditionalExStyle(), L"COMBOBOX", L"", - flags, 0, 0, width(), height(), - GetWidget()->GetNativeView(), NULL, NULL, - NULL); - ui::CheckWindowCreated(control_hwnd); - NativeControlCreated(control_hwnd); -} - -void NativeComboboxWin::NativeControlCreated(HWND native_control) { - NativeControlWin::NativeControlCreated(native_control); - - UpdateFont(); - UpdateFromModel(); - UpdateSelectedItem(); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxWin, private: - -void NativeComboboxWin::UpdateFont() { - HFONT font = ResourceBundle::GetSharedInstance(). - GetFont(ResourceBundle::BaseFont).GetNativeFont(); - SendMessage(native_view(), WM_SETFONT, reinterpret_cast<WPARAM>(font), FALSE); -} - -//////////////////////////////////////////////////////////////////////////////// -// NativeComboboxWrapper, public: - -// static -NativeComboboxWrapper* NativeComboboxWrapper::CreateWrapper( - Combobox* combobox) { - if (Widget::IsPureViews()) - return new NativeComboboxViews(combobox); - return new NativeComboboxWin(combobox); -} - -} // namespace views diff --git a/views/controls/combobox/native_combobox_win.h b/views/controls/combobox/native_combobox_win.h deleted file mode 100644 index 640d3e1..0000000 --- a/views/controls/combobox/native_combobox_win.h +++ /dev/null @@ -1,58 +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. - -#ifndef VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_WIN_H_ -#define VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_WIN_H_ -#pragma once - -#include "views/controls/combobox/native_combobox_wrapper.h" -#include "views/controls/native_control_win.h" - -namespace views { - -class NativeComboboxWin : public NativeControlWin, - public NativeComboboxWrapper { - public: - explicit NativeComboboxWin(Combobox* combobox); - virtual ~NativeComboboxWin(); - - // Overridden from NativeComboboxWrapper: - virtual void UpdateFromModel() OVERRIDE; - virtual void UpdateSelectedItem() OVERRIDE; - virtual void UpdateEnabled() OVERRIDE; - virtual int GetSelectedItem() const OVERRIDE; - virtual bool IsDropdownOpen() const OVERRIDE; - virtual gfx::Size GetPreferredSize() OVERRIDE; - virtual View* GetView() OVERRIDE; - virtual void SetFocus() OVERRIDE; - virtual bool HandleKeyPressed(const views::KeyEvent& event) OVERRIDE; - virtual bool HandleKeyReleased(const views::KeyEvent& event) OVERRIDE; - virtual void HandleFocus() OVERRIDE; - virtual void HandleBlur() OVERRIDE; - virtual gfx::NativeView GetTestingHandle() const OVERRIDE; - - protected: - // Overridden from NativeControlWin: - virtual bool ProcessMessage(UINT message, - WPARAM w_param, - LPARAM l_param, - LRESULT* result) OVERRIDE; - virtual void CreateNativeControl() OVERRIDE; - virtual void NativeControlCreated(HWND native_control) OVERRIDE; - - private: - void UpdateFont(); - - // The combobox we are bound to. - Combobox* combobox_; - - // The min width, in pixels, for the text content. - int content_width_; - - DISALLOW_COPY_AND_ASSIGN(NativeComboboxWin); -}; - -} // namespace views - -#endif // VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_WIN_H_ diff --git a/views/controls/combobox/native_combobox_wrapper.h b/views/controls/combobox/native_combobox_wrapper.h deleted file mode 100644 index 327d02db..0000000 --- a/views/controls/combobox/native_combobox_wrapper.h +++ /dev/null @@ -1,71 +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. - -#ifndef VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_WRAPPER_H_ -#define VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_WRAPPER_H_ -#pragma once - -#include "ui/gfx/native_widget_types.h" -#include "views/views_export.h" - -namespace gfx{ -class Size; -} - -namespace views { - -class Combobox; -class KeyEvent; -class View; - -class VIEWS_EXPORT NativeComboboxWrapper { - public: - // Updates the combobox's content from its model. - virtual void UpdateFromModel() = 0; - - // Updates the displayed selected item from the associated Combobox. - virtual void UpdateSelectedItem() = 0; - - // Updates the enabled state of the combobox from the associated view. - virtual void UpdateEnabled() = 0; - - // Gets the selected index. - virtual int GetSelectedItem() const = 0; - - // Returns true if the Combobox dropdown is open. - virtual bool IsDropdownOpen() const = 0; - - // Returns the preferred size of the combobox. - virtual gfx::Size GetPreferredSize() = 0; - - // Retrieves the views::View that hosts the native control. - virtual View* GetView() = 0; - - // Sets the focus to the button. - virtual void SetFocus() = 0; - - // Invoked when a key is pressed/release on Combobox. Subclasser - // should return true if the event has been processed and false - // otherwise. - // See also View::OnKeyPressed/OnKeyReleased. - virtual bool HandleKeyPressed(const views::KeyEvent& e) = 0; - virtual bool HandleKeyReleased(const views::KeyEvent& e) = 0; - - // Invoked when focus is being moved from or to the Combobox. - // See also View::OnFocus/OnBlur. - virtual void HandleFocus() = 0; - virtual void HandleBlur() = 0; - - // Returns a handle to the underlying native view for testing. - virtual gfx::NativeView GetTestingHandle() const = 0; - - static NativeComboboxWrapper* CreateWrapper(Combobox* combobox); - - protected: - virtual ~NativeComboboxWrapper() {} -}; - -} // namespace views - -#endif // VIEWS_CONTROLS_COMBOBOX_NATIVE_COMBOBOX_WRAPPER_H_ diff --git a/views/controls/native_control_win.cc b/views/controls/native_control_win.cc index 20e829c..d4e6989 100644 --- a/views/controls/native_control_win.cc +++ b/views/controls/native_control_win.cc @@ -11,9 +11,9 @@ #include "ui/base/l10n/l10n_util_win.h" #include "ui/base/view_prop.h" #include "ui/base/win/hwnd_util.h" +#include "ui/views/controls/combobox/combobox.h" #include "ui/views/focus/focus_manager.h" #include "ui/views/widget/widget.h" -#include "views/controls/combobox/combobox.h" using ui::ViewProp; diff --git a/views/views.gyp b/views/views.gyp index 088388f..1e75213 100644 --- a/views/views.gyp +++ b/views/views.gyp @@ -68,16 +68,6 @@ 'controls/button/radio_button.h', 'controls/button/text_button.cc', 'controls/button/text_button.h', - 'controls/combobox/combobox.cc', - 'controls/combobox/combobox.h', - 'controls/combobox/combobox_listener.h', - 'controls/combobox/native_combobox_gtk.cc', - 'controls/combobox/native_combobox_gtk.h', - 'controls/combobox/native_combobox_views.cc', - 'controls/combobox/native_combobox_views.h', - 'controls/combobox/native_combobox_win.cc', - 'controls/combobox/native_combobox_win.h', - 'controls/combobox/native_combobox_wrapper.h', 'controls/focusable_border.cc', 'controls/focusable_border.h', 'controls/image_view.cc', @@ -260,6 +250,16 @@ '../ui/views/bubble/bubble_delegate.h', '../ui/views/bubble/bubble_frame_view.cc', '../ui/views/bubble/bubble_frame_view.h', + '../ui/views/controls/combobox/combobox.cc', + '../ui/views/controls/combobox/combobox.h', + '../ui/views/controls/combobox/combobox_listener.h', + '../ui/views/controls/combobox/native_combobox_gtk.cc', + '../ui/views/controls/combobox/native_combobox_gtk.h', + '../ui/views/controls/combobox/native_combobox_views.cc', + '../ui/views/controls/combobox/native_combobox_views.h', + '../ui/views/controls/combobox/native_combobox_win.cc', + '../ui/views/controls/combobox/native_combobox_win.h', + '../ui/views/controls/combobox/native_combobox_wrapper.h', '../ui/views/controls/table/native_table_wrapper.h', '../ui/views/controls/table/native_table_gtk.cc', '../ui/views/controls/table/native_table_gtk.h', @@ -509,6 +509,7 @@ '../ui/views/animation/bounds_animator_unittest.cc', '../ui/views/bubble/bubble_delegate_unittest.cc', '../ui/views/bubble/bubble_frame_view_unittest.cc', + '../ui/views/controls/combobox/native_combobox_views_unittest.cc', '../ui/views/controls/table/table_view_unittest.cc', '../ui/views/events/event_unittest.cc', '../ui/views/focus/accelerator_handler_gtk_unittest.cc', @@ -535,7 +536,6 @@ 'controls/progress_bar_unittest.cc', 'controls/single_split_view_unittest.cc', 'controls/tabbed_pane/tabbed_pane_unittest.cc', - 'controls/combobox/native_combobox_views_unittest.cc', 'controls/menu/menu_model_adapter_unittest.cc', 'controls/textfield/native_textfield_views_unittest.cc', 'controls/textfield/textfield_views_model_unittest.cc', @@ -576,9 +576,9 @@ '../ui/aura/aura.gyp:test_support_aura', ], 'sources/': [ + ['exclude', '../ui/views/controls/combobox/native_combobox_views_unittest.cc'], ['exclude', '../ui/views/controls/table/table_view_unittest.cc'], ['exclude', '../ui/views/widget/native_widget_win_unittest.cc'], - ['exclude', 'controls/combobox/native_combobox_views_unittest.cc'], ['exclude', 'controls/tabbed_pane/tabbed_pane_unittest.cc'], ], }, { |