Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(657)

Side by Side Diff: xfa/fwl/core/cfwl_datetimepicker.cpp

Issue 2524173002: Merge IFWL and CFWL classes. (Closed)
Patch Set: make chrome build happy Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fwl/core/cfwl_datetimepicker.h" 7 #include "xfa/fwl/core/cfwl_datetimepicker.h"
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility>
10 11
11 #include "third_party/base/ptr_util.h" 12 #include "third_party/base/ptr_util.h"
12 #include "xfa/fwl/core/fwl_error.h" 13 #include "xfa/fwl/core/cfwl_evteditchanged.h"
13 #include "xfa/fwl/core/ifwl_datetimepicker.h" 14 #include "xfa/fwl/core/cfwl_evtselectchanged.h"
14 #include "xfa/fwl/core/ifwl_widget.h" 15 #include "xfa/fwl/core/cfwl_formproxy.h"
16 #include "xfa/fwl/core/cfwl_msgmouse.h"
17 #include "xfa/fwl/core/cfwl_msgsetfocus.h"
18 #include "xfa/fwl/core/cfwl_notedriver.h"
19 #include "xfa/fwl/core/cfwl_spinbutton.h"
20 #include "xfa/fwl/core/cfwl_themebackground.h"
21 #include "xfa/fwl/core/cfwl_widgetmgr.h"
22 #include "xfa/fwl/core/ifwl_themeprovider.h"
15 23
16 namespace { 24 namespace {
17 25
18 IFWL_DateTimePicker* ToDateTimePicker(IFWL_Widget* widget) { 26 const int kDateTimePickerWidth = 100;
19 return static_cast<IFWL_DateTimePicker*>(widget); 27 const int kDateTimePickerHeight = 20;
20 }
21 28
22 } // namespace 29 } // namespace
23
24 CFWL_DateTimePicker::CFWL_DateTimePicker(const CFWL_App* app) 30 CFWL_DateTimePicker::CFWL_DateTimePicker(const CFWL_App* app)
25 : CFWL_Widget(app) {} 31 : CFWL_Widget(app, pdfium::MakeUnique<CFWL_WidgetProperties>(), nullptr),
26 32 m_iBtnState(1),
27 CFWL_DateTimePicker::~CFWL_DateTimePicker() {} 33 m_iYear(-1),
28 34 m_iMonth(-1),
29 void CFWL_DateTimePicker::Initialize() { 35 m_iDay(-1),
30 ASSERT(!m_pIface); 36 m_bLBtnDown(false) {
31 37 m_rtBtn.Set(0, 0, 0, 0);
32 m_pIface = pdfium::MakeUnique<IFWL_DateTimePicker>( 38
33 m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>()); 39 m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
34 40
35 CFWL_Widget::Initialize(); 41 auto monthProp = pdfium::MakeUnique<CFWL_WidgetProperties>();
36 } 42 monthProp->m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border;
37 43 monthProp->m_dwStates = FWL_WGTSTATE_Invisible;
38 int32_t CFWL_DateTimePicker::CountSelRanges() { 44 monthProp->m_pParent = this;
39 return ToDateTimePicker(GetWidget())->CountSelRanges(); 45 monthProp->m_pThemeProvider = m_pProperties->m_pThemeProvider;
40 } 46 m_pMonthCal.reset(
41 47 new CFWL_MonthCalendar(m_pOwnerApp, std::move(monthProp), this));
42 int32_t CFWL_DateTimePicker::GetSelRange(int32_t nIndex, int32_t& nStart) { 48
43 return ToDateTimePicker(GetWidget())->GetSelRange(nIndex, nStart); 49 CFX_RectF rtMonthCal;
44 } 50 m_pMonthCal->GetWidgetRect(rtMonthCal, true);
45 51 rtMonthCal.Set(0, 0, rtMonthCal.width, rtMonthCal.height);
46 void CFWL_DateTimePicker::GetEditText(CFX_WideString& wsText) { 52 m_pMonthCal->SetWidgetRect(rtMonthCal);
47 ToDateTimePicker(GetWidget())->GetEditText(wsText); 53
48 } 54 auto editProp = pdfium::MakeUnique<CFWL_WidgetProperties>();
49 55 editProp->m_pParent = this;
50 void CFWL_DateTimePicker::SetEditText(const CFX_WideString& wsText) { 56 editProp->m_pThemeProvider = m_pProperties->m_pThemeProvider;
51 ToDateTimePicker(GetWidget())->SetEditText(wsText); 57
58 m_pEdit.reset(new CFWL_DateTimeEdit(m_pOwnerApp, std::move(editProp), this));
59 RegisterEventTarget(m_pMonthCal.get());
60 RegisterEventTarget(m_pEdit.get());
61 }
62
63 CFWL_DateTimePicker::~CFWL_DateTimePicker() {
64 UnregisterEventTarget();
65 }
66
67 FWL_Type CFWL_DateTimePicker::GetClassID() const {
68 return FWL_Type::DateTimePicker;
69 }
70
71 void CFWL_DateTimePicker::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
72 if (m_pWidgetMgr->IsFormDisabled()) {
73 DisForm_GetWidgetRect(rect, bAutoSize);
74 return;
75 }
76 if (!bAutoSize) {
77 rect = m_pProperties->m_rtWidget;
78 return;
79 }
80
81 rect.Set(0, 0, kDateTimePickerWidth, kDateTimePickerHeight);
82 CFWL_Widget::GetWidgetRect(rect, true);
83 }
84
85 void CFWL_DateTimePicker::Update() {
86 if (m_pWidgetMgr->IsFormDisabled()) {
87 DisForm_Update();
88 return;
89 }
90 if (m_iLock)
91 return;
92 if (!m_pProperties->m_pThemeProvider)
93 m_pProperties->m_pThemeProvider = GetAvailableTheme();
94
95 m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider);
96 GetClientRect(m_rtClient);
97 FX_FLOAT* pFWidth = static_cast<FX_FLOAT*>(
98 GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
99 if (!pFWidth)
100 return;
101
102 FX_FLOAT fBtn = *pFWidth;
103 m_rtBtn.Set(m_rtClient.right() - fBtn, m_rtClient.top, fBtn - 1,
104 m_rtClient.height - 1);
105
106 CFX_RectF rtEdit;
107 rtEdit.Set(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn,
108 m_rtClient.height);
109 m_pEdit->SetWidgetRect(rtEdit);
110 ResetEditAlignment();
111 m_pEdit->Update();
112 if (!(m_pMonthCal->GetThemeProvider()))
113 m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider);
114
115 CFX_RectF rtMonthCal;
116 m_pMonthCal->GetWidgetRect(rtMonthCal, true);
117 CFX_RectF rtPopUp;
118 rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + kDateTimePickerHeight,
119 rtMonthCal.width, rtMonthCal.height);
120 m_pMonthCal->SetWidgetRect(rtPopUp);
121 m_pMonthCal->Update();
122 return;
123 }
124
125 FWL_WidgetHit CFWL_DateTimePicker::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
126 if (m_pWidgetMgr->IsFormDisabled())
127 return DisForm_HitTest(fx, fy);
128 if (m_rtClient.Contains(fx, fy))
129 return FWL_WidgetHit::Client;
130 if (IsMonthCalendarVisible()) {
131 CFX_RectF rect;
132 m_pMonthCal->GetWidgetRect(rect);
133 if (rect.Contains(fx, fy))
134 return FWL_WidgetHit::Client;
135 }
136 return FWL_WidgetHit::Unknown;
137 }
138
139 void CFWL_DateTimePicker::DrawWidget(CFX_Graphics* pGraphics,
140 const CFX_Matrix* pMatrix) {
141 if (!pGraphics)
142 return;
143 if (!m_pProperties->m_pThemeProvider)
144 return;
145
146 IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
147 if (HasBorder())
148 DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
149 if (HasEdge())
150 DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
151 if (!m_rtBtn.IsEmpty())
152 DrawDropDownButton(pGraphics, pTheme, pMatrix);
153 if (m_pWidgetMgr->IsFormDisabled()) {
154 DisForm_DrawWidget(pGraphics, pMatrix);
155 return;
156 }
157 }
158
159 void CFWL_DateTimePicker::SetThemeProvider(IFWL_ThemeProvider* pTP) {
160 m_pProperties->m_pThemeProvider = pTP;
161 m_pMonthCal->SetThemeProvider(pTP);
162 }
163
164 void CFWL_DateTimePicker::GetCurSel(int32_t& iYear,
165 int32_t& iMonth,
166 int32_t& iDay) {
167 iYear = m_iYear;
168 iMonth = m_iMonth;
169 iDay = m_iDay;
52 } 170 }
53 171
54 void CFWL_DateTimePicker::SetCurSel(int32_t iYear, 172 void CFWL_DateTimePicker::SetCurSel(int32_t iYear,
55 int32_t iMonth, 173 int32_t iMonth,
56 int32_t iDay) { 174 int32_t iDay) {
57 ToDateTimePicker(GetWidget())->SetCurSel(iYear, iMonth, iDay); 175 if (iYear <= 0 || iYear >= 3000)
58 } 176 return;
59 177 if (iMonth <= 0 || iMonth >= 13)
60 void CFWL_DateTimePicker::GetBBox(CFX_RectF& rect) { 178 return;
61 ToDateTimePicker(GetWidget())->GetBBox(rect); 179 if (iDay <= 0 || iDay >= 32)
62 } 180 return;
63 181
64 void CFWL_DateTimePicker::SetEditLimit(int32_t nLimit) { 182 m_iYear = iYear;
65 ToDateTimePicker(GetWidget())->SetEditLimit(nLimit); 183 m_iMonth = iMonth;
184 m_iDay = iDay;
185 m_pMonthCal->SetSelect(iYear, iMonth, iDay);
186 }
187
188 void CFWL_DateTimePicker::SetEditText(const CFX_WideString& wsText) {
189 if (!m_pEdit)
190 return;
191
192 m_pEdit->SetText(wsText);
193 Repaint(&m_rtClient);
194
195 CFWL_EvtEditChanged ev;
196 DispatchEvent(&ev);
197 }
198
199 void CFWL_DateTimePicker::GetEditText(CFX_WideString& wsText,
200 int32_t nStart,
201 int32_t nCount) const {
202 if (m_pEdit)
203 m_pEdit->GetText(wsText, nStart, nCount);
204 }
205
206 void CFWL_DateTimePicker::GetBBox(CFX_RectF& rect) const {
207 if (m_pWidgetMgr->IsFormDisabled()) {
208 DisForm_GetBBox(rect);
209 return;
210 }
211
212 rect = m_pProperties->m_rtWidget;
213 if (IsMonthCalendarVisible()) {
214 CFX_RectF rtMonth;
215 m_pMonthCal->GetWidgetRect(rtMonth);
216 rtMonth.Offset(m_pProperties->m_rtWidget.left,
217 m_pProperties->m_rtWidget.top);
218 rect.Union(rtMonth);
219 }
66 } 220 }
67 221
68 void CFWL_DateTimePicker::ModifyEditStylesEx(uint32_t dwStylesExAdded, 222 void CFWL_DateTimePicker::ModifyEditStylesEx(uint32_t dwStylesExAdded,
69 uint32_t dwStylesExRemoved) { 223 uint32_t dwStylesExRemoved) {
70 ToDateTimePicker(GetWidget()) 224 m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
71 ->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved); 225 }
72 } 226
227 void CFWL_DateTimePicker::DrawDropDownButton(CFX_Graphics* pGraphics,
228 IFWL_ThemeProvider* pTheme,
229 const CFX_Matrix* pMatrix) {
230 if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_Spin) ==
231 FWL_STYLEEXT_DTP_Spin) {
232 return;
233 }
234
235 CFWL_ThemeBackground param;
236 param.m_pWidget = this;
237 param.m_iPart = CFWL_Part::DropDownButton;
238 param.m_dwStates = m_iBtnState;
239 param.m_pGraphics = pGraphics;
240 param.m_rtPart = m_rtBtn;
241 if (pMatrix)
242 param.m_matrix.Concat(*pMatrix);
243 pTheme->DrawBackground(&param);
244 }
245
246 void CFWL_DateTimePicker::FormatDateString(int32_t iYear,
247 int32_t iMonth,
248 int32_t iDay,
249 CFX_WideString& wsText) {
250 if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_ShortDateFormat) ==
251 FWL_STYLEEXT_DTP_ShortDateFormat) {
252 wsText.Format(L"%d-%d-%d", iYear, iMonth, iDay);
253 } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_LongDateFormat) ==
254 FWL_STYLEEXT_DTP_LongDateFormat) {
255 wsText.Format(L"%d Year %d Month %d Day", iYear, iMonth, iDay);
256 }
257 }
258
259 void CFWL_DateTimePicker::ShowMonthCalendar(bool bActivate) {
260 if (m_pWidgetMgr->IsFormDisabled())
261 return DisForm_ShowMonthCalendar(bActivate);
262 if (IsMonthCalendarVisible() == bActivate)
263 return;
264 if (!m_pForm)
265 InitProxyForm();
266
267 if (!bActivate) {
268 m_pForm->EndDoModal();
269 return;
270 }
271
272 CFX_RectF rtMonth;
273 m_pMonthCal->GetWidgetRect(rtMonth);
274
275 CFX_RectF rtAnchor;
276 rtAnchor.Set(0, 0, m_pProperties->m_rtWidget.width,
277 m_pProperties->m_rtWidget.height);
278 GetPopupPos(0, rtMonth.height, rtAnchor, rtMonth);
279 m_pForm->SetWidgetRect(rtMonth);
280
281 rtMonth.left = rtMonth.top = 0;
282 m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
283 m_pMonthCal->SetWidgetRect(rtMonth);
284 m_pMonthCal->Update();
285 m_pForm->DoModal();
286 }
287
288 bool CFWL_DateTimePicker::IsMonthCalendarVisible() const {
289 if (m_pWidgetMgr->IsFormDisabled())
290 return DisForm_IsMonthCalendarVisible();
291 if (!m_pForm)
292 return false;
293 return !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible);
294 }
295
296 void CFWL_DateTimePicker::ResetEditAlignment() {
297 if (!m_pEdit)
298 return;
299
300 uint32_t dwAdd = 0;
301 switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_EditHAlignMask) {
302 case FWL_STYLEEXT_DTP_EditHCenter: {
303 dwAdd |= FWL_STYLEEXT_EDT_HCenter;
304 break;
305 }
306 case FWL_STYLEEXT_DTP_EditHFar: {
307 dwAdd |= FWL_STYLEEXT_EDT_HFar;
308 break;
309 }
310 default: {
311 dwAdd |= FWL_STYLEEXT_EDT_HNear;
312 break;
313 }
314 }
315 switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_EditVAlignMask) {
316 case FWL_STYLEEXT_DTP_EditVCenter: {
317 dwAdd |= FWL_STYLEEXT_EDT_VCenter;
318 break;
319 }
320 case FWL_STYLEEXT_DTP_EditVFar: {
321 dwAdd |= FWL_STYLEEXT_EDT_VFar;
322 break;
323 }
324 default: {
325 dwAdd |= FWL_STYLEEXT_EDT_VNear;
326 break;
327 }
328 }
329 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_EditJustified)
330 dwAdd |= FWL_STYLEEXT_EDT_Justified;
331 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_EditDistributed)
332 dwAdd |= FWL_STYLEEXT_EDT_Distributed;
333
334 m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask |
335 FWL_STYLEEXT_EDT_HAlignModeMask |
336 FWL_STYLEEXT_EDT_VAlignMask);
337 }
338
339 void CFWL_DateTimePicker::ProcessSelChanged(int32_t iYear,
340 int32_t iMonth,
341 int32_t iDay) {
342 m_iYear = iYear;
343 m_iMonth = iMonth;
344 m_iDay = iDay;
345
346 CFX_WideString wsText;
347 FormatDateString(m_iYear, m_iMonth, m_iDay, wsText);
348 m_pEdit->SetText(wsText);
349 m_pEdit->Update();
350 Repaint(&m_rtClient);
351
352 CFWL_EvtSelectChanged ev;
353 ev.m_pSrcTarget = this;
354 ev.iYear = m_iYear;
355 ev.iMonth = m_iMonth;
356 ev.iDay = m_iDay;
357 DispatchEvent(&ev);
358 }
359
360 void CFWL_DateTimePicker::InitProxyForm() {
361 if (m_pForm)
362 return;
363 if (!m_pMonthCal)
364 return;
365
366 auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
367 prop->m_dwStyles = FWL_WGTSTYLE_Popup;
368 prop->m_dwStates = FWL_WGTSTATE_Invisible;
369 prop->m_pOwner = this;
370
371 m_pForm = pdfium::MakeUnique<CFWL_FormProxy>(m_pOwnerApp, std::move(prop),
372 m_pMonthCal.get());
373 m_pMonthCal->SetParent(m_pForm.get());
374 }
375
376 bool CFWL_DateTimePicker::DisForm_IsMonthCalendarVisible() const {
377 if (!m_pMonthCal)
378 return false;
379 return !(m_pMonthCal->GetStates() & FWL_WGTSTATE_Invisible);
380 }
381
382 void CFWL_DateTimePicker::DisForm_ShowMonthCalendar(bool bActivate) {
383 if (IsMonthCalendarVisible() == bActivate)
384 return;
385
386 if (bActivate) {
387 CFX_RectF rtMonthCal;
388 m_pMonthCal->GetWidgetRect(rtMonthCal, true);
389 FX_FLOAT fPopupMin = rtMonthCal.height;
390 FX_FLOAT fPopupMax = rtMonthCal.height;
391 CFX_RectF rtAnchor(m_pProperties->m_rtWidget);
392 rtAnchor.width = rtMonthCal.width;
393 rtMonthCal.left = m_rtClient.left;
394 rtMonthCal.top = rtAnchor.Height();
395 GetPopupPos(fPopupMin, fPopupMax, rtAnchor, rtMonthCal);
396 m_pMonthCal->SetWidgetRect(rtMonthCal);
397 if (m_iYear > 0 && m_iMonth > 0 && m_iDay > 0)
398 m_pMonthCal->SetSelect(m_iYear, m_iMonth, m_iDay);
399 m_pMonthCal->Update();
400 }
401 m_pMonthCal->SetStates(FWL_WGTSTATE_Invisible, !bActivate);
402
403 if (bActivate) {
404 CFWL_MsgSetFocus msg;
405 msg.m_pDstTarget = m_pMonthCal.get();
406 msg.m_pSrcTarget = m_pEdit.get();
407 m_pEdit->GetDelegate()->OnProcessMessage(&msg);
408 }
409
410 CFX_RectF rtInvalidate, rtCal;
411 rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
412 m_pProperties->m_rtWidget.height);
413 m_pMonthCal->GetWidgetRect(rtCal);
414 rtInvalidate.Union(rtCal);
415 rtInvalidate.Inflate(2, 2);
416 Repaint(&rtInvalidate);
417 }
418
419 FWL_WidgetHit CFWL_DateTimePicker::DisForm_HitTest(FX_FLOAT fx,
420 FX_FLOAT fy) const {
421 CFX_RectF rect;
422 rect.Set(0, 0, m_pProperties->m_rtWidget.width,
423 m_pProperties->m_rtWidget.height);
424 if (rect.Contains(fx, fy))
425 return FWL_WidgetHit::Edit;
426 if (DisForm_IsNeedShowButton())
427 rect.width += m_fBtn;
428 if (rect.Contains(fx, fy))
429 return FWL_WidgetHit::Client;
430 if (IsMonthCalendarVisible()) {
431 m_pMonthCal->GetWidgetRect(rect);
432 if (rect.Contains(fx, fy))
433 return FWL_WidgetHit::Client;
434 }
435 return FWL_WidgetHit::Unknown;
436 }
437
438 bool CFWL_DateTimePicker::DisForm_IsNeedShowButton() const {
439 return m_pProperties->m_dwStates & FWL_WGTSTATE_Focused ||
440 m_pMonthCal->GetStates() & FWL_WGTSTATE_Focused ||
441 m_pEdit->GetStates() & FWL_WGTSTATE_Focused;
442 }
443
444 void CFWL_DateTimePicker::DisForm_Update() {
445 if (m_iLock)
446 return;
447 if (!m_pProperties->m_pThemeProvider)
448 m_pProperties->m_pThemeProvider = GetAvailableTheme();
449
450 m_pEdit->SetThemeProvider(m_pProperties->m_pThemeProvider);
451 GetClientRect(m_rtClient);
452 m_pEdit->SetWidgetRect(m_rtClient);
453 ResetEditAlignment();
454 m_pEdit->Update();
455
456 if (!m_pMonthCal->GetThemeProvider())
457 m_pMonthCal->SetThemeProvider(m_pProperties->m_pThemeProvider);
458
459 FX_FLOAT* pWidth = static_cast<FX_FLOAT*>(
460 GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
461 if (!pWidth)
462 return;
463
464 m_fBtn = *pWidth;
465 CFX_RectF rtMonthCal;
466 m_pMonthCal->GetWidgetRect(rtMonthCal, true);
467
468 CFX_RectF rtPopUp;
469 rtPopUp.Set(rtMonthCal.left, rtMonthCal.top + kDateTimePickerHeight,
470 rtMonthCal.width, rtMonthCal.height);
471 m_pMonthCal->SetWidgetRect(rtPopUp);
472 m_pMonthCal->Update();
473 }
474
475 void CFWL_DateTimePicker::DisForm_GetWidgetRect(CFX_RectF& rect,
476 bool bAutoSize) {
477 rect = m_pProperties->m_rtWidget;
478 if (DisForm_IsNeedShowButton())
479 rect.width += m_fBtn;
480 }
481
482 void CFWL_DateTimePicker::DisForm_GetBBox(CFX_RectF& rect) const {
483 rect = m_pProperties->m_rtWidget;
484 if (DisForm_IsNeedShowButton())
485 rect.width += m_fBtn;
486 if (!IsMonthCalendarVisible())
487 return;
488
489 CFX_RectF rtMonth;
490 m_pMonthCal->GetWidgetRect(rtMonth);
491 rtMonth.Offset(m_pProperties->m_rtWidget.left, m_pProperties->m_rtWidget.top);
492 rect.Union(rtMonth);
493 }
494
495 void CFWL_DateTimePicker::DisForm_DrawWidget(CFX_Graphics* pGraphics,
496 const CFX_Matrix* pMatrix) {
497 if (!pGraphics)
498 return;
499 if (m_pEdit) {
500 CFX_RectF rtEdit;
501 m_pEdit->GetWidgetRect(rtEdit);
502
503 CFX_Matrix mt;
504 mt.Set(1, 0, 0, 1, rtEdit.left, rtEdit.top);
505 if (pMatrix)
506 mt.Concat(*pMatrix);
507 m_pEdit->DrawWidget(pGraphics, &mt);
508 }
509 if (!IsMonthCalendarVisible())
510 return;
511
512 CFX_RectF rtMonth;
513 m_pMonthCal->GetWidgetRect(rtMonth);
514 CFX_Matrix mt;
515 mt.Set(1, 0, 0, 1, rtMonth.left, rtMonth.top);
516 if (pMatrix)
517 mt.Concat(*pMatrix);
518 m_pMonthCal->DrawWidget(pGraphics, &mt);
519 }
520
521 void CFWL_DateTimePicker::OnProcessMessage(CFWL_Message* pMessage) {
522 if (!pMessage)
523 return;
524
525 switch (pMessage->GetClassID()) {
526 case CFWL_MessageType::SetFocus:
527 OnFocusChanged(pMessage, true);
528 break;
529 case CFWL_MessageType::KillFocus:
530 OnFocusChanged(pMessage, false);
531 break;
532 case CFWL_MessageType::Mouse: {
533 CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
534 switch (pMouse->m_dwCmd) {
535 case FWL_MouseCommand::LeftButtonDown:
536 OnLButtonDown(pMouse);
537 break;
538 case FWL_MouseCommand::LeftButtonUp:
539 OnLButtonUp(pMouse);
540 break;
541 case FWL_MouseCommand::Move:
542 OnMouseMove(pMouse);
543 break;
544 case FWL_MouseCommand::Leave:
545 OnMouseLeave(pMouse);
546 break;
547 default:
548 break;
549 }
550 break;
551 }
552 case CFWL_MessageType::Key: {
553 if (m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
554 m_pEdit->GetDelegate()->OnProcessMessage(pMessage);
555 return;
556 }
557 break;
558 }
559 default:
560 break;
561 }
562
563 CFWL_Widget::OnProcessMessage(pMessage);
564 }
565
566 void CFWL_DateTimePicker::OnDrawWidget(CFX_Graphics* pGraphics,
567 const CFX_Matrix* pMatrix) {
568 DrawWidget(pGraphics, pMatrix);
569 }
570
571 void CFWL_DateTimePicker::OnFocusChanged(CFWL_Message* pMsg, bool bSet) {
572 if (!pMsg)
573 return;
574 if (m_pWidgetMgr->IsFormDisabled())
575 return DisForm_OnFocusChanged(pMsg, bSet);
576
577 if (bSet) {
578 m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
579 Repaint(&m_rtClient);
580 } else {
581 m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
582 Repaint(&m_rtClient);
583 }
584 if (pMsg->m_pSrcTarget == m_pMonthCal.get() && IsMonthCalendarVisible()) {
585 ShowMonthCalendar(false);
586 }
587 Repaint(&m_rtClient);
588 }
589
590 void CFWL_DateTimePicker::OnLButtonDown(CFWL_MsgMouse* pMsg) {
591 if (!pMsg)
592 return;
593 if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
594 SetFocus(true);
595 if (!m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy))
596 return;
597
598 if (IsMonthCalendarVisible()) {
599 ShowMonthCalendar(false);
600 return;
601 }
602 if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_TimeFormat))
603 ShowMonthCalendar(true);
604
605 m_bLBtnDown = true;
606 Repaint(&m_rtClient);
607 }
608
609 void CFWL_DateTimePicker::OnLButtonUp(CFWL_MsgMouse* pMsg) {
610 if (!pMsg)
611 return;
612
613 m_bLBtnDown = false;
614 if (m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy))
615 m_iBtnState = CFWL_PartState_Hovered;
616 else
617 m_iBtnState = CFWL_PartState_Normal;
618 Repaint(&m_rtBtn);
619 }
620
621 void CFWL_DateTimePicker::OnMouseMove(CFWL_MsgMouse* pMsg) {
622 if (!m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy))
623 m_iBtnState = CFWL_PartState_Normal;
624 Repaint(&m_rtBtn);
625 }
626
627 void CFWL_DateTimePicker::OnMouseLeave(CFWL_MsgMouse* pMsg) {
628 if (!pMsg)
629 return;
630 m_iBtnState = CFWL_PartState_Normal;
631 Repaint(&m_rtBtn);
632 }
633
634 void CFWL_DateTimePicker::DisForm_OnFocusChanged(CFWL_Message* pMsg,
635 bool bSet) {
636 CFX_RectF rtInvalidate(m_rtBtn);
637 if (bSet) {
638 m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
639 if (m_pEdit && !(m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly)) {
640 m_rtBtn.Set(m_pProperties->m_rtWidget.width, 0, m_fBtn,
641 m_pProperties->m_rtWidget.height - 1);
642 }
643 rtInvalidate = m_rtBtn;
644 pMsg->m_pDstTarget = m_pEdit.get();
645 m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
646 } else {
647 m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
648 m_rtBtn.Set(0, 0, 0, 0);
649 if (DisForm_IsMonthCalendarVisible())
650 ShowMonthCalendar(false);
651 if (m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
652 pMsg->m_pSrcTarget = m_pEdit.get();
653 m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
654 }
655 }
656 rtInvalidate.Inflate(2, 2);
657 Repaint(&rtInvalidate);
658 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698