// 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;
using fuchsia.ui.viewsv1token;

// A view is a graphical user interface component which is responsible
// for drawing and supporting user interactions in the area of the screen
// that it occupies.
//
// A view may also act as a container for other views (known as the
// view's children) which it may freely layout and position anywhere
// within its bounds to form a composite user interface.  The hierarchy
// of views thus formed is called a view tree.
//
// LIFECYCLE
//
// Use |ViewManager.CreateView()| to create a view.  The application
// uses the |View| interface to manage the view's content and implements
// the |ViewListener| interface to handle events.
//
// To destroy a view, simply close the |View| channel.
//
// ADDING CHILD VIEWS
//
// Use |GetContainer()| to obtain an interface for manipulating child views.
//
// See |ViewContainer| for more information.
//
// GETTING SERVICES
//
// The view's |fuchsia::sys::ServiceProvider| offers access to many services which
// are not directly expressed by the |View| interface itself, such
// as input, accessiblity, and editing capabilities.
//
// For example, perform the following actions to receive input events:
//
// 1. Call |GetServiceProvider()| to obtain the view's service provider.
//
// 2. Ask the service provider for its |InputConnection|.
//
// 3. Set listeners on the input connection to receive events.
interface View {
  // Gets a service provider to access services which are associated with
  // the view such as input, accessibility and editing capabilities.
  // The view service provider is private to the view and should not be
  // shared with anyone else.
  //
  // See |InputConnection|.
  1: GetServiceProvider(request<fuchsia.sys.ServiceProvider> service_provider);

  // This is a way for an app to offer services that are associated with a
  // particular view. Used to expose services to the compositor
  //
  // In particular this should be used to let know which view is implementing
  // the ability to show an IME
  //
  // |service_names| should contain a list of service names as defined with the
  // FIDL syntax [Discoverable]
  //
  // The list of services will be used by the compositor to filter service
  // providers when looking for a particular service.
  2: OfferServiceProvider(fuchsia.sys.ServiceProvider service_provider,
                         vector<string> service_names);

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

// An interface clients may implement to receive events from a view.
interface ViewListener {
  // Called when the view receives new properties from its ancestors.
  // Initially the view has no properties so this method will be called
  // as soon as properties first become available and whenever they change
  // thereafter.
  1: OnPropertiesChanged(ViewProperties properties) -> ();
};
