OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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. | |
4 | |
5 #include "views/focus/external_focus_tracker.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "views/view.h" | |
9 #include "views/focus/view_storage.h" | |
10 | |
11 namespace views { | |
12 | |
13 ExternalFocusTracker::ExternalFocusTracker(View* parent_view, | |
14 FocusManager* focus_manager) | |
15 : focus_manager_(focus_manager), | |
16 parent_view_(parent_view) { | |
17 DCHECK(focus_manager); | |
18 DCHECK(parent_view); | |
19 view_storage_ = ViewStorage::GetInstance(); | |
20 last_focused_view_storage_id_ = view_storage_->CreateStorageID(); | |
21 // Store the view which is focused when we're created. | |
22 StartTracking(); | |
23 } | |
24 | |
25 ExternalFocusTracker::~ExternalFocusTracker() { | |
26 view_storage_->RemoveView(last_focused_view_storage_id_); | |
27 if (focus_manager_) | |
28 focus_manager_->RemoveFocusChangeListener(this); | |
29 } | |
30 | |
31 void ExternalFocusTracker::OnWillChangeFocus(View* focused_before, | |
32 View* focused_now) { | |
33 if (focused_now && !parent_view_->Contains(focused_now) && | |
34 parent_view_ != focused_now) { | |
35 // Store the newly focused view. | |
36 StoreLastFocusedView(focused_now); | |
37 } | |
38 } | |
39 | |
40 void ExternalFocusTracker::OnDidChangeFocus(View* focused_before, | |
41 View* focused_now) { | |
42 } | |
43 | |
44 void ExternalFocusTracker::FocusLastFocusedExternalView() { | |
45 View* last_focused_view = | |
46 view_storage_->RetrieveView(last_focused_view_storage_id_); | |
47 if (last_focused_view) | |
48 last_focused_view->RequestFocus(); | |
49 } | |
50 | |
51 void ExternalFocusTracker::SetFocusManager(FocusManager* focus_manager) { | |
52 if (focus_manager_) | |
53 focus_manager_->RemoveFocusChangeListener(this); | |
54 focus_manager_ = focus_manager; | |
55 if (focus_manager_) | |
56 StartTracking(); | |
57 } | |
58 | |
59 void ExternalFocusTracker::StoreLastFocusedView(View* view) { | |
60 view_storage_->RemoveView(last_focused_view_storage_id_); | |
61 // If the view is NULL, remove the last focused view from storage, but don't | |
62 // try to store NULL. | |
63 if (view != NULL) | |
64 view_storage_->StoreView(last_focused_view_storage_id_, view); | |
65 } | |
66 | |
67 void ExternalFocusTracker::StartTracking() { | |
68 StoreLastFocusedView(focus_manager_->GetFocusedView()); | |
69 focus_manager_->AddFocusChangeListener(this); | |
70 } | |
71 | |
72 } // namespace views | |
OLD | NEW |