Index: mojo/services/view_manager/focus_controller.cc |
diff --git a/mojo/services/view_manager/focus_controller.cc b/mojo/services/view_manager/focus_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e363eec232ee31d8d75b6e32c0821745c66997f |
--- /dev/null |
+++ b/mojo/services/view_manager/focus_controller.cc |
@@ -0,0 +1,54 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/services/view_manager/focus_controller.h" |
+ |
+#include "mojo/services/view_manager/focus_controller_delegate.h" |
+#include "mojo/services/view_manager/server_view.h" |
+#include "mojo/services/view_manager/server_view_drawn_tracker.h" |
+ |
+namespace view_manager { |
+ |
+FocusController::FocusController(FocusControllerDelegate* delegate, |
+ ServerView* root) |
+ : delegate_(delegate), root_(root) { |
+} |
+ |
+FocusController::~FocusController() { |
+} |
+ |
+void FocusController::SetFocusedView(ServerView* view) { |
+ if (GetFocusedView() == view) |
+ return; |
+ |
+ SetFocusedViewImpl(view, CHANGE_SOURCE_EXPLICIT); |
+} |
+ |
+ServerView* FocusController::GetFocusedView() { |
+ return drawn_tracker_ ? drawn_tracker_->view() : nullptr; |
+} |
+ |
+void FocusController::SetFocusedViewImpl(ServerView* view, |
+ ChangeSource change_source) { |
+ ServerView* old = GetFocusedView(); |
+ |
+ DCHECK(!view || view->IsDrawn(root_)); |
+ |
+ if (view) |
+ drawn_tracker_.reset(new ServerViewDrawnTracker(root_, view, this)); |
+ else |
+ drawn_tracker_.reset(); |
+ |
+ if (change_source == CHANGE_SOURCE_DRAWN_STATE_CHANGED) |
+ delegate_->OnFocusChanged(old, view); |
+} |
+ |
+void FocusController::OnDrawnStateChanged(ServerView* ancestor, |
+ ServerView* view, |
+ bool is_drawn) { |
+ DCHECK(!is_drawn); // We only observe when drawn. |
+ SetFocusedViewImpl(ancestor, CHANGE_SOURCE_DRAWN_STATE_CHANGED); |
+} |
+ |
+} // namespace view_manager |