// 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_FXFA_APP_XFA_FFPAGEVIEW_H_
#define XFA_FXFA_APP_XFA_FFPAGEVIEW_H_

#include "xfa/fxfa/parser/xfa_doclayout.h"

class CXFA_FFWidget;
class CXFA_FFDocView;
class CXFA_FFPageView : public CXFA_ContainerLayoutItem, public IXFA_PageView {
 public:
  CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea);
  ~CXFA_FFPageView() override;

  // IFXA_PageView:
  IXFA_DocView* GetDocView() override;
  int32_t GetPageViewIndex() override;
  void GetPageViewRect(CFX_RectF& rtPage) override;
  void GetDisplayMatrix(CFX_Matrix& mt,
                        const CFX_Rect& rtDisp,
                        int32_t iRotate) override;
  int32_t LoadPageView(IFX_Pause* pPause = NULL) override;
  void UnloadPageView() override;
  IXFA_Widget* GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) override;
  IXFA_WidgetIterator* CreateWidgetIterator(
      FX_DWORD dwTraverseWay = XFA_TRAVERSEWAY_Form,
      FX_DWORD dwWidgetFilter = XFA_WIDGETFILTER_Visible |
                                XFA_WIDGETFILTER_Viewable |
                                XFA_WIDGETFILTER_AllType) override;

  FX_BOOL IsPageViewLoaded();

 protected:
  CXFA_FFDocView* m_pDocView;
  FX_BOOL m_bLoaded;
};
typedef CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
                                  CXFA_TraverseStrategy_LayoutItem>
    CXFA_LayoutItemIterator;
class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator {
 public:
  CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, FX_DWORD dwFilter);
  virtual ~CXFA_FFPageWidgetIterator();
  virtual void Release() { delete this; }

  virtual void Reset();
  virtual IXFA_Widget* MoveToFirst();
  virtual IXFA_Widget* MoveToLast();
  virtual IXFA_Widget* MoveToNext();
  virtual IXFA_Widget* MoveToPrevious();
  virtual IXFA_Widget* GetCurrentWidget();
  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);

 protected:
  IXFA_Widget* GetWidget(CXFA_LayoutItem* pLayoutItem);
  CXFA_FFPageView* m_pPageView;
  IXFA_Widget* m_hCurWidget;
  FX_DWORD m_dwFilter;
  FX_BOOL m_bIgnorerelevant;
  CXFA_LayoutItemIterator m_sIterator;
};
typedef CFX_ArrayTemplate<CXFA_FFWidget*> CXFA_WidgetArray;
class CXFA_TabParam {
 public:
  CXFA_TabParam() : m_pWidget(NULL) {}
  ~CXFA_TabParam() {}

  CXFA_FFWidget* m_pWidget;
  CXFA_WidgetArray m_Children;
};
class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator {
 public:
  CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView,
                                    FX_DWORD dwFilter);
  virtual ~CXFA_FFTabOrderPageWidgetIterator();

  virtual void Release();

  virtual void Reset();
  virtual IXFA_Widget* MoveToFirst();
  virtual IXFA_Widget* MoveToLast();
  virtual IXFA_Widget* MoveToNext();
  virtual IXFA_Widget* MoveToPrevious();
  virtual IXFA_Widget* GetCurrentWidget();
  virtual FX_BOOL SetCurrentWidget(IXFA_Widget* hWidget);

 protected:
  CXFA_WidgetArray m_TabOrderWidgetArray;
  CXFA_FFPageView* m_pPageView;
  FX_DWORD m_dwFilter;
  int32_t m_iCurWidget;
  FX_BOOL m_bIgnorerelevant;
  CXFA_FFWidget* GetTraverseWidget(CXFA_FFWidget* pWidget);
  CXFA_FFWidget* FindWidgetByName(const CFX_WideStringC& wsWidgetName,
                                  CXFA_FFWidget* pRefWidget);
  void CreateTabOrderWidgetArray();
  void CreateSpaceOrderWidgetArray(CXFA_WidgetArray& WidgetArray);
  CXFA_FFWidget* GetWidget(CXFA_LayoutItem* pLayoutItem);
  void OrderContainer(CXFA_LayoutItemIterator* sIterator,
                      CXFA_LayoutItem* pContainerItem,
                      CXFA_TabParam* pContainer,
                      FX_BOOL& bCurrentItem,
                      FX_BOOL& bContentArea,
                      FX_BOOL bMarsterPage = FALSE);
};

#endif  // XFA_FXFA_APP_XFA_FFPAGEVIEW_H_
