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 "fpdfsdk/include/formfiller/FFL_CheckBox.h" 8 9 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h" 10 #include "fpdfsdk/include/fsdk_mgr.h" 11 #include "fpdfsdk/include/pdfwindow/PWL_SpecialButton.h" 12 #include "public/fpdf_fwlevent.h" 13 14 CFFL_CheckBox::CFFL_CheckBox(CPDFDoc_Environment* pApp, CPDFSDK_Widget* pWidget) 15 : CFFL_Button(pApp, pWidget) {} 16 17 CFFL_CheckBox::~CFFL_CheckBox() {} 18 19 CPWL_Wnd* CFFL_CheckBox::NewPDFWindow(const PWL_CREATEPARAM& cp, 20 CPDFSDK_PageView* pPageView) { 21 CPWL_CheckBox* pWnd = new CPWL_CheckBox(); 22 pWnd->Create(cp); 23 pWnd->SetCheck(m_pWidget->IsChecked()); 24 return pWnd; 25 } 26 27 FX_BOOL CFFL_CheckBox::OnKeyDown(CPDFSDK_Annot* pAnnot, 28 FX_UINT nKeyCode, 29 FX_UINT nFlags) { 30 switch (nKeyCode) { 31 case FWL_VKEY_Return: 32 case FWL_VKEY_Space: 33 return TRUE; 34 default: 35 return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags); 36 } 37 } 38 FX_BOOL CFFL_CheckBox::OnChar(CPDFSDK_Annot* pAnnot, 39 FX_UINT nChar, 40 FX_UINT nFlags) { 41 switch (nChar) { 42 case FWL_VKEY_Return: 43 case FWL_VKEY_Space: { 44 CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); 45 ASSERT(pIFormFiller); 46 47 CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); 48 ASSERT(pPageView); 49 50 FX_BOOL bReset = FALSE; 51 FX_BOOL bExit = FALSE; 52 53 pIFormFiller->OnButtonUp(m_pWidget, pPageView, bReset, bExit, nFlags); 54 55 if (bReset) 56 return TRUE; 57 if (bExit) 58 return TRUE; 59 60 CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); 61 62 if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE)) 63 pWnd->SetCheck(!pWnd->IsChecked()); 64 65 CommitData(pPageView, nFlags); 66 return TRUE; 67 } 68 default: 69 return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); 70 } 71 } 72 73 FX_BOOL CFFL_CheckBox::OnLButtonUp(CPDFSDK_PageView* pPageView, 74 CPDFSDK_Annot* pAnnot, 75 FX_UINT nFlags, 76 const CPDF_Point& point) { 77 CFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point); 78 79 if (IsValid()) { 80 if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE)) { 81 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 82 pWnd->SetCheck(!pWidget->IsChecked()); 83 } 84 85 if (!CommitData(pPageView, nFlags)) 86 return FALSE; 87 } 88 89 return TRUE; 90 } 91 92 FX_BOOL CFFL_CheckBox::IsDataChanged(CPDFSDK_PageView* pPageView) { 93 CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE); 94 return pWnd && pWnd->IsChecked() != m_pWidget->IsChecked(); 95 } 96 97 void CFFL_CheckBox::SaveData(CPDFSDK_PageView* pPageView) { 98 if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE)) { 99 FX_BOOL bNewChecked = pWnd->IsChecked(); 100 101 if (bNewChecked) { 102 CPDF_FormField* pField = m_pWidget->GetFormField(); 103 ASSERT(pField != NULL); 104 105 for (int32_t i = 0, sz = pField->CountControls(); i < sz; i++) { 106 if (CPDF_FormControl* pCtrl = pField->GetControl(i)) { 107 if (pCtrl->IsChecked()) { 108 break; 109 } 110 } 111 } 112 } 113 114 m_pWidget->SetCheck(bNewChecked, FALSE); 115 m_pWidget->UpdateField(); 116 SetChangeMark(); 117 } 118 } 119