xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_checkbox.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_checkbox.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
11*3ac0a46fSAndroid Build Coastguard Worker 
12*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fde/cfde_textout.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_app.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_event.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagekey.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagemouse.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_notedriver.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_themebackground.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_themetext.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_widgetmgr.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/fwl_widgetdef.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/ifwl_themeprovider.h"
23*3ac0a46fSAndroid Build Coastguard Worker 
24*3ac0a46fSAndroid Build Coastguard Worker namespace {
25*3ac0a46fSAndroid Build Coastguard Worker 
26*3ac0a46fSAndroid Build Coastguard Worker const int kCaptionMargin = 5;
27*3ac0a46fSAndroid Build Coastguard Worker 
28*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
29*3ac0a46fSAndroid Build Coastguard Worker 
CFWL_CheckBox(CFWL_App * app)30*3ac0a46fSAndroid Build Coastguard Worker CFWL_CheckBox::CFWL_CheckBox(CFWL_App* app)
31*3ac0a46fSAndroid Build Coastguard Worker     : CFWL_Widget(app, Properties(), nullptr) {
32*3ac0a46fSAndroid Build Coastguard Worker   m_TTOStyles.single_line_ = true;
33*3ac0a46fSAndroid Build Coastguard Worker }
34*3ac0a46fSAndroid Build Coastguard Worker 
35*3ac0a46fSAndroid Build Coastguard Worker CFWL_CheckBox::~CFWL_CheckBox() = default;
36*3ac0a46fSAndroid Build Coastguard Worker 
GetClassID() const37*3ac0a46fSAndroid Build Coastguard Worker FWL_Type CFWL_CheckBox::GetClassID() const {
38*3ac0a46fSAndroid Build Coastguard Worker   return FWL_Type::CheckBox;
39*3ac0a46fSAndroid Build Coastguard Worker }
40*3ac0a46fSAndroid Build Coastguard Worker 
SetBoxSize(float fHeight)41*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::SetBoxSize(float fHeight) {
42*3ac0a46fSAndroid Build Coastguard Worker   m_fBoxHeight = fHeight;
43*3ac0a46fSAndroid Build Coastguard Worker }
44*3ac0a46fSAndroid Build Coastguard Worker 
Update()45*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::Update() {
46*3ac0a46fSAndroid Build Coastguard Worker   if (IsLocked())
47*3ac0a46fSAndroid Build Coastguard Worker     return;
48*3ac0a46fSAndroid Build Coastguard Worker 
49*3ac0a46fSAndroid Build Coastguard Worker   UpdateTextOutStyles();
50*3ac0a46fSAndroid Build Coastguard Worker   Layout();
51*3ac0a46fSAndroid Build Coastguard Worker }
52*3ac0a46fSAndroid Build Coastguard Worker 
DrawWidget(CFGAS_GEGraphics * pGraphics,const CFX_Matrix & matrix)53*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::DrawWidget(CFGAS_GEGraphics* pGraphics,
54*3ac0a46fSAndroid Build Coastguard Worker                                const CFX_Matrix& matrix) {
55*3ac0a46fSAndroid Build Coastguard Worker   if (!pGraphics)
56*3ac0a46fSAndroid Build Coastguard Worker     return;
57*3ac0a46fSAndroid Build Coastguard Worker 
58*3ac0a46fSAndroid Build Coastguard Worker   if (HasBorder())
59*3ac0a46fSAndroid Build Coastguard Worker     DrawBorder(pGraphics, CFWL_ThemePart::Part::kBorder, matrix);
60*3ac0a46fSAndroid Build Coastguard Worker 
61*3ac0a46fSAndroid Build Coastguard Worker   Mask<CFWL_PartState> dwStates = GetPartStates();
62*3ac0a46fSAndroid Build Coastguard Worker   IFWL_ThemeProvider* pTheme = GetThemeProvider();
63*3ac0a46fSAndroid Build Coastguard Worker   CFWL_ThemeBackground param(CFWL_ThemePart::Part::kBackground, this,
64*3ac0a46fSAndroid Build Coastguard Worker                              pGraphics);
65*3ac0a46fSAndroid Build Coastguard Worker   param.m_dwStates = dwStates;
66*3ac0a46fSAndroid Build Coastguard Worker   param.m_matrix = matrix;
67*3ac0a46fSAndroid Build Coastguard Worker   param.m_PartRect = m_ClientRect;
68*3ac0a46fSAndroid Build Coastguard Worker   if (m_Properties.m_dwStates & FWL_STATE_WGT_Focused)
69*3ac0a46fSAndroid Build Coastguard Worker     param.m_pRtData = &m_FocusRect;
70*3ac0a46fSAndroid Build Coastguard Worker   pTheme->DrawBackground(param);
71*3ac0a46fSAndroid Build Coastguard Worker 
72*3ac0a46fSAndroid Build Coastguard Worker   CFWL_ThemeBackground checkParam(CFWL_ThemePart::Part::kCheckBox, this,
73*3ac0a46fSAndroid Build Coastguard Worker                                   pGraphics);
74*3ac0a46fSAndroid Build Coastguard Worker   checkParam.m_dwStates = dwStates;
75*3ac0a46fSAndroid Build Coastguard Worker   checkParam.m_matrix = matrix;
76*3ac0a46fSAndroid Build Coastguard Worker   checkParam.m_PartRect = m_BoxRect;
77*3ac0a46fSAndroid Build Coastguard Worker   if (m_Properties.m_dwStates & FWL_STATE_WGT_Focused)
78*3ac0a46fSAndroid Build Coastguard Worker     checkParam.m_pRtData = &m_FocusRect;
79*3ac0a46fSAndroid Build Coastguard Worker   pTheme->DrawBackground(checkParam);
80*3ac0a46fSAndroid Build Coastguard Worker 
81*3ac0a46fSAndroid Build Coastguard Worker   CFWL_ThemeText textParam(CFWL_ThemePart::Part::kCaption, this, pGraphics);
82*3ac0a46fSAndroid Build Coastguard Worker   textParam.m_dwStates = dwStates;
83*3ac0a46fSAndroid Build Coastguard Worker   textParam.m_matrix = matrix;
84*3ac0a46fSAndroid Build Coastguard Worker   textParam.m_PartRect = m_CaptionRect;
85*3ac0a46fSAndroid Build Coastguard Worker   textParam.m_wsText = L"Check box";
86*3ac0a46fSAndroid Build Coastguard Worker   textParam.m_dwTTOStyles = m_TTOStyles;
87*3ac0a46fSAndroid Build Coastguard Worker   textParam.m_iTTOAlign = m_iTTOAlign;
88*3ac0a46fSAndroid Build Coastguard Worker   pTheme->DrawText(textParam);
89*3ac0a46fSAndroid Build Coastguard Worker }
90*3ac0a46fSAndroid Build Coastguard Worker 
SetCheckState(int32_t iCheck)91*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::SetCheckState(int32_t iCheck) {
92*3ac0a46fSAndroid Build Coastguard Worker   m_Properties.m_dwStates &= ~FWL_STATE_CKB_CheckMask;
93*3ac0a46fSAndroid Build Coastguard Worker   switch (iCheck) {
94*3ac0a46fSAndroid Build Coastguard Worker     case 1:
95*3ac0a46fSAndroid Build Coastguard Worker       m_Properties.m_dwStates |= FWL_STATE_CKB_Checked;
96*3ac0a46fSAndroid Build Coastguard Worker       break;
97*3ac0a46fSAndroid Build Coastguard Worker     case 2:
98*3ac0a46fSAndroid Build Coastguard Worker       if (m_Properties.m_dwStyleExts & FWL_STYLEEXT_CKB_3State)
99*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates |= FWL_STATE_CKB_Neutral;
100*3ac0a46fSAndroid Build Coastguard Worker       break;
101*3ac0a46fSAndroid Build Coastguard Worker     default:
102*3ac0a46fSAndroid Build Coastguard Worker       break;
103*3ac0a46fSAndroid Build Coastguard Worker   }
104*3ac0a46fSAndroid Build Coastguard Worker   RepaintRect(m_ClientRect);
105*3ac0a46fSAndroid Build Coastguard Worker }
106*3ac0a46fSAndroid Build Coastguard Worker 
Layout()107*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::Layout() {
108*3ac0a46fSAndroid Build Coastguard Worker   m_WidgetRect.width = FXSYS_roundf(m_WidgetRect.width);
109*3ac0a46fSAndroid Build Coastguard Worker   m_WidgetRect.height = FXSYS_roundf(m_WidgetRect.height);
110*3ac0a46fSAndroid Build Coastguard Worker   m_ClientRect = GetClientRect();
111*3ac0a46fSAndroid Build Coastguard Worker 
112*3ac0a46fSAndroid Build Coastguard Worker   float fTextLeft = m_ClientRect.left + m_fBoxHeight;
113*3ac0a46fSAndroid Build Coastguard Worker   m_BoxRect = CFX_RectF(m_ClientRect.TopLeft(), m_fBoxHeight, m_fBoxHeight);
114*3ac0a46fSAndroid Build Coastguard Worker   m_CaptionRect =
115*3ac0a46fSAndroid Build Coastguard Worker       CFX_RectF(fTextLeft, m_ClientRect.top, m_ClientRect.right() - fTextLeft,
116*3ac0a46fSAndroid Build Coastguard Worker                 m_ClientRect.height);
117*3ac0a46fSAndroid Build Coastguard Worker   m_CaptionRect.Inflate(-kCaptionMargin, -kCaptionMargin);
118*3ac0a46fSAndroid Build Coastguard Worker 
119*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtFocus = m_CaptionRect;
120*3ac0a46fSAndroid Build Coastguard Worker   CalcTextRect(L"Check box", m_TTOStyles, m_iTTOAlign, &rtFocus);
121*3ac0a46fSAndroid Build Coastguard Worker   m_FocusRect = CFX_RectF(m_CaptionRect.TopLeft(),
122*3ac0a46fSAndroid Build Coastguard Worker                           std::max(m_CaptionRect.width, rtFocus.width),
123*3ac0a46fSAndroid Build Coastguard Worker                           std::min(m_CaptionRect.height, rtFocus.height));
124*3ac0a46fSAndroid Build Coastguard Worker   m_FocusRect.Inflate(1, 1);
125*3ac0a46fSAndroid Build Coastguard Worker }
126*3ac0a46fSAndroid Build Coastguard Worker 
GetPartStates() const127*3ac0a46fSAndroid Build Coastguard Worker Mask<CFWL_PartState> CFWL_CheckBox::GetPartStates() const {
128*3ac0a46fSAndroid Build Coastguard Worker   Mask<CFWL_PartState> dwStates = CFWL_PartState::kNormal;
129*3ac0a46fSAndroid Build Coastguard Worker   if ((m_Properties.m_dwStates & FWL_STATE_CKB_CheckMask) ==
130*3ac0a46fSAndroid Build Coastguard Worker       FWL_STATE_CKB_Neutral) {
131*3ac0a46fSAndroid Build Coastguard Worker     dwStates = CFWL_PartState::kNeutral;
132*3ac0a46fSAndroid Build Coastguard Worker   } else if ((m_Properties.m_dwStates & FWL_STATE_CKB_CheckMask) ==
133*3ac0a46fSAndroid Build Coastguard Worker              FWL_STATE_CKB_Checked) {
134*3ac0a46fSAndroid Build Coastguard Worker     dwStates = CFWL_PartState::kChecked;
135*3ac0a46fSAndroid Build Coastguard Worker   }
136*3ac0a46fSAndroid Build Coastguard Worker   if (m_Properties.m_dwStates & FWL_STATE_WGT_Disabled)
137*3ac0a46fSAndroid Build Coastguard Worker     dwStates |= CFWL_PartState::kDisabled;
138*3ac0a46fSAndroid Build Coastguard Worker   else if (m_Properties.m_dwStates & FWL_STATE_CKB_Hovered)
139*3ac0a46fSAndroid Build Coastguard Worker     dwStates |= CFWL_PartState::kHovered;
140*3ac0a46fSAndroid Build Coastguard Worker   else if (m_Properties.m_dwStates & FWL_STATE_CKB_Pressed)
141*3ac0a46fSAndroid Build Coastguard Worker     dwStates |= CFWL_PartState::kPressed;
142*3ac0a46fSAndroid Build Coastguard Worker   else
143*3ac0a46fSAndroid Build Coastguard Worker     dwStates |= CFWL_PartState::kNormal;
144*3ac0a46fSAndroid Build Coastguard Worker   if (m_Properties.m_dwStates & FWL_STATE_WGT_Focused)
145*3ac0a46fSAndroid Build Coastguard Worker     dwStates |= CFWL_PartState::kFocused;
146*3ac0a46fSAndroid Build Coastguard Worker   return dwStates;
147*3ac0a46fSAndroid Build Coastguard Worker }
148*3ac0a46fSAndroid Build Coastguard Worker 
UpdateTextOutStyles()149*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::UpdateTextOutStyles() {
150*3ac0a46fSAndroid Build Coastguard Worker   m_iTTOAlign = FDE_TextAlignment::kTopLeft;
151*3ac0a46fSAndroid Build Coastguard Worker   m_TTOStyles.Reset();
152*3ac0a46fSAndroid Build Coastguard Worker   m_TTOStyles.single_line_ = true;
153*3ac0a46fSAndroid Build Coastguard Worker }
154*3ac0a46fSAndroid Build Coastguard Worker 
NextStates()155*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::NextStates() {
156*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFirststate = m_Properties.m_dwStates;
157*3ac0a46fSAndroid Build Coastguard Worker   if (m_Properties.m_dwStyleExts & FWL_STYLEEXT_CKB_RadioButton) {
158*3ac0a46fSAndroid Build Coastguard Worker     if ((m_Properties.m_dwStates & FWL_STATE_CKB_CheckMask) ==
159*3ac0a46fSAndroid Build Coastguard Worker         FWL_STATE_CKB_Unchecked) {
160*3ac0a46fSAndroid Build Coastguard Worker       m_Properties.m_dwStates |= FWL_STATE_CKB_Checked;
161*3ac0a46fSAndroid Build Coastguard Worker     }
162*3ac0a46fSAndroid Build Coastguard Worker   } else {
163*3ac0a46fSAndroid Build Coastguard Worker     if ((m_Properties.m_dwStates & FWL_STATE_CKB_CheckMask) ==
164*3ac0a46fSAndroid Build Coastguard Worker         FWL_STATE_CKB_Neutral) {
165*3ac0a46fSAndroid Build Coastguard Worker       m_Properties.m_dwStates &= ~FWL_STATE_CKB_CheckMask;
166*3ac0a46fSAndroid Build Coastguard Worker       if (m_Properties.m_dwStyleExts & FWL_STYLEEXT_CKB_3State)
167*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates |= FWL_STATE_CKB_Checked;
168*3ac0a46fSAndroid Build Coastguard Worker     } else if ((m_Properties.m_dwStates & FWL_STATE_CKB_CheckMask) ==
169*3ac0a46fSAndroid Build Coastguard Worker                FWL_STATE_CKB_Checked) {
170*3ac0a46fSAndroid Build Coastguard Worker       m_Properties.m_dwStates &= ~FWL_STATE_CKB_CheckMask;
171*3ac0a46fSAndroid Build Coastguard Worker     } else {
172*3ac0a46fSAndroid Build Coastguard Worker       if (m_Properties.m_dwStyleExts & FWL_STYLEEXT_CKB_3State)
173*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates |= FWL_STATE_CKB_Neutral;
174*3ac0a46fSAndroid Build Coastguard Worker       else
175*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates |= FWL_STATE_CKB_Checked;
176*3ac0a46fSAndroid Build Coastguard Worker     }
177*3ac0a46fSAndroid Build Coastguard Worker   }
178*3ac0a46fSAndroid Build Coastguard Worker 
179*3ac0a46fSAndroid Build Coastguard Worker   RepaintRect(m_ClientRect);
180*3ac0a46fSAndroid Build Coastguard Worker   if (dwFirststate == m_Properties.m_dwStates)
181*3ac0a46fSAndroid Build Coastguard Worker     return;
182*3ac0a46fSAndroid Build Coastguard Worker 
183*3ac0a46fSAndroid Build Coastguard Worker   CFWL_Event wmCheckBoxState(CFWL_Event::Type::CheckStateChanged, this);
184*3ac0a46fSAndroid Build Coastguard Worker   DispatchEvent(&wmCheckBoxState);
185*3ac0a46fSAndroid Build Coastguard Worker }
186*3ac0a46fSAndroid Build Coastguard Worker 
OnProcessMessage(CFWL_Message * pMessage)187*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnProcessMessage(CFWL_Message* pMessage) {
188*3ac0a46fSAndroid Build Coastguard Worker   switch (pMessage->GetType()) {
189*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kSetFocus:
190*3ac0a46fSAndroid Build Coastguard Worker       OnFocusGained();
191*3ac0a46fSAndroid Build Coastguard Worker       break;
192*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kKillFocus:
193*3ac0a46fSAndroid Build Coastguard Worker       OnFocusLost();
194*3ac0a46fSAndroid Build Coastguard Worker       break;
195*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kMouse: {
196*3ac0a46fSAndroid Build Coastguard Worker       CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage);
197*3ac0a46fSAndroid Build Coastguard Worker       switch (pMsg->m_dwCmd) {
198*3ac0a46fSAndroid Build Coastguard Worker         case CFWL_MessageMouse::MouseCommand::kLeftButtonDown:
199*3ac0a46fSAndroid Build Coastguard Worker           OnLButtonDown();
200*3ac0a46fSAndroid Build Coastguard Worker           break;
201*3ac0a46fSAndroid Build Coastguard Worker         case CFWL_MessageMouse::MouseCommand::kLeftButtonUp:
202*3ac0a46fSAndroid Build Coastguard Worker           OnLButtonUp(pMsg);
203*3ac0a46fSAndroid Build Coastguard Worker           break;
204*3ac0a46fSAndroid Build Coastguard Worker         case CFWL_MessageMouse::MouseCommand::kMove:
205*3ac0a46fSAndroid Build Coastguard Worker           OnMouseMove(pMsg);
206*3ac0a46fSAndroid Build Coastguard Worker           break;
207*3ac0a46fSAndroid Build Coastguard Worker         case CFWL_MessageMouse::MouseCommand::kLeave:
208*3ac0a46fSAndroid Build Coastguard Worker           OnMouseLeave();
209*3ac0a46fSAndroid Build Coastguard Worker           break;
210*3ac0a46fSAndroid Build Coastguard Worker         default:
211*3ac0a46fSAndroid Build Coastguard Worker           break;
212*3ac0a46fSAndroid Build Coastguard Worker       }
213*3ac0a46fSAndroid Build Coastguard Worker       break;
214*3ac0a46fSAndroid Build Coastguard Worker     }
215*3ac0a46fSAndroid Build Coastguard Worker     case CFWL_Message::Type::kKey: {
216*3ac0a46fSAndroid Build Coastguard Worker       CFWL_MessageKey* pKey = static_cast<CFWL_MessageKey*>(pMessage);
217*3ac0a46fSAndroid Build Coastguard Worker       if (pKey->m_dwCmd == CFWL_MessageKey::KeyCommand::kKeyDown)
218*3ac0a46fSAndroid Build Coastguard Worker         OnKeyDown(pKey);
219*3ac0a46fSAndroid Build Coastguard Worker       break;
220*3ac0a46fSAndroid Build Coastguard Worker     }
221*3ac0a46fSAndroid Build Coastguard Worker     default:
222*3ac0a46fSAndroid Build Coastguard Worker       break;
223*3ac0a46fSAndroid Build Coastguard Worker   }
224*3ac0a46fSAndroid Build Coastguard Worker   // Dst target could be |this|, continue only if not destroyed by above.
225*3ac0a46fSAndroid Build Coastguard Worker   if (pMessage->GetDstTarget())
226*3ac0a46fSAndroid Build Coastguard Worker     CFWL_Widget::OnProcessMessage(pMessage);
227*3ac0a46fSAndroid Build Coastguard Worker }
228*3ac0a46fSAndroid Build Coastguard Worker 
OnDrawWidget(CFGAS_GEGraphics * pGraphics,const CFX_Matrix & matrix)229*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnDrawWidget(CFGAS_GEGraphics* pGraphics,
230*3ac0a46fSAndroid Build Coastguard Worker                                  const CFX_Matrix& matrix) {
231*3ac0a46fSAndroid Build Coastguard Worker   DrawWidget(pGraphics, matrix);
232*3ac0a46fSAndroid Build Coastguard Worker }
233*3ac0a46fSAndroid Build Coastguard Worker 
OnFocusGained()234*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnFocusGained() {
235*3ac0a46fSAndroid Build Coastguard Worker   m_Properties.m_dwStates |= FWL_STATE_WGT_Focused;
236*3ac0a46fSAndroid Build Coastguard Worker   RepaintRect(m_ClientRect);
237*3ac0a46fSAndroid Build Coastguard Worker }
238*3ac0a46fSAndroid Build Coastguard Worker 
OnFocusLost()239*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnFocusLost() {
240*3ac0a46fSAndroid Build Coastguard Worker   m_Properties.m_dwStates &= ~FWL_STATE_WGT_Focused;
241*3ac0a46fSAndroid Build Coastguard Worker   RepaintRect(m_ClientRect);
242*3ac0a46fSAndroid Build Coastguard Worker }
243*3ac0a46fSAndroid Build Coastguard Worker 
OnLButtonDown()244*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnLButtonDown() {
245*3ac0a46fSAndroid Build Coastguard Worker   if (m_Properties.m_dwStates & FWL_STATE_WGT_Disabled)
246*3ac0a46fSAndroid Build Coastguard Worker     return;
247*3ac0a46fSAndroid Build Coastguard Worker 
248*3ac0a46fSAndroid Build Coastguard Worker   m_bBtnDown = true;
249*3ac0a46fSAndroid Build Coastguard Worker   m_Properties.m_dwStates &= ~FWL_STATE_CKB_Hovered;
250*3ac0a46fSAndroid Build Coastguard Worker   m_Properties.m_dwStates |= FWL_STATE_CKB_Pressed;
251*3ac0a46fSAndroid Build Coastguard Worker   RepaintRect(m_ClientRect);
252*3ac0a46fSAndroid Build Coastguard Worker }
253*3ac0a46fSAndroid Build Coastguard Worker 
OnLButtonUp(CFWL_MessageMouse * pMsg)254*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnLButtonUp(CFWL_MessageMouse* pMsg) {
255*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bBtnDown)
256*3ac0a46fSAndroid Build Coastguard Worker     return;
257*3ac0a46fSAndroid Build Coastguard Worker 
258*3ac0a46fSAndroid Build Coastguard Worker   m_bBtnDown = false;
259*3ac0a46fSAndroid Build Coastguard Worker   if (!m_ClientRect.Contains(pMsg->m_pos))
260*3ac0a46fSAndroid Build Coastguard Worker     return;
261*3ac0a46fSAndroid Build Coastguard Worker 
262*3ac0a46fSAndroid Build Coastguard Worker   m_Properties.m_dwStates |= FWL_STATE_CKB_Hovered;
263*3ac0a46fSAndroid Build Coastguard Worker   m_Properties.m_dwStates &= ~FWL_STATE_CKB_Pressed;
264*3ac0a46fSAndroid Build Coastguard Worker   NextStates();
265*3ac0a46fSAndroid Build Coastguard Worker }
266*3ac0a46fSAndroid Build Coastguard Worker 
OnMouseMove(CFWL_MessageMouse * pMsg)267*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnMouseMove(CFWL_MessageMouse* pMsg) {
268*3ac0a46fSAndroid Build Coastguard Worker   if (m_Properties.m_dwStates & FWL_STATE_WGT_Disabled)
269*3ac0a46fSAndroid Build Coastguard Worker     return;
270*3ac0a46fSAndroid Build Coastguard Worker 
271*3ac0a46fSAndroid Build Coastguard Worker   bool bRepaint = false;
272*3ac0a46fSAndroid Build Coastguard Worker   if (m_bBtnDown) {
273*3ac0a46fSAndroid Build Coastguard Worker     if (m_ClientRect.Contains(pMsg->m_pos)) {
274*3ac0a46fSAndroid Build Coastguard Worker       if ((m_Properties.m_dwStates & FWL_STATE_CKB_Pressed) == 0) {
275*3ac0a46fSAndroid Build Coastguard Worker         bRepaint = true;
276*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates |= FWL_STATE_CKB_Pressed;
277*3ac0a46fSAndroid Build Coastguard Worker       }
278*3ac0a46fSAndroid Build Coastguard Worker       if ((m_Properties.m_dwStates & FWL_STATE_CKB_Hovered)) {
279*3ac0a46fSAndroid Build Coastguard Worker         bRepaint = true;
280*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates &= ~FWL_STATE_CKB_Hovered;
281*3ac0a46fSAndroid Build Coastguard Worker       }
282*3ac0a46fSAndroid Build Coastguard Worker     } else {
283*3ac0a46fSAndroid Build Coastguard Worker       if (m_Properties.m_dwStates & FWL_STATE_CKB_Pressed) {
284*3ac0a46fSAndroid Build Coastguard Worker         bRepaint = true;
285*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates &= ~FWL_STATE_CKB_Pressed;
286*3ac0a46fSAndroid Build Coastguard Worker       }
287*3ac0a46fSAndroid Build Coastguard Worker       if ((m_Properties.m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
288*3ac0a46fSAndroid Build Coastguard Worker         bRepaint = true;
289*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates |= FWL_STATE_CKB_Hovered;
290*3ac0a46fSAndroid Build Coastguard Worker       }
291*3ac0a46fSAndroid Build Coastguard Worker     }
292*3ac0a46fSAndroid Build Coastguard Worker   } else {
293*3ac0a46fSAndroid Build Coastguard Worker     if (m_ClientRect.Contains(pMsg->m_pos)) {
294*3ac0a46fSAndroid Build Coastguard Worker       if ((m_Properties.m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
295*3ac0a46fSAndroid Build Coastguard Worker         bRepaint = true;
296*3ac0a46fSAndroid Build Coastguard Worker         m_Properties.m_dwStates |= FWL_STATE_CKB_Hovered;
297*3ac0a46fSAndroid Build Coastguard Worker       }
298*3ac0a46fSAndroid Build Coastguard Worker     }
299*3ac0a46fSAndroid Build Coastguard Worker   }
300*3ac0a46fSAndroid Build Coastguard Worker   if (bRepaint)
301*3ac0a46fSAndroid Build Coastguard Worker     RepaintRect(m_BoxRect);
302*3ac0a46fSAndroid Build Coastguard Worker }
303*3ac0a46fSAndroid Build Coastguard Worker 
OnMouseLeave()304*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnMouseLeave() {
305*3ac0a46fSAndroid Build Coastguard Worker   if (m_bBtnDown)
306*3ac0a46fSAndroid Build Coastguard Worker     m_Properties.m_dwStates |= FWL_STATE_CKB_Hovered;
307*3ac0a46fSAndroid Build Coastguard Worker   else
308*3ac0a46fSAndroid Build Coastguard Worker     m_Properties.m_dwStates &= ~FWL_STATE_CKB_Hovered;
309*3ac0a46fSAndroid Build Coastguard Worker 
310*3ac0a46fSAndroid Build Coastguard Worker   RepaintRect(m_BoxRect);
311*3ac0a46fSAndroid Build Coastguard Worker }
312*3ac0a46fSAndroid Build Coastguard Worker 
OnKeyDown(CFWL_MessageKey * pMsg)313*3ac0a46fSAndroid Build Coastguard Worker void CFWL_CheckBox::OnKeyDown(CFWL_MessageKey* pMsg) {
314*3ac0a46fSAndroid Build Coastguard Worker   if (pMsg->m_dwKeyCodeOrChar == XFA_FWL_VKEY_Tab)
315*3ac0a46fSAndroid Build Coastguard Worker     return;
316*3ac0a46fSAndroid Build Coastguard Worker   if (pMsg->m_dwKeyCodeOrChar == XFA_FWL_VKEY_Return ||
317*3ac0a46fSAndroid Build Coastguard Worker       pMsg->m_dwKeyCodeOrChar == XFA_FWL_VKEY_Space) {
318*3ac0a46fSAndroid Build Coastguard Worker     NextStates();
319*3ac0a46fSAndroid Build Coastguard Worker   }
320*3ac0a46fSAndroid Build Coastguard Worker }
321