diff options
author | zork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-03 08:41:04 +0000 |
---|---|---|
committer | zork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-03 08:41:04 +0000 |
commit | eccdb14302a4ddeecad039e89f4a150a0b906483 (patch) | |
tree | 3954eab071f6edf917a70315ca049e680cdf7cf8 /ash | |
parent | 2e1fca91cd3bc9e613a4fe355ac2140e9910959a (diff) | |
download | chromium_src-eccdb14302a4ddeecad039e89f4a150a0b906483.zip chromium_src-eccdb14302a4ddeecad039e89f4a150a0b906483.tar.gz chromium_src-eccdb14302a4ddeecad039e89f4a150a0b906483.tar.bz2 |
Use the order of items in the Launcher's ViewModel to determine the tab order
R=davemoore@chromium.org
BUG=120498
Review URL: http://codereview.chromium.org/9965055
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130345 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r-- | ash/launcher/launcher_view.cc | 60 | ||||
-rw-r--r-- | ash/launcher/launcher_view.h | 12 |
2 files changed, 71 insertions, 1 deletions
diff --git a/ash/launcher/launcher_view.cc b/ash/launcher/launcher_view.cc index ec12bb3..e98dc6a 100644 --- a/ash/launcher/launcher_view.cc +++ b/ash/launcher/launcher_view.cc @@ -28,6 +28,7 @@ #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/menu/menu_model_adapter.h" #include "ui/views/controls/menu/menu_runner.h" +#include "ui/views/focus/focus_search.h" #include "ui/views/widget/root_view.h" #include "ui/views/widget/widget.h" @@ -50,6 +51,45 @@ static const int kButtonSpacing = 4; namespace { +// Custom FocusSearch used to navigate the launcher in the order items are in +// the ViewModel. +class LauncherFocusSearch : public views::FocusSearch { + public: + LauncherFocusSearch(ViewModel* view_model) + : FocusSearch(NULL, true, true), + view_model_(view_model) {} + virtual ~LauncherFocusSearch() {} + + // views::FocusSearch overrides: + virtual View* FindNextFocusableView( + View* starting_view, + bool reverse, + Direction direction, + bool check_starting_view, + views::FocusTraversable** focus_traversable, + View** focus_traversable_view) OVERRIDE { + int index = view_model_->GetIndexOfView(starting_view); + if (index == -1) + return view_model_->view_at(0); + + if (reverse) { + --index; + if (index < 0) + index = view_model_->view_size() - 1; + } else { + ++index; + if (index >= view_model_->view_size()) + index = 0; + } + return view_model_->view_at(index); + } + + private: + ViewModel* view_model_; + + DISALLOW_COPY_AND_ASSIGN(LauncherFocusSearch); +}; + // ui::SimpleMenuModel::Delegate implementation that remembers the id of the // menu that was activated. class MenuDelegateImpl : public ui::SimpleMenuModel::Delegate { @@ -224,6 +264,7 @@ LauncherView::LauncherView(LauncherModel* model, LauncherDelegate* delegate) DCHECK(model_); bounds_animator_.reset(new views::BoundsAnimator(this)); set_context_menu_controller(this); + focus_search_.reset(new LauncherFocusSearch(view_model_.get())); } LauncherView::~LauncherView() { @@ -286,6 +327,21 @@ bool LauncherView::IsShowingMenu() const { return false; } +//////////////////////////////////////////////////////////////////////////////// +// LauncherView, FocusTraversable implementation: + +views::FocusSearch* LauncherView::GetFocusSearch() { + return focus_search_.get(); +} + +views::FocusTraversable* LauncherView::GetFocusTraversableParent() { + return parent()->GetFocusTraversable(); +} + +View* LauncherView::GetFocusTraversableParentView() { + return this; +} + void LauncherView::LayoutToIdealBounds() { IdealBounds ideal_bounds; CalculateIdealBounds(&ideal_bounds); @@ -606,6 +662,10 @@ void LauncherView::OnBoundsChanged(const gfx::Rect& previous_bounds) { LayoutToIdealBounds(); } +views::FocusTraversable* LauncherView::GetPaneFocusTraversable() { + return this; +} + void LauncherView::LauncherItemAdded(int model_index) { CancelDrag(NULL); diff --git a/ash/launcher/launcher_view.h b/ash/launcher/launcher_view.h index 59cff17..9d3373b 100644 --- a/ash/launcher/launcher_view.h +++ b/ash/launcher/launcher_view.h @@ -13,6 +13,7 @@ #include "ash/launcher/launcher_model_observer.h" #include "ui/views/context_menu_controller.h" #include "ui/views/controls/button/button.h" +#include "ui/views/focus/focus_manager.h" #include "ui/views/view.h" namespace views { @@ -36,7 +37,8 @@ class ASH_EXPORT LauncherView : public views::View, public LauncherModelObserver, public views::ButtonListener, public LauncherButtonHost, - public views::ContextMenuController { + public views::ContextMenuController, + public views::FocusTraversable { public: // Use the api in this class for testing only. class ASH_EXPORT TestAPI { @@ -67,6 +69,11 @@ class ASH_EXPORT LauncherView : public views::View, // Returns true if we're showing a menu. bool IsShowingMenu() const; + // Overridden from FocusTraversable: + virtual views::FocusSearch* GetFocusSearch() OVERRIDE; + virtual FocusTraversable* GetFocusTraversableParent() OVERRIDE; + virtual View* GetFocusTraversableParentView() OVERRIDE; + private: class FadeOutAnimationDelegate; class StartFadeAnimationDelegate; @@ -124,6 +131,7 @@ class ASH_EXPORT LauncherView : public views::View, // Overridden from views::View: virtual gfx::Size GetPreferredSize() OVERRIDE; virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE; + virtual FocusTraversable* GetPaneFocusTraversable() OVERRIDE; // Overridden from LauncherModelObserver: virtual void LauncherItemAdded(int model_index) OVERRIDE; @@ -182,6 +190,8 @@ class ASH_EXPORT LauncherView : public views::View, // Used for the context menu of a particular item. LauncherID context_menu_id_; + scoped_ptr<views::FocusSearch> focus_search_; + #if !defined(OS_MACOSX) scoped_ptr<views::MenuRunner> overflow_menu_runner_; |