// 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 _FXFA_FORMFILLER_PAGEVIEW_IMP_H
#define _FXFA_FORMFILLER_PAGEVIEW_IMP_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
