| Index: xfa/src/fxfa/src/app/xfa_ffpageview.cpp
|
| diff --git a/xfa/src/fxfa/src/app/xfa_ffpageview.cpp b/xfa/src/fxfa/src/app/xfa_ffpageview.cpp
|
| index 87fe5cd1b4d9f3e3fc65c4599c865f262cdf83ab..aa108a262535ae7e196105a936d05f201993607c 100644
|
| --- a/xfa/src/fxfa/src/app/xfa_ffpageview.cpp
|
| +++ b/xfa/src/fxfa/src/app/xfa_ffpageview.cpp
|
| @@ -1,423 +1,423 @@
|
| -// 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
|
| -
|
| -#include "xfa/src/foxitlib.h"
|
| -#include "xfa/src/fxfa/src/common/xfa_common.h"
|
| -#include "xfa_fwladapter.h"
|
| -#include "xfa_ffpageview.h"
|
| -#include "xfa_ffwidget.h"
|
| -#include "xfa_ffdoc.h"
|
| -#include "xfa_ffdocview.h"
|
| -#include "xfa_fffield.h"
|
| -#include "xfa_ffpushbutton.h"
|
| -#include "xfa_ffcheckbutton.h"
|
| -#include "xfa_ffchoicelist.h"
|
| -#include "xfa_ffimageedit.h"
|
| -#include "xfa_fftextedit.h"
|
| -CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea)
|
| - : CXFA_ContainerLayoutItem(pPageArea),
|
| - m_pDocView(pDocView),
|
| - m_bLoaded(FALSE) {}
|
| -CXFA_FFPageView::~CXFA_FFPageView() {}
|
| -IXFA_DocView* CXFA_FFPageView::GetDocView() {
|
| - return m_pDocView;
|
| -}
|
| -int32_t CXFA_FFPageView::GetPageViewIndex() {
|
| - return GetPageIndex();
|
| -}
|
| -void CXFA_FFPageView::GetPageViewRect(CFX_RectF& rtPage) {
|
| - CFX_SizeF sz;
|
| - GetPageSize(sz);
|
| - rtPage.Set(0, 0, sz);
|
| -}
|
| -void CXFA_FFPageView::GetDisplayMatrix(CFX_Matrix& mt,
|
| - const CFX_Rect& rtDisp,
|
| - int32_t iRotate) {
|
| - CFX_SizeF sz;
|
| - GetPageSize(sz);
|
| - CFX_RectF fdePage;
|
| - fdePage.Set(0, 0, sz.x, sz.y);
|
| - FDE_GetPageMatrix(mt, fdePage, rtDisp, iRotate, 0);
|
| -}
|
| -int32_t CXFA_FFPageView::LoadPageView(IFX_Pause* pPause) {
|
| - if (m_bLoaded) {
|
| - return 100;
|
| - }
|
| - m_bLoaded = TRUE;
|
| - return 100;
|
| -}
|
| -void CXFA_FFPageView::UnloadPageView() {
|
| - if (!m_bLoaded) {
|
| - return;
|
| - }
|
| -}
|
| -FX_BOOL CXFA_FFPageView::IsPageViewLoaded() {
|
| - return m_bLoaded;
|
| -}
|
| -IXFA_Widget* CXFA_FFPageView::GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) {
|
| - if (!m_bLoaded) {
|
| - return nullptr;
|
| - }
|
| - IXFA_WidgetIterator* pIterator = CreateWidgetIterator();
|
| - CXFA_FFWidget* pWidget = nullptr;
|
| - while ((pWidget = static_cast<CXFA_FFWidget*>(pIterator->MoveToNext()))) {
|
| - if (!(pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
|
| - continue;
|
| - }
|
| - CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
|
| - int32_t type = pAcc->GetClassID();
|
| - if (type != XFA_ELEMENT_Field && type != XFA_ELEMENT_Draw) {
|
| - continue;
|
| - }
|
| - FX_FLOAT fWidgetx = fx;
|
| - FX_FLOAT fWidgety = fy;
|
| - pWidget->Rotate2Normal(fWidgetx, fWidgety);
|
| - FX_DWORD dwFlag = pWidget->OnHitTest(fWidgetx, fWidgety);
|
| - if ((FWL_WGTHITTEST_Client == dwFlag ||
|
| - FWL_WGTHITTEST_HyperLink == dwFlag)) {
|
| - break;
|
| - }
|
| - }
|
| - pIterator->Release();
|
| - return pWidget;
|
| -}
|
| -IXFA_WidgetIterator* CXFA_FFPageView::CreateWidgetIterator(
|
| - FX_DWORD dwTraverseWay,
|
| - FX_DWORD dwWidgetFilter) {
|
| - switch (dwTraverseWay) {
|
| - case XFA_TRAVERSEWAY_Tranvalse:
|
| - return new CXFA_FFTabOrderPageWidgetIterator(this, dwWidgetFilter);
|
| - case XFA_TRAVERSEWAY_Form:
|
| - return new CXFA_FFPageWidgetIterator(this, dwWidgetFilter);
|
| - }
|
| - return NULL;
|
| -}
|
| -static FX_BOOL XFA_PageWidgetFilter(CXFA_FFWidget* pWidget,
|
| - FX_DWORD dwFilter,
|
| - FX_BOOL bTraversal,
|
| - FX_BOOL bIgnorerelevant) {
|
| - CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
|
| - FX_DWORD dwType = dwFilter & XFA_WIDGETFILTER_AllType;
|
| - if ((dwType == XFA_WIDGETFILTER_Field) &&
|
| - (pWidgetAcc->GetClassID() != XFA_ELEMENT_Field)) {
|
| - return FALSE;
|
| - }
|
| - FX_DWORD dwStatus = pWidget->GetStatus();
|
| - if (bTraversal && (dwStatus & XFA_WIDGETSTATUS_Disabled)) {
|
| - return FALSE;
|
| - }
|
| - if (bIgnorerelevant) {
|
| - return (dwStatus & XFA_WIDGETFILTER_Visible) != 0;
|
| - }
|
| - dwFilter &= (XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable |
|
| - XFA_WIDGETFILTER_Printable);
|
| - return (dwFilter & dwStatus) == dwFilter;
|
| -}
|
| -CXFA_FFPageWidgetIterator::CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView,
|
| - FX_DWORD dwFilter) {
|
| - m_pPageView = pPageView;
|
| - m_dwFilter = dwFilter;
|
| - m_sIterator.Init(pPageView);
|
| - m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
|
| - ->GetXFADoc()
|
| - ->GetCurVersionMode() < XFA_VERSION_205;
|
| -}
|
| -CXFA_FFPageWidgetIterator::~CXFA_FFPageWidgetIterator() {}
|
| -void CXFA_FFPageWidgetIterator::Reset() {
|
| - m_sIterator.Reset();
|
| -}
|
| -IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToFirst() {
|
| - m_sIterator.Reset();
|
| - for (CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem;
|
| - pLayoutItem = m_sIterator.MoveToNext()) {
|
| - if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
|
| - return hWidget;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToLast() {
|
| - m_sIterator.SetCurrent(NULL);
|
| - return MoveToPrevious();
|
| -}
|
| -IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToNext() {
|
| - for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem;
|
| - pLayoutItem = m_sIterator.MoveToNext()) {
|
| - if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
|
| - return hWidget;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToPrevious() {
|
| - for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem;
|
| - pLayoutItem = m_sIterator.MoveToPrev()) {
|
| - if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
|
| - return hWidget;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -IXFA_Widget* CXFA_FFPageWidgetIterator::GetCurrentWidget() {
|
| - CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent();
|
| - return pLayoutItem ? XFA_GetWidgetFromLayoutItem(pLayoutItem) : NULL;
|
| -}
|
| -FX_BOOL CXFA_FFPageWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) {
|
| - CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(hWidget);
|
| - return pWidget && m_sIterator.SetCurrent(pWidget);
|
| -}
|
| -IXFA_Widget* CXFA_FFPageWidgetIterator::GetWidget(
|
| - CXFA_LayoutItem* pLayoutItem) {
|
| - if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
|
| - if (!XFA_PageWidgetFilter(pWidget, m_dwFilter, FALSE, m_bIgnorerelevant)) {
|
| - return NULL;
|
| - }
|
| - if (!pWidget->IsLoaded() &&
|
| - (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible) != 0) {
|
| - pWidget->LoadWidget();
|
| - }
|
| - return pWidget;
|
| - }
|
| - return NULL;
|
| -}
|
| -CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator(
|
| - CXFA_FFPageView* pPageView,
|
| - FX_DWORD dwFilter)
|
| - : m_pPageView(pPageView), m_dwFilter(dwFilter), m_iCurWidget(-1) {
|
| - m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
|
| - ->GetXFADoc()
|
| - ->GetCurVersionMode() < XFA_VERSION_205;
|
| - Reset();
|
| -}
|
| -CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() {}
|
| -void CXFA_FFTabOrderPageWidgetIterator::Release() {
|
| - delete this;
|
| -}
|
| -void CXFA_FFTabOrderPageWidgetIterator::Reset() {
|
| - CreateTabOrderWidgetArray();
|
| - m_iCurWidget = -1;
|
| -}
|
| -IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() {
|
| - if (m_TabOrderWidgetArray.GetSize() > 0) {
|
| - for (int32_t i = 0; i < m_TabOrderWidgetArray.GetSize(); i++) {
|
| - if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| - m_bIgnorerelevant)) {
|
| - m_iCurWidget = i;
|
| - return m_TabOrderWidgetArray[m_iCurWidget];
|
| - }
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() {
|
| - if (m_TabOrderWidgetArray.GetSize() > 0) {
|
| - for (int32_t i = m_TabOrderWidgetArray.GetSize() - 1; i >= 0; i--) {
|
| - if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| - m_bIgnorerelevant)) {
|
| - m_iCurWidget = i;
|
| - return m_TabOrderWidgetArray[m_iCurWidget];
|
| - }
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() {
|
| - for (int32_t i = m_iCurWidget + 1; i < m_TabOrderWidgetArray.GetSize(); i++) {
|
| - if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| - m_bIgnorerelevant)) {
|
| - m_iCurWidget = i;
|
| - return m_TabOrderWidgetArray[m_iCurWidget];
|
| - }
|
| - }
|
| - m_iCurWidget = -1;
|
| - return NULL;
|
| -}
|
| -IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() {
|
| - for (int32_t i = m_iCurWidget - 1; i >= 0; i--) {
|
| - if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| - m_bIgnorerelevant)) {
|
| - m_iCurWidget = i;
|
| - return m_TabOrderWidgetArray[m_iCurWidget];
|
| - }
|
| - }
|
| - m_iCurWidget = -1;
|
| - return NULL;
|
| -}
|
| -IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() {
|
| - if (m_iCurWidget >= 0) {
|
| - return m_TabOrderWidgetArray[m_iCurWidget];
|
| - }
|
| - return NULL;
|
| -}
|
| -FX_BOOL CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(
|
| - IXFA_Widget* hWidget) {
|
| - int32_t iWidgetIndex =
|
| - m_TabOrderWidgetArray.Find(static_cast<CXFA_FFWidget*>(hWidget));
|
| - if (iWidgetIndex >= 0) {
|
| - m_iCurWidget = iWidgetIndex;
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(
|
| - CXFA_FFWidget* pWidget) {
|
| - CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
|
| - CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_ELEMENT_Traversal);
|
| - if (pTraversal != NULL) {
|
| - CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_ELEMENT_Traverse);
|
| - if (pTraverse != NULL) {
|
| - CFX_WideString wsTraverseWidgetName;
|
| - if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) {
|
| - return FindWidgetByName(wsTraverseWidgetName, pWidget);
|
| - }
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName(
|
| - const CFX_WideStringC& wsWidgetName,
|
| - CXFA_FFWidget* pRefWidget) {
|
| - return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget);
|
| -}
|
| -void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() {
|
| - m_TabOrderWidgetArray.RemoveAll();
|
| - CXFA_WidgetArray SpaceOrderWidgetArray;
|
| - CreateSpaceOrderWidgetArray(SpaceOrderWidgetArray);
|
| - int32_t nWidgetCount = SpaceOrderWidgetArray.GetSize();
|
| - if (nWidgetCount < 1) {
|
| - return;
|
| - }
|
| - CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0];
|
| - for (; m_TabOrderWidgetArray.GetSize() < nWidgetCount;) {
|
| - if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
|
| - m_TabOrderWidgetArray.Add(hWidget);
|
| - CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc();
|
| - if (pWidgetAcc->GetUIType() == XFA_ELEMENT_ExclGroup) {
|
| - int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget) + 1;
|
| - while (TRUE) {
|
| - CXFA_FFWidget* pRadio =
|
| - SpaceOrderWidgetArray[(iWidgetIndex) % nWidgetCount];
|
| - if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) {
|
| - break;
|
| - }
|
| - if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
|
| - m_TabOrderWidgetArray.Add(pRadio);
|
| - }
|
| - iWidgetIndex++;
|
| - }
|
| - }
|
| - if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) {
|
| - hWidget = hTraverseWidget;
|
| - continue;
|
| - }
|
| - }
|
| - int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget);
|
| - hWidget = SpaceOrderWidgetArray[(iWidgetIndex + 1) % nWidgetCount];
|
| - }
|
| -}
|
| -static int32_t XFA_TabOrderWidgetComparator(const void* phWidget1,
|
| - const void* phWidget2) {
|
| - CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget;
|
| - CXFA_FFWidget* pWidget2 = (*(CXFA_TabParam**)phWidget2)->m_pWidget;
|
| - CFX_RectF rt1, rt2;
|
| - pWidget1->GetWidgetRect(rt1);
|
| - pWidget2->GetWidgetRect(rt2);
|
| - FX_FLOAT x1 = rt1.left, y1 = rt1.top, x2 = rt2.left, y2 = rt2.top;
|
| - if (y1 < y2 || (y1 - y2 < XFA_FLOAT_PERCISION && x1 < x2)) {
|
| - return -1;
|
| - }
|
| - return 1;
|
| -}
|
| -void CXFA_FFTabOrderPageWidgetIterator::OrderContainer(
|
| - CXFA_LayoutItemIterator* sIterator,
|
| - CXFA_LayoutItem* pContainerItem,
|
| - CXFA_TabParam* pContainer,
|
| - FX_BOOL& bCurrentItem,
|
| - FX_BOOL& bContentArea,
|
| - FX_BOOL bMarsterPage) {
|
| - CFX_PtrArray tabParams;
|
| - CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext();
|
| - while (pSearchItem) {
|
| - if (!pSearchItem->IsContentLayoutItem()) {
|
| - bContentArea = TRUE;
|
| - pSearchItem = sIterator->MoveToNext();
|
| - continue;
|
| - }
|
| - if (bMarsterPage && bContentArea) {
|
| - break;
|
| - }
|
| - if (bMarsterPage || bContentArea) {
|
| - CXFA_FFWidget* hWidget = GetWidget(pSearchItem);
|
| - if (!hWidget) {
|
| - pSearchItem = sIterator->MoveToNext();
|
| - continue;
|
| - }
|
| - if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) {
|
| - bCurrentItem = TRUE;
|
| - break;
|
| - }
|
| - CXFA_TabParam* pParam = new CXFA_TabParam;
|
| - pParam->m_pWidget = hWidget;
|
| - tabParams.Add(pParam);
|
| - if (XFA_IsLayoutElement(pSearchItem->GetFormNode()->GetClassID(), TRUE)) {
|
| - OrderContainer(sIterator, pSearchItem, pParam, bCurrentItem,
|
| - bContentArea, bMarsterPage);
|
| - }
|
| - }
|
| - if (bCurrentItem) {
|
| - pSearchItem = sIterator->GetCurrent();
|
| - bCurrentItem = FALSE;
|
| - } else {
|
| - pSearchItem = sIterator->MoveToNext();
|
| - }
|
| - }
|
| - int32_t iChildren = tabParams.GetSize();
|
| - if (iChildren > 1) {
|
| - FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*),
|
| - XFA_TabOrderWidgetComparator);
|
| - }
|
| - for (int32_t iStart = 0; iStart < iChildren; iStart++) {
|
| - CXFA_TabParam* pParam = (CXFA_TabParam*)tabParams[iStart];
|
| - pContainer->m_Children.Add(pParam->m_pWidget);
|
| - if (pParam->m_Children.GetSize() > 0) {
|
| - pContainer->m_Children.Append(pParam->m_Children);
|
| - }
|
| - delete pParam;
|
| - }
|
| - tabParams.RemoveAll();
|
| -}
|
| -void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray(
|
| - CXFA_WidgetArray& WidgetArray) {
|
| - CXFA_LayoutItemIterator sIterator;
|
| - sIterator.Init(m_pPageView);
|
| - CXFA_TabParam* pParam = new CXFA_TabParam;
|
| - FX_BOOL bCurrentItem = FALSE;
|
| - FX_BOOL bContentArea = FALSE;
|
| - OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea);
|
| - if (pParam->m_Children.GetSize() > 0) {
|
| - WidgetArray.Append(pParam->m_Children);
|
| - }
|
| - sIterator.Reset();
|
| - bCurrentItem = FALSE;
|
| - bContentArea = FALSE;
|
| - pParam->m_Children.RemoveAll();
|
| - OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea, TRUE);
|
| - if (pParam->m_Children.GetSize() > 0) {
|
| - WidgetArray.Append(pParam->m_Children);
|
| - }
|
| - delete pParam;
|
| -}
|
| -CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(
|
| - CXFA_LayoutItem* pLayoutItem) {
|
| - if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
|
| - if (!pWidget->IsLoaded() &&
|
| - (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
|
| - pWidget->LoadWidget();
|
| - }
|
| - return pWidget;
|
| - }
|
| - return NULL;
|
| -}
|
| +// 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
|
| +
|
| +#include "xfa/src/foxitlib.h"
|
| +#include "xfa/src/fxfa/src/common/xfa_common.h"
|
| +#include "xfa_fwladapter.h"
|
| +#include "xfa_ffpageview.h"
|
| +#include "xfa_ffwidget.h"
|
| +#include "xfa_ffdoc.h"
|
| +#include "xfa_ffdocview.h"
|
| +#include "xfa_fffield.h"
|
| +#include "xfa_ffpushbutton.h"
|
| +#include "xfa_ffcheckbutton.h"
|
| +#include "xfa_ffchoicelist.h"
|
| +#include "xfa_ffimageedit.h"
|
| +#include "xfa_fftextedit.h"
|
| +CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea)
|
| + : CXFA_ContainerLayoutItem(pPageArea),
|
| + m_pDocView(pDocView),
|
| + m_bLoaded(FALSE) {}
|
| +CXFA_FFPageView::~CXFA_FFPageView() {}
|
| +IXFA_DocView* CXFA_FFPageView::GetDocView() {
|
| + return m_pDocView;
|
| +}
|
| +int32_t CXFA_FFPageView::GetPageViewIndex() {
|
| + return GetPageIndex();
|
| +}
|
| +void CXFA_FFPageView::GetPageViewRect(CFX_RectF& rtPage) {
|
| + CFX_SizeF sz;
|
| + GetPageSize(sz);
|
| + rtPage.Set(0, 0, sz);
|
| +}
|
| +void CXFA_FFPageView::GetDisplayMatrix(CFX_Matrix& mt,
|
| + const CFX_Rect& rtDisp,
|
| + int32_t iRotate) {
|
| + CFX_SizeF sz;
|
| + GetPageSize(sz);
|
| + CFX_RectF fdePage;
|
| + fdePage.Set(0, 0, sz.x, sz.y);
|
| + FDE_GetPageMatrix(mt, fdePage, rtDisp, iRotate, 0);
|
| +}
|
| +int32_t CXFA_FFPageView::LoadPageView(IFX_Pause* pPause) {
|
| + if (m_bLoaded) {
|
| + return 100;
|
| + }
|
| + m_bLoaded = TRUE;
|
| + return 100;
|
| +}
|
| +void CXFA_FFPageView::UnloadPageView() {
|
| + if (!m_bLoaded) {
|
| + return;
|
| + }
|
| +}
|
| +FX_BOOL CXFA_FFPageView::IsPageViewLoaded() {
|
| + return m_bLoaded;
|
| +}
|
| +IXFA_Widget* CXFA_FFPageView::GetWidgetByPos(FX_FLOAT fx, FX_FLOAT fy) {
|
| + if (!m_bLoaded) {
|
| + return nullptr;
|
| + }
|
| + IXFA_WidgetIterator* pIterator = CreateWidgetIterator();
|
| + CXFA_FFWidget* pWidget = nullptr;
|
| + while ((pWidget = static_cast<CXFA_FFWidget*>(pIterator->MoveToNext()))) {
|
| + if (!(pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
|
| + continue;
|
| + }
|
| + CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
|
| + int32_t type = pAcc->GetClassID();
|
| + if (type != XFA_ELEMENT_Field && type != XFA_ELEMENT_Draw) {
|
| + continue;
|
| + }
|
| + FX_FLOAT fWidgetx = fx;
|
| + FX_FLOAT fWidgety = fy;
|
| + pWidget->Rotate2Normal(fWidgetx, fWidgety);
|
| + FX_DWORD dwFlag = pWidget->OnHitTest(fWidgetx, fWidgety);
|
| + if ((FWL_WGTHITTEST_Client == dwFlag ||
|
| + FWL_WGTHITTEST_HyperLink == dwFlag)) {
|
| + break;
|
| + }
|
| + }
|
| + pIterator->Release();
|
| + return pWidget;
|
| +}
|
| +IXFA_WidgetIterator* CXFA_FFPageView::CreateWidgetIterator(
|
| + FX_DWORD dwTraverseWay,
|
| + FX_DWORD dwWidgetFilter) {
|
| + switch (dwTraverseWay) {
|
| + case XFA_TRAVERSEWAY_Tranvalse:
|
| + return new CXFA_FFTabOrderPageWidgetIterator(this, dwWidgetFilter);
|
| + case XFA_TRAVERSEWAY_Form:
|
| + return new CXFA_FFPageWidgetIterator(this, dwWidgetFilter);
|
| + }
|
| + return NULL;
|
| +}
|
| +static FX_BOOL XFA_PageWidgetFilter(CXFA_FFWidget* pWidget,
|
| + FX_DWORD dwFilter,
|
| + FX_BOOL bTraversal,
|
| + FX_BOOL bIgnorerelevant) {
|
| + CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc();
|
| + FX_DWORD dwType = dwFilter & XFA_WIDGETFILTER_AllType;
|
| + if ((dwType == XFA_WIDGETFILTER_Field) &&
|
| + (pWidgetAcc->GetClassID() != XFA_ELEMENT_Field)) {
|
| + return FALSE;
|
| + }
|
| + FX_DWORD dwStatus = pWidget->GetStatus();
|
| + if (bTraversal && (dwStatus & XFA_WIDGETSTATUS_Disabled)) {
|
| + return FALSE;
|
| + }
|
| + if (bIgnorerelevant) {
|
| + return (dwStatus & XFA_WIDGETFILTER_Visible) != 0;
|
| + }
|
| + dwFilter &= (XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable |
|
| + XFA_WIDGETFILTER_Printable);
|
| + return (dwFilter & dwStatus) == dwFilter;
|
| +}
|
| +CXFA_FFPageWidgetIterator::CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView,
|
| + FX_DWORD dwFilter) {
|
| + m_pPageView = pPageView;
|
| + m_dwFilter = dwFilter;
|
| + m_sIterator.Init(pPageView);
|
| + m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
|
| + ->GetXFADoc()
|
| + ->GetCurVersionMode() < XFA_VERSION_205;
|
| +}
|
| +CXFA_FFPageWidgetIterator::~CXFA_FFPageWidgetIterator() {}
|
| +void CXFA_FFPageWidgetIterator::Reset() {
|
| + m_sIterator.Reset();
|
| +}
|
| +IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToFirst() {
|
| + m_sIterator.Reset();
|
| + for (CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem;
|
| + pLayoutItem = m_sIterator.MoveToNext()) {
|
| + if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
|
| + return hWidget;
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToLast() {
|
| + m_sIterator.SetCurrent(NULL);
|
| + return MoveToPrevious();
|
| +}
|
| +IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToNext() {
|
| + for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem;
|
| + pLayoutItem = m_sIterator.MoveToNext()) {
|
| + if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
|
| + return hWidget;
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +IXFA_Widget* CXFA_FFPageWidgetIterator::MoveToPrevious() {
|
| + for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem;
|
| + pLayoutItem = m_sIterator.MoveToPrev()) {
|
| + if (IXFA_Widget* hWidget = GetWidget(pLayoutItem)) {
|
| + return hWidget;
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +IXFA_Widget* CXFA_FFPageWidgetIterator::GetCurrentWidget() {
|
| + CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent();
|
| + return pLayoutItem ? XFA_GetWidgetFromLayoutItem(pLayoutItem) : NULL;
|
| +}
|
| +FX_BOOL CXFA_FFPageWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) {
|
| + CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(hWidget);
|
| + return pWidget && m_sIterator.SetCurrent(pWidget);
|
| +}
|
| +IXFA_Widget* CXFA_FFPageWidgetIterator::GetWidget(
|
| + CXFA_LayoutItem* pLayoutItem) {
|
| + if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
|
| + if (!XFA_PageWidgetFilter(pWidget, m_dwFilter, FALSE, m_bIgnorerelevant)) {
|
| + return NULL;
|
| + }
|
| + if (!pWidget->IsLoaded() &&
|
| + (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible) != 0) {
|
| + pWidget->LoadWidget();
|
| + }
|
| + return pWidget;
|
| + }
|
| + return NULL;
|
| +}
|
| +CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator(
|
| + CXFA_FFPageView* pPageView,
|
| + FX_DWORD dwFilter)
|
| + : m_pPageView(pPageView), m_dwFilter(dwFilter), m_iCurWidget(-1) {
|
| + m_bIgnorerelevant = ((CXFA_FFDoc*)m_pPageView->GetDocView()->GetDoc())
|
| + ->GetXFADoc()
|
| + ->GetCurVersionMode() < XFA_VERSION_205;
|
| + Reset();
|
| +}
|
| +CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() {}
|
| +void CXFA_FFTabOrderPageWidgetIterator::Release() {
|
| + delete this;
|
| +}
|
| +void CXFA_FFTabOrderPageWidgetIterator::Reset() {
|
| + CreateTabOrderWidgetArray();
|
| + m_iCurWidget = -1;
|
| +}
|
| +IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() {
|
| + if (m_TabOrderWidgetArray.GetSize() > 0) {
|
| + for (int32_t i = 0; i < m_TabOrderWidgetArray.GetSize(); i++) {
|
| + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| + m_bIgnorerelevant)) {
|
| + m_iCurWidget = i;
|
| + return m_TabOrderWidgetArray[m_iCurWidget];
|
| + }
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() {
|
| + if (m_TabOrderWidgetArray.GetSize() > 0) {
|
| + for (int32_t i = m_TabOrderWidgetArray.GetSize() - 1; i >= 0; i--) {
|
| + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| + m_bIgnorerelevant)) {
|
| + m_iCurWidget = i;
|
| + return m_TabOrderWidgetArray[m_iCurWidget];
|
| + }
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() {
|
| + for (int32_t i = m_iCurWidget + 1; i < m_TabOrderWidgetArray.GetSize(); i++) {
|
| + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| + m_bIgnorerelevant)) {
|
| + m_iCurWidget = i;
|
| + return m_TabOrderWidgetArray[m_iCurWidget];
|
| + }
|
| + }
|
| + m_iCurWidget = -1;
|
| + return NULL;
|
| +}
|
| +IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() {
|
| + for (int32_t i = m_iCurWidget - 1; i >= 0; i--) {
|
| + if (XFA_PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, TRUE,
|
| + m_bIgnorerelevant)) {
|
| + m_iCurWidget = i;
|
| + return m_TabOrderWidgetArray[m_iCurWidget];
|
| + }
|
| + }
|
| + m_iCurWidget = -1;
|
| + return NULL;
|
| +}
|
| +IXFA_Widget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() {
|
| + if (m_iCurWidget >= 0) {
|
| + return m_TabOrderWidgetArray[m_iCurWidget];
|
| + }
|
| + return NULL;
|
| +}
|
| +FX_BOOL CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(
|
| + IXFA_Widget* hWidget) {
|
| + int32_t iWidgetIndex =
|
| + m_TabOrderWidgetArray.Find(static_cast<CXFA_FFWidget*>(hWidget));
|
| + if (iWidgetIndex >= 0) {
|
| + m_iCurWidget = iWidgetIndex;
|
| + return TRUE;
|
| + }
|
| + return FALSE;
|
| +}
|
| +CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(
|
| + CXFA_FFWidget* pWidget) {
|
| + CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
|
| + CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_ELEMENT_Traversal);
|
| + if (pTraversal != NULL) {
|
| + CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_ELEMENT_Traverse);
|
| + if (pTraverse != NULL) {
|
| + CFX_WideString wsTraverseWidgetName;
|
| + if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) {
|
| + return FindWidgetByName(wsTraverseWidgetName, pWidget);
|
| + }
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName(
|
| + const CFX_WideStringC& wsWidgetName,
|
| + CXFA_FFWidget* pRefWidget) {
|
| + return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget);
|
| +}
|
| +void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() {
|
| + m_TabOrderWidgetArray.RemoveAll();
|
| + CXFA_WidgetArray SpaceOrderWidgetArray;
|
| + CreateSpaceOrderWidgetArray(SpaceOrderWidgetArray);
|
| + int32_t nWidgetCount = SpaceOrderWidgetArray.GetSize();
|
| + if (nWidgetCount < 1) {
|
| + return;
|
| + }
|
| + CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0];
|
| + for (; m_TabOrderWidgetArray.GetSize() < nWidgetCount;) {
|
| + if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
|
| + m_TabOrderWidgetArray.Add(hWidget);
|
| + CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc();
|
| + if (pWidgetAcc->GetUIType() == XFA_ELEMENT_ExclGroup) {
|
| + int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget) + 1;
|
| + while (TRUE) {
|
| + CXFA_FFWidget* pRadio =
|
| + SpaceOrderWidgetArray[(iWidgetIndex) % nWidgetCount];
|
| + if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) {
|
| + break;
|
| + }
|
| + if (m_TabOrderWidgetArray.Find(hWidget) < 0) {
|
| + m_TabOrderWidgetArray.Add(pRadio);
|
| + }
|
| + iWidgetIndex++;
|
| + }
|
| + }
|
| + if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) {
|
| + hWidget = hTraverseWidget;
|
| + continue;
|
| + }
|
| + }
|
| + int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget);
|
| + hWidget = SpaceOrderWidgetArray[(iWidgetIndex + 1) % nWidgetCount];
|
| + }
|
| +}
|
| +static int32_t XFA_TabOrderWidgetComparator(const void* phWidget1,
|
| + const void* phWidget2) {
|
| + CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget;
|
| + CXFA_FFWidget* pWidget2 = (*(CXFA_TabParam**)phWidget2)->m_pWidget;
|
| + CFX_RectF rt1, rt2;
|
| + pWidget1->GetWidgetRect(rt1);
|
| + pWidget2->GetWidgetRect(rt2);
|
| + FX_FLOAT x1 = rt1.left, y1 = rt1.top, x2 = rt2.left, y2 = rt2.top;
|
| + if (y1 < y2 || (y1 - y2 < XFA_FLOAT_PERCISION && x1 < x2)) {
|
| + return -1;
|
| + }
|
| + return 1;
|
| +}
|
| +void CXFA_FFTabOrderPageWidgetIterator::OrderContainer(
|
| + CXFA_LayoutItemIterator* sIterator,
|
| + CXFA_LayoutItem* pContainerItem,
|
| + CXFA_TabParam* pContainer,
|
| + FX_BOOL& bCurrentItem,
|
| + FX_BOOL& bContentArea,
|
| + FX_BOOL bMarsterPage) {
|
| + CFX_PtrArray tabParams;
|
| + CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext();
|
| + while (pSearchItem) {
|
| + if (!pSearchItem->IsContentLayoutItem()) {
|
| + bContentArea = TRUE;
|
| + pSearchItem = sIterator->MoveToNext();
|
| + continue;
|
| + }
|
| + if (bMarsterPage && bContentArea) {
|
| + break;
|
| + }
|
| + if (bMarsterPage || bContentArea) {
|
| + CXFA_FFWidget* hWidget = GetWidget(pSearchItem);
|
| + if (!hWidget) {
|
| + pSearchItem = sIterator->MoveToNext();
|
| + continue;
|
| + }
|
| + if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) {
|
| + bCurrentItem = TRUE;
|
| + break;
|
| + }
|
| + CXFA_TabParam* pParam = new CXFA_TabParam;
|
| + pParam->m_pWidget = hWidget;
|
| + tabParams.Add(pParam);
|
| + if (XFA_IsLayoutElement(pSearchItem->GetFormNode()->GetClassID(), TRUE)) {
|
| + OrderContainer(sIterator, pSearchItem, pParam, bCurrentItem,
|
| + bContentArea, bMarsterPage);
|
| + }
|
| + }
|
| + if (bCurrentItem) {
|
| + pSearchItem = sIterator->GetCurrent();
|
| + bCurrentItem = FALSE;
|
| + } else {
|
| + pSearchItem = sIterator->MoveToNext();
|
| + }
|
| + }
|
| + int32_t iChildren = tabParams.GetSize();
|
| + if (iChildren > 1) {
|
| + FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*),
|
| + XFA_TabOrderWidgetComparator);
|
| + }
|
| + for (int32_t iStart = 0; iStart < iChildren; iStart++) {
|
| + CXFA_TabParam* pParam = (CXFA_TabParam*)tabParams[iStart];
|
| + pContainer->m_Children.Add(pParam->m_pWidget);
|
| + if (pParam->m_Children.GetSize() > 0) {
|
| + pContainer->m_Children.Append(pParam->m_Children);
|
| + }
|
| + delete pParam;
|
| + }
|
| + tabParams.RemoveAll();
|
| +}
|
| +void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray(
|
| + CXFA_WidgetArray& WidgetArray) {
|
| + CXFA_LayoutItemIterator sIterator;
|
| + sIterator.Init(m_pPageView);
|
| + CXFA_TabParam* pParam = new CXFA_TabParam;
|
| + FX_BOOL bCurrentItem = FALSE;
|
| + FX_BOOL bContentArea = FALSE;
|
| + OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea);
|
| + if (pParam->m_Children.GetSize() > 0) {
|
| + WidgetArray.Append(pParam->m_Children);
|
| + }
|
| + sIterator.Reset();
|
| + bCurrentItem = FALSE;
|
| + bContentArea = FALSE;
|
| + pParam->m_Children.RemoveAll();
|
| + OrderContainer(&sIterator, NULL, pParam, bCurrentItem, bContentArea, TRUE);
|
| + if (pParam->m_Children.GetSize() > 0) {
|
| + WidgetArray.Append(pParam->m_Children);
|
| + }
|
| + delete pParam;
|
| +}
|
| +CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(
|
| + CXFA_LayoutItem* pLayoutItem) {
|
| + if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
|
| + if (!pWidget->IsLoaded() &&
|
| + (pWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
|
| + pWidget->LoadWidget();
|
| + }
|
| + return pWidget;
|
| + }
|
| + return NULL;
|
| +}
|
|
|