summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorzork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 08:41:04 +0000
committerzork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 08:41:04 +0000
commiteccdb14302a4ddeecad039e89f4a150a0b906483 (patch)
tree3954eab071f6edf917a70315ca049e680cdf7cf8 /ash
parent2e1fca91cd3bc9e613a4fe355ac2140e9910959a (diff)
downloadchromium_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.cc60
-rw-r--r--ash/launcher/launcher_view.h12
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_;