// Copyright 2016 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

#include "xfa/fxfa/layout/cxfa_viewlayoutitem.h"

#include "fxjs/xfa/cjx_object.h"
#include "xfa/fxfa/cxfa_ffpageview.h"
#include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
#include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
#include "xfa/fxfa/parser/cxfa_measurement.h"
#include "xfa/fxfa/parser/cxfa_medium.h"
#include "xfa/fxfa/parser/cxfa_node.h"

CXFA_ViewLayoutItem::CXFA_ViewLayoutItem(CXFA_Node* pNode,
                                         CXFA_FFPageView* pPageView)
    : CXFA_LayoutItem(pNode, kViewItem), m_pFFPageView(pPageView) {
  if (m_pFFPageView)
    m_pFFPageView->SetLayoutItem(this);
}

CXFA_ViewLayoutItem::~CXFA_ViewLayoutItem() = default;

void CXFA_ViewLayoutItem::Trace(cppgc::Visitor* visitor) const {
  CXFA_LayoutItem::Trace(visitor);
  visitor->Trace(m_pOldSubform);
  visitor->Trace(m_pFFPageView);
}

CXFA_LayoutProcessor* CXFA_ViewLayoutItem::GetLayout() const {
  return CXFA_LayoutProcessor::FromDocument(GetFormNode()->GetDocument());
}

int32_t CXFA_ViewLayoutItem::GetPageIndex() const {
  auto* pLayout =
      CXFA_LayoutProcessor::FromDocument(GetFormNode()->GetDocument());
  return pLayout->GetLayoutPageMgr()->GetPageIndex(this);
}

CFX_SizeF CXFA_ViewLayoutItem::GetPageSize() const {
  CFX_SizeF size;
  CXFA_Medium* pMedium =
      GetFormNode()->GetFirstChildByClass<CXFA_Medium>(XFA_Element::Medium);
  if (!pMedium)
    return size;

  size = CFX_SizeF(
      pMedium->JSObject()->GetMeasureInUnit(XFA_Attribute::Short, XFA_Unit::Pt),
      pMedium->JSObject()->GetMeasureInUnit(XFA_Attribute::Long, XFA_Unit::Pt));
  if (pMedium->JSObject()->GetEnum(XFA_Attribute::Orientation) ==
      XFA_AttributeValue::Landscape) {
    size = CFX_SizeF(size.height, size.width);
  }
  return size;
}

CXFA_Node* CXFA_ViewLayoutItem::GetMasterPage() const {
  return GetFormNode();
}

void CXFA_ViewLayoutItem::SetOldSubform(CXFA_Node* pSubform) {
  m_pOldSubform = pSubform;
}
