#ifndef FS_OFD_COMPOSITEOBJECT_H_
#define FS_OFD_COMPOSITEOBJECT_H_

#include "common/fs_common.h"
#include "fs_ofdgraphicsobject.h"

/**
 * @brief Foxit 命名空间。
 *
 * @details Foxit PDF SDK 的所有定义和类都在此命名空间内定义。
 */
namespace foxit {
/**
 * @brief ofd 命名空间。
 */
namespace ofd {
/**
 * @brief ofd graphics 命名空间。
 */
namespace graphics {
class OFDBlock;
/** 此类表示和OFD复合对象单元相关的方法。*/
class OFDCompositeUnit FS_FINAL : public Base {
 public:
  /** @brief 析构函数。 */
  ~OFDCompositeUnit();

  /**
   * @brief 构造函数，通过另一个OFD复合对象单元对象。
   *
   * @param[in] other  另一个OFD复合对象单元对象。
   */
  OFDCompositeUnit(const OFDCompositeUnit& other);

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

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

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

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

  /**
   * @brief 设置复合单元宽度。
   *
   * @param[in] width 复合单元宽度。
   *
   * @return 无。
   */
  void SetWidth(float width);

  /**
   * @brief 设置复合单元高度。
   *
   * @param[in] height         复合单元高度。
   *
   * @return 无。
   */
  void SetHeight(float height);

  /**
   * @brief 设置复合单元缩略图。
   *
   * @param[in] resource_id    缩略图资源ID。可通过函数 @link OFDDoc::AddImageResourceFromFile @endlink 等添加资源函数来获取资源ID。
   *
   * @return 无。
   */
  void SetThumbnail(foxit::uint32 resource_id);

  /**
   * @brief 设置复合单元替换缩略图。
   *
   * @param[in] resource_id    替换缩略图资源ID。可通过函数 @link OFDDoc::AddImageResourceFromFile @endlink 等添加资源函数来获取资源ID。
   *
   * @return 无。
   */
  void SetSubstitution(foxit::uint32 resource_id);

  explicit OFDCompositeUnit(FS_HANDLE handle);
};

/** 此类表示和OFD复合对象相关的方法。*/
class OFDCompositeObject FS_FINAL : public OFDGraphicsObject {
 public:
   /**
   * @brief  构造函数，从现有@link foxit::ofd::graphics::OFDGraphicsObject @endlink对象。
   * @param[in] object OFDGraphicsObject对象。
                       此对象必须是一个有效的对象，并且其类型必须是@link foxit::ofd::graphics::OFDGraphicsObject::e_ObjectTypeComposite @endlink，否则构造函数将抛出异常。
   */
  explicit OFDCompositeObject(OFDGraphicsObject object);

  /** @brief 析构函数。 */
  ~OFDCompositeObject();

  /**
   * @brief 构造函数，通过另一个OFD复合对象。
   *
   * @param[in] other  另一个OFD复合对象。
   */
  OFDCompositeObject(const OFDCompositeObject& other);

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

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

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

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

  /**
   * @brief 添加复合单元。
   *
   * @return 复合单元对象。
   */
  OFDCompositeUnit AddUnit();

  explicit OFDCompositeObject(FS_HANDLE handle);
};
}  // namespace graphics
}  // namespace ofd
}  // namespace foxit

#endif  // FS_OFD_COMPOSITEOBJECT_H_
