// Copyright 2016 The PDFium Authors
// 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_FXFA_LAYOUT_CXFA_LAYOUTITEM_H_
#define XFA_FXFA_LAYOUT_CXFA_LAYOUTITEM_H_

#include "fxjs/gc/gced_tree_node.h"
#include "fxjs/gc/heap.h"
#include "v8/include/cppgc/member.h"
#include "v8/include/cppgc/prefinalizer.h"
#include "v8/include/cppgc/visitor.h"

class CXFA_ContentLayoutItem;
class CXFA_Node;
class CXFA_ViewLayoutItem;

class CXFA_LayoutItem : public GCedTreeNode<CXFA_LayoutItem> {
  CPPGC_USING_PRE_FINALIZER(CXFA_LayoutItem, PreFinalize);

 public:
  CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
  ~CXFA_LayoutItem() override;

  void PreFinalize();

  // GCedTreeNode:
  void Trace(cppgc::Visitor* visitor) const override;

  bool IsViewLayoutItem() const { return item_type_ == kViewItem; }
  bool IsContentLayoutItem() const { return item_type_ == kContentItem; }
  CXFA_ViewLayoutItem* AsViewLayoutItem();
  const CXFA_ViewLayoutItem* AsViewLayoutItem() const;
  CXFA_ContentLayoutItem* AsContentLayoutItem();
  const CXFA_ContentLayoutItem* AsContentLayoutItem() const;

  const CXFA_ViewLayoutItem* GetPage() const;
  CXFA_Node* GetFormNode() const { return form_node_; }
  void SetFormNode(CXFA_Node* pNode);

 protected:
  enum ItemType { kViewItem, kContentItem };
  CXFA_LayoutItem(CXFA_Node* pNode, ItemType type);

 private:
  const ItemType item_type_;
  cppgc::Member<CXFA_Node> form_node_;
};

inline CXFA_ViewLayoutItem* ToViewLayoutItem(CXFA_LayoutItem* item) {
  return item ? item->AsViewLayoutItem() : nullptr;
}

inline CXFA_ContentLayoutItem* ToContentLayoutItem(CXFA_LayoutItem* item) {
  return item ? item->AsContentLayoutItem() : nullptr;
}

void XFA_ReleaseLayoutItem(CXFA_LayoutItem* pLayoutItem);

#endif  // XFA_FXFA_LAYOUT_CXFA_LAYOUTITEM_H_
