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 "../../include/formfiller/FFL_FormFiller.h" 8 #include "../../include/formfiller/FFL_IFormFiller.h" 9 #include "../../include/formfiller/FFL_CheckBox.h" 10 #include "../../include/formfiller/FFL_ComboBox.h" 11 #include "../../include/formfiller/FFL_ListBox.h" 12 #include "../../include/formfiller/FFL_PushButton.h" 13 #include "../../include/formfiller/FFL_RadioButton.h" 14 #include "../../include/formfiller/FFL_TextField.h" 15 16 #define FFL_MAXLISTBOXHEIGHT 140.0f 17 18 // HHOOK CFFL_IFormFiller::m_hookSheet = NULL; 19 // MSG CFFL_IFormFiller::g_Msg; 20 21 /* ----------------------------- CFFL_IFormFiller ----------------------------- */ 22 23 CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) : 24 m_pApp(pApp), 25 m_bNotifying(FALSE) 26 { 27 } 28 29 CFFL_IFormFiller::~CFFL_IFormFiller() 30 { 31 FX_POSITION pos = m_Maps.GetStartPosition(); 32 while (pos) 33 { 34 CPDFSDK_Annot * pAnnot = NULL; 35 CFFL_FormFiller * pFormFiller = NULL; 36 m_Maps.GetNextAssoc(pos,pAnnot,pFormFiller); 37 delete pFormFiller; 38 } 39 m_Maps.RemoveAll(); 40 } 41 42 FX_BOOL CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point) 43 { 44 CPDF_Rect rc = pAnnot->GetRect(); 45 if(rc.Contains(point.x, point.y)) 46 return TRUE; 47 return FALSE; 48 } 49 50 FX_RECT CFFL_IFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot) 51 { 52 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 53 { 54 return pFormFiller->GetViewBBox(pPageView, pAnnot); 55 } 56 else 57 { 58 ASSERT(pPageView != NULL); 59 ASSERT(pAnnot != NULL); 60 61 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); 62 ASSERT(pPDFAnnot != NULL); 63 64 CPDF_Rect rcAnnot; 65 pPDFAnnot->GetRect(rcAnnot); 66 67 // CRect rcWin; 68 // pPageView->DocToWindow(rcAnnot, rcWin); 69 CPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot,1); 70 // rcWin.InflateRect(1, 1); 71 72 return rcWin.GetOutterRect(); 73 } 74 } 75 76 void CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, 77 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 78 /*const CRect& rcWindow,*/ FX_DWORD dwFlags) 79 { 80 ASSERT(pPageView != NULL); 81 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 82 83 if (IsVisible(pWidget)) 84 { 85 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 86 { 87 if (pFormFiller->IsValid()) 88 { 89 pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); 90 91 pAnnot->GetPDFPage(); 92 93 94 CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc(); 95 ASSERT(pDocument != NULL); 96 97 if (pDocument->GetFocusAnnot() == pAnnot) 98 { 99 CPDF_Rect rcFocus = pFormFiller->GetFocusBox(pPageView); 100 if (!rcFocus.IsEmpty()) 101 { 102 CFX_PathData path; 103 104 path.SetPointCount(5); 105 path.SetPoint(0, rcFocus.left, rcFocus.top, FXPT_MOVETO); 106 path.SetPoint(1, rcFocus.left, rcFocus.bottom, FXPT_LINETO); 107 path.SetPoint(2, rcFocus.right, rcFocus.bottom, FXPT_LINETO); 108 path.SetPoint(3, rcFocus.right, rcFocus.top, FXPT_LINETO); 109 path.SetPoint(4, rcFocus.left, rcFocus.top, FXPT_LINETO); 110 111 CFX_GraphStateData gsd; 112 gsd.SetDashCount(1); 113 gsd.m_DashArray[0] = 1.0f; 114 gsd.m_DashPhase = 0; 115 116 gsd.m_LineWidth = 1.0f; 117 pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE); 118 119 // ::DrawFocusRect(hDC, &rcFocus); 120 } 121 } 122 123 return; 124 } 125 } 126 127 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 128 pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); 129 else 130 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); 131 132 if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget)) 133 { 134 pWidget->DrawShadow(pDevice, pPageView); 135 } 136 137 } 138 } 139 140 void CFFL_IFormFiller::OnCreate(CPDFSDK_Annot* pAnnot) 141 { 142 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 143 { 144 pFormFiller->OnCreate(pAnnot); 145 } 146 } 147 148 void CFFL_IFormFiller::OnLoad(CPDFSDK_Annot* pAnnot) 149 { 150 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 151 { 152 pFormFiller->OnLoad(pAnnot); 153 } 154 } 155 156 void CFFL_IFormFiller::OnDelete(CPDFSDK_Annot* pAnnot) 157 { 158 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 159 { 160 pFormFiller->OnDelete(pAnnot); 161 } 162 163 UnRegisterFormFiller(pAnnot); 164 } 165 166 void CFFL_IFormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag) 167 { 168 ASSERT(pAnnot != NULL); 169 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 170 171 if (!m_bNotifying) 172 { 173 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 174 if (pWidget->GetAAction(CPDF_AAction::CursorEnter)) 175 { 176 m_bNotifying = TRUE; 177 178 int nValueAge = pWidget->GetValueAge(); 179 180 pWidget->ClearAppModified(); 181 182 ASSERT(pPageView != NULL); 183 184 185 186 PDFSDK_FieldAction fa; 187 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 188 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 189 pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView ); 190 m_bNotifying = FALSE; 191 192 //if ( !IsValidAnnot(pPageView, pAnnot) ) return; 193 194 if (pWidget->IsAppModified()) 195 { 196 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) 197 { 198 pFormFiller->ResetPDFWindow(pPageView, pWidget->GetValueAge() == nValueAge); 199 } 200 } 201 } 202 } 203 204 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE)) 205 { 206 pFormFiller->OnMouseEnter(pPageView, pAnnot); 207 } 208 } 209 210 void CFFL_IFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag) 211 { 212 ASSERT(pAnnot != NULL); 213 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 214 215 if (!m_bNotifying) 216 { 217 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 218 if (pWidget->GetAAction(CPDF_AAction::CursorExit)) 219 { 220 m_bNotifying = TRUE; 221 pWidget->GetAppearanceAge(); 222 int nValueAge = pWidget->GetValueAge(); 223 pWidget->ClearAppModified(); 224 225 ASSERT(pPageView != NULL); 226 227 228 229 PDFSDK_FieldAction fa; 230 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 231 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 232 233 pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView); 234 m_bNotifying = FALSE; 235 236 //if (!IsValidAnnot(pPageView, pAnnot)) return; 237 238 if (pWidget->IsAppModified()) 239 { 240 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) 241 { 242 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge()); 243 } 244 } 245 } 246 } 247 248 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 249 { 250 pFormFiller->OnMouseExit(pPageView, pAnnot); 251 } 252 } 253 254 FX_BOOL CFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 255 { 256 ASSERT(pAnnot != NULL); 257 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 258 259 if (!m_bNotifying) 260 { 261 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 262 if (Annot_HitTest(pPageView, pAnnot, point) && pWidget->GetAAction(CPDF_AAction::ButtonDown)) 263 { 264 m_bNotifying = TRUE; 265 pWidget->GetAppearanceAge(); 266 int nValueAge = pWidget->GetValueAge(); 267 pWidget->ClearAppModified(); 268 269 ASSERT(pPageView != NULL); 270 271 272 273 PDFSDK_FieldAction fa; 274 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags); 275 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags); 276 pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView); 277 m_bNotifying = FALSE; 278 279 if (!IsValidAnnot(pPageView, pAnnot)) return TRUE; 280 281 if (pWidget->IsAppModified()) 282 { 283 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) 284 { 285 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge()); 286 } 287 } 288 } 289 } 290 291 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 292 { 293 return pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point); 294 } 295 296 return FALSE; 297 } 298 299 FX_BOOL CFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 300 { 301 ASSERT(pAnnot != NULL); 302 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 303 304 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 305 // CReader_Page* pPage = pAnnot->GetPage(); 306 // ASSERT(pPage != NULL); 307 CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc(); 308 ASSERT(pDocument != NULL); 309 310 switch (pWidget->GetFieldType()) 311 { 312 case FIELDTYPE_PUSHBUTTON: 313 case FIELDTYPE_CHECKBOX: 314 case FIELDTYPE_RADIOBUTTON: 315 if (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y)) 316 { 317 pDocument->SetFocusAnnot(pAnnot); 318 } 319 break; 320 default: 321 pDocument->SetFocusAnnot(pAnnot); 322 break; 323 } 324 325 FX_BOOL bRet = FALSE; 326 327 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 328 { 329 bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point); 330 } 331 332 if (pDocument->GetFocusAnnot() == pAnnot) 333 { 334 FX_BOOL bExit = FALSE; 335 FX_BOOL bReset = FALSE; 336 OnButtonUp(pWidget, pPageView, bReset, bExit,nFlags); 337 if (bExit) return TRUE; 338 } 339 return bRet; 340 } 341 342 void CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag) 343 { 344 ASSERT(pWidget != NULL); 345 346 if (!m_bNotifying) 347 { 348 if (pWidget->GetAAction(CPDF_AAction::ButtonUp)) 349 { 350 m_bNotifying = TRUE; 351 int nAge = pWidget->GetAppearanceAge(); 352 int nValueAge = pWidget->GetValueAge(); 353 354 ASSERT(pPageView != NULL); 355 // CReader_DocView* pDocView = pPageView->GetDocView(); 356 // ASSERT(pDocView != NULL); 357 358 359 360 PDFSDK_FieldAction fa; 361 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 362 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 363 364 pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView); 365 m_bNotifying = FALSE; 366 367 if (!IsValidAnnot(pPageView, pWidget)) 368 { 369 bExit = TRUE; 370 return; 371 } 372 373 if (nAge != pWidget->GetAppearanceAge()) 374 { 375 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) 376 { 377 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge()); 378 } 379 380 bReset = TRUE; 381 } 382 } 383 } 384 } 385 386 FX_BOOL CFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 387 { 388 ASSERT(pAnnot != NULL); 389 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 390 391 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 392 { 393 return pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); 394 } 395 396 return FALSE; 397 } 398 399 FX_BOOL CFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 400 { 401 ASSERT(pAnnot != NULL); 402 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 403 404 //change cursor 405 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE)) 406 { 407 return pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point); 408 } 409 410 return FALSE; 411 } 412 413 FX_BOOL CFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point) 414 { 415 ASSERT(pAnnot != NULL); 416 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 417 418 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 419 { 420 return pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point); 421 } 422 423 return FALSE; 424 } 425 426 FX_BOOL CFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 427 { 428 ASSERT(pAnnot != NULL); 429 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 430 431 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 432 { 433 return pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point); 434 } 435 436 return FALSE; 437 } 438 439 FX_BOOL CFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 440 { 441 ASSERT(pAnnot != NULL); 442 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 443 444 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 445 { 446 return pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point); 447 } 448 449 return FALSE; 450 } 451 452 FX_BOOL CFFL_IFormFiller::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 453 { 454 ASSERT(pAnnot != NULL); 455 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 456 457 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 458 { 459 return pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point); 460 } 461 462 return FALSE; 463 } 464 465 FX_BOOL CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags) 466 { 467 ASSERT(pAnnot != NULL); 468 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 469 470 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 471 { 472 return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags); 473 } 474 475 return FALSE; 476 } 477 478 FX_BOOL CFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags) 479 { 480 ASSERT(pAnnot != NULL); 481 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 482 483 if (nChar == FWL_VKEY_Tab) return TRUE; 484 485 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 486 { 487 return pFormFiller->OnChar(pAnnot, nChar, nFlags); 488 } 489 490 return FALSE; 491 } 492 493 void CFFL_IFormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot) 494 { 495 ASSERT(pAnnot != NULL); 496 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 497 498 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 499 { 500 pFormFiller->OnDeSelected(pAnnot); 501 } 502 } 503 504 void CFFL_IFormFiller::OnSelected(CPDFSDK_Annot* pAnnot) 505 { 506 ASSERT(pAnnot != NULL); 507 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 508 509 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 510 { 511 pFormFiller->OnSelected(pAnnot); 512 } 513 } 514 515 FX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag) 516 { 517 if(!pAnnot) return FALSE; 518 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 519 520 if (!m_bNotifying) 521 { 522 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 523 if (pWidget->GetAAction(CPDF_AAction::GetFocus)) 524 { 525 m_bNotifying = TRUE; 526 pWidget->GetAppearanceAge(); 527 int nValueAge = pWidget->GetValueAge(); 528 pWidget->ClearAppModified(); 529 530 531 CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); 532 ASSERT(pPageView != NULL); 533 534 PDFSDK_FieldAction fa; 535 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 536 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 537 538 539 CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE); 540 if(!pFormFiller) return FALSE; 541 pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa); 542 543 pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView); 544 m_bNotifying = FALSE; 545 546 // if (!IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pAnnot)) return FALSE; 547 548 if (pWidget->IsAppModified()) 549 { 550 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE)) 551 { 552 pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge()); 553 } 554 } 555 } 556 } 557 558 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE)) 559 { 560 if (pFormFiller->OnSetFocus(pAnnot, nFlag)) 561 { 562 return TRUE; 563 } 564 else 565 return FALSE; 566 } 567 568 return TRUE; 569 } 570 571 FX_BOOL CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag) 572 { 573 if(!pAnnot) return FALSE; 574 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 575 576 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE)) 577 { 578 if (pFormFiller->OnKillFocus(pAnnot, nFlag)) 579 { 580 if (!m_bNotifying) 581 { 582 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 583 if (pWidget->GetAAction(CPDF_AAction::LoseFocus)) 584 { 585 m_bNotifying = TRUE; 586 pWidget->ClearAppModified(); 587 588 CPDFSDK_PageView* pPageView = pWidget->GetPageView(); 589 ASSERT(pPageView != NULL); 590 591 PDFSDK_FieldAction fa; 592 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 593 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 594 595 pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa); 596 597 pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView); 598 m_bNotifying = FALSE; 599 600 } 601 } 602 } 603 else 604 return FALSE; 605 } 606 607 return TRUE; 608 } 609 610 FX_BOOL CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget) 611 { 612 return pWidget->IsVisible(); 613 } 614 615 FX_BOOL CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget) 616 { 617 ASSERT(pWidget != NULL); 618 619 int nFieldFlags = pWidget->GetFieldFlags(); 620 621 return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY; 622 } 623 624 FX_BOOL CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget) 625 { 626 ASSERT(pWidget != NULL); 627 628 if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON) 629 return TRUE; 630 else 631 { 632 CPDF_Page* pPage = pWidget->GetPDFPage(); 633 ASSERT(pPage != NULL); 634 635 CPDF_Document* pDocument = pPage->m_pDocument; 636 ASSERT(pDocument != NULL); 637 638 FX_DWORD dwPermissions = pDocument->GetUserPermissions(); 639 return (dwPermissions&FPDFPERM_FILL_FORM) || 640 (dwPermissions&FPDFPERM_ANNOT_FORM) || 641 (dwPermissions&FPDFPERM_MODIFY); 642 } 643 return TRUE; 644 } 645 646 CFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister) 647 { 648 // ASSERT(pAnnot != NULL); 649 // ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 650 651 CFFL_FormFiller * pFormFiller = NULL; 652 m_Maps.Lookup(pAnnot, pFormFiller); 653 654 if (pFormFiller) 655 return pFormFiller; 656 657 if (bRegister) 658 { 659 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 660 661 int nFieldType = pWidget->GetFieldType(); 662 switch(nFieldType) 663 { 664 case FIELDTYPE_PUSHBUTTON: 665 pFormFiller = new CFFL_PushButton(m_pApp, pWidget); 666 break; 667 case FIELDTYPE_CHECKBOX: 668 pFormFiller = new CFFL_CheckBox(m_pApp, pWidget); 669 break; 670 case FIELDTYPE_RADIOBUTTON: 671 pFormFiller = new CFFL_RadioButton(m_pApp, pWidget); 672 break; 673 case FIELDTYPE_TEXTFIELD: 674 pFormFiller = new CFFL_TextField(m_pApp, pWidget); 675 break; 676 case FIELDTYPE_LISTBOX: 677 pFormFiller = new CFFL_ListBox(m_pApp, pWidget); 678 break; 679 case FIELDTYPE_COMBOBOX: 680 pFormFiller = new CFFL_ComboBox(m_pApp, pWidget); 681 break; 682 case FIELDTYPE_UNKNOWN: 683 default: 684 pFormFiller = NULL; 685 break; 686 } 687 688 if (pFormFiller) 689 { 690 m_Maps.SetAt(pAnnot, pFormFiller); 691 } 692 } 693 694 return pFormFiller; 695 } 696 697 void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot) 698 { 699 if ( pAnnot != NULL ) 700 { 701 UnRegisterFormFiller( pAnnot ); 702 } 703 } 704 705 void CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot) 706 { 707 CFFL_FormFiller * pFormFiller = NULL; 708 709 if (m_Maps.Lookup(pAnnot,pFormFiller)) 710 { 711 if (pFormFiller) 712 delete pFormFiller; 713 m_Maps.RemoveKey(pAnnot); 714 } 715 } 716 717 void CFFL_IFormFiller::SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext) 718 { 719 720 } 721 722 void CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet) 723 { 724 ASSERT(pPrivateData != NULL); 725 726 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; 727 728 729 730 731 CPDF_Rect rcPageView(0,0,0,0); 732 rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth(); 733 rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight(); 734 rcPageView.Normalize(); 735 736 737 ASSERT(pData->pWidget != NULL); 738 CPDF_Rect rcAnnot = pData->pWidget->GetRect(); 739 740 FX_FLOAT fTop = 0.0f; 741 FX_FLOAT fBottom = 0.0f; 742 743 CPDFSDK_Widget * pWidget = (CPDFSDK_Widget*)pData->pWidget; 744 switch (pWidget->GetRotate() / 90) 745 { 746 default: 747 case 0: 748 fTop = rcPageView.top - rcAnnot.top; 749 fBottom = rcAnnot.bottom - rcPageView.bottom; 750 break; 751 case 1: 752 fTop = rcAnnot.left - rcPageView.left; 753 fBottom = rcPageView.right - rcAnnot.right; 754 break; 755 case 2: 756 fTop = rcAnnot.bottom - rcPageView.bottom; 757 fBottom = rcPageView.top - rcAnnot.top; 758 break; 759 case 3: 760 fTop = rcPageView.right - rcAnnot.right; 761 fBottom = rcAnnot.left - rcPageView.left; 762 break; 763 } 764 765 FX_FLOAT fFactHeight = 0; 766 FX_BOOL bBottom = TRUE; 767 FX_FLOAT fMaxListBoxHeight = 0; 768 if (fPopupMax > FFL_MAXLISTBOXHEIGHT) 769 { 770 if (fPopupMin > FFL_MAXLISTBOXHEIGHT) 771 { 772 fMaxListBoxHeight = fPopupMin; 773 } 774 else 775 { 776 fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT; 777 } 778 } 779 else 780 fMaxListBoxHeight = fPopupMax; 781 782 if (fBottom > fMaxListBoxHeight) 783 { 784 fFactHeight = fMaxListBoxHeight; 785 bBottom = TRUE; 786 } 787 else 788 { 789 if (fTop > fMaxListBoxHeight) 790 { 791 fFactHeight = fMaxListBoxHeight; 792 bBottom = FALSE; 793 } 794 else 795 { 796 if (fTop > fBottom) 797 { 798 fFactHeight = fTop; 799 bBottom = FALSE; 800 } 801 else 802 { 803 fFactHeight = fBottom; 804 bBottom = TRUE; 805 } 806 } 807 } 808 809 nRet = bBottom ? 0 : 1; 810 fPopupRet = fFactHeight; 811 } 812 813 void CFFL_IFormFiller::OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow) 814 { 815 ASSERT(pPrivateData != NULL); 816 817 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; 818 819 if (CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, TRUE)) 820 { 821 822 CPDF_Rect rcOld = pFormFiller->PWLtoFFL(pFormFiller->GetWindowRect(pData->pPageView)); 823 CPDF_Rect rcNew = pFormFiller->PWLtoFFL(rcWindow); 824 pFormFiller->SetWindowRect(pData->pPageView, rcWindow); 825 826 CPDF_Rect unRect = rcOld; 827 unRect.Union(rcNew); 828 //FX_RECT rcRect = unRect.GetOutterRect(); 829 unRect.left = (FX_FLOAT)(unRect.left - 0.5); 830 unRect.right = (FX_FLOAT)(unRect.right + 0.5); 831 unRect.top = (FX_FLOAT)(unRect.top + 0.5); 832 unRect.bottom = (FX_FLOAT)(unRect.bottom -0.5); 833 m_pApp->FFI_Invalidate(pData->pWidget->GetPDFPage(), unRect.left, unRect.top, unRect.right, unRect.bottom); 834 } 835 } 836 837 void CFFL_IFormFiller::OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString& strChange, 838 const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, 839 FX_BOOL & bRC, FX_BOOL & bExit) 840 { 841 ASSERT(pPrivateData != NULL); 842 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; 843 ASSERT(pData->pWidget != NULL); 844 845 CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE); 846 ASSERT(pFormFiller != NULL); 847 848 pFormFiller->OnKeyStroke(bKeyDown); 849 } 850 851 void CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag) 852 { 853 if (!m_bNotifying) 854 { 855 ASSERT(pWidget != NULL); 856 if (pWidget->GetAAction(CPDF_AAction::KeyStroke)) 857 { 858 m_bNotifying = TRUE; 859 pWidget->ClearAppModified(); 860 861 ASSERT(pPageView != NULL); 862 // CReader_DocView* pDocView = pPageView->GetDocView(); 863 // ASSERT(pDocView != NULL); 864 865 866 867 PDFSDK_FieldAction fa; 868 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 869 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 870 fa.bWillCommit = TRUE; 871 fa.nCommitKey = GetCommitKey(); 872 fa.bKeyDown = GetKeyDown(); 873 fa.bRC = TRUE; 874 875 CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE); 876 ASSERT(pFormFiller != NULL); 877 878 pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa); 879 pFormFiller->SaveState(pPageView); 880 881 PDFSDK_FieldAction faOld = fa; 882 pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView); 883 884 bRC = fa.bRC; 885 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget); 886 887 m_bNotifying = FALSE; 888 } 889 } 890 } 891 892 void CFFL_IFormFiller::OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag) 893 { 894 if (!m_bNotifying) 895 { 896 ASSERT(pWidget != NULL); 897 if (pWidget->GetAAction(CPDF_AAction::Validate)) 898 { 899 m_bNotifying = TRUE; 900 pWidget->ClearAppModified(); 901 902 ASSERT(pPageView != NULL); 903 // CReader_DocView* pDocView = pPageView->GetDocView(); 904 // ASSERT(pDocView != NULL); 905 906 907 908 PDFSDK_FieldAction fa; 909 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 910 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 911 fa.bKeyDown = GetKeyDown(); 912 fa.bRC = TRUE; 913 914 CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE); 915 ASSERT(pFormFiller != NULL); 916 917 pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa); 918 pFormFiller->SaveState(pPageView); 919 920 PDFSDK_FieldAction faOld = fa; 921 pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView); 922 923 bRC = fa.bRC; 924 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget); 925 926 m_bNotifying = FALSE; 927 } 928 } 929 } 930 931 void CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag) 932 { 933 if (!m_bNotifying) 934 { 935 ASSERT(pWidget != NULL); 936 ASSERT(pPageView != NULL); 937 // CReader_DocView* pDocView = pPageView->GetDocView(); 938 // ASSERT(pDocView != NULL); 939 CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); 940 ASSERT(pDocument != NULL); 941 942 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); 943 ASSERT(pInterForm != NULL); 944 945 pInterForm->OnCalculate(pWidget->GetFormField()); 946 947 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget); 948 949 m_bNotifying = FALSE; 950 } 951 } 952 953 void CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag) 954 { 955 if (!m_bNotifying) 956 { 957 ASSERT(pWidget != NULL); 958 ASSERT(pPageView != NULL); 959 // CReader_DocView* pDocView = pPageView->GetDocView(); 960 // ASSERT(pDocView != NULL); 961 CPDFSDK_Document* pDocument = pPageView->GetSDKDocument(); 962 ASSERT(pDocument != NULL); 963 964 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm(); 965 ASSERT(pInterForm != NULL); 966 967 FX_BOOL bFormated = FALSE; 968 CFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), GetCommitKey(), bFormated); 969 970 // bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget); 971 972 if (bExit) return; 973 974 if (bFormated) 975 { 976 pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue, TRUE); 977 pInterForm->UpdateField(pWidget->GetFormField()); 978 } 979 980 m_bNotifying = FALSE; 981 } 982 } 983 984 // LRESULT CALLBACK CFFL_IFormFiller::FFL_WndProc( 985 // int code, // hook code 986 // WPARAM wParam, // virtual-key code 987 // LPARAM lParam // keystroke-message information 988 // ) 989 // { 990 // if (code != HC_ACTION) 991 // { 992 // return CallNextHookEx (m_hookSheet, code, wParam, lParam); 993 // } 994 // 995 // FXSYS_memcpy(&g_Msg, (void*)lParam, sizeof(MSG)); 996 // 997 // return 0; 998 // } 999 1000 // MSG CFFL_IFormFiller::GetLastMessage() 1001 // { 1002 // return g_Msg; 1003 // } 1004 1005 int CFFL_IFormFiller::GetCommitKey() 1006 { 1007 // MSG msg = CFFL_IFormFiller::GetLastMessage(); 1008 1009 int nCommitKey = 0; 1010 // switch (msg.message) 1011 // { 1012 // case WM_LBUTTONDOWN: 1013 // case WM_LBUTTONUP: 1014 // nCommitKey = 1; 1015 // break; 1016 // case WM_KEYDOWN: 1017 // switch (msg.wParam) 1018 // { 1019 // case VK_RETURN: 1020 // nCommitKey = 2; 1021 // break; 1022 // case VK_TAB: 1023 // nCommitKey = 3; 1024 // break; 1025 // } 1026 // break; 1027 // } 1028 1029 return nCommitKey; 1030 } 1031 1032 FX_BOOL CFFL_IFormFiller::GetKeyDown() 1033 { 1034 return TRUE; 1035 // MSG msg = CFFL_IFormFiller::GetLastMessage(); 1036 // 1037 // return msg.message == WM_KEYDOWN || msg.message == WM_CHAR; 1038 } 1039 1040 FX_BOOL CFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot) 1041 { 1042 1043 ASSERT(pPageView != NULL); 1044 ASSERT(pAnnot != NULL); 1045 1046 if(pPageView) 1047 return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot()); 1048 else 1049 return FALSE; 1050 } 1051 1052 void CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument) 1053 { 1054 1055 } 1056 1057 void CFFL_IFormFiller::BeforeRedo(CPDFSDK_Document* pDocument) 1058 { 1059 BeforeUndo(pDocument); 1060 } 1061 1062 void CFFL_IFormFiller::AfterUndo(CPDFSDK_Document* pDocument) 1063 { 1064 } 1065 1066 void CFFL_IFormFiller::AfterRedo(CPDFSDK_Document* pDocument) 1067 { 1068 } 1069 1070 FX_BOOL CFFL_IFormFiller::CanCopy(CPDFSDK_Document* pDocument) 1071 { 1072 1073 return FALSE; 1074 } 1075 1076 FX_BOOL CFFL_IFormFiller::CanCut(CPDFSDK_Document* pDocument) 1077 { 1078 1079 return FALSE; 1080 } 1081 1082 FX_BOOL CFFL_IFormFiller::CanPaste(CPDFSDK_Document* pDocument) 1083 { 1084 1085 return FALSE; 1086 } 1087 1088 void CFFL_IFormFiller::DoCopy(CPDFSDK_Document* pDocument) 1089 { 1090 } 1091 1092 void CFFL_IFormFiller::DoCut(CPDFSDK_Document* pDocument) 1093 { 1094 } 1095 1096 void CFFL_IFormFiller::DoPaste(CPDFSDK_Document* pDocument) 1097 { 1098 1099 } 1100 void CFFL_IFormFiller::OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, 1101 CFX_WideString & strChange, const CFX_WideString& strChangeEx, 1102 int nSelStart, int nSelEnd, 1103 FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag) 1104 { 1105 ASSERT(pPrivateData != NULL); 1106 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; 1107 ASSERT(pData->pWidget != NULL); 1108 1109 CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE); 1110 ASSERT(pFormFiller != NULL); 1111 1112 if (!m_bNotifying) 1113 { 1114 if (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke)) 1115 { 1116 m_bNotifying = TRUE; 1117 int nAge = pData->pWidget->GetAppearanceAge(); 1118 int nValueAge = pData->pWidget->GetValueAge(); 1119 1120 ASSERT(pData->pPageView != NULL); 1121 CPDFSDK_Document* pDocument = pData->pPageView->GetSDKDocument(); 1122 1123 PDFSDK_FieldAction fa; 1124 fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag); 1125 fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag); 1126 fa.sChange = strChange; 1127 fa.sChangeEx = strChangeEx; 1128 fa.bKeyDown = bKeyDown; 1129 fa.bWillCommit = FALSE; 1130 fa.bRC = TRUE; 1131 fa.nSelStart = nSelStart; 1132 fa.nSelEnd = nSelEnd; 1133 1134 1135 pFormFiller->GetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa); 1136 pFormFiller->SaveState(pData->pPageView); 1137 1138 if (pData->pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pData->pPageView)) 1139 { 1140 if (!IsValidAnnot(pData->pPageView, pData->pWidget)) 1141 { 1142 bExit = TRUE; 1143 m_bNotifying = FALSE; 1144 return; 1145 } 1146 1147 if (nAge != pData->pWidget->GetAppearanceAge()) 1148 { 1149 CPWL_Wnd* pWnd = pFormFiller->ResetPDFWindow(pData->pPageView, nValueAge == pData->pWidget->GetValueAge()); 1150 pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); 1151 bExit = TRUE; 1152 } 1153 1154 if (fa.bRC) 1155 { 1156 pFormFiller->SetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa); 1157 bRC = FALSE; 1158 } 1159 else 1160 { 1161 pFormFiller->RestoreState(pData->pPageView); 1162 bRC = FALSE; 1163 } 1164 1165 if (pDocument->GetFocusAnnot() != pData->pWidget) 1166 { 1167 pFormFiller->CommitData(pData->pPageView,nFlag); 1168 bExit = TRUE; 1169 } 1170 } 1171 else 1172 { 1173 if (!IsValidAnnot(pData->pPageView, pData->pWidget)) 1174 { 1175 bExit = TRUE; 1176 m_bNotifying = FALSE; 1177 return; 1178 } 1179 } 1180 1181 m_bNotifying = FALSE; 1182 } 1183 } 1184 } 1185 1186 void CFFL_IFormFiller::OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit,FX_DWORD nFlag) 1187 { 1188 ASSERT(pPrivateData != NULL); 1189 CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData; 1190 ASSERT(pData->pWidget != NULL); 1191 1192 CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE); 1193 ASSERT(pFormFiller != NULL); 1194 1195 if (!bEditOrList) 1196 pFormFiller->OnKeyStroke(bExit); 1197 } 1198