// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef XFA_FWL_LIGHTWIDGET_CFWL_EDIT_H_
#define XFA_FWL_LIGHTWIDGET_CFWL_EDIT_H_

#include <vector>

#include "xfa/fwl/basewidget/ifwl_edit.h"
#include "xfa/fwl/lightwidget/cfwl_widget.h"

class CFWL_WidgetProperties;
class IFDE_TxtEdtDoRecord;

class CFWL_Edit : public CFWL_Widget {
 public:
  CFWL_Edit();
  ~CFWL_Edit() override;

  IFWL_Edit* GetWidget() override;
  const IFWL_Edit* GetWidget() const override;

  static CFWL_Edit* Create();
  FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
  FWL_Error SetText(const CFX_WideString& wsText);
  int32_t GetTextLength() const;
  FWL_Error GetText(CFX_WideString& wsText,
                    int32_t nStart = 0,
                    int32_t nCount = -1) const;
  FWL_Error ClearText();
  int32_t GetCaretPos() const;
  int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore = TRUE);
  int32_t AddSelRange(int32_t nStart, int32_t nCount = -1);
  int32_t CountSelRanges();
  int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
  FWL_Error ClearSelections();
  int32_t GetLimit();
  FWL_Error SetLimit(int32_t nLimit);
  FWL_Error SetAliasChar(FX_WCHAR wAlias);
  FWL_Error SetFormatString(const CFX_WideString& wsFormat);
  FWL_Error Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLen);
  FWL_Error DeleteSelections();
  FWL_Error DeleteRange(int32_t nStart, int32_t nCount = -1);
  FWL_Error Replace(int32_t nStart,
                    int32_t nLen,
                    const CFX_WideStringC& wsReplace);
  FWL_Error DoClipboard(int32_t iCmd);
  FX_BOOL Redo(const IFDE_TxtEdtDoRecord* pRecord);
  FX_BOOL Undo(const IFDE_TxtEdtDoRecord* pRecord);
  FWL_Error SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant);
  FWL_Error SetNumberRange(int32_t iMin, int32_t iMax);
  FWL_Error SetBackColor(uint32_t dwColor);
  FWL_Error SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize);
  FX_BOOL CanUndo();
  FX_BOOL CanRedo();
  FX_BOOL Undo();
  FX_BOOL Redo();
  FX_BOOL Copy(CFX_WideString& wsCopy);
  FX_BOOL Cut(CFX_WideString& wsCut);
  FX_BOOL Paste(const CFX_WideString& wsPaste);
  FX_BOOL Delete();
  void SetScrollOffset(FX_FLOAT fScrollOffset);
  FX_BOOL GetSuggestWords(CFX_PointF pointf,
                          std::vector<CFX_ByteString>& sSuggest);
  FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
                                const CFX_ByteStringC& bsReplace);
};

#endif  // XFA_FWL_LIGHTWIDGET_CFWL_EDIT_H_
