Home | History | Annotate | Download | only in src
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include <algorithm>
      8 
      9 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h"
     10 #include "fpdfsdk/include/fsdk_annothandler.h"
     11 #include "fpdfsdk/include/fsdk_define.h"
     12 #include "fpdfsdk/include/fsdk_mgr.h"
     13 
     14 #ifdef PDF_ENABLE_XFA
     15 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
     16 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
     17 #endif  // PDF_ENABLE_XFA
     18 
     19 CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp) {
     20   m_pApp = pApp;
     21 
     22   CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp);
     23   pHandler->SetFormFiller(m_pApp->GetIFormFiller());
     24   RegisterAnnotHandler(pHandler);
     25 #ifdef PDF_ENABLE_XFA
     26   CPDFSDK_XFAAnnotHandler* pXFAAnnotHandler =
     27       new CPDFSDK_XFAAnnotHandler(m_pApp);
     28   RegisterAnnotHandler(pXFAAnnotHandler);
     29 #endif  // PDF_ENABLE_XFA
     30 }
     31 
     32 CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {
     33   for (int i = 0; i < m_Handlers.GetSize(); i++) {
     34     IPDFSDK_AnnotHandler* pHandler = m_Handlers.GetAt(i);
     35     delete pHandler;
     36   }
     37   m_Handlers.RemoveAll();
     38   m_mapType2Handler.clear();
     39 }
     40 
     41 void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler(
     42     IPDFSDK_AnnotHandler* pAnnotHandler) {
     43   ASSERT(!GetAnnotHandler(pAnnotHandler->GetType()));
     44 
     45   m_Handlers.Add(pAnnotHandler);
     46   m_mapType2Handler[pAnnotHandler->GetType()] = pAnnotHandler;
     47 }
     48 
     49 void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler(
     50     IPDFSDK_AnnotHandler* pAnnotHandler) {
     51   m_mapType2Handler.erase(pAnnotHandler->GetType());
     52   for (int i = 0, sz = m_Handlers.GetSize(); i < sz; i++) {
     53     if (m_Handlers.GetAt(i) == pAnnotHandler) {
     54       m_Handlers.RemoveAt(i);
     55       break;
     56     }
     57   }
     58 }
     59 
     60 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot,
     61                                                  CPDFSDK_PageView* pPageView) {
     62   ASSERT(pPageView);
     63 
     64   if (IPDFSDK_AnnotHandler* pAnnotHandler =
     65           GetAnnotHandler(pAnnot->GetSubType())) {
     66     return pAnnotHandler->NewAnnot(pAnnot, pPageView);
     67   }
     68 
     69   return new CPDFSDK_BAAnnot(pAnnot, pPageView);
     70 }
     71 
     72 #ifdef PDF_ENABLE_XFA
     73 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(IXFA_Widget* pAnnot,
     74                                                  CPDFSDK_PageView* pPageView) {
     75   ASSERT(pAnnot != NULL);
     76   ASSERT(pPageView != NULL);
     77 
     78   if (IPDFSDK_AnnotHandler* pAnnotHandler =
     79           GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) {
     80     return pAnnotHandler->NewAnnot(pAnnot, pPageView);
     81   }
     82 
     83   return NULL;
     84 }
     85 #endif  // PDF_ENABLE_XFA
     86 
     87 void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
     88   pAnnot->GetPDFPage();
     89 
     90   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
     91     pAnnotHandler->OnRelease(pAnnot);
     92     pAnnotHandler->ReleaseAnnot(pAnnot);
     93   } else {
     94     delete (CPDFSDK_Annot*)pAnnot;
     95   }
     96 }
     97 
     98 void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) {
     99   CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
    100 
    101   CPDFSDK_DateTime curTime;
    102   pPDFAnnot->GetAnnotDict()->SetAtString("M", curTime.ToPDFDateTimeString());
    103   pPDFAnnot->GetAnnotDict()->SetAtNumber("F", 0);
    104 
    105   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    106     pAnnotHandler->OnCreate(pAnnot);
    107   }
    108 }
    109 
    110 void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) {
    111   ASSERT(pAnnot);
    112 
    113   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    114     pAnnotHandler->OnLoad(pAnnot);
    115   }
    116 }
    117 
    118 IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
    119     CPDFSDK_Annot* pAnnot) const {
    120   CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
    121   if (pPDFAnnot)
    122     return GetAnnotHandler(pPDFAnnot->GetSubType());
    123 #ifdef PDF_ENABLE_XFA
    124   if (pAnnot->GetXFAWidget())
    125     return GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME);
    126 #endif  // PDF_ENABLE_XFA
    127   return nullptr;
    128 }
    129 
    130 IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
    131     const CFX_ByteString& sType) const {
    132   auto it = m_mapType2Handler.find(sType);
    133   return it != m_mapType2Handler.end() ? it->second : nullptr;
    134 }
    135 
    136 void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView,
    137                                            CPDFSDK_Annot* pAnnot,
    138                                            CFX_RenderDevice* pDevice,
    139                                            CFX_Matrix* pUser2Device,
    140                                            FX_DWORD dwFlags) {
    141   ASSERT(pAnnot);
    142 
    143   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    144     pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
    145   } else {
    146 #ifdef PDF_ENABLE_XFA
    147     if (pAnnot->IsXFAField())
    148       return;
    149 #endif  // PDF_ENABLE_XFA
    150     static_cast<CPDFSDK_BAAnnot*>(pAnnot)
    151         ->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr);
    152   }
    153 }
    154 
    155 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(
    156     CPDFSDK_PageView* pPageView,
    157     CPDFSDK_Annot* pAnnot,
    158     FX_DWORD nFlags,
    159     const CPDF_Point& point) {
    160   ASSERT(pAnnot);
    161 
    162   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    163     return pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point);
    164   }
    165   return FALSE;
    166 }
    167 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(CPDFSDK_PageView* pPageView,
    168                                                    CPDFSDK_Annot* pAnnot,
    169                                                    FX_DWORD nFlags,
    170                                                    const CPDF_Point& point) {
    171   ASSERT(pAnnot);
    172 
    173   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    174     return pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point);
    175   }
    176   return FALSE;
    177 }
    178 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(
    179     CPDFSDK_PageView* pPageView,
    180     CPDFSDK_Annot* pAnnot,
    181     FX_DWORD nFlags,
    182     const CPDF_Point& point) {
    183   ASSERT(pAnnot);
    184 
    185   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    186     return pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
    187   }
    188   return FALSE;
    189 }
    190 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(CPDFSDK_PageView* pPageView,
    191                                                    CPDFSDK_Annot* pAnnot,
    192                                                    FX_DWORD nFlags,
    193                                                    const CPDF_Point& point) {
    194   ASSERT(pAnnot);
    195 
    196   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    197     return pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point);
    198   }
    199   return FALSE;
    200 }
    201 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(CPDFSDK_PageView* pPageView,
    202                                                     CPDFSDK_Annot* pAnnot,
    203                                                     FX_DWORD nFlags,
    204                                                     short zDelta,
    205                                                     const CPDF_Point& point) {
    206   ASSERT(pAnnot);
    207 
    208   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    209     return pAnnotHandler->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta,
    210                                        point);
    211   }
    212   return FALSE;
    213 }
    214 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(
    215     CPDFSDK_PageView* pPageView,
    216     CPDFSDK_Annot* pAnnot,
    217     FX_DWORD nFlags,
    218     const CPDF_Point& point) {
    219   ASSERT(pAnnot);
    220 
    221   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    222     return pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point);
    223   }
    224   return FALSE;
    225 }
    226 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(CPDFSDK_PageView* pPageView,
    227                                                    CPDFSDK_Annot* pAnnot,
    228                                                    FX_DWORD nFlags,
    229                                                    const CPDF_Point& point) {
    230   ASSERT(pAnnot);
    231 
    232   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    233     return pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point);
    234   }
    235   return FALSE;
    236 }
    237 
    238 void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView* pPageView,
    239                                                  CPDFSDK_Annot* pAnnot,
    240                                                  FX_DWORD nFlag) {
    241   ASSERT(pAnnot);
    242 
    243   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    244     pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag);
    245   }
    246   return;
    247 }
    248 
    249 void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView* pPageView,
    250                                                 CPDFSDK_Annot* pAnnot,
    251                                                 FX_DWORD nFlag) {
    252   ASSERT(pAnnot);
    253 
    254   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    255     pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag);
    256   }
    257   return;
    258 }
    259 
    260 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot,
    261                                               FX_DWORD nChar,
    262                                               FX_DWORD nFlags) {
    263   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    264     return pAnnotHandler->OnChar(pAnnot, nChar, nFlags);
    265   }
    266   return FALSE;
    267 }
    268 
    269 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot,
    270                                                  int nKeyCode,
    271                                                  int nFlag) {
    272   if (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag)) {
    273     CPDFSDK_PageView* pPage = pAnnot->GetPageView();
    274     CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();
    275     if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) {
    276       CPDFSDK_Annot* pNext =
    277           GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag));
    278 
    279       if (pNext && pNext != pFocusAnnot) {
    280         CPDFSDK_Document* pDocument = pPage->GetSDKDocument();
    281         pDocument->SetFocusAnnot(pNext);
    282         return TRUE;
    283       }
    284     }
    285   }
    286 
    287   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    288     return pAnnotHandler->OnKeyDown(pAnnot, nKeyCode, nFlag);
    289   }
    290   return FALSE;
    291 }
    292 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot,
    293                                                int nKeyCode,
    294                                                int nFlag) {
    295   return FALSE;
    296 }
    297 
    298 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot,
    299                                                   FX_DWORD nFlag) {
    300   ASSERT(pAnnot);
    301 
    302   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    303     if (pAnnotHandler->OnSetFocus(pAnnot, nFlag)) {
    304       CPDFSDK_PageView* pPage = pAnnot->GetPageView();
    305       pPage->GetSDKDocument();
    306       return TRUE;
    307     }
    308   }
    309   return FALSE;
    310 }
    311 
    312 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot,
    313                                                    FX_DWORD nFlag) {
    314   ASSERT(pAnnot);
    315   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
    316     return pAnnotHandler->OnKillFocus(pAnnot, nFlag);
    317 
    318   return FALSE;
    319 }
    320 
    321 #ifdef PDF_ENABLE_XFA
    322 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus(
    323     CPDFSDK_Annot* pSetAnnot,
    324     CPDFSDK_Annot* pKillAnnot) {
    325   FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) ||
    326                  (pKillAnnot && pKillAnnot->GetXFAWidget());
    327 
    328   if (bXFA) {
    329     if (IPDFSDK_AnnotHandler* pXFAAnnotHandler =
    330             GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME))
    331       return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot);
    332   }
    333 
    334   return TRUE;
    335 }
    336 #endif  // PDF_ENABLE_XFA
    337 
    338 CPDF_Rect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(
    339     CPDFSDK_PageView* pPageView,
    340     CPDFSDK_Annot* pAnnot) {
    341   ASSERT(pAnnot);
    342   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
    343     return pAnnotHandler->GetViewBBox(pPageView, pAnnot);
    344 
    345   return pAnnot->GetRect();
    346 }
    347 
    348 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView,
    349                                                  CPDFSDK_Annot* pAnnot,
    350                                                  const CPDF_Point& point) {
    351   ASSERT(pAnnot);
    352   if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
    353     if (pAnnotHandler->CanAnswer(pAnnot))
    354       return pAnnotHandler->HitTest(pPageView, pAnnot, point);
    355   }
    356   return FALSE;
    357 }
    358 
    359 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,
    360                                                      FX_BOOL bNext) {
    361 #ifdef PDF_ENABLE_XFA
    362   CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView();
    363   CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage();
    364   if (pPage == NULL)
    365     return NULL;
    366   if (pPage->GetPDFPage()) {  // for pdf annots.
    367     CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), pSDKAnnot->GetType(), "");
    368     CPDFSDK_Annot* pNext =
    369         bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
    370     return pNext;
    371   }
    372   // for xfa annots
    373   IXFA_WidgetIterator* pWidgetIterator =
    374       pPage->GetXFAPageView()->CreateWidgetIterator(
    375           XFA_TRAVERSEWAY_Tranvalse, XFA_WIDGETFILTER_Visible |
    376                                          XFA_WIDGETFILTER_Viewable |
    377                                          XFA_WIDGETFILTER_Field);
    378   if (pWidgetIterator == NULL)
    379     return NULL;
    380   if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget())
    381     pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget());
    382   IXFA_Widget* hNextFocus = NULL;
    383   hNextFocus =
    384       bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious();
    385   if (hNextFocus == NULL && pSDKAnnot != NULL)
    386     hNextFocus = pWidgetIterator->MoveToFirst();
    387 
    388   pWidgetIterator->Release();
    389   return pPageView->GetAnnotByXFAWidget(hNextFocus);
    390 #else   // PDF_ENABLE_XFA
    391   CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", "");
    392   return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
    393 #endif  // PDF_ENABLE_XFA
    394 }
    395 
    396 FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) {
    397   ASSERT(pAnnot->GetType() == "Widget");
    398   if (pAnnot->GetSubType() == BFFT_SIGNATURE)
    399     return FALSE;
    400 
    401   CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    402   if (!pWidget->IsVisible())
    403     return FALSE;
    404 
    405   int nFieldFlags = pWidget->GetFieldFlags();
    406   if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY)
    407     return FALSE;
    408 
    409   if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
    410     return TRUE;
    411 
    412   CPDF_Page* pPage = pWidget->GetPDFPage();
    413   CPDF_Document* pDocument = pPage->m_pDocument;
    414   FX_DWORD dwPermissions = pDocument->GetUserPermissions();
    415   return (dwPermissions & FPDFPERM_FILL_FORM) ||
    416          (dwPermissions & FPDFPERM_ANNOT_FORM);
    417 }
    418 
    419 CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot,
    420                                                 CPDFSDK_PageView* pPage) {
    421   CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument();
    422   CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm();
    423   CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl(
    424       pInterForm->GetInterForm(), pAnnot->GetAnnotDict());
    425   if (!pCtrl)
    426     return nullptr;
    427 
    428   CPDFSDK_Widget* pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm);
    429   pInterForm->AddMap(pCtrl, pWidget);
    430   CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
    431   if (pPDFInterForm && pPDFInterForm->NeedConstructAP())
    432     pWidget->ResetAppearance(nullptr, FALSE);
    433 
    434   return pWidget;
    435 }
    436 
    437 #ifdef PDF_ENABLE_XFA
    438 CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(IXFA_Widget* hWidget,
    439                                                 CPDFSDK_PageView* pPage) {
    440   return NULL;
    441 }
    442 #endif  // PDF_ENABLE_XFA
    443 
    444 void CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
    445   ASSERT(pAnnot);
    446 
    447   if (m_pFormFiller)
    448     m_pFormFiller->OnDelete(pAnnot);
    449 
    450   CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    451   CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
    452   CPDF_FormControl* pCtrol = pWidget->GetFormControl();
    453   pInterForm->RemoveMap(pCtrol);
    454 
    455   delete pWidget;
    456 }
    457 
    458 void CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView,
    459                                     CPDFSDK_Annot* pAnnot,
    460                                     CFX_RenderDevice* pDevice,
    461                                     CFX_Matrix* pUser2Device,
    462                                     FX_DWORD dwFlags) {
    463   CFX_ByteString sSubType = pAnnot->GetSubType();
    464 
    465   if (sSubType == BFFT_SIGNATURE) {
    466     static_cast<CPDFSDK_BAAnnot*>(pAnnot)
    467         ->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr);
    468   } else {
    469     if (m_pFormFiller) {
    470       m_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
    471     }
    472   }
    473 }
    474 
    475 void CPDFSDK_BFAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView,
    476                                           CPDFSDK_Annot* pAnnot,
    477                                           FX_DWORD nFlag) {
    478   CFX_ByteString sSubType = pAnnot->GetSubType();
    479 
    480   if (sSubType == BFFT_SIGNATURE) {
    481   } else {
    482     if (m_pFormFiller)
    483       m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag);
    484   }
    485 }
    486 void CPDFSDK_BFAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView,
    487                                          CPDFSDK_Annot* pAnnot,
    488                                          FX_DWORD nFlag) {
    489   CFX_ByteString sSubType = pAnnot->GetSubType();
    490 
    491   if (sSubType == BFFT_SIGNATURE) {
    492   } else {
    493     if (m_pFormFiller)
    494       m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag);
    495   }
    496 }
    497 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView,
    498                                               CPDFSDK_Annot* pAnnot,
    499                                               FX_DWORD nFlags,
    500                                               const CPDF_Point& point) {
    501   CFX_ByteString sSubType = pAnnot->GetSubType();
    502 
    503   if (sSubType == BFFT_SIGNATURE) {
    504   } else {
    505     if (m_pFormFiller)
    506       return m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
    507   }
    508 
    509   return FALSE;
    510 }
    511 
    512 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView,
    513                                             CPDFSDK_Annot* pAnnot,
    514                                             FX_DWORD nFlags,
    515                                             const CPDF_Point& point) {
    516   CFX_ByteString sSubType = pAnnot->GetSubType();
    517 
    518   if (sSubType == BFFT_SIGNATURE) {
    519   } else {
    520     if (m_pFormFiller)
    521       return m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
    522   }
    523 
    524   return FALSE;
    525 }
    526 
    527 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
    528                                                 CPDFSDK_Annot* pAnnot,
    529                                                 FX_DWORD nFlags,
    530                                                 const CPDF_Point& point) {
    531   CFX_ByteString sSubType = pAnnot->GetSubType();
    532 
    533   if (sSubType == BFFT_SIGNATURE) {
    534   } else {
    535     if (m_pFormFiller)
    536       return m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
    537   }
    538 
    539   return FALSE;
    540 }
    541 
    542 FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView,
    543                                             CPDFSDK_Annot* pAnnot,
    544                                             FX_DWORD nFlags,
    545                                             const CPDF_Point& point) {
    546   CFX_ByteString sSubType = pAnnot->GetSubType();
    547 
    548   if (sSubType == BFFT_SIGNATURE) {
    549   } else {
    550     if (m_pFormFiller)
    551       return m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
    552   }
    553 
    554   return FALSE;
    555 }
    556 
    557 FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView,
    558                                              CPDFSDK_Annot* pAnnot,
    559                                              FX_DWORD nFlags,
    560                                              short zDelta,
    561                                              const CPDF_Point& point) {
    562   CFX_ByteString sSubType = pAnnot->GetSubType();
    563 
    564   if (sSubType == BFFT_SIGNATURE) {
    565   } else {
    566     if (m_pFormFiller)
    567       return m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta,
    568                                          point);
    569   }
    570 
    571   return FALSE;
    572 }
    573 
    574 FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView,
    575                                               CPDFSDK_Annot* pAnnot,
    576                                               FX_DWORD nFlags,
    577                                               const CPDF_Point& point) {
    578   CFX_ByteString sSubType = pAnnot->GetSubType();
    579 
    580   if (sSubType == BFFT_SIGNATURE) {
    581   } else {
    582     if (m_pFormFiller)
    583       return m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
    584   }
    585 
    586   return FALSE;
    587 }
    588 FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView,
    589                                             CPDFSDK_Annot* pAnnot,
    590                                             FX_DWORD nFlags,
    591                                             const CPDF_Point& point) {
    592   CFX_ByteString sSubType = pAnnot->GetSubType();
    593 
    594   if (sSubType == BFFT_SIGNATURE) {
    595   } else {
    596     if (m_pFormFiller)
    597       return m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
    598   }
    599 
    600   return FALSE;
    601 }
    602 
    603 FX_BOOL CPDFSDK_BFAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot,
    604                                        FX_DWORD nChar,
    605                                        FX_DWORD nFlags) {
    606   CFX_ByteString sSubType = pAnnot->GetSubType();
    607 
    608   if (sSubType == BFFT_SIGNATURE) {
    609   } else {
    610     if (m_pFormFiller)
    611       return m_pFormFiller->OnChar(pAnnot, nChar, nFlags);
    612   }
    613 
    614   return FALSE;
    615 }
    616 
    617 FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot,
    618                                           int nKeyCode,
    619                                           int nFlag) {
    620   CFX_ByteString sSubType = pAnnot->GetSubType();
    621 
    622   if (sSubType == BFFT_SIGNATURE) {
    623   } else {
    624     if (m_pFormFiller)
    625       return m_pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlag);
    626   }
    627 
    628   return FALSE;
    629 }
    630 
    631 FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot,
    632                                         int nKeyCode,
    633                                         int nFlag) {
    634   return FALSE;
    635 }
    636 void CPDFSDK_BFAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot) {
    637   CFX_ByteString sSubType = pAnnot->GetSubType();
    638 
    639   if (sSubType == BFFT_SIGNATURE) {
    640   } else {
    641     if (m_pFormFiller)
    642       m_pFormFiller->OnCreate(pAnnot);
    643   }
    644 }
    645 
    646 void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) {
    647   if (pAnnot->GetSubType() == BFFT_SIGNATURE)
    648     return;
    649 
    650   CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    651   if (!pWidget->IsAppearanceValid())
    652     pWidget->ResetAppearance(NULL, FALSE);
    653 
    654   int nFieldType = pWidget->GetFieldType();
    655   if (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX) {
    656     FX_BOOL bFormated = FALSE;
    657     CFX_WideString sValue = pWidget->OnFormat(bFormated);
    658     if (bFormated && nFieldType == FIELDTYPE_COMBOBOX) {
    659       pWidget->ResetAppearance(sValue.c_str(), FALSE);
    660     }
    661   }
    662 
    663 #ifdef PDF_ENABLE_XFA
    664   CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
    665   CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument();
    666   CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument();
    667   if (pDoc->GetDocType() == DOCTYPE_STATIC_XFA) {
    668     if (!pWidget->IsAppearanceValid() && !pWidget->GetValue().IsEmpty())
    669       pWidget->ResetAppearance(FALSE);
    670   }
    671 #endif  // PDF_ENABLE_XFA
    672   if (m_pFormFiller)
    673     m_pFormFiller->OnLoad(pAnnot);
    674 }
    675 
    676 FX_BOOL CPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot,
    677                                            FX_DWORD nFlag) {
    678   CFX_ByteString sSubType = pAnnot->GetSubType();
    679 
    680   if (sSubType == BFFT_SIGNATURE) {
    681   } else {
    682     if (m_pFormFiller)
    683       return m_pFormFiller->OnSetFocus(pAnnot, nFlag);
    684   }
    685 
    686   return TRUE;
    687 }
    688 FX_BOOL CPDFSDK_BFAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot,
    689                                             FX_DWORD nFlag) {
    690   CFX_ByteString sSubType = pAnnot->GetSubType();
    691 
    692   if (sSubType == BFFT_SIGNATURE) {
    693   } else {
    694     if (m_pFormFiller)
    695       return m_pFormFiller->OnKillFocus(pAnnot, nFlag);
    696   }
    697 
    698   return TRUE;
    699 }
    700 
    701 CPDF_Rect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView,
    702                                               CPDFSDK_Annot* pAnnot) {
    703   CFX_ByteString sSubType = pAnnot->GetSubType();
    704 
    705   if (sSubType == BFFT_SIGNATURE) {
    706   } else {
    707     if (m_pFormFiller)
    708       return m_pFormFiller->GetViewBBox(pPageView, pAnnot);
    709   }
    710 
    711   return CPDF_Rect(0, 0, 0, 0);
    712 }
    713 
    714 FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView* pPageView,
    715                                         CPDFSDK_Annot* pAnnot,
    716                                         const CPDF_Point& point) {
    717   ASSERT(pPageView);
    718   ASSERT(pAnnot);
    719 
    720   CPDF_Rect rect = GetViewBBox(pPageView, pAnnot);
    721   return rect.Contains(point.x, point.y);
    722 }
    723 
    724 #ifdef PDF_ENABLE_XFA
    725 #define FWL_WGTHITTEST_Unknown 0
    726 #define FWL_WGTHITTEST_Client 1     // arrow
    727 #define FWL_WGTHITTEST_Titlebar 11  // caption
    728 #define FWL_WGTHITTEST_HScrollBar 15
    729 #define FWL_WGTHITTEST_VScrollBar 16
    730 #define FWL_WGTHITTEST_Border 17
    731 #define FWL_WGTHITTEST_Edit 19
    732 #define FWL_WGTHITTEST_HyperLink 20
    733 
    734 CPDFSDK_XFAAnnotHandler::CPDFSDK_XFAAnnotHandler(CPDFDoc_Environment* pApp)
    735     : m_pApp(pApp) {}
    736 
    737 CPDFSDK_Annot* CPDFSDK_XFAAnnotHandler::NewAnnot(IXFA_Widget* pAnnot,
    738                                                  CPDFSDK_PageView* pPage) {
    739   CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument();
    740   CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm();
    741   CPDFSDK_XFAWidget* pWidget = new CPDFSDK_XFAWidget(pAnnot, pPage, pInterForm);
    742   pInterForm->AddXFAMap(pAnnot, pWidget);
    743   return pWidget;
    744 }
    745 
    746 FX_BOOL CPDFSDK_XFAAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) {
    747   return pAnnot->GetXFAWidget() != NULL;
    748 }
    749 
    750 void CPDFSDK_XFAAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView,
    751                                      CPDFSDK_Annot* pAnnot,
    752                                      CFX_RenderDevice* pDevice,
    753                                      CFX_Matrix* pUser2Device,
    754                                      FX_DWORD dwFlags) {
    755   ASSERT(pPageView != NULL);
    756   ASSERT(pAnnot != NULL);
    757 
    758   CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument();
    759   ASSERT(pSDKDoc != NULL);
    760 
    761   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    762   ASSERT(pWidgetHandler != NULL);
    763 
    764   CFX_Graphics gs;
    765   gs.Create(pDevice);
    766 
    767   CFX_Matrix mt;
    768   mt = *(CFX_Matrix*)pUser2Device;
    769 
    770   FX_BOOL bIsHighlight = FALSE;
    771   if (pSDKDoc->GetFocusAnnot() != pAnnot)
    772     bIsHighlight = TRUE;
    773 
    774   pWidgetHandler->RenderWidget(pAnnot->GetXFAWidget(), &gs, &mt, bIsHighlight);
    775 
    776   // to do highlight and shadow
    777 }
    778 
    779 void CPDFSDK_XFAAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
    780   ASSERT(pAnnot != NULL);
    781 
    782   CPDFSDK_XFAWidget* pWidget = (CPDFSDK_XFAWidget*)pAnnot;
    783   CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
    784   ASSERT(pInterForm != NULL);
    785 
    786   pInterForm->RemoveXFAMap(pWidget->GetXFAWidget());
    787 
    788   delete pWidget;
    789 }
    790 
    791 CPDF_Rect CPDFSDK_XFAAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView,
    792                                                CPDFSDK_Annot* pAnnot) {
    793   ASSERT(pAnnot != NULL);
    794 
    795   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    796   ASSERT(pWidgetHandler != NULL);
    797 
    798   CFX_RectF rcBBox;
    799   XFA_ELEMENT eType =
    800       pWidgetHandler->GetDataAcc(pAnnot->GetXFAWidget())->GetUIType();
    801   if (eType == XFA_ELEMENT_Signature)
    802     pWidgetHandler->GetBBox(pAnnot->GetXFAWidget(), rcBBox,
    803                             XFA_WIDGETSTATUS_Visible, TRUE);
    804   else
    805     pWidgetHandler->GetBBox(pAnnot->GetXFAWidget(), rcBBox, 0);
    806 
    807   CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width,
    808                          rcBBox.top + rcBBox.height);
    809   rcWidget.left -= 1.0f;
    810   rcWidget.right += 1.0f;
    811   rcWidget.bottom -= 1.0f;
    812   rcWidget.top += 1.0f;
    813 
    814   return rcWidget;
    815 }
    816 
    817 FX_BOOL CPDFSDK_XFAAnnotHandler::HitTest(CPDFSDK_PageView* pPageView,
    818                                          CPDFSDK_Annot* pAnnot,
    819                                          const CPDF_Point& point) {
    820   if (!pPageView || !pAnnot)
    821     return FALSE;
    822 
    823   CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument();
    824   if (!pSDKDoc)
    825     return FALSE;
    826 
    827   CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument();
    828   if (!pDoc)
    829     return FALSE;
    830 
    831   IXFA_DocView* pDocView = pDoc->GetXFADocView();
    832   if (!pDocView)
    833     return FALSE;
    834 
    835   IXFA_WidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler();
    836   if (!pWidgetHandler)
    837     return FALSE;
    838 
    839   FX_DWORD dwHitTest =
    840       pWidgetHandler->OnHitTest(pAnnot->GetXFAWidget(), point.x, point.y);
    841   return (dwHitTest != FWL_WGTHITTEST_Unknown);
    842 }
    843 
    844 void CPDFSDK_XFAAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView,
    845                                            CPDFSDK_Annot* pAnnot,
    846                                            FX_DWORD nFlag) {
    847   if (!pPageView || !pAnnot)
    848     return;
    849   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    850   ASSERT(pWidgetHandler != NULL);
    851 
    852   pWidgetHandler->OnMouseEnter(pAnnot->GetXFAWidget());
    853 }
    854 
    855 void CPDFSDK_XFAAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView,
    856                                           CPDFSDK_Annot* pAnnot,
    857                                           FX_DWORD nFlag) {
    858   if (!pPageView || !pAnnot)
    859     return;
    860 
    861   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    862   ASSERT(pWidgetHandler != NULL);
    863 
    864   pWidgetHandler->OnMouseExit(pAnnot->GetXFAWidget());
    865 }
    866 
    867 FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView,
    868                                                CPDFSDK_Annot* pAnnot,
    869                                                FX_DWORD nFlags,
    870                                                const CPDF_Point& point) {
    871   if (!pPageView || !pAnnot)
    872     return FALSE;
    873 
    874   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    875   ASSERT(pWidgetHandler != NULL);
    876 
    877   FX_BOOL bRet = FALSE;
    878   bRet = pWidgetHandler->OnLButtonDown(pAnnot->GetXFAWidget(),
    879                                        GetFWLFlags(nFlags), point.x, point.y);
    880 
    881   return bRet;
    882 }
    883 
    884 FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView,
    885                                              CPDFSDK_Annot* pAnnot,
    886                                              FX_DWORD nFlags,
    887                                              const CPDF_Point& point) {
    888   if (!pPageView || !pAnnot)
    889     return FALSE;
    890 
    891   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    892   ASSERT(pWidgetHandler != NULL);
    893 
    894   FX_BOOL bRet = FALSE;
    895   bRet = pWidgetHandler->OnLButtonUp(pAnnot->GetXFAWidget(),
    896                                      GetFWLFlags(nFlags), point.x, point.y);
    897 
    898   return bRet;
    899 }
    900 
    901 FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
    902                                                  CPDFSDK_Annot* pAnnot,
    903                                                  FX_DWORD nFlags,
    904                                                  const CPDF_Point& point) {
    905   if (!pPageView || !pAnnot)
    906     return FALSE;
    907 
    908   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    909   ASSERT(pWidgetHandler != NULL);
    910 
    911   FX_BOOL bRet = FALSE;
    912   bRet = pWidgetHandler->OnLButtonDblClk(pAnnot->GetXFAWidget(),
    913                                          GetFWLFlags(nFlags), point.x, point.y);
    914 
    915   return bRet;
    916 }
    917 
    918 FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView,
    919                                              CPDFSDK_Annot* pAnnot,
    920                                              FX_DWORD nFlags,
    921                                              const CPDF_Point& point) {
    922   if (!pPageView || !pAnnot)
    923     return FALSE;
    924 
    925   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    926   ASSERT(pWidgetHandler != NULL);
    927 
    928   FX_BOOL bRet = FALSE;
    929   bRet = pWidgetHandler->OnMouseMove(pAnnot->GetXFAWidget(),
    930                                      GetFWLFlags(nFlags), point.x, point.y);
    931 
    932   return bRet;
    933 }
    934 
    935 FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView,
    936                                               CPDFSDK_Annot* pAnnot,
    937                                               FX_DWORD nFlags,
    938                                               short zDelta,
    939                                               const CPDF_Point& point) {
    940   if (!pPageView || !pAnnot)
    941     return FALSE;
    942 
    943   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    944   ASSERT(pWidgetHandler != NULL);
    945 
    946   FX_BOOL bRet = FALSE;
    947   bRet = pWidgetHandler->OnMouseWheel(
    948       pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), zDelta, point.x, point.y);
    949 
    950   return bRet;
    951 }
    952 
    953 FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView,
    954                                                CPDFSDK_Annot* pAnnot,
    955                                                FX_DWORD nFlags,
    956                                                const CPDF_Point& point) {
    957   if (!pPageView || !pAnnot)
    958     return FALSE;
    959 
    960   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    961   ASSERT(pWidgetHandler != NULL);
    962 
    963   FX_BOOL bRet = FALSE;
    964   bRet = pWidgetHandler->OnRButtonDown(pAnnot->GetXFAWidget(),
    965                                        GetFWLFlags(nFlags), point.x, point.y);
    966 
    967   return bRet;
    968 }
    969 
    970 FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView,
    971                                              CPDFSDK_Annot* pAnnot,
    972                                              FX_DWORD nFlags,
    973                                              const CPDF_Point& point) {
    974   if (!pPageView || !pAnnot)
    975     return FALSE;
    976 
    977   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    978   ASSERT(pWidgetHandler != NULL);
    979 
    980   FX_BOOL bRet = FALSE;
    981   bRet = pWidgetHandler->OnRButtonUp(pAnnot->GetXFAWidget(),
    982                                      GetFWLFlags(nFlags), point.x, point.y);
    983 
    984   return bRet;
    985 }
    986 
    987 FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView,
    988                                                  CPDFSDK_Annot* pAnnot,
    989                                                  FX_DWORD nFlags,
    990                                                  const CPDF_Point& point) {
    991   if (!pPageView || !pAnnot)
    992     return FALSE;
    993 
    994   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
    995   ASSERT(pWidgetHandler != NULL);
    996 
    997   FX_BOOL bRet = FALSE;
    998   bRet = pWidgetHandler->OnRButtonDblClk(pAnnot->GetXFAWidget(),
    999                                          GetFWLFlags(nFlags), point.x, point.y);
   1000 
   1001   return bRet;
   1002 }
   1003 
   1004 FX_BOOL CPDFSDK_XFAAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot,
   1005                                         FX_DWORD nChar,
   1006                                         FX_DWORD nFlags) {
   1007   if (!pAnnot)
   1008     return FALSE;
   1009 
   1010   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
   1011   ASSERT(pWidgetHandler != NULL);
   1012 
   1013   FX_BOOL bRet = FALSE;
   1014   bRet = pWidgetHandler->OnChar(pAnnot->GetXFAWidget(), nChar,
   1015                                 GetFWLFlags(nFlags));
   1016 
   1017   return bRet;
   1018 }
   1019 
   1020 FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot,
   1021                                            int nKeyCode,
   1022                                            int nFlag) {
   1023   if (!pAnnot)
   1024     return FALSE;
   1025 
   1026   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
   1027   ASSERT(pWidgetHandler != NULL);
   1028 
   1029   FX_BOOL bRet = FALSE;
   1030   bRet = pWidgetHandler->OnKeyDown(pAnnot->GetXFAWidget(), nKeyCode,
   1031                                    GetFWLFlags(nFlag));
   1032 
   1033   return bRet;
   1034 }
   1035 
   1036 FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot,
   1037                                          int nKeyCode,
   1038                                          int nFlag) {
   1039   if (!pAnnot)
   1040     return FALSE;
   1041 
   1042   IXFA_WidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
   1043   ASSERT(pWidgetHandler != NULL);
   1044 
   1045   FX_BOOL bRet = FALSE;
   1046   bRet = pWidgetHandler->OnKeyUp(pAnnot->GetXFAWidget(), nKeyCode,
   1047                                  GetFWLFlags(nFlag));
   1048 
   1049   return bRet;
   1050 }
   1051 
   1052 FX_BOOL CPDFSDK_XFAAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot,
   1053                                             FX_DWORD nFlag) {
   1054   return TRUE;
   1055 }
   1056 
   1057 FX_BOOL CPDFSDK_XFAAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot,
   1058                                              FX_DWORD nFlag) {
   1059   return TRUE;
   1060 }
   1061 
   1062 FX_BOOL CPDFSDK_XFAAnnotHandler::OnXFAChangedFocus(CPDFSDK_Annot* pOldAnnot,
   1063                                                    CPDFSDK_Annot* pNewAnnot) {
   1064   IXFA_WidgetHandler* pWidgetHandler = NULL;
   1065 
   1066   if (pOldAnnot)
   1067     pWidgetHandler = GetXFAWidgetHandler(pOldAnnot);
   1068   else if (pNewAnnot)
   1069     pWidgetHandler = GetXFAWidgetHandler(pNewAnnot);
   1070 
   1071   if (pWidgetHandler) {
   1072     FX_BOOL bRet = TRUE;
   1073     IXFA_Widget* hWidget = pNewAnnot ? pNewAnnot->GetXFAWidget() : NULL;
   1074     if (hWidget) {
   1075       IXFA_PageView* pXFAPageView = pWidgetHandler->GetPageView(hWidget);
   1076       if (pXFAPageView) {
   1077         bRet = pXFAPageView->GetDocView()->SetFocus(hWidget);
   1078         if (pXFAPageView->GetDocView()->GetFocusWidget() == hWidget)
   1079           bRet = TRUE;
   1080       }
   1081     }
   1082     return bRet;
   1083   }
   1084 
   1085   return TRUE;
   1086 }
   1087 
   1088 IXFA_WidgetHandler* CPDFSDK_XFAAnnotHandler::GetXFAWidgetHandler(
   1089     CPDFSDK_Annot* pAnnot) {
   1090   if (!pAnnot)
   1091     return NULL;
   1092 
   1093   CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
   1094   if (!pPageView)
   1095     return NULL;
   1096 
   1097   CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument();
   1098   if (!pSDKDoc)
   1099     return NULL;
   1100 
   1101   CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument();
   1102   if (!pDoc)
   1103     return NULL;
   1104 
   1105   IXFA_DocView* pDocView = pDoc->GetXFADocView();
   1106   if (!pDocView)
   1107     return NULL;
   1108 
   1109   return pDocView->GetWidgetHandler();
   1110 }
   1111 
   1112 #define FWL_KEYFLAG_Ctrl (1 << 0)
   1113 #define FWL_KEYFLAG_Alt (1 << 1)
   1114 #define FWL_KEYFLAG_Shift (1 << 2)
   1115 #define FWL_KEYFLAG_LButton (1 << 3)
   1116 #define FWL_KEYFLAG_RButton (1 << 4)
   1117 #define FWL_KEYFLAG_MButton (1 << 5)
   1118 
   1119 FX_DWORD CPDFSDK_XFAAnnotHandler::GetFWLFlags(FX_DWORD dwFlag) {
   1120   FX_DWORD dwFWLFlag = 0;
   1121 
   1122   if (dwFlag & FWL_EVENTFLAG_ControlKey)
   1123     dwFWLFlag |= FWL_KEYFLAG_Ctrl;
   1124   if (dwFlag & FWL_EVENTFLAG_LeftButtonDown)
   1125     dwFWLFlag |= FWL_KEYFLAG_LButton;
   1126   if (dwFlag & FWL_EVENTFLAG_MiddleButtonDown)
   1127     dwFWLFlag |= FWL_KEYFLAG_MButton;
   1128   if (dwFlag & FWL_EVENTFLAG_RightButtonDown)
   1129     dwFWLFlag |= FWL_KEYFLAG_RButton;
   1130   if (dwFlag & FWL_EVENTFLAG_ShiftKey)
   1131     dwFWLFlag |= FWL_KEYFLAG_Shift;
   1132   if (dwFlag & FWL_EVENTFLAG_AltKey)
   1133     dwFWLFlag |= FWL_KEYFLAG_Alt;
   1134 
   1135   return dwFWLFlag;
   1136 }
   1137 #endif  // PDF_ENABLE_XFA
   1138 
   1139 CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView,
   1140                                              bool bReverse)
   1141     : m_bReverse(bReverse), m_pos(0) {
   1142   const std::vector<CPDFSDK_Annot*>& annots = pPageView->GetAnnotList();
   1143   m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), annots.rbegin(),
   1144                              annots.rend());
   1145   std::stable_sort(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(),
   1146                    [](CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) {
   1147                      return p1->GetLayoutOrder() < p2->GetLayoutOrder();
   1148                    });
   1149 
   1150   CPDFSDK_Annot* pTopMostAnnot = pPageView->GetFocusAnnot();
   1151   if (!pTopMostAnnot)
   1152     return;
   1153 
   1154   auto it = std::find(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(),
   1155                       pTopMostAnnot);
   1156   if (it != m_iteratorAnnotList.end()) {
   1157     CPDFSDK_Annot* pReaderAnnot = *it;
   1158     m_iteratorAnnotList.erase(it);
   1159     m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), pReaderAnnot);
   1160   }
   1161 }
   1162 
   1163 CPDFSDK_AnnotIterator::~CPDFSDK_AnnotIterator() {
   1164 }
   1165 
   1166 CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot() {
   1167   if (m_pos < m_iteratorAnnotList.size())
   1168     return m_iteratorAnnotList[m_pos++];
   1169   return nullptr;
   1170 }
   1171 
   1172 CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot() {
   1173   if (m_pos < m_iteratorAnnotList.size())
   1174     return m_iteratorAnnotList[m_iteratorAnnotList.size() - ++m_pos];
   1175   return nullptr;
   1176 }
   1177 
   1178 CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next() {
   1179   return m_bReverse ? PrevAnnot() : NextAnnot();
   1180 }
   1181