// Copyright 2015 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.ui.viewsv1;

using fuchsia.sys;

// A view tree is a top-level container for a hierarchy of views.
// Each view is intended to operate independently from others and will
// generally correspond to discrete interactive spaces such as separate
// displays or isolated environments in a multi-user system.
//
// Within a view tree, certain global invariants may be enforced such as
// ensuring that only one view has focus at a time.
//
// View trees will typically be created by system components responsible
// for managing the overall user interface rather than end-user applications.
//
// LIFECYCLE
//
// Use |ViewManager.CreateViewTree()| to create a view tree.  The client
// uses the |ViewTree| interface to manage the view tree's content
// and implements the |ViewTreeListener| interface to handle events.
//
// To destroy a view tree, simply close the |ViewTree| channel.
//
// SETTING A ROOT VIEW
//
// Use |GetContainer()| to obtain an interface for manipulating the root view.
//
// See |ViewContainer| for more information.
//
// GETTING SERVICES
//
// The view tree's |fuchsia::sys::ServiceProvider| offers access to many services
// which are not directly expressed by the |ViewTree| interface itself, such
// as input, accessiblity, and editing capabilities.
//
// For example, perform the following actions to dispatch input events:
//
// 1. Call |GetServiceProvider()| to obtain the view's service provider.
//
// 2. Ask the service provider for its |InputDispatcher|.
//
// 3. Send input events to the dispatcher for delivery to views.
interface ViewTree {
  // Gets the view tree's token.
  1: GetToken() -> (ViewTreeToken token);

  // Gets a service provider to access services which are associated with
  // the view tree such as input, accessibility and editing capabilities.
  // The view tree service provider is private to the view tree and should
  // not be shared with anyone else.
  //
  // See |InputDispatcher|.
  2: GetServiceProvider(request<fuchsia.sys.ServiceProvider> service_provider);

  // Gets an interface for managing the view tree's root.
  3: GetContainer(request<ViewContainer> container);
};

// An interface clients may implement to receive events from a view tree.
interface ViewTreeListener {
  // There are currently no events defined but we have preserved the
  // plumbing for the future when ViewContainer will merge into ViewTree
  // along with its listener.
};