// 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_FDE_CFDE_TXTEDTPARAG_H_
#define XFA_FDE_CFDE_TXTEDTPARAG_H_

#include <stdint.h>

#include "core/fxcrt/cfx_unowned_ptr.h"

class CFDE_TxtEdtEngine;

class CFDE_TxtEdtParag {
 public:
  explicit CFDE_TxtEdtParag(CFDE_TxtEdtEngine* pEngine);
  ~CFDE_TxtEdtParag();

  int32_t GetTextLength() const { return m_nCharCount; }
  int32_t GetStartIndex() const { return m_nCharStart; }
  int32_t GetLineCount() const { return m_nLineCount; }

  void SetTextLength(int32_t len) { m_nCharCount = len; }
  void IncrementTextLength(int32_t len) { m_nCharCount += len; }
  void SetStartIndex(int32_t idx) { m_nCharStart = idx; }
  void IncrementStartIndex(int32_t val) { m_nCharStart += val; }
  void DecrementStartIndex(int32_t val) { m_nCharStart -= val; }
  void SetLineCount(int32_t count) { m_nLineCount = count; }

  void GetLineRange(int32_t nLineIndex, int32_t& nStart, int32_t& nCount) const;
  void LoadParag();
  void UnloadParag();
  void CalcLines();

 private:
  int32_t m_nCharStart;
  int32_t m_nCharCount;
  int32_t m_nLineCount;
  int32_t* m_lpData;
  CFX_UnownedPtr<CFDE_TxtEdtEngine> m_pEngine;
};

#endif  // XFA_FDE_CFDE_TXTEDTPARAG_H_
