cffl_checkbox.cpp revision 4d3acf4ec42bf6e838f9060103aff98fbf170794
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/formfiller/cffl_checkbox.h" 8 9#include "fpdfsdk/cpdfsdk_formfillenvironment.h" 10#include "fpdfsdk/cpdfsdk_widget.h" 11#include "fpdfsdk/formfiller/cffl_formfiller.h" 12#include "fpdfsdk/pdfwindow/PWL_SpecialButton.h" 13#include "public/fpdf_fwlevent.h" 14 15CFFL_CheckBox::CFFL_CheckBox(CPDFSDK_FormFillEnvironment* pApp, 16 CPDFSDK_Widget* pWidget) 17 : CFFL_Button(pApp, pWidget) {} 18 19CFFL_CheckBox::~CFFL_CheckBox() {} 20 21CPWL_Wnd* CFFL_CheckBox::NewPDFWindow(const PWL_CREATEPARAM& cp, 22 CPDFSDK_PageView* pPageView) { 23 CPWL_CheckBox* pWnd = new CPWL_CheckBox(); 24 pWnd->Create(cp); 25 pWnd->SetCheck(m_pWidget->IsChecked()); 26 return pWnd; 27} 28 29bool CFFL_CheckBox::OnKeyDown(CPDFSDK_Annot* pAnnot, 30 uint32_t nKeyCode, 31 uint32_t nFlags) { 32 switch (nKeyCode) { 33 case FWL_VKEY_Return: 34 case FWL_VKEY_Space: 35 return true; 36 default: 37 return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags); 38 } 39} 40bool CFFL_CheckBox::OnChar(CPDFSDK_Annot* pAnnot, 41 uint32_t nChar, 42 uint32_t nFlags) { 43 switch (nChar) { 44 case FWL_VKEY_Return: 45 case FWL_VKEY_Space: { 46 CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); 47 ASSERT(pPageView); 48 49 bool bReset = false; 50 bool bExit = false; 51 CPDFSDK_Annot::ObservedPtr pObserved(m_pWidget); 52 m_pFormFillEnv->GetInteractiveFormFiller()->OnButtonUp( 53 &pObserved, pPageView, bReset, bExit, nFlags); 54 if (!pObserved) { 55 m_pWidget = nullptr; 56 return true; 57 } 58 if (bReset || bExit) 59 return true; 60 61 CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); 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 73bool CFFL_CheckBox::OnLButtonUp(CPDFSDK_PageView* pPageView, 74 CPDFSDK_Annot* pAnnot, 75 uint32_t nFlags, 76 const CFX_FloatPoint& 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 92bool 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 97void CFFL_CheckBox::SaveData(CPDFSDK_PageView* pPageView) { 98 if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, false)) { 99 bool bNewChecked = pWnd->IsChecked(); 100 101 if (bNewChecked) { 102 CPDF_FormField* pField = m_pWidget->GetFormField(); 103 for (int32_t i = 0, sz = pField->CountControls(); i < sz; i++) { 104 if (CPDF_FormControl* pCtrl = pField->GetControl(i)) { 105 if (pCtrl->IsChecked()) { 106 break; 107 } 108 } 109 } 110 } 111 112 m_pWidget->SetCheck(bNewChecked, false); 113 m_pWidget->UpdateField(); 114 SetChangeMark(); 115 } 116} 117