// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
 * @interface
 */
UI.TextEditorFactory = function() {};

UI.TextEditorFactory.prototype = {
  /**
   * @param {!UI.TextEditor.Options} options
   * @return {!UI.TextEditor}
   */
  createEditor(options) {}
};

/**
 * @interface
 * @extends {Common.EventTarget}
 */
UI.TextEditor = function() {};

UI.TextEditor.prototype = {

  /**
   * @return {!UI.Widget}
   */
  widget() {},

  /**
   * @return {!TextUtils.TextRange}
   */
  fullRange() {},

  /**
   * @return {!TextUtils.TextRange}
   */
  selection() {},

  /**
   * @param {!TextUtils.TextRange} selection
   */
  setSelection(selection) {},

  /**
   * @param {!TextUtils.TextRange=} textRange
   * @return {string}
   */
  text(textRange) {},

  /**
   * @return {string}
   */
  textWithCurrentSuggestion() {},

  /**
   * @param {string} text
   */
  setText(text) {},

  /**
   * @param {number} lineNumber
   * @return {string}
   */
  line(lineNumber) {},

  newlineAndIndent() {},

  /**
   * @param {function(!KeyboardEvent)} handler
   */
  addKeyDownHandler(handler) {},

  /**
   * @param {?UI.AutocompleteConfig} config
   */
  configureAutocomplete(config) {},

  clearAutocomplete() {},

  /**
   * @param {number} lineNumber
   * @param {number} columnNumber
   * @return {!{x: number, y: number}}
   */
  visualCoordinates(lineNumber, columnNumber) {},

  /**
   * @param {number} lineNumber
   * @param {number} columnNumber
   * @return {?{startColumn: number, endColumn: number, type: string}}
   */
  tokenAtTextPosition(lineNumber, columnNumber) {}
};

/** @enum {symbol} */
UI.TextEditor.Events = {
  TextChanged: Symbol('TextChanged'),
  SuggestionChanged: Symbol('SuggestionChanged')
};

/**
 * @typedef {{
 *  bracketMatchingSetting: (!Common.Setting|undefined),
 *  lineNumbers: boolean,
 *  lineWrapping: boolean,
 *  mimeType: (string|undefined),
 *  autoHeight: (boolean|undefined),
 *  padBottom: (boolean|undefined),
 *  maxHighlightLength: (number|undefined),
 *  placeholder: (string|undefined)
 * }}
 */
UI.TextEditor.Options;

/**
 * @typedef {{
 *     substituteRangeCallback: ((function(number, number):?TextUtils.TextRange)|undefined),
 *     tooltipCallback: ((function(number, number):?Element)|undefined),
 *     suggestionsCallback: ((function(!TextUtils.TextRange, !TextUtils.TextRange, boolean=):?Promise.<!UI.SuggestBox.Suggestions>)|undefined),
 *     isWordChar: ((function(string):boolean)|undefined),
 *     anchorBehavior: (UI.GlassPane.AnchorBehavior|undefined)
 * }}
 */
UI.AutocompleteConfig;
