1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/views/focus/view_storage.h"
9 #include "base/logging.h"
10 #include "base/memory/singleton.h"
11 #include "base/stl_util.h"
16 ViewStorage
* ViewStorage::GetInstance() {
17 return Singleton
<ViewStorage
>::get();
20 ViewStorage::ViewStorage() : view_storage_next_id_(0) {
23 ViewStorage::~ViewStorage() {
24 STLDeleteContainerPairSecondPointers(view_to_ids_
.begin(),
28 int ViewStorage::CreateStorageID() {
29 return view_storage_next_id_
++;
32 void ViewStorage::StoreView(int storage_id
, View
* view
) {
34 std::map
<int, View
*>::iterator iter
= id_to_view_
.find(storage_id
);
36 if (iter
!= id_to_view_
.end()) {
38 RemoveView(storage_id
);
41 id_to_view_
[storage_id
] = view
;
43 std::vector
<int>* ids
= NULL
;
44 std::map
<View
*, std::vector
<int>*>::iterator id_iter
=
45 view_to_ids_
.find(view
);
46 if (id_iter
== view_to_ids_
.end()) {
47 ids
= new std::vector
<int>();
48 view_to_ids_
[view
] = ids
;
50 ids
= id_iter
->second
;
52 ids
->push_back(storage_id
);
55 View
* ViewStorage::RetrieveView(int storage_id
) {
56 std::map
<int, View
*>::iterator iter
= id_to_view_
.find(storage_id
);
57 if (iter
== id_to_view_
.end())
62 void ViewStorage::RemoveView(int storage_id
) {
63 EraseView(storage_id
, false);
66 void ViewStorage::ViewRemoved(View
* removed
) {
67 // Let's first retrieve the ids for that view.
68 std::map
<View
*, std::vector
<int>*>::iterator ids_iter
=
69 view_to_ids_
.find(removed
);
71 if (ids_iter
== view_to_ids_
.end()) {
72 // That view is not in the view storage.
76 std::vector
<int>* ids
= ids_iter
->second
;
77 DCHECK(!ids
->empty());
78 EraseView((*ids
)[0], true);
81 void ViewStorage::EraseView(int storage_id
, bool remove_all_ids
) {
82 // Remove the view from id_to_view_location_.
83 std::map
<int, View
*>::iterator view_iter
= id_to_view_
.find(storage_id
);
84 if (view_iter
== id_to_view_
.end())
87 View
* view
= view_iter
->second
;
88 id_to_view_
.erase(view_iter
);
90 // Also update view_to_ids_.
91 std::map
<View
*, std::vector
<int>*>::iterator ids_iter
=
92 view_to_ids_
.find(view
);
93 DCHECK(ids_iter
!= view_to_ids_
.end());
94 std::vector
<int>* ids
= ids_iter
->second
;
97 for (size_t i
= 0; i
< ids
->size(); ++i
) {
98 view_iter
= id_to_view_
.find((*ids
)[i
]);
99 if (view_iter
!= id_to_view_
.end())
100 id_to_view_
.erase(view_iter
);
104 std::vector
<int>::iterator id_iter
=
105 std::find(ids
->begin(), ids
->end(), storage_id
);
106 DCHECK(id_iter
!= ids
->end());
112 view_to_ids_
.erase(ids_iter
);