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