#ifndef FS_OFD_OUTLINE_H_
#define FS_OFD_OUTLINE_H_

#include "common/fs_common.h"

/**
 * @brief Foxit 命名空间。
 *
 * @details Foxit PDF SDK 的所有定义和类都在此命名空间内定义。
 */
namespace foxit {
/**
* @brief ofd 命名空间。
*/
namespace ofd {
class Action;
class ActionDestinationInfo;

/** 此类表示和OFD大纲相关的操作。*/
class Outline FS_FINAL : public Base {
 public:
  /** @brief 析构函数。 */
  ~Outline();

  /**
   * @brief 构造函数，通过另一个大纲对象。
   *
   * @param[in] other 另一个大纲对象。
   */
  Outline(const Outline& other);

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other 另一个大纲对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  Outline& operator = (const Outline& other);

  /**
   * @brief 相等操作符。
   *
   * @param[in] other 另一个大纲对象。此函数将检查当前对象是否等于这个对象。
   *
   * @return <b>true</b> 表示相等，<b>false</b> 表示不相等。
   */
  bool operator == (const Outline& other) const;

  /**
   * @brief 不相等操作符。
   *
   * @param[in] other 另一个大纲对象。此函数将检查当前对象是否不等于这个对象。
   *
   * @return <b>true</b> 表示不相等，<b>false</b> 表示相等。
   */
  bool operator != (const Outline& other) const;

  /**
   * @brief 检查当前对象是否为空。
   *
   * @details 当前对象为空时，表示当前对象是无用的。
   *
   * @return <b>true</b> 表示当前对象为空，<b>false</b> 表示不为空。
   */
  bool IsEmpty() const;

  /**
   * @brief 获取子大纲的数量。
   *
   * @return 子大纲的数量。
   */
  int GetOutlineCount();

  /**
   * @brief 获取指定索引的子大纲对象。
   *
   * @param[in] index 指定的子大纲索引，有效范围：从0到(<i>count - 1</i>)。
   *                  <i>count</i>由函数 @link foxit::ofd::Outline::GetOutlineCount @endlink 返回。
   *
   * @return 指定索引的子大纲对象。
   */
  Outline GetOutline(int index);

  /**
   * @brief 添加子大纲。
   *
   * @return 新添加的子大纲对象。
   */
  Outline AddOutline();

  /**
   * @brief 删除指定索引的子大纲。
   *
   * @param[in] index 指定的子大纲索引，有效范围：从0到(<i>count - 1</i>)。
   *                  <i>count</i>由函数 @link foxit::ofd::Outline::GetOutlineCount @endlink 返回。
   *
   * @return <b>true</b> 表示删除成功，<b>false</b> 表示删除失败。
   */
  bool RemoveOutline(int index);

  /**
   * @brief 获取标题。
   *
   * @return 标题值。
   */
  String GetTitle();

  /**
   * @brief 获取动作对象。
   *
   * @return 动作对象。
   */
  Action GetAction();

  /**
   * @brief 获取目标信息对象。
   *
   * @return 目标信息对象。详见 @link foxit::ofd::ActionDestinationInfo @endlink 。
   */
  ActionDestinationInfo GetDestination();

  /**
   * @brief 获取uri。
   *
   * @return uri值。
   */
  String GetURI();

  /**
   * @brief 设置标题。
   *
   * @param[in] title     标题值。
   *
   * @return 无。
   */
  void SetTitle(const String& title);

  /**
   * @brief 设置是否展开。
   *
   * @param[in] expanded     是否展开。
   *
   * @return 无。
   */
  void EnableExpanded(bool expanded);

  /**
   * @brief 设置跳转目标到指定页面和位置。
   *
   * @param[in] page_index  目标页面索引（从0开始）。
   * @param[in] x           目标位置的X坐标。
   * @param[in] y           目标位置的Y坐标。
   *
   * @return 无。
   */
  void SetDestination(int page_index, float x, float y);

  /**
   * @brief 设置URI。
   *
   * @param[in] uri     URI值。
   *
   * @return 无。
   */
  void SetURI(const String& uri);

  explicit Outline(FS_HANDLE handle);
};

}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_OUTLINE_H_
