15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef UI_VIEWS_ACCESSIBILITY_AX_AURA_OBJ_CACHE_H_
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define UI_VIEWS_ACCESSIBILITY_AX_AURA_OBJ_CACHE_H_
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <map>
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/basictypes.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/views_export.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate <typename T> struct DefaultSingletonTraits;
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace aura {
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Window;
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace aura
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace views {
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass AXAuraObjWrapper;
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass View;
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Widget;
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// A cache responsible for assigning id's to a set of interesting Aura views.
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass VIEWS_EXPORT AXAuraObjCache {
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Get the single instance of this class.
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static AXAuraObjCache* GetInstance();
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Get or create an entry in the cache based on an Aura view.
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AXAuraObjWrapper* GetOrCreate(View* view);
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AXAuraObjWrapper* GetOrCreate(Widget* widget);
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AXAuraObjWrapper* GetOrCreate(aura::Window* window);
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Gets an id given an Aura view.
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int32 GetID(View* view);
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int32 GetID(Widget* widget);
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int32 GetID(aura::Window* window);
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Gets the next unique id for this cache. Useful for non-Aura view backed
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // views.
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int32 GetNextID() { return current_id_++; }
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Removes an entry from this cache based on an Aura view.
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void Remove(View* view);
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void Remove(Widget* widget);
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void Remove(aura::Window* window);
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Lookup a cached entry based on an id.
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AXAuraObjWrapper* Get(int32 id);
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Remove a cached entry based on an id.
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void Remove(int32 id);
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  friend struct DefaultSingletonTraits<AXAuraObjCache>;
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AXAuraObjCache();
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~AXAuraObjCache();
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  template <typename AuraViewWrapper, typename AuraView>
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      AXAuraObjWrapper* CreateInternal(
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          AuraView* aura_view, std::map<AuraView*, int32>& aura_view_to_id_map);
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  template<typename AuraView> int32 GetIDInternal(
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      AuraView* aura_view, std::map<AuraView*, int32>& aura_view_to_id_map);
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  template<typename AuraView> void RemoveInternal(
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      AuraView* aura_view, std::map<AuraView*, int32>& aura_view_to_id_map);
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::map<views::View*, int32> view_to_id_map_;
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::map<views::Widget*, int32> widget_to_id_map_;
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::map<aura::Window*, int32> window_to_id_map_;
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::map<int32, AXAuraObjWrapper*> cache_;
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int32 current_id_;
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(AXAuraObjCache);
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace views
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // UI_VIEWS_ACCESSIBILITY_AX_AURA_OBJ_CACHE_H_
84