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