| Index: xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| diff --git a/xfa/fwl/core/fwl_widgetmgrimp.cpp b/xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| index 93f39a98e52e6fe79d161895b909090fb5de3c32..98d135c96db1db131c04a4f924c0a3b58335f4a1 100644
|
| --- a/xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| +++ b/xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| @@ -36,11 +36,10 @@ FX_BOOL FWL_UseOffscreen(IFWL_Widget* pWidget) {
|
| #endif
|
| }
|
|
|
| -IFWL_WidgetMgr* FWL_GetWidgetMgr() {
|
| +// static
|
| +CFWL_WidgetMgr* CFWL_WidgetMgr::GetInstance() {
|
| IFWL_App* pApp = FWL_GetApp();
|
| - if (!pApp)
|
| - return NULL;
|
| - return pApp->GetWidgetMgr();
|
| + return pApp ? pApp->GetWidgetMgr() : nullptr;
|
| }
|
|
|
| CFWL_WidgetMgr::CFWL_WidgetMgr(CXFA_FFApp* pAdapterNative)
|
| @@ -56,88 +55,68 @@ CFWL_WidgetMgr::CFWL_WidgetMgr(CXFA_FFApp* pAdapterNative)
|
|
|
| CFWL_WidgetMgr::~CFWL_WidgetMgr() {}
|
|
|
| -int32_t CFWL_WidgetMgr::CountWidgets(IFWL_Widget* pParent) {
|
| - CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
|
| - return TravelWidgetMgr(pParentItem, NULL, NULL);
|
| +IFWL_Widget* CFWL_WidgetMgr::GetParentWidget(IFWL_Widget* pWidget) const {
|
| + CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| + return pItem && pItem->pParent ? pItem->pParent->pWidget : nullptr;
|
| }
|
| -IFWL_Widget* CFWL_WidgetMgr::GetWidget(int32_t nIndex, IFWL_Widget* pParent) {
|
| - CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
|
| - IFWL_Widget* pWidget = NULL;
|
| - TravelWidgetMgr(pParentItem, &nIndex, NULL, &pWidget);
|
| - return pWidget;
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetOwnerWidget(IFWL_Widget* pWidget) const {
|
| + CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| + return pItem && pItem->pOwner ? pItem->pOwner->pWidget : nullptr;
|
| }
|
| -IFWL_Widget* CFWL_WidgetMgr::GetWidget(IFWL_Widget* pWidget,
|
| - FWL_WGTRELATION eRelation) {
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetFirstSiblingWidget(IFWL_Widget* pWidget) const {
|
| CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| - if (!pItem) {
|
| - return NULL;
|
| - }
|
| - IFWL_Widget* pRet = NULL;
|
| - switch (eRelation) {
|
| - case FWL_WGTRELATION_Parent: {
|
| - pRet = pItem->pParent ? pItem->pParent->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_Owner: {
|
| - pRet = pItem->pOwner ? pItem->pOwner->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_FirstSibling: {
|
| - pItem = pItem->pPrevious;
|
| - while (pItem && pItem->pPrevious) {
|
| - pItem = pItem->pPrevious;
|
| - }
|
| - pRet = pItem ? pItem->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_PriorSibling: {
|
| - pRet = pItem->pPrevious ? pItem->pPrevious->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_NextSibling: {
|
| - pRet = pItem->pNext ? pItem->pNext->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_LastSibling: {
|
| - pItem = pItem->pNext;
|
| - while (pItem && pItem->pNext) {
|
| - pItem = pItem->pNext;
|
| - }
|
| - pRet = pItem ? pItem->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_FirstChild: {
|
| - pRet = pItem->pChild ? pItem->pChild->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_LastChild: {
|
| - pItem = pItem->pChild;
|
| - while (pItem && pItem->pNext) {
|
| - pItem = pItem->pNext;
|
| - }
|
| - pRet = pItem ? pItem->pWidget : NULL;
|
| - break;
|
| - }
|
| - case FWL_WGTRELATION_SystemForm: {
|
| - while (pItem) {
|
| - if (IsAbleNative(pItem->pWidget)) {
|
| - pRet = pItem->pWidget;
|
| - break;
|
| - }
|
| - pItem = pItem->pParent;
|
| - }
|
| - break;
|
| - }
|
| - default: {}
|
| - }
|
| - return pRet;
|
| + pItem = pItem ? pItem->pPrevious : nullptr; // Not self.
|
| + while (pItem && pItem->pPrevious)
|
| + pItem = pItem->pPrevious;
|
| +
|
| + return pItem ? pItem->pWidget : nullptr;
|
| }
|
| -int32_t CFWL_WidgetMgr::GetWidgetIndex(IFWL_Widget* pWidget) {
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetPriorSiblingWidget(IFWL_Widget* pWidget) const {
|
| CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| - if (!pItem)
|
| - return -1;
|
| - return TravelWidgetMgr(pItem->pParent, NULL, pItem);
|
| + return pItem && pItem->pPrevious ? pItem->pPrevious->pWidget : nullptr;
|
| +}
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetNextSiblingWidget(IFWL_Widget* pWidget) const {
|
| + CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| + return pItem && pItem->pNext ? pItem->pNext->pWidget : nullptr;
|
| +}
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetLastSiblingWidget(IFWL_Widget* pWidget) const {
|
| + CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| + pItem = pItem ? pItem->pNext : nullptr; // Not self.
|
| + while (pItem && pItem->pNext)
|
| + pItem = pItem->pNext;
|
| +
|
| + return pItem ? pItem->pWidget : nullptr;
|
| }
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetFirstChildWidget(IFWL_Widget* pWidget) const {
|
| + CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| + return pItem && pItem->pChild ? pItem->pChild->pWidget : nullptr;
|
| +}
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetLastChildWidget(IFWL_Widget* pWidget) const {
|
| + CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| + pItem = pItem ? pItem->pChild : nullptr;
|
| + while (pItem && pItem->pNext)
|
| + pItem = pItem->pNext;
|
| +
|
| + return pItem ? pItem->pWidget : nullptr;
|
| +}
|
| +
|
| +IFWL_Widget* CFWL_WidgetMgr::GetSystemFormWidget(IFWL_Widget* pWidget) const {
|
| + CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| + while (pItem) {
|
| + if (IsAbleNative(pItem->pWidget))
|
| + return pItem->pWidget;
|
| + pItem = pItem->pParent;
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| FX_BOOL CFWL_WidgetMgr::SetWidgetIndex(IFWL_Widget* pWidget, int32_t nIndex) {
|
| CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
|
| if (!pItem)
|
| @@ -225,7 +204,7 @@ FWL_Error CFWL_WidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
|
| pOuter = pOuter->GetOuter();
|
| }
|
| } else if (!IsAbleNative(pWidget)) {
|
| - pNative = GetWidget(pWidget, FWL_WGTRELATION_SystemForm);
|
| + pNative = GetSystemFormWidget(pWidget);
|
| if (!pNative)
|
| return FWL_Error::Indefinite;
|
| pWidget->TransformTo(pNative, rect.left, rect.top);
|
| @@ -345,10 +324,9 @@ void CFWL_WidgetMgr::SetParent(IFWL_Widget* pParent, IFWL_Widget* pChild) {
|
| FX_BOOL CFWL_WidgetMgr::IsChild(IFWL_Widget* pChild, IFWL_Widget* pParent) {
|
| IFWL_Widget* pTemp = pChild;
|
| do {
|
| - if (pTemp == pParent) {
|
| + if (pTemp == pParent)
|
| return TRUE;
|
| - }
|
| - pTemp = GetWidget(pTemp, FWL_WGTRELATION_Parent);
|
| + pTemp = GetParentWidget(pTemp);
|
| } while (pTemp);
|
| return FALSE;
|
| }
|
| @@ -382,7 +360,7 @@ IFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(IFWL_Widget* parent,
|
| return NULL;
|
| FX_FLOAT x1;
|
| FX_FLOAT y1;
|
| - IFWL_Widget* child = GetWidget(parent, FWL_WGTRELATION_LastChild);
|
| + IFWL_Widget* child = GetLastChildWidget(parent);
|
| while (child) {
|
| if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) {
|
| x1 = x;
|
| @@ -401,7 +379,7 @@ IFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(IFWL_Widget* parent,
|
| return GetWidgetAtPoint(child, x1, y1);
|
| }
|
| }
|
| - child = GetWidget(child, FWL_WGTRELATION_PriorSibling);
|
| + child = GetPriorSiblingWidget(child);
|
| }
|
| return parent;
|
| }
|
| @@ -416,29 +394,32 @@ void CFWL_WidgetMgr::NotifySizeChanged(IFWL_Widget* pForm,
|
| IFWL_Widget* CFWL_WidgetMgr::nextTab(IFWL_Widget* parent,
|
| IFWL_Widget* focus,
|
| FX_BOOL& bFind) {
|
| - IFWL_Widget* child =
|
| - FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
|
| + CFWL_WidgetMgr* pMgr = CFWL_WidgetMgr::GetInstance();
|
| + IFWL_Widget* child = pMgr->GetFirstChildWidget(parent);
|
| while (child) {
|
| - if (focus == child) {
|
| + if (focus == child)
|
| bFind = TRUE;
|
| - }
|
| +
|
| if ((child->GetStyles() & FWL_WGTSTYLE_TabStop) &&
|
| (!focus || (focus != child && bFind))) {
|
| return child;
|
| }
|
| IFWL_Widget* bRet = nextTab(child, focus, bFind);
|
| - if (bRet) {
|
| + if (bRet)
|
| return bRet;
|
| - }
|
| - child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
|
| +
|
| + child = pMgr->GetNextSiblingWidget(child);
|
| }
|
| - return NULL;
|
| + return nullptr;
|
| }
|
| +
|
| int32_t CFWL_WidgetMgr::CountRadioButtonGroup(IFWL_Widget* pFirst) {
|
| int32_t iRet = 0;
|
| IFWL_Widget* pChild = pFirst;
|
| - while (pChild)
|
| - pChild = GetWidget(pChild, FWL_WGTRELATION_NextSibling);
|
| + while (pChild) {
|
| + pChild = GetNextSiblingWidget(pChild);
|
| + ++iRet;
|
| + }
|
| return iRet;
|
| }
|
| IFWL_Widget* CFWL_WidgetMgr::GetSiblingRadioButton(IFWL_Widget* pWidget,
|
| @@ -453,19 +434,19 @@ IFWL_Widget* CFWL_WidgetMgr::GetRadioButtonGroupHeader(
|
| return pNext;
|
| pNext = GetSiblingRadioButton(pNext, FALSE);
|
| }
|
| - pNext = GetWidget(pRadioButton, FWL_WGTRELATION_LastSibling);
|
| + pNext = GetLastSiblingWidget(pRadioButton);
|
| while ((pNext = GetSiblingRadioButton(pNext, FALSE)) != nullptr &&
|
| pNext != pRadioButton) {
|
| if (pNext->GetStyles() & FWL_WGTSTYLE_Group)
|
| return pNext;
|
| }
|
| - pNext = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
|
| + pNext = GetFirstSiblingWidget(pRadioButton);
|
| return GetSiblingRadioButton(pNext, TRUE);
|
| }
|
| void CFWL_WidgetMgr::GetSameGroupRadioButton(
|
| IFWL_Widget* pRadioButton,
|
| CFX_ArrayTemplate<IFWL_Widget*>& group) {
|
| - IFWL_Widget* pFirst = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
|
| + IFWL_Widget* pFirst = GetFirstSiblingWidget(pRadioButton);
|
| if (!pFirst) {
|
| pFirst = pRadioButton;
|
| }
|
| @@ -491,7 +472,7 @@ IFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(IFWL_Widget* pParent) {
|
| return pParent;
|
| }
|
| IFWL_Widget* child =
|
| - FWL_GetWidgetMgr()->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
|
| + CFWL_WidgetMgr::GetInstance()->GetFirstChildWidget(pParent);
|
| while (child) {
|
| if ((child->GetClassID() == FWL_Type::PushButton) &&
|
| (child->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
|
| @@ -501,7 +482,7 @@ IFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(IFWL_Widget* pParent) {
|
| if (find) {
|
| return find;
|
| }
|
| - child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
|
| + child = CFWL_WidgetMgr::GetInstance()->GetNextSiblingWidget(child);
|
| }
|
| return NULL;
|
| }
|
| @@ -550,7 +531,8 @@ int32_t CFWL_WidgetMgr::TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
|
| }
|
| return iCount - 1;
|
| }
|
| -FX_BOOL CFWL_WidgetMgr::IsAbleNative(IFWL_Widget* pWidget) {
|
| +
|
| +FX_BOOL CFWL_WidgetMgr::IsAbleNative(IFWL_Widget* pWidget) const {
|
| if (!pWidget)
|
| return FALSE;
|
| if (!pWidget->IsInstance(FX_WSTRC(FWL_CLASS_Form))) {
|
| @@ -677,11 +659,10 @@ void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
|
| return;
|
|
|
| FX_BOOL bFormDisable = m_pWidgetMgr->IsFormDisabled();
|
| - IFWL_Widget* pNextChild =
|
| - m_pWidgetMgr->GetWidget(parent, FWL_WGTRELATION_FirstChild);
|
| + IFWL_Widget* pNextChild = m_pWidgetMgr->GetFirstChildWidget(parent);
|
| while (pNextChild) {
|
| IFWL_Widget* child = pNextChild;
|
| - pNextChild = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
|
| + pNextChild = m_pWidgetMgr->GetNextSiblingWidget(child);
|
| if (child->GetStates() & FWL_WGTSTATE_Invisible)
|
| continue;
|
|
|
| @@ -719,7 +700,7 @@ void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
|
|
|
| DrawChild(child, clipBounds, pGraphics,
|
| bFormDisable ? &widgetMatrix : pMatrix);
|
| - child = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
|
| + child = m_pWidgetMgr->GetNextSiblingWidget(child);
|
| }
|
| }
|
|
|
| @@ -776,7 +757,7 @@ FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
|
| return FALSE;
|
|
|
| IFWL_Widget* pChild =
|
| - FWL_GetWidgetMgr()->GetWidget(pWidget, FWL_WGTRELATION_FirstChild);
|
| + CFWL_WidgetMgr::GetInstance()->GetFirstChildWidget(pWidget);
|
| if (!pChild)
|
| return TRUE;
|
|
|
| @@ -835,8 +816,8 @@ FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
|
| if (r.Contains(hitPoint[i].hitPoint))
|
| hitPoint[i].bNotNeedRepaint = true;
|
| }
|
| - } while ((pChild = FWL_GetWidgetMgr()->GetWidget(
|
| - pChild, FWL_WGTRELATION_NextSibling)) != NULL);
|
| + } while (
|
| + (pChild = CFWL_WidgetMgr::GetInstance()->GetNextSiblingWidget(pChild)));
|
|
|
| if (!bChildIntersectWithDirty)
|
| return TRUE;
|
|
|