FFL_FormFiller.cpp revision ee451cb395940862dad63c85adfe8f2fd55e864c
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 8#include "../../include/formfiller/FFL_FormFiller.h" 9#include "../../include/formfiller/FFL_Notify.h" 10#include "../../include/formfiller/FFL_CBA_Fontmap.h" 11 12#define GetRed(rgb) ((FX_BYTE)(rgb)) 13#define GetGreen(rgb) ((FX_BYTE)(((FX_WORD)(rgb)) >> 8)) 14#define GetBlue(rgb) ((FX_BYTE)((rgb)>>16)) 15 16#define FFL_HINT_ELAPSE 800 17 18/* ------------------------- CFFL_FormFiller ------------------------- */ 19 20CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) 21 :m_pApp(pApp), 22 m_pAnnot(pAnnot), 23 m_bValid(FALSE), 24 m_ptOldPos(0,0) 25{ 26 m_pWidget = (CPDFSDK_Widget*) pAnnot; 27} 28 29CFFL_FormFiller::~CFFL_FormFiller() 30{ 31 FX_POSITION pos = m_Maps.GetStartPosition(); 32 while (pos) 33 { 34 CPDFSDK_PageView * pPageView = NULL; 35 CPWL_Wnd* pWnd = NULL; 36 m_Maps.GetNextAssoc(pos, pPageView, pWnd); 37 38 if (pWnd) 39 { 40 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); 41 pWnd->Destroy(); 42 delete pWnd; 43 delete pData; 44 } 45 } 46 m_Maps.RemoveAll(); 47 48} 49 50void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow) 51{ 52 if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE)) 53 { 54 pWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE); 55 } 56} 57 58CPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView) 59{ 60 if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE)) 61 { 62 return pWnd->GetWindowRect(); 63 } 64 65 return CPDF_Rect(0,0,0,0); 66} 67 68FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) 69{ 70 ASSERT(pPageView != NULL); 71 ASSERT(pAnnot != NULL); 72 73 CPDF_Rect rcAnnot = m_pWidget->GetRect(); 74 75 if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE)) 76 { 77 CPDF_Rect rcWindow = pWnd->GetWindowRect(); 78 rcAnnot = PWLtoFFL(rcWindow); 79 } 80 81 CPDF_Rect rcWin = rcAnnot; 82// pPageView->DocToWindow(rcAnnot, rcWin); 83 84 CPDF_Rect rcFocus = this->GetFocusBox(pPageView); 85 if (!rcFocus.IsEmpty()) 86 rcWin.Union(rcFocus); 87 88 CPDF_Rect rect = CPWL_Utils::InflateRect(rcWin,1); 89 90 return rect.GetOutterRect(); 91} 92 93void CFFL_FormFiller::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, 94 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 95 /*const CRect& rcWindow,*/ FX_DWORD dwFlags) 96{ 97 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget"); 98 99 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 100 { 101 CPDF_Matrix mt = this->GetCurMatrix(); 102 mt.Concat(*pUser2Device); 103 pWnd->DrawAppearance(pDevice,&mt); 104 } 105 else 106 { 107 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 108 if (CFFL_IFormFiller::IsVisible(pWidget)) 109 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); 110 } 111} 112 113void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, 114 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 115 /*const CRect& rcWindow,*/ FX_DWORD dwFlags) 116{ 117 ASSERT(pAnnot != NULL); 118 119 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 120 121 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); 122} 123 124 125void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot) 126{ 127} 128 129void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot) 130{ 131} 132 133void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot) 134{ 135} 136 137void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) 138{ 139} 140 141void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) 142{ 143 EndTimer(); 144 ASSERT(m_pWidget != NULL); 145} 146 147FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 148{ 149 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE)) 150 { 151 m_bValid = TRUE; 152 FX_RECT rect = this->GetViewBBox(pPageView,pAnnot); 153 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); 154 155 if(!rect.Contains((int)point.x, (int)point.y)) 156 return FALSE; 157 158 return pWnd->OnLButtonDown(WndtoPWL(pPageView, point),nFlags); 159 } 160 161 return FALSE; 162} 163 164FX_BOOL CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 165{ 166 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 167 { 168 FX_RECT rcFFL = this->GetViewBBox(pPageView, pAnnot); 169 this->InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom); 170 pWnd->OnLButtonUp(WndtoPWL(pPageView, point),nFlags); 171 return TRUE; 172 } 173 174 return FALSE; 175} 176 177FX_BOOL CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 178{ 179 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 180 { 181 pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point),nFlags); 182 return TRUE; 183 } 184 185 return FALSE; 186} 187 188FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 189{ 190 if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y)) 191 { 192 m_ptOldPos = point; 193 } 194 195 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 196 { 197 pWnd->OnMouseMove(WndtoPWL(pPageView, point),nFlags); 198 return TRUE; 199 } 200 201 return FALSE; 202} 203 204FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point) 205{ 206 if (!IsValid()) return FALSE; 207 208 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE)) 209 { 210 return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point),nFlags); 211 } 212 213 return FALSE; 214} 215 216FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 217{ 218 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE)) 219 { 220 pWnd->OnRButtonDown(WndtoPWL(pPageView, point),nFlags); 221 return TRUE; 222 } 223 224 return FALSE; 225} 226 227FX_BOOL CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 228{ 229 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 230 { 231 pWnd->OnRButtonUp(WndtoPWL(pPageView, point),nFlags); 232 return TRUE; 233 } 234 235 return FALSE; 236} 237 238FX_BOOL CFFL_FormFiller::OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 239{ 240 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 241 { 242 pWnd->OnRButtonDblClk(WndtoPWL(pPageView, point),nFlags); 243 return TRUE; 244 } 245 246 return FALSE; 247} 248 249FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags) 250{ 251 if (IsValid()) 252 { 253 CPDFSDK_PageView* pPageView = this->GetCurPageView(); 254 ASSERT(pPageView != NULL); 255 256 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 257 { 258 return pWnd->OnKeyDown(nKeyCode,nFlags); 259 } 260 } 261 262 return FALSE; 263} 264 265FX_BOOL CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags) 266{ 267 if (IsValid()) 268 { 269 CPDFSDK_PageView* pPageView = this->GetCurPageView(); 270 ASSERT(pPageView != NULL); 271 272 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 273 { 274 return pWnd->OnChar(nChar,nFlags); 275 } 276 } 277 278 return FALSE; 279} 280 281void CFFL_FormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot) 282{ 283 ASSERT(FALSE); 284} 285 286void CFFL_FormFiller::OnSelected(CPDFSDK_Annot* pAnnot) 287{ 288 ASSERT(FALSE); 289} 290 291FX_BOOL CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) 292{ 293 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 294 295 CPDF_Page * pPage = pWidget->GetPDFPage(); 296 CPDFSDK_Document * pDoc = m_pApp->GetCurrentDoc(); 297 CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage); 298 ASSERT(pPageView != NULL); 299 300 301 302 CPWL_Wnd * pWnd = NULL; 303 if ( (pWnd = GetPDFWindow(pPageView, TRUE))) 304 { 305 pWnd->SetFocus(); 306 } 307 308 m_bValid = TRUE; 309 310 311 312 313 m_bValid = TRUE; 314 FX_RECT rcRect = this->GetViewBBox(pPageView,pAnnot); 315 this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom); 316 317 return TRUE; 318} 319 320FX_BOOL CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) 321{ 322 if (IsValid()) 323 { 324 CPDFSDK_PageView* pPageView = this->GetCurPageView(); 325 ASSERT(pPageView != NULL); 326 327 CommitData(pPageView, nFlag); 328 329 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) 330 { 331 pWnd->KillFocus(); 332 } 333 334 switch (m_pWidget->GetFieldType()) 335 { 336 case FIELDTYPE_PUSHBUTTON: 337 case FIELDTYPE_CHECKBOX: 338 case FIELDTYPE_RADIOBUTTON: 339 EscapeFiller(pPageView, TRUE); 340 break; 341 default: 342 EscapeFiller(pPageView, FALSE); 343 break; 344 } 345 } 346 347 return TRUE; 348} 349 350FX_BOOL CFFL_FormFiller::IsValid() const 351{ 352 return m_bValid; 353} 354 355PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam() 356{ 357 ASSERT(m_pApp != NULL); 358 359 PWL_CREATEPARAM cp; 360 361 cp.pParentWnd = NULL; 362 cp.pProvider = this; 363 cp.rcRectWnd = GetPDFWindowRect(); 364 365 FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE; 366 367 ASSERT(m_pWidget != NULL); 368 369 370 FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags(); 371 372 if (dwFieldFlag & FIELDFLAG_READONLY) 373 { 374 dwCreateFlags |= PWS_READONLY; 375 } 376 377 FX_COLORREF color; 378 if (m_pWidget->GetFillColor(color)) 379 { 380 cp.sBackgroundColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); 381 } 382 383 if (m_pWidget->GetBorderColor(color)) 384 { 385 cp.sBorderColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); 386 } 387 388 cp.sTextColor = CPWL_Color(COLORTYPE_GRAY,0); 389 390 if (m_pWidget->GetTextColor(color)) 391 { 392 cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color)); 393 } 394 395 cp.fFontSize = m_pWidget->GetFontSize(); 396 cp.dwBorderWidth = m_pWidget->GetBorderWidth(); 397 398 int nBorderStyle = m_pWidget->GetBorderStyle(); 399 400 switch (nBorderStyle) 401 { 402 case BBS_SOLID: 403 cp.nBorderStyle = PBS_SOLID; 404 break; 405 case BBS_DASH: 406 cp.nBorderStyle = PBS_DASH; 407 cp.sDash = CPWL_Dash(3,3,0); 408 break; 409 case BBS_BEVELED: 410 cp.nBorderStyle = PBS_BEVELED; 411 cp.dwBorderWidth *= 2; 412 break; 413 case BBS_INSET: 414 cp.nBorderStyle = PBS_INSET; 415 cp.dwBorderWidth *= 2; 416 break; 417 case BBS_UNDERLINE: 418 cp.nBorderStyle = PBS_UNDERLINED; 419 break; 420 } 421 422 if (cp.fFontSize <= 0) 423 { 424 dwCreateFlags |= PWS_AUTOFONTSIZE; 425 } 426 427 cp.dwFlags = dwCreateFlags; 428 cp.pSystemHandler = m_pApp->GetSysHandler(); 429 return cp; 430} 431 432CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew) 433{ 434 ASSERT(pPageView != NULL); 435 ASSERT(m_pWidget != NULL); 436 437 CPWL_Wnd* pWnd = NULL; 438 m_Maps.Lookup(pPageView, pWnd); 439 440 if (bNew) 441 { 442 if (pWnd) 443 { 444 CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData(); 445 ASSERT(pPrivateData != NULL); 446 447 if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge()) 448 { 449 return this->ResetPDFWindow(pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge); 450 } 451 } 452 else 453 { 454 PWL_CREATEPARAM cp = GetCreateParam(); 455 cp.hAttachedWnd = (FX_HWND)m_pWidget; 456 457 CFFL_PrivateData* pPrivateData = new CFFL_PrivateData; 458 pPrivateData->pWidget = m_pWidget; 459 pPrivateData->pPageView = pPageView; 460 pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge(); 461 pPrivateData->nValueAge = 0; 462 463 cp.pAttachedData = pPrivateData; 464 465 pWnd = NewPDFWindow(cp, pPageView); 466 467 if (pWnd) 468 { 469 m_Maps.SetAt(pPageView, pWnd); 470 } 471 } 472 } 473 474 return pWnd; 475} 476 477void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView) 478{ 479 CPWL_Wnd* pWnd = NULL; 480 m_Maps.Lookup(pPageView, pWnd); 481 482 if (pWnd) 483 { 484 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); 485 pData->pPageView = NULL; 486 pWnd->Destroy(); 487 delete pWnd; 488 delete pData; 489 } 490 491 m_Maps.RemoveKey(pPageView); 492} 493 494CPDF_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData) 495{ 496 if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData) 497 { 498 if (pPrivateData->pPageView) 499 { 500 CPDF_Matrix mtPageView; 501 pPrivateData->pPageView->GetCurrentMatrix(mtPageView); 502 CPDF_Matrix mt = GetCurMatrix(); 503 mt.Concat(mtPageView); 504 505 return mt; 506 } 507 } 508 return CPDF_Matrix(1,0,0,1,0,0); 509} 510 511CPDF_Matrix CFFL_FormFiller::GetCurMatrix() 512{ 513 CPDF_Matrix mt; 514 515 ASSERT(m_pWidget != NULL); 516 517 CPDF_Rect rcDA ; 518 m_pWidget->GetPDFAnnot()->GetRect(rcDA); 519 520 521 switch (m_pWidget->GetRotate()) 522 { 523 default: 524 case 0: 525 mt = CPDF_Matrix(1,0,0,1,0,0); 526 break; 527 case 90: 528 mt = CPDF_Matrix(0,1,-1,0,rcDA.right - rcDA.left,0); 529 break; 530 case 180: 531 mt = CPDF_Matrix(-1,0,0,-1,rcDA.right - rcDA.left,rcDA.top - rcDA.bottom); 532 break; 533 case 270: 534 mt = CPDF_Matrix(0,-1,1,0,0,rcDA.top - rcDA.bottom); 535 break; 536 } 537 mt.e += rcDA.left; 538 mt.f += rcDA.bottom; 539 540 return mt; 541} 542 543CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex) 544{ 545 ASSERT(m_pApp != NULL); 546 547 return L""; 548} 549 550CPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const 551{ 552 ASSERT(m_pWidget != NULL); 553 554 CPDF_Rect rectAnnot; 555 m_pWidget->GetPDFAnnot()->GetRect(rectAnnot); 556 557 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left; 558 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom; 559 560 561 if ((m_pWidget->GetRotate() / 90) & 0x01) 562 return CPDF_Rect(0,0,fHeight,fWidth); 563 else 564 return CPDF_Rect(0,0,fWidth,fHeight); 565} 566 567CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView() 568{ 569 570 CPDF_Page* pPage = m_pAnnot->GetPDFPage(); 571 CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc(); 572 if(pSDKDoc) 573 { 574 return pSDKDoc->GetPageView(pPage); 575 } 576 return NULL; 577} 578 579CPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView) 580{ 581 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE)) 582 { 583 CPDF_Rect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect())); 584 ASSERT(pPageView); 585 CPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox(); 586 if(rcPage.Contains(rcFocus)) 587 return rcFocus; 588 else 589 return CPDF_Rect(0,0,0,0); 590 } 591 return CPDF_Rect(0,0,0,0); 592} 593 594CPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect) 595{ 596 CPDF_Matrix mt; 597 mt.SetReverse(GetCurMatrix()); 598 599 CPDF_Rect temp = rect; 600 mt.TransformRect(temp); 601 602 return temp; 603} 604 605CPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect) 606{ 607 CPDF_Matrix mt = GetCurMatrix(); 608 609 CPDF_Rect temp = rect; 610 mt.TransformRect(temp); 611 612 return temp; 613} 614 615CPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point) 616{ 617 CPDF_Matrix mt; 618 mt.SetReverse(GetCurMatrix()); 619 620 CPDF_Point pt = point; 621 mt.Transform(pt.x,pt.y); 622 623 return pt; 624} 625 626CPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point & point) 627{ 628 CPDF_Matrix mt = GetCurMatrix(); 629 630 CPDF_Point pt = point; 631 mt.Transform(pt.x,pt.y); 632 633 return pt; 634} 635 636CPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt) 637{ 638// ASSERT(pPageView != NULL); 639// 640// CPDF_Point point(0.0f, 0.0f); 641// pPageView->WindowToDoc(pt.x, pt.y, point.x, point.y); 642// 643 return FFLtoPWL(pt); 644// return CPDF_Point(0, 0); 645} 646 647CPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect & rect) 648{ 649// FX_RECT rcRet(0,0,0,0); 650// 651// ASSERT(pPageView != NULL); 652// pPageView->DocToWindow(rect, rcRet); 653// 654 return rect; 655 656} 657 658void CFFL_FormFiller::FFL_FreeData(void* pData) 659{ 660 ASSERT(pData != NULL); 661 662 delete (CFFL_PrivateData*)pData; 663} 664 665FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag) 666{ 667 if (IsDataChanged(pPageView)) 668 { 669 //CFFL_IFormFiller* pIFormFiller = CFFL_Module::GetFormFiller(m_pApp); 670 CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();//NULL; 671 ASSERT(pIFormFiller != NULL); 672 673 FX_BOOL bRC = TRUE; 674 FX_BOOL bExit = FALSE; 675 676 pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag); 677 if (bExit) return TRUE; 678 if (!bRC) 679 { 680 this->ResetPDFWindow(pPageView, FALSE); 681 return TRUE; 682 } 683 684 pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag); 685 if (bExit) return TRUE; 686 if (!bRC) 687 { 688 this->ResetPDFWindow(pPageView, FALSE); 689 return TRUE; 690 } 691 692 SaveData(pPageView); 693 694 pIFormFiller->OnCalculate(m_pWidget, pPageView, bExit,nFlag); 695 if (bExit) return TRUE; 696 697 pIFormFiller->OnFormat(m_pWidget, pPageView, bExit,nFlag); 698 } 699 700 return TRUE; 701} 702 703FX_BOOL CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView) 704{ 705 return FALSE; 706} 707 708void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView) 709{ 710} 711 712void CFFL_FormFiller::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data) 713{ 714} 715 716void CFFL_FormFiller::SetChangeMark() 717{ 718 m_pApp->FFI_OnChange(); 719} 720 721void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, 722 PDFSDK_FieldAction& fa) 723{ 724 fa.sValue = m_pWidget->GetValue(); 725} 726 727void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, 728 const PDFSDK_FieldAction& fa) 729{ 730} 731 732FX_BOOL CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, 733 const PDFSDK_FieldAction& faNew) 734{ 735 return FALSE; 736} 737 738void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView) 739{ 740} 741 742void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView) 743{ 744} 745 746CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue) 747{ 748 return GetPDFWindow(pPageView, FALSE); 749} 750 751void CFFL_FormFiller::TimerProc() 752{ 753 754} 755 756IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const 757{ 758 return m_pApp->GetSysHandler(); 759// return NULL; 760} 761 762void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown) 763{ 764} 765 766void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow) 767{ 768 m_bValid = FALSE; 769 770 FX_RECT rcRect = this->GetViewBBox(pPageView, m_pWidget); 771 this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom); 772 773 if(bDestroyPDFWindow) 774 DestroyPDFWindow(pPageView); 775} 776 777FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument) 778{ 779 return FALSE; 780} 781 782FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument) 783{ 784 return FALSE; 785} 786 787FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument) 788{ 789 return FALSE; 790} 791 792void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument) 793{ 794} 795 796void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument) 797{ 798} 799 800void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument) 801{ 802} 803 804void CFFL_FormFiller::InvalidateRect(double left, double top, double right, double bottom) 805{ 806 CPDF_Page * pPage = m_pWidget->GetPDFPage(); 807 m_pApp->FFI_Invalidate(pPage, left, top, right, bottom); 808} 809 810/* ------------------------- CFFL_Button ------------------------- */ 811 812CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) : 813 CFFL_FormFiller(pApp, pWidget), 814 m_bMouseIn(FALSE), 815 m_bMouseDown(FALSE) 816{ 817} 818 819CFFL_Button::~CFFL_Button() 820{ 821} 822 823void CFFL_Button::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) 824{ 825 m_bMouseIn = TRUE; 826 FX_RECT rect = this->GetViewBBox(pPageView,pAnnot); 827 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); 828// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE); 829} 830 831void CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) 832{ 833 m_bMouseIn = FALSE; 834 835 FX_RECT rect = this->GetViewBBox(pPageView,pAnnot); 836 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); 837// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE); 838 EndTimer(); 839 ASSERT(m_pWidget != NULL); 840// m_pWidget->HideHint(); 841} 842 843FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 844{ 845 CPDF_Rect rcAnnot = pAnnot->GetRect(); 846 if(!rcAnnot.Contains(point.x, point.y)) 847 return FALSE; 848 849 m_bMouseDown = TRUE; 850 m_bValid = TRUE; 851 FX_RECT rect = this->GetViewBBox(pPageView, pAnnot); 852 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); 853// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE); 854 return TRUE; 855} 856 857FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 858{ 859 CPDF_Rect rcAnnot = pAnnot->GetRect(); 860 if(!rcAnnot.Contains(point.x, point.y)) 861 return FALSE; 862 863 m_bMouseDown = FALSE; 864 m_pWidget->GetPDFPage(); 865 866 867 FX_RECT rect = this->GetViewBBox(pPageView, pAnnot); 868 this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); 869// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE); 870 return TRUE; 871} 872 873FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point) 874{ 875 ASSERT(m_pApp != NULL); 876 877 return TRUE; 878} 879 880void CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, 881 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 882 /*const CRect& rcWindow,*/ FX_DWORD dwFlags) 883{ 884 ASSERT(pPageView != NULL); 885 ASSERT(pAnnot != NULL); 886 887 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 888 889 CPDF_FormControl* pCtrl = pWidget->GetFormControl(); 890 ASSERT(pCtrl != NULL); 891 892 CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode(); 893 894 if (eHM == CPDF_FormControl::Push) 895 { 896 if (m_bMouseDown) 897 { 898 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down)) 899 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL); 900 else 901 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); 902 } 903 else if (m_bMouseIn) 904 { 905 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover)) 906 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, NULL); 907 else 908 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); 909 } 910 else 911 { 912 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); 913 } 914 } 915 else 916 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL); 917} 918 919 920void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot, 921 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 922 /*const CRect& rcWindow, */FX_DWORD dwFlags) 923{ 924 OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); 925} 926