FX_BOOL CXFA_FFDocView::SetFocus(IXFA_Widget* hWidget) { CXFA_FFWidget* pNewFocus = (CXFA_FFWidget*)hWidget; if (m_pOldFocusWidget == pNewFocus) { return FALSE; } CXFA_FFWidget* pOldFocus = m_pOldFocusWidget; m_pOldFocusWidget = pNewFocus; if (pOldFocus) { if (m_pFocusWidget != m_pOldFocusWidget && (pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Focused)) { m_pFocusWidget = pOldFocus; pOldFocus->OnKillFocus(pNewFocus); } else if ((pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { if (!pOldFocus->IsLoaded()) { pOldFocus->LoadWidget(); } pOldFocus->OnSetFocus(m_pFocusWidget); m_pFocusWidget = pOldFocus; pOldFocus->OnKillFocus(pNewFocus); } } if (m_pFocusWidget == m_pOldFocusWidget) { return FALSE; } pNewFocus = m_pOldFocusWidget; if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) { m_pFocusAcc = NULL; m_pFocusWidget = NULL; m_pListFocusWidget = NULL; m_pOldFocusWidget = NULL; return FALSE; } if (pNewFocus && (pNewFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { if (!pNewFocus->IsLoaded()) { pNewFocus->LoadWidget(); } pNewFocus->OnSetFocus(m_pFocusWidget); } m_pFocusAcc = pNewFocus ? pNewFocus->GetDataAcc() : NULL; m_pFocusWidget = pNewFocus; m_pOldFocusWidget = m_pFocusWidget; return TRUE; }
void CXFA_FFNotify::OnLayoutItemAdded(CXFA_LayoutProcessor* pLayout, CXFA_LayoutItem* pSender, int32_t iPageIdx, uint32_t dwStatus) { CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout); if (!pDocView) return; CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pSender); if (!pWidget) return; CXFA_FFPageView* pNewPageView = pDocView->GetPageView(iPageIdx); uint32_t dwFilter = XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable | XFA_WidgetStatus_Printable; pWidget->ModifyStatus(dwStatus, dwFilter); CXFA_FFPageView* pPrePageView = pWidget->GetPageView(); if (pPrePageView != pNewPageView || (dwStatus & (XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable)) == (XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable)) { pWidget->SetPageView(pNewPageView); m_pDoc->GetDocProvider()->WidgetPostAdd(pWidget, pWidget->GetDataAcc()); } if (pDocView->GetLayoutStatus() != XFA_DOCVIEW_LAYOUTSTATUS_End || !(dwStatus & XFA_WidgetStatus_Visible)) { return; } if (pWidget->IsLoaded()) { CFX_RectF rtOld; pWidget->GetWidgetRect(rtOld); if (rtOld != pWidget->ReCacheWidgetRect()) pWidget->PerformLayout(); } else { pWidget->LoadWidget(); } pWidget->AddInvalidateRect(nullptr); }