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