| OLD | NEW |
| (Empty) |
| 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 "xfa/fwl/core/ifwl_datetimecalendar.h" | |
| 8 | |
| 9 #include "third_party/base/ptr_util.h" | |
| 10 #include "xfa/fwl/core/cfwl_widgetmgr.h" | |
| 11 #include "xfa/fwl/core/ifwl_datetimepicker.h" | |
| 12 #include "xfa/fwl/core/ifwl_formproxy.h" | |
| 13 | |
| 14 IFWL_DateTimeCalendar::IFWL_DateTimeCalendar( | |
| 15 const IFWL_App* app, | |
| 16 std::unique_ptr<CFWL_WidgetProperties> properties, | |
| 17 IFWL_Widget* pOuter) | |
| 18 : IFWL_MonthCalendar(app, std::move(properties), pOuter), m_bFlag(false) {} | |
| 19 | |
| 20 void IFWL_DateTimeCalendar::OnProcessMessage(CFWL_Message* pMessage) { | |
| 21 CFWL_MessageType dwCode = pMessage->GetClassID(); | |
| 22 if (dwCode == CFWL_MessageType::SetFocus || | |
| 23 dwCode == CFWL_MessageType::KillFocus) { | |
| 24 IFWL_Widget* pOuter = GetOuter(); | |
| 25 pOuter->GetDelegate()->OnProcessMessage(pMessage); | |
| 26 return; | |
| 27 } | |
| 28 if (dwCode == CFWL_MessageType::Mouse) { | |
| 29 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage); | |
| 30 if (pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonDown) | |
| 31 OnLButtonDownEx(pMsg); | |
| 32 else if (pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonUp) | |
| 33 OnLButtonUpEx(pMsg); | |
| 34 return; | |
| 35 } | |
| 36 IFWL_MonthCalendar::OnProcessMessage(pMessage); | |
| 37 } | |
| 38 | |
| 39 void IFWL_DateTimeCalendar::OnLButtonDownEx(CFWL_MsgMouse* pMsg) { | |
| 40 if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 41 m_iLBtnPartStates = CFWL_PartState_Pressed; | |
| 42 PrevMonth(); | |
| 43 Repaint(&m_rtClient); | |
| 44 } else if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 45 m_iRBtnPartStates |= CFWL_PartState_Pressed; | |
| 46 NextMonth(); | |
| 47 Repaint(&m_rtClient); | |
| 48 } else if (m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 49 if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) == 0) { | |
| 50 JumpToToday(); | |
| 51 Repaint(&m_rtClient); | |
| 52 } | |
| 53 } else { | |
| 54 IFWL_DateTimePicker* pIPicker = static_cast<IFWL_DateTimePicker*>(m_pOuter); | |
| 55 if (pIPicker->IsMonthCalendarShowed()) | |
| 56 m_bFlag = 1; | |
| 57 } | |
| 58 } | |
| 59 | |
| 60 void IFWL_DateTimeCalendar::OnLButtonUpEx(CFWL_MsgMouse* pMsg) { | |
| 61 if (m_pWidgetMgr->IsFormDisabled()) | |
| 62 return DisForm_OnLButtonUpEx(pMsg); | |
| 63 if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 64 m_iLBtnPartStates = 0; | |
| 65 Repaint(&m_rtLBtn); | |
| 66 return; | |
| 67 } | |
| 68 if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 69 m_iRBtnPartStates = 0; | |
| 70 Repaint(&m_rtRBtn); | |
| 71 return; | |
| 72 } | |
| 73 if (m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) | |
| 74 return; | |
| 75 | |
| 76 int32_t iOldSel = 0; | |
| 77 if (m_arrSelDays.GetSize() > 0) | |
| 78 iOldSel = m_arrSelDays[0]; | |
| 79 | |
| 80 int32_t iCurSel = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); | |
| 81 CFX_RectF rt; | |
| 82 IFWL_DateTimePicker* pIPicker = static_cast<IFWL_DateTimePicker*>(m_pOuter); | |
| 83 pIPicker->GetFormProxy()->GetWidgetRect(rt); | |
| 84 rt.Set(0, 0, rt.width, rt.height); | |
| 85 if (iCurSel > 0) { | |
| 86 FWL_DATEINFO* lpDatesInfo = m_arrDates.GetAt(iCurSel - 1); | |
| 87 CFX_RectF rtInvalidate(lpDatesInfo->rect); | |
| 88 if (iOldSel > 0 && iOldSel <= m_arrDates.GetSize()) { | |
| 89 lpDatesInfo = m_arrDates.GetAt(iOldSel - 1); | |
| 90 rtInvalidate.Union(lpDatesInfo->rect); | |
| 91 } | |
| 92 AddSelDay(iCurSel); | |
| 93 if (!m_pOuter) | |
| 94 return; | |
| 95 | |
| 96 pIPicker->ProcessSelChanged(m_iCurYear, m_iCurMonth, iCurSel); | |
| 97 pIPicker->ShowMonthCalendar(false); | |
| 98 } else if (m_bFlag && (!rt.Contains(pMsg->m_fx, pMsg->m_fy))) { | |
| 99 pIPicker->ShowMonthCalendar(false); | |
| 100 } | |
| 101 m_bFlag = 0; | |
| 102 } | |
| 103 | |
| 104 void IFWL_DateTimeCalendar::OnMouseMoveEx(CFWL_MsgMouse* pMsg) { | |
| 105 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) | |
| 106 return; | |
| 107 | |
| 108 bool bRepaint = false; | |
| 109 CFX_RectF rtInvalidate; | |
| 110 rtInvalidate.Set(0, 0, 0, 0); | |
| 111 if (m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 112 int32_t iHover = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); | |
| 113 bRepaint = m_iHovered != iHover; | |
| 114 if (bRepaint) { | |
| 115 if (m_iHovered > 0) | |
| 116 GetDayRect(m_iHovered, rtInvalidate); | |
| 117 if (iHover > 0) { | |
| 118 CFX_RectF rtDay; | |
| 119 GetDayRect(iHover, rtDay); | |
| 120 if (rtInvalidate.IsEmpty()) | |
| 121 rtInvalidate = rtDay; | |
| 122 else | |
| 123 rtInvalidate.Union(rtDay); | |
| 124 } | |
| 125 } | |
| 126 m_iHovered = iHover; | |
| 127 CFWL_Event_DtpHoverChanged ev; | |
| 128 ev.hoverday = iHover; | |
| 129 DispatchEvent(&ev); | |
| 130 } else { | |
| 131 bRepaint = m_iHovered > 0; | |
| 132 if (bRepaint) | |
| 133 GetDayRect(m_iHovered, rtInvalidate); | |
| 134 | |
| 135 m_iHovered = -1; | |
| 136 } | |
| 137 if (bRepaint && !rtInvalidate.IsEmpty()) | |
| 138 Repaint(&rtInvalidate); | |
| 139 } | |
| 140 | |
| 141 void IFWL_DateTimeCalendar::DisForm_OnProcessMessage(CFWL_Message* pMessage) { | |
| 142 if (pMessage->GetClassID() == CFWL_MessageType::Mouse) { | |
| 143 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage); | |
| 144 if (pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonUp) { | |
| 145 DisForm_OnLButtonUpEx(pMsg); | |
| 146 return; | |
| 147 } | |
| 148 } | |
| 149 IFWL_MonthCalendar::OnProcessMessage(pMessage); | |
| 150 } | |
| 151 | |
| 152 void IFWL_DateTimeCalendar::DisForm_OnLButtonUpEx(CFWL_MsgMouse* pMsg) { | |
| 153 if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 154 m_iLBtnPartStates = 0; | |
| 155 Repaint(&(m_rtLBtn)); | |
| 156 return; | |
| 157 } | |
| 158 if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 159 m_iRBtnPartStates = 0; | |
| 160 Repaint(&(m_rtRBtn)); | |
| 161 return; | |
| 162 } | |
| 163 if (m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) | |
| 164 return; | |
| 165 | |
| 166 int32_t iOldSel = 0; | |
| 167 if (m_arrSelDays.GetSize() > 0) | |
| 168 iOldSel = m_arrSelDays[0]; | |
| 169 | |
| 170 int32_t iCurSel = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy); | |
| 171 if (iCurSel > 0) { | |
| 172 FWL_DATEINFO* lpDatesInfo = m_arrDates.GetAt(iCurSel - 1); | |
| 173 CFX_RectF rtInvalidate(lpDatesInfo->rect); | |
| 174 if (iOldSel > 0 && iOldSel <= m_arrDates.GetSize()) { | |
| 175 lpDatesInfo = m_arrDates.GetAt(iOldSel - 1); | |
| 176 rtInvalidate.Union(lpDatesInfo->rect); | |
| 177 } | |
| 178 AddSelDay(iCurSel); | |
| 179 IFWL_DateTimePicker* pDateTime = | |
| 180 static_cast<IFWL_DateTimePicker*>(m_pOuter); | |
| 181 pDateTime->ProcessSelChanged(m_iCurYear, m_iCurMonth, iCurSel); | |
| 182 pDateTime->ShowMonthCalendar(false); | |
| 183 } | |
| 184 } | |
| OLD | NEW |