From fb3158d1941397fc7183021782c4bceb9a02d587 Mon Sep 17 00:00:00 2001 From: "jcampan@chromium.org" Date: Tue, 4 Aug 2009 23:28:03 +0000 Subject: Committing pierre.lafayette patch, see: http://codereview.chromium.org/159804 Adding support for Ctrl+Tab and Ctrl+Shift+Tab navigation of TabbedPane tabs. This will make the tabbed dialogs consistent with the TabStrip functionality. BUG=6761 TEST=none Review URL: http://codereview.chromium.org/160607 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@22440 0039d316-1c4b-4281-b951-d872f2087c98 --- views/controls/tabbed_pane/tabbed_pane.cc | 27 +++++++++++++++++++++++++++ views/controls/tabbed_pane/tabbed_pane.h | 5 +++++ 2 files changed, 32 insertions(+) diff --git a/views/controls/tabbed_pane/tabbed_pane.cc b/views/controls/tabbed_pane/tabbed_pane.cc index 20a2e7a..78ed6d2 100644 --- a/views/controls/tabbed_pane/tabbed_pane.cc +++ b/views/controls/tabbed_pane/tabbed_pane.cc @@ -4,6 +4,7 @@ #include "views/controls/tabbed_pane/tabbed_pane.h" +#include "base/logging.h" #include "views/controls/tabbed_pane/native_tabbed_pane_wrapper.h" namespace views { @@ -67,9 +68,35 @@ void TabbedPane::ViewHierarchyChanged(bool is_add, View* parent, View* child) { if (is_add && !native_tabbed_pane_ && GetWidget()) { CreateWrapper(); AddChildView(native_tabbed_pane_->GetView()); + LoadAccelerators(); } } +bool TabbedPane::AcceleratorPressed(const views::Accelerator& accelerator) { + // We only accept Ctrl+Tab keyboard events. + DCHECK(accelerator.GetKeyCode() == VK_TAB && accelerator.IsCtrlDown()); + + int tab_count = GetTabCount(); + if (tab_count <= 1) + return false; + int selected_tab_index = GetSelectedTabIndex(); + int next_tab_index = accelerator.IsShiftDown() ? + (selected_tab_index - 1) % tab_count : + (selected_tab_index + 1) % tab_count; + // Wrap around. + if (next_tab_index < 0) + next_tab_index += tab_count; + SelectTabAt(next_tab_index); + return true; +} + +void TabbedPane::LoadAccelerators() { + // Ctrl+Shift+Tab + AddAccelerator(views::Accelerator(VK_TAB, true, true, false)); + // Ctrl+Tab + AddAccelerator(views::Accelerator(VK_TAB, false, true, false)); +} + void TabbedPane::Layout() { if (native_tabbed_pane_) { native_tabbed_pane_->GetView()->SetBounds(0, 0, width(), height()); diff --git a/views/controls/tabbed_pane/tabbed_pane.h b/views/controls/tabbed_pane/tabbed_pane.h index f0eb5a5..e713ff8 100644 --- a/views/controls/tabbed_pane/tabbed_pane.h +++ b/views/controls/tabbed_pane/tabbed_pane.h @@ -65,6 +65,8 @@ class TabbedPane : public View { // View overrides: virtual void ViewHierarchyChanged(bool is_add, View* parent, View* child); + // Handles Ctrl+Tab and Ctrl+Shift+Tab navigation of pages. + virtual bool AcceleratorPressed(const views::Accelerator& accelerator); virtual std::string GetClassName() const; virtual void Layout(); virtual void Focus(); @@ -81,6 +83,9 @@ class TabbedPane : public View { // Creates the native wrapper. void CreateWrapper(); + // We support Ctrl+Tab and Ctrl+Shift+Tab to navigate tabbed option pages. + void LoadAccelerators(); + // The listener we notify about tab selection changes. Listener* listener_; -- cgit v1.1