| 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
|
|
|