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