1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_ACCESSIBLE_PANE_VIEW_H_
64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_ACCESSIBLE_PANE_VIEW_H_
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/hash_tables.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/task.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/focus/focus_manager.h"
134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/view.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views {
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass FocusSearch;
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// This class provides keyboard access to any view that extends it, typically
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// a toolbar.  The user sets focus to a control in this view by pressing
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// F6 to traverse all panes, or by pressing a shortcut that jumps directly
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// to this pane.
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass AccessiblePaneView : public views::View,
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                           public views::FocusChangeListener,
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                           public views::FocusTraversable {
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  AccessiblePaneView();
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual ~AccessiblePaneView();
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Set focus to the pane with complete keyboard access.
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Focus will be restored to the ViewStorage with id |view_storage_id|
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // if the user escapes. If |initial_focus| is not NULL, that control will get
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the initial focus, if it's enabled and focusable. Returns true if
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the pane was able to receive focus.
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool SetPaneFocus(int view_storage_id, View* initial_focus);
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Set focus to the pane with complete keyboard access, with the
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // focus initially set to the default child. Focus will be restored
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // to the ViewStorage with id |view_storage_id| if the user escapes.
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns true if the pane was able to receive focus.
414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual bool SetPaneFocusAndFocusDefault(int view_storage_id);
424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::View:
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual FocusTraversable* GetPaneFocusTraversable() OVERRIDE;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool AcceleratorPressed(const views::Accelerator& accelerator)
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      OVERRIDE;
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetVisible(bool flag) OVERRIDE;
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::FocusChangeListener:
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void FocusWillChange(View* focused_before,
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               View* focused_now) OVERRIDE;
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overridden from views::FocusTraversable:
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual views::FocusSearch* GetFocusSearch() OVERRIDE;
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual FocusTraversable* GetFocusTraversableParent() OVERRIDE;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual View* GetFocusTraversableParentView() OVERRIDE;
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch protected:
604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // A subclass can override this to provide a default focusable child
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // other than the first focusable child.
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual views::View* GetDefaultFocusableChild();
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Remove pane focus.
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void RemovePaneFocus();
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Select all text in the location bar
684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void LocationBarSelectAll();
694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void RestoreLastFocusedView();
714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  View* GetFirstFocusableChild();
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  View* GetLastFocusableChild();
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool pane_has_focus_;
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ScopedRunnableMethodFactory<AccessiblePaneView> method_factory_;
784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Save the focus manager rather than calling GetFocusManager(),
804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // so that we can remove focus listeners in the destructor.
814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::FocusManager* focus_manager_;
824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Our custom focus search implementation that traps focus in this
844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // pane and traverses all views that are focusable for accessibility,
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // not just those that are normally focusable.
864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  scoped_ptr<views::FocusSearch> focus_search_;
874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Registered accelerators
894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Accelerator home_key_;
904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Accelerator end_key_;
914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Accelerator escape_key_;
924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Accelerator left_key_;
934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Accelerator right_key_;
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Last focused view that issued this traversal.
964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int last_focused_view_storage_id_;
974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(AccessiblePaneView);
994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // CHROME_BROWSER_UI_VIEWS_ACCESSIBLE_PANE_VIEW_H_
102