| Index: xfa/fwl/core/ifwl_datetimecalendar.cpp
|
| diff --git a/xfa/fwl/core/ifwl_datetimecalendar.cpp b/xfa/fwl/core/ifwl_datetimecalendar.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..26d1f17da9ede7cf16e5e9256287e489fdecd797
|
| --- /dev/null
|
| +++ b/xfa/fwl/core/ifwl_datetimecalendar.cpp
|
| @@ -0,0 +1,222 @@
|
| +// Copyright 2014 PDFium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| +
|
| +#include "xfa/fwl/core/ifwl_datetimecalendar.h"
|
| +
|
| +#include "xfa/fwl/core/cfwl_widgetmgr.h"
|
| +#include "xfa/fwl/core/ifwl_datetimepicker.h"
|
| +#include "xfa/fwl/core/ifwl_formproxy.h"
|
| +
|
| +// static
|
| +IFWL_DateTimeCalendar* IFWL_DateTimeCalendar::Create(
|
| + const CFWL_WidgetImpProperties& properties,
|
| + IFWL_Widget* pOuter) {
|
| + return new IFWL_DateTimeCalendar(properties, pOuter);
|
| +}
|
| +
|
| +IFWL_DateTimeCalendar::IFWL_DateTimeCalendar(
|
| + const CFWL_WidgetImpProperties& properties,
|
| + IFWL_Widget* pOuter)
|
| + : IFWL_MonthCalendar(properties, pOuter) {}
|
| +
|
| +FWL_Error IFWL_DateTimeCalendar::Initialize() {
|
| + if (IFWL_MonthCalendar::Initialize() != FWL_Error::Succeeded)
|
| + return FWL_Error::Indefinite;
|
| + delete m_pDelegate;
|
| + m_pDelegate = new CFWL_DateTimeCalendarImpDelegate(this);
|
| + return FWL_Error::Succeeded;
|
| +}
|
| +
|
| +FWL_Error IFWL_DateTimeCalendar::Finalize() {
|
| + delete m_pDelegate;
|
| + m_pDelegate = nullptr;
|
| + return IFWL_MonthCalendar::Finalize();
|
| +}
|
| +
|
| +CFWL_DateTimeCalendarImpDelegate::CFWL_DateTimeCalendarImpDelegate(
|
| + IFWL_DateTimeCalendar* pOwner)
|
| + : CFWL_MonthCalendarImpDelegate(pOwner), m_pOwner(pOwner) {
|
| + m_bFlag = FALSE;
|
| +}
|
| +
|
| +void CFWL_DateTimeCalendarImpDelegate::OnProcessMessage(
|
| + CFWL_Message* pMessage) {
|
| + CFWL_MessageType dwCode = pMessage->GetClassID();
|
| + if (dwCode == CFWL_MessageType::SetFocus ||
|
| + dwCode == CFWL_MessageType::KillFocus) {
|
| + IFWL_Widget* pOuter = m_pOwner->GetOuter();
|
| + IFWL_WidgetDelegate* pDelegate = pOuter->SetDelegate(nullptr);
|
| + pDelegate->OnProcessMessage(pMessage);
|
| + return;
|
| + }
|
| + if (dwCode == CFWL_MessageType::Mouse) {
|
| + CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
|
| + if (pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonDown)
|
| + OnLButtonDownEx(pMsg);
|
| + else if (pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonUp)
|
| + OnLButtonUpEx(pMsg);
|
| + return;
|
| + }
|
| + CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
|
| +}
|
| +
|
| +void CFWL_DateTimeCalendarImpDelegate::OnLButtonDownEx(CFWL_MsgMouse* pMsg) {
|
| + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + m_pOwner->m_iLBtnPartStates = CFWL_PartState_Pressed;
|
| + m_pOwner->PrevMonth();
|
| + m_pOwner->Repaint(&m_pOwner->m_rtClient);
|
| + } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + m_pOwner->m_iRBtnPartStates |= CFWL_PartState_Pressed;
|
| + m_pOwner->NextMonth();
|
| + m_pOwner->Repaint(&m_pOwner->m_rtClient);
|
| + } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) ==
|
| + 0) {
|
| + m_pOwner->JumpToToday();
|
| + m_pOwner->Repaint(&m_pOwner->m_rtClient);
|
| + }
|
| + } else {
|
| + IFWL_DateTimePicker* pIPicker =
|
| + static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
|
| + if (pIPicker->IsMonthCalendarShowed()) {
|
| + m_bFlag = 1;
|
| + }
|
| + }
|
| +}
|
| +
|
| +void CFWL_DateTimeCalendarImpDelegate::OnLButtonUpEx(CFWL_MsgMouse* pMsg) {
|
| + if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
|
| + return DisForm_OnLButtonUpEx(pMsg);
|
| + }
|
| + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + m_pOwner->m_iLBtnPartStates = 0;
|
| + m_pOwner->Repaint(&m_pOwner->m_rtLBtn);
|
| + return;
|
| + }
|
| + if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + m_pOwner->m_iRBtnPartStates = 0;
|
| + m_pOwner->Repaint(&m_pOwner->m_rtRBtn);
|
| + return;
|
| + }
|
| + if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + return;
|
| + }
|
| + int32_t iOldSel = 0;
|
| + if (m_pOwner->m_arrSelDays.GetSize() > 0) {
|
| + iOldSel = m_pOwner->m_arrSelDays[0];
|
| + }
|
| + int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
|
| + CFX_RectF rt;
|
| + IFWL_DateTimePicker* pIPicker =
|
| + static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
|
| + pIPicker->m_pForm->GetWidgetRect(rt);
|
| + rt.Set(0, 0, rt.width, rt.height);
|
| + if (iCurSel > 0) {
|
| + FWL_DATEINFO* lpDatesInfo = m_pOwner->m_arrDates.GetAt(iCurSel - 1);
|
| + CFX_RectF rtInvalidate(lpDatesInfo->rect);
|
| + if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
|
| + lpDatesInfo = m_pOwner->m_arrDates.GetAt(iOldSel - 1);
|
| + rtInvalidate.Union(lpDatesInfo->rect);
|
| + }
|
| + m_pOwner->AddSelDay(iCurSel);
|
| + if (!m_pOwner->m_pOuter)
|
| + return;
|
| + pIPicker->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
|
| + iCurSel);
|
| + pIPicker->ShowMonthCalendar(FALSE);
|
| + } else if (m_bFlag && (!rt.Contains(pMsg->m_fx, pMsg->m_fy))) {
|
| + pIPicker->ShowMonthCalendar(FALSE);
|
| + }
|
| + m_bFlag = 0;
|
| +}
|
| +
|
| +void CFWL_DateTimeCalendarImpDelegate::OnMouseMoveEx(CFWL_MsgMouse* pMsg) {
|
| + if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
|
| + return;
|
| + }
|
| + FX_BOOL bRepaint = FALSE;
|
| + CFX_RectF rtInvalidate;
|
| + rtInvalidate.Set(0, 0, 0, 0);
|
| + if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + int32_t iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
|
| + bRepaint = m_pOwner->m_iHovered != iHover;
|
| + if (bRepaint) {
|
| + if (m_pOwner->m_iHovered > 0) {
|
| + m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
|
| + }
|
| + if (iHover > 0) {
|
| + CFX_RectF rtDay;
|
| + m_pOwner->GetDayRect(iHover, rtDay);
|
| + if (rtInvalidate.IsEmpty()) {
|
| + rtInvalidate = rtDay;
|
| + } else {
|
| + rtInvalidate.Union(rtDay);
|
| + }
|
| + }
|
| + }
|
| + m_pOwner->m_iHovered = iHover;
|
| + CFWL_Event_DtpHoverChanged ev;
|
| + ev.hoverday = iHover;
|
| + m_pOwner->DispatchEvent(&ev);
|
| + } else {
|
| + bRepaint = m_pOwner->m_iHovered > 0;
|
| + if (bRepaint) {
|
| + m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
|
| + }
|
| + m_pOwner->m_iHovered = -1;
|
| + }
|
| + if (bRepaint && !rtInvalidate.IsEmpty()) {
|
| + m_pOwner->Repaint(&rtInvalidate);
|
| + }
|
| +}
|
| +
|
| +void CFWL_DateTimeCalendarImpDelegate::DisForm_OnProcessMessage(
|
| + CFWL_Message* pMessage) {
|
| + if (pMessage->GetClassID() == CFWL_MessageType::Mouse) {
|
| + CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
|
| + if (pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonUp) {
|
| + DisForm_OnLButtonUpEx(pMsg);
|
| + return;
|
| + }
|
| + }
|
| + CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
|
| +}
|
| +
|
| +void CFWL_DateTimeCalendarImpDelegate::DisForm_OnLButtonUpEx(
|
| + CFWL_MsgMouse* pMsg) {
|
| + if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + m_pOwner->m_iLBtnPartStates = 0;
|
| + m_pOwner->Repaint(&(m_pOwner->m_rtLBtn));
|
| + return;
|
| + }
|
| + if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + m_pOwner->m_iRBtnPartStates = 0;
|
| + m_pOwner->Repaint(&(m_pOwner->m_rtRBtn));
|
| + return;
|
| + }
|
| + if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
|
| + return;
|
| + }
|
| + int32_t iOldSel = 0;
|
| + if (m_pOwner->m_arrSelDays.GetSize() > 0) {
|
| + iOldSel = m_pOwner->m_arrSelDays[0];
|
| + }
|
| + int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
|
| + if (iCurSel > 0) {
|
| + FWL_DATEINFO* lpDatesInfo = m_pOwner->m_arrDates.GetAt(iCurSel - 1);
|
| + CFX_RectF rtInvalidate(lpDatesInfo->rect);
|
| + if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
|
| + lpDatesInfo = m_pOwner->m_arrDates.GetAt(iOldSel - 1);
|
| + rtInvalidate.Union(lpDatesInfo->rect);
|
| + }
|
| + m_pOwner->AddSelDay(iCurSel);
|
| + IFWL_DateTimePicker* pDateTime =
|
| + static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
|
| + pDateTime->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
|
| + iCurSel);
|
| + pDateTime->ShowMonthCalendar(FALSE);
|
| + }
|
| +}
|
|
|