// Copyright 2017 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.input;

// Whether a TextPosition is visually upstream or downstream of its offset.
//
// For example, when a text position exists at a line break, a single offset has
// two visual positions, one prior to the line break (at the end of the first
// line) and one after the line break (at the start of the second line). A text
// affinity disambiguates between those cases. (Something similar happens with
// between runs of bidirectional text.)
enum TextAffinity {
  // The position has affinity for the upstream side of the text position.
  //
  // For example, if the offset of the text position is a line break, the
  // position represents the end of the first line.
  UPSTREAM = 0;

  // The position has affinity for the downstream side of the text position.
  //
  // For example, if the offset of the text position is a line break, the
  // position represents the start of the second line.
  DOWNSTREAM = 1;
};

// A range of characters in a string of text.
struct TextRange {
  // The index of the first UTF-16 character in the range.
  //
  // If |start| and |end| are both -1, the text range is empty.
  int64 start = -1;

  // The next index after the UTF-16 characters in this range.
  //
  // If |start| and |end| are both -1, the text range is empty.
  int64 end = -1;
};

// A range of text that represents a selection.
//
// Text selection is always directional. Direction should be determined by
// comparing base and extent.
struct TextSelection {
  // The offset at which the selection originates.
  //
  // Might be larger than, smaller than, or equal to extent.
  int64 base;

  // The offset at which the selection terminates.
  //
  // When the user uses the arrow keys to adjust the selection, this is the
  // value that changes. Similarly, if the current theme paints a caret on one
  // side of the selection, this is the location at which to paint the caret.
  //
  // Might be larger than, smaller than, or equal to base.
  int64 extent;

  // If the the text range is collapsed and has more than one visual location
  // (e.g., occurs at a line break), which of the two locations to use when
  // painting the caret.
  TextAffinity affinity;
};
