// Copyright 2019 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.text;

/// Indicates a character position in a text field, either between two grapheme clusters
/// or at the very edge of the document.
///
/// Any valid TextPoint is a place a typing caret could appear, and vice-versa.
/// Instead of using absolute character indexes, each TextPoint has a
/// TextField-assigned ID; it's the TextField's responsibility to keep a mapping
/// of point IDs to its internal representation of position.
///
/// When the TextField's revision number increments, all existing TextPoints
/// become invalid. TextField should take care never reuse point IDs, even across
/// revisions.
struct TextPoint {
  uint64 id;
};

/// A selection is the current range of the text that is selected by the user,
/// or the current position of the blinking input caret.
///
/// A zero-length selection is a caret. TextAffinity only has an effect on carets.
///
/// Even in mixed RTL and LTR text situations, a selection is still just the
/// string-wise slice between `focus` and `anchor` — graphical representations
/// of selections flip directions when crossing the RTL/LTR boundary, but no
/// special code is needed to handle crossing the boundary in the model.
struct TextSelection {
  TextRange range;
  TextSelectionAnchor anchor;
  TextAffinity affinity;
};

/// Text orientation states which edge of the selection is the anchor, and which
/// is the focus. While holding down shift and using the arrow keys, or while
/// dragging across some text to select it, the anchor is the edge that stays in
/// place, and the focus is the edge that moves around.
enum TextSelectionAnchor {
  ANCHORED_AT_START = 1;
  ANCHORED_AT_END = 2;
};

/// A range is the grapheme clusters between `start` and `end`. When sending
/// ranges to clients, TextField must ensure `start` is always upstream of
/// `end`. However, when receiving ranges from clients, it should accept
/// `start` and `end` in any order.
struct TextRange {
  TextPoint start;
  TextPoint end;
};

/// Whether a TextPoint is visually upstream or downstream when ambiguous.
///
/// For example, when a text position exists at a soft line break, a single offset has
/// two visual positions, UPSTREAM (at the end of the first line) and DOWNSTREAM
/// (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 {
  UPSTREAM = 0;
  DOWNSTREAM = 1;
};
