// 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 unicode code points
/// or at the very edge of the document. This is an opaque identifier generated and
/// maintained by the TextField.
///
/// Any valid Position is a place a typing caret could appear, and vice-versa.
/// Instead of using absolute character indexes, each Position has a
/// TextField-assigned ID; it's the TextField's responsibility to keep a mapping
/// of position IDs to its internal representation of position.
///
/// When the TextField's revision number increments, all existing Positions
/// become invalid. TextField should take care never reuse position IDs, even across
/// revisions.
struct Position {
    uint64 id;
};

/// A range is the unicode code points 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 Range {
    Position start;
    Position end;
};

/// Selection anchor 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 SelectionAnchor {
    ANCHORED_AT_START = 1;
    ANCHORED_AT_END = 2;
};

/// Whether a Position is visually upstream or downstream when ambiguous.
///
/// For example, when a 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 Affinity {
    UPSTREAM = 0;
    DOWNSTREAM = 1;
};

/// A selection is the current range of the text that is selected by the user,
/// or the current position of the input caret.
///
/// A zero-length selection is a caret. Affinity 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 Selection {
    Range range;
    SelectionAnchor anchor;
    Affinity affinity;
};
