diff options
author | Bo Xu <bo_xu@foxitsoftware.com> | 2014-10-28 23:03:33 -0700 |
---|---|---|
committer | Bo Xu <bo_xu@foxitsoftware.com> | 2014-11-03 11:10:11 -0800 |
commit | fdc00a7042d912aafaabddae4d9c84199921ef23 (patch) | |
tree | 32ab8ac91cc68d2cd15b9168782a71b3f3f5e7b9 /fpdfsdk/src/fsdk_annothandler.cpp | |
parent | e9b38fa38de2c95d8260be31c57d9272c4d127ed (diff) | |
download | pdfium-fdc00a7042d912aafaabddae4d9c84199921ef23.tar.xz |
Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
Diffstat (limited to 'fpdfsdk/src/fsdk_annothandler.cpp')
-rw-r--r-- | fpdfsdk/src/fsdk_annothandler.cpp | 494 |
1 files changed, 483 insertions, 11 deletions
diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp index 9f208d34e2..fff038b809 100644 --- a/fpdfsdk/src/fsdk_annothandler.cpp +++ b/fpdfsdk/src/fsdk_annothandler.cpp @@ -5,6 +5,8 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "../include/fsdk_define.h" +#include "../include/fpdfxfa/fpdfxfa_doc.h" +#include "../include/fpdfxfa/fpdfxfa_util.h" #include "../include/fsdk_mgr.h" #include "../include/formfiller/FFL_FormFiller.h" #include "../include/fsdk_annothandler.h" @@ -17,6 +19,9 @@ CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp) CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp); pHandler->SetFormFiller(m_pApp->GetIFormFiller()); RegisterAnnotHandler(pHandler); + + CPDFSDK_XFAAnnotHandler* pXFAAnnotHandler = new CPDFSDK_XFAAnnotHandler(m_pApp); + RegisterAnnotHandler(pXFAAnnotHandler); } CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() @@ -66,7 +71,20 @@ CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_Pa return pAnnotHandler->NewAnnot(pAnnot, pPageView); } - return new CPDFSDK_Annot(pAnnot, pPageView); + return new CPDFSDK_BAAnnot(pAnnot, pPageView); +} + +CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(XFA_HWIDGET pAnnot, CPDFSDK_PageView* pPageView) +{ + ASSERT(pAnnot != NULL); + ASSERT(pPageView != NULL); + + if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) + { + return pAnnotHandler->NewAnnot(pAnnot, pPageView); + } + + return NULL; } void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) @@ -119,9 +137,11 @@ IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(CPDFSDK_Annot* pA ASSERT(pAnnot != NULL); CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); - ASSERT(pPDFAnnot != NULL); - - return GetAnnotHandler(pPDFAnnot->GetSubType()); + if (pPDFAnnot) + return GetAnnotHandler(pPDFAnnot->GetSubType()); + else if (pAnnot->GetXFAWidget()) + return GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME); + return NULL; } IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(const CFX_ByteString& sType) const @@ -141,7 +161,8 @@ void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_ } else { - pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); + if (!pAnnot->IsXFAField()) + ((CPDFSDK_BAAnnot*)pAnnot)->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); } } @@ -323,6 +344,20 @@ FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_D return FALSE; } +FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus(CPDFSDK_Annot* pSetAnnot,CPDFSDK_Annot* pKillAnnot) +{ + FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) || + (pKillAnnot && pKillAnnot->GetXFAWidget()); + + if (bXFA) + { + if (IPDFSDK_AnnotHandler* pXFAAnnotHandler = GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) + return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot); + } + + return TRUE; +} + CPDF_Rect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) { ASSERT(pAnnot); @@ -346,13 +381,30 @@ FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView *pPageView, CP CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext) { - CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", ""); - - CPDFSDK_Annot* pNext = bNext ? - ai.GetNextAnnot(pSDKAnnot) : + CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); + CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage(); + if (pPage == NULL) + return NULL; + if (pPage->GetPDFPage()) { // for pdf annots. + CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), pSDKAnnot->GetType(), ""); + CPDFSDK_Annot* pNext = bNext ? + ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); - return pNext; + } + // for xfa annots + IXFA_WidgetIterator* pWidgetIterator = pPage->GetXFAPageView()->CreateWidgetIterator(XFA_TRAVERSEWAY_Tranvalse, XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_Viewable | XFA_WIDGETFILTER_Field); + if (pWidgetIterator == NULL) + return NULL; + if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget()) + pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget()); + XFA_HWIDGET hNextFocus = NULL; + hNextFocus = bNext?pWidgetIterator->MoveToNext():pWidgetIterator->MoveToPrevious(); + if (hNextFocus == NULL && pSDKAnnot != NULL) + hNextFocus = pWidgetIterator->MoveToFirst(); + + pWidgetIterator->Release(); + return pPageView->GetAnnotByXFAWidget(hNextFocus); } FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) @@ -414,6 +466,11 @@ CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_Pag return pWidget; } +CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(XFA_HWIDGET hWidget, CPDFSDK_PageView* pPage) +{ + return NULL; +} + void CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { ASSERT(pAnnot != NULL); @@ -440,7 +497,7 @@ void CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* if (sSubType == BFFT_SIGNATURE) { - pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); + ((CPDFSDK_BAAnnot*)pAnnot)->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); } else { @@ -660,6 +717,15 @@ void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) { ASSERT(pAnnot != NULL); + CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); + ASSERT(pPageView != NULL); + + CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); + ASSERT(pSDKDoc != NULL); + + CPDFXFA_Document* pDoc = pSDKDoc->GetDocument(); + ASSERT(pDoc != NULL); + CFX_ByteString sSubType = pAnnot->GetSubType(); if (sSubType == BFFT_SIGNATURE) @@ -685,6 +751,12 @@ void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) } } + if (pDoc->GetDocType() == DOCTYPE_STATIC_XFA) + { + if (!pWidget->IsAppearanceValid() && !pWidget->GetValue().IsEmpty()) + pWidget->ResetAppearance(FALSE); + } + if (m_pFormFiller) m_pFormFiller->OnLoad(pAnnot); @@ -752,6 +824,406 @@ FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Ann return rect.Contains(point.x, point.y); } +//CPDFSDK_XFAAnnotHandler + +#define FWL_WGTHITTEST_Unknown 0 +#define FWL_WGTHITTEST_Client 1 //arrow +#define FWL_WGTHITTEST_Titlebar 11 //caption +#define FWL_WGTHITTEST_HScrollBar 15 +#define FWL_WGTHITTEST_VScrollBar 16 +#define FWL_WGTHITTEST_Border 17 +#define FWL_WGTHITTEST_Edit 19 +#define FWL_WGTHITTEST_HyperLink 20 + +CPDFSDK_XFAAnnotHandler::CPDFSDK_XFAAnnotHandler(CPDFDoc_Environment* pApp) : + m_pApp(pApp) +{ + +} + +CPDFSDK_Annot* CPDFSDK_XFAAnnotHandler::NewAnnot(XFA_HWIDGET pAnnot, CPDFSDK_PageView* pPage) +{ + ASSERT(pPage != NULL); + ASSERT(pAnnot != NULL); + + CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc(); + ASSERT(pSDKDoc); + CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm(); + ASSERT(pInterForm != NULL); + + CPDFSDK_XFAWidget* pWidget = NULL; + pWidget = new CPDFSDK_XFAWidget(pAnnot, pPage, pInterForm); + ASSERT(pWidget != NULL); + pInterForm->AddXFAMap(pAnnot, pWidget); + + return pWidget; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) +{ + ASSERT(pAnnot != NULL); + + return pAnnot->GetXFAWidget() != NULL; +} + +void CPDFSDK_XFAAnnotHandler::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, FX_DWORD dwFlags) +{ + ASSERT(pPageView != NULL); + ASSERT(pAnnot != NULL); + + CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); + ASSERT(pSDKDoc != NULL); + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + CFX_Graphics gs; + gs.Create(pDevice); + + CFX_Matrix mt; + mt = *(CFX_Matrix*)pUser2Device; + + XFA_HWIDGET hWidget = pAnnot->GetXFAWidget(); + ASSERT(hWidget != NULL); + + FX_BOOL bIsHighlight = FALSE; + if (pSDKDoc->GetFocusAnnot() != pAnnot) + bIsHighlight = TRUE; + + pWidgetHandler->RenderWidget(pAnnot->GetXFAWidget(), &gs, &mt, bIsHighlight); + + // to do highlight and shadow + +} + +void CPDFSDK_XFAAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) +{ + ASSERT(pAnnot != NULL); + + CPDFSDK_XFAWidget* pWidget = (CPDFSDK_XFAWidget*)pAnnot; + CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); + ASSERT(pInterForm != NULL); + + pInterForm->RemoveXFAMap(pWidget->GetXFAWidget()); + + delete pWidget; +} + +CPDF_Rect CPDFSDK_XFAAnnotHandler::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) +{ + ASSERT(pAnnot != NULL); + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + XFA_ELEMENT eType = pWidgetHandler->GetDataAcc(pAnnot->GetXFAWidget())->GetUIType(); + CFX_RectF rcBBox; + if (eType == XFA_ELEMENT_Signature) + pWidgetHandler->GetBBox (pAnnot->GetXFAWidget(), rcBBox, XFA_WIDGETSTATUS_Visible, TRUE); + else + pWidgetHandler->GetBBox (pAnnot->GetXFAWidget(), rcBBox, 0); + + CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, rcBBox.top+rcBBox.height); + rcWidget.left -= 1.0f; + rcWidget.right += 1.0f; + rcWidget.bottom -= 1.0f; + rcWidget.top += 1.0f; + + return rcWidget; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); + if (!pSDKDoc) + return FALSE; + + CPDFXFA_Document* pDoc = pSDKDoc->GetDocument(); + if (!pDoc) + return FALSE; + + IXFA_DocView* pDocView = pDoc->GetXFADocView(); + if (!pDocView) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); + if (!pWidgetHandler) + return FALSE; + + FX_DWORD dwHitTest = pWidgetHandler->OnHitTest(pAnnot->GetXFAWidget(), point.x, point.y); + return (dwHitTest != FWL_WGTHITTEST_Unknown); +} + +void CPDFSDK_XFAAnnotHandler::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) +{ + if (!pPageView || !pAnnot) + return; + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + pWidgetHandler->OnMouseEnter(pAnnot->GetXFAWidget()); +} + +void CPDFSDK_XFAAnnotHandler::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) +{ + if (!pPageView || !pAnnot) + return; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + pWidgetHandler->OnMouseExit(pAnnot->GetXFAWidget()); +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnLButtonDown(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnLButtonUp(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnLButtonDblClk(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnMouseMove(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnMouseWheel(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), zDelta, point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnRButtonDown(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnRButtonUp(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) +{ + if (!pPageView || !pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnRButtonDblClk(pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), point.x, point.y); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags) +{ + if (!pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnChar(pAnnot->GetXFAWidget(), nChar, GetFWLFlags(nFlags)); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) +{ + if (!pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnKeyDown(pAnnot->GetXFAWidget(), nKeyCode, GetFWLFlags(nFlag)); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) +{ + if (!pAnnot) + return FALSE; + + IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); + ASSERT(pWidgetHandler != NULL); + + FX_BOOL bRet = FALSE; + bRet = pWidgetHandler->OnKeyUp(pAnnot->GetXFAWidget(), nKeyCode, GetFWLFlags(nFlag)); + + return bRet; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) +{ + return TRUE; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) +{ + return TRUE; +} + +FX_BOOL CPDFSDK_XFAAnnotHandler::OnXFAChangedFocus(CPDFSDK_Annot* pOldAnnot, CPDFSDK_Annot* pNewAnnot) +{ + IXFA_WidgetHandler* pWidgetHandler = NULL; + + if (pOldAnnot) + pWidgetHandler = GetXFAWidgetHandler(pOldAnnot); + else if (pNewAnnot) + pWidgetHandler = GetXFAWidgetHandler(pNewAnnot); + + if (pWidgetHandler) + { + FX_BOOL bRet = TRUE; /*pWidgetHandler->OnFocusChange(pNewAnnot ? pNewAnnot->GetXFAWidget() : NULL, + pOldAnnot ? pOldAnnot->GetXFAWidget() : NULL); */ + + XFA_HWIDGET hWidget = pNewAnnot ? pNewAnnot->GetXFAWidget() : NULL; + if (hWidget) + { + IXFA_PageView* pXFAPageView = pWidgetHandler->GetPageView(hWidget); + if (pXFAPageView) + { + bRet = pXFAPageView->GetDocView()->SetFocus(hWidget); + if (pXFAPageView->GetDocView()->GetFocusWidget() == hWidget) + bRet = TRUE; + } + } + return bRet; + } + + return TRUE; +} + +IXFA_WidgetHandler* CPDFSDK_XFAAnnotHandler::GetXFAWidgetHandler(CPDFSDK_Annot* pAnnot) +{ + if (!pAnnot) + return NULL; + + CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); + if (!pPageView) + return NULL; + + CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); + if (!pSDKDoc) + return NULL; + + CPDFXFA_Document* pDoc = pSDKDoc->GetDocument(); + if (!pDoc) + return NULL; + + IXFA_DocView* pDocView = pDoc->GetXFADocView(); + if (!pDocView) + return NULL; + + return pDocView->GetWidgetHandler(); +} + +#define FWL_KEYFLAG_Ctrl (1 << 0) +#define FWL_KEYFLAG_Alt (1 << 1) +#define FWL_KEYFLAG_Shift (1 << 2) +#define FWL_KEYFLAG_LButton (1 << 3) +#define FWL_KEYFLAG_RButton (1 << 4) +#define FWL_KEYFLAG_MButton (1 << 5) + +FX_DWORD CPDFSDK_XFAAnnotHandler::GetFWLFlags(FX_DWORD dwFlag) +{ + FX_DWORD dwFWLFlag = 0; + + if (dwFlag & FWL_EVENTFLAG_ControlKey) + dwFWLFlag |= FWL_KEYFLAG_Ctrl; + if (dwFlag & FWL_EVENTFLAG_LeftButtonDown) + dwFWLFlag |= FWL_KEYFLAG_LButton; + if (dwFlag & FWL_EVENTFLAG_MiddleButtonDown) + dwFWLFlag |= FWL_KEYFLAG_MButton; + if (dwFlag & FWL_EVENTFLAG_RightButtonDown) + dwFWLFlag |= FWL_KEYFLAG_RButton; + if (dwFlag & FWL_EVENTFLAG_ShiftKey) + dwFWLFlag |= FWL_KEYFLAG_Shift; + if (dwFlag & FWL_EVENTFLAG_AltKey) + dwFWLFlag |= FWL_KEYFLAG_Alt; + + return dwFWLFlag; +} + //CReader_AnnotIteratorEx CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse, |