XTPCalendarMonthViewEvent.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:11k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarMonthViewEvent.cpp: implementation of the CXTPCalendarMonthViewEvent class.
  2. //
  3. // This file is a part of the XTREME CALENDAR MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "XTPCalendarMonthViewEvent.h"
  22. #include "XTPCalendarData.h"
  23. #include "XTPCalendarEvent.h"
  24. #include "XTPCalendarRecurrencePattern.h"
  25. #include "XTPCalendarMonthViewDay.h"
  26. #include "XTPCalendarMonthView.h"
  27. #include "XTPCalendarControl.h"
  28. #include "XTPCalendarTheme.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. IMPLEMENT_DYNAMIC(CXTPCalendarMonthViewEvent, CXTPCalendarViewEvent)
  35. CXTPCalendarMonthViewEvent::CXTPCalendarMonthViewEvent(CXTPCalendarEvent* pEvent,
  36.    CXTPCalendarMonthViewGroup* pViewGroup) :
  37. TBase(pEvent, pViewGroup)
  38. {
  39. ASSERT(pEvent);
  40. }
  41. CXTPCalendarMonthViewEvent::~CXTPCalendarMonthViewEvent()
  42. {
  43. }
  44. void CXTPCalendarMonthViewEvent::Draw(CDC* pDC)
  45. {
  46. if (m_nMultiDayEventFlags & xtpCalendarMultiDaySlave)
  47. {
  48. return;// was drawn in the Master
  49. }
  50. ASSERT((m_nMultiDayEventFlags & xtpCalendarMultiDayMaster) || m_nMultiDayEventFlags == xtpCalendarMultiDayNoMultiDay);
  51. //-----------------------------------------------------------------------
  52. CXTPCalendarPaintManager::CMonthViewEventPart* pMEPart =
  53. XTP_SAFE_GET4(GetViewGroup(), GetViewDay(), GetView(), GetPaintManager(), GetMonthViewEventPart(), NULL);
  54. ASSERT(pMEPart);
  55. XTP_SAFE_CALL1(pMEPart, OnDrawEvent(pDC, this));
  56. }
  57. void CXTPCalendarMonthViewEvent::AdjustLayout(CDC* pDC, const CRect& rcEventMax, int nEventPlaceNumber)
  58. {
  59. if (!GetCalendarControl() || !GetEvent() || !pDC ||
  60. !XTP_SAFE_GET2(GetViewGroup(), GetViewDay(), GetView(), NULL) )
  61. {
  62. ASSERT(FALSE);
  63. return;
  64. }
  65. TBase::AdjustLayout(pDC, rcEventMax, nEventPlaceNumber);
  66. m_nMultiDayEventFlags = 0;
  67. //---------------------------------------------------
  68. CString strLoc = GetItemTextLocation();
  69. CString strEventText = GetItemTextSubject();
  70. if (strLoc.GetLength() > 0)
  71. {
  72. strEventText += _T(" (") + strLoc + _T(")");
  73. }
  74. m_szText = XTP_SAFE_GET5(GetViewGroup(), GetViewDay(), GetView(), GetPaintManager(),
  75. GetDayViewEventPart(), GetTextExtent(pDC, strEventText), CSize(0));
  76. //---------------------------------------------------
  77. if (IsMultidayEvent())
  78. {
  79. //calc icons rect
  80. AdjustMultidayEvent(rcEventMax, nEventPlaceNumber);
  81. }
  82. else
  83. {
  84. m_nMultiDayEventFlags = xtpCalendarMultiDayNoMultiDay;
  85. int nEventHeight = XTP_SAFE_GET3(GetViewGroup(), GetViewDay(), GetView(), GetRowHeight(), 0);
  86. m_rcEvent.top = rcEventMax.top + nEventPlaceNumber * nEventHeight + 1;
  87. m_rcEvent.bottom = m_rcEvent.top + nEventHeight - 2;
  88. m_rcEvent.left += 4 + 2;
  89. m_rcEvent.right -= 5 + 2;
  90. m_rcEventMax.top = m_rcEvent.top;
  91. m_rcEventMax.bottom = m_rcEvent.bottom;
  92. // adjust subject area
  93. m_rcText.CopyRect(m_rcEvent);
  94. // set times rects
  95. int nTimeCellWidth = 0;
  96. if (IsTimeAsClock())
  97. {
  98. nTimeCellWidth = 2 + XTP_SAFE_GET4(GetViewGroup(), GetViewDay(), GetView(), GetPaintManager(), GetClockSize().cx, 0);
  99. }
  100. else
  101. {
  102. CString strTime = XTP_SAFE_GET3(GetViewGroup(), GetViewDay(), GetView(), GetItemTextEventTimeMax(), _T(""));
  103. nTimeCellWidth = 2 + XTP_SAFE_GET5(GetViewGroup(), GetViewDay(), GetView(), GetPaintManager(), GetMonthViewEventPart(), GetTextExtent(pDC, strTime).cx, 0);
  104. }
  105. int nECFormat = XTP_SAFE_GET3(GetViewGroup(), GetViewDay(), GetView(), GetEventCaptionFormat(), 0);
  106. BOOL bStartTime = nECFormat == xtpCalendarCaptionFormatStartSubject;
  107. BOOL bStartEndTime = nECFormat == xtpCalendarCaptionFormatStartEndSubject;
  108. if (bStartTime || bStartEndTime)
  109. {
  110. m_rcStartTime.CopyRect(m_rcEvent);
  111. m_rcStartTime.right = min(m_rcStartTime.left + nTimeCellWidth, m_rcEvent.right);
  112. m_rcText.left = min(m_rcStartTime.right + 1, m_rcEvent.right);
  113. }
  114. if (bStartEndTime)
  115. {
  116. m_rcEndTime.CopyRect(m_rcStartTime);
  117. m_rcEndTime.OffsetRect(nTimeCellWidth + 1, 0);
  118. m_rcEndTime.left = min(m_rcEndTime.left, m_rcEvent.right);
  119. m_rcEndTime.right = min(m_rcEndTime.right, m_rcEvent.right);
  120. m_rcText.left = min(m_rcEndTime.right + 1, m_rcEvent.right);
  121. }
  122. if (bStartTime || bStartEndTime)
  123. {
  124. m_rcText.left = min(m_rcText.left + 5, m_rcEvent.right);
  125. }
  126. m_rcSubjectEditor.CopyRect(m_rcText);
  127. m_rcSubjectEditor.right = m_rcEventMax.right;
  128. m_rcSubjectEditor.top++;
  129. m_rcSubjectEditor.bottom--;
  130. }
  131. ASSERT(m_nMultiDayEventFlags);
  132. }
  133. void CXTPCalendarMonthViewEvent::AdjustLayout2(CDC* pDC, const CRect& rcEventMax, int nEventPlaceNumber)
  134. {
  135. TBase::AdjustLayout(pDC, rcEventMax, nEventPlaceNumber);
  136. m_nMultiDayEventFlags = 0;
  137. CXTPCalendarEvent* pEvent = GetEvent();
  138. if (!pEvent  || !pDC ||
  139. !XTP_SAFE_GET2(GetViewGroup(), GetViewDay(), GetView(), NULL) ||
  140. !XTP_SAFE_GET3(GetViewGroup(), GetViewDay(), GetView(), GetTheme(), NULL) )
  141. {
  142. ASSERT(FALSE);
  143. return;
  144. }
  145. CXTPCalendarTheme* pTheme = GetViewGroup()->GetViewDay()->GetView()->GetTheme();
  146. // all-day event
  147. if (IsMultidayEvent())
  148. {
  149. // to calculate multiday-flags
  150. AdjustMultidayEvent(rcEventMax, nEventPlaceNumber);
  151. pTheme->GetMonthViewPart()->GetDayPart()->GetMultiDayEventPart()->AdjustLayout(this, pDC, rcEventMax, nEventPlaceNumber);
  152. return;
  153. }
  154. m_nMultiDayEventFlags = xtpCalendarMultiDayNoMultiDay;
  155. pTheme->GetMonthViewPart()->GetDayPart()->GetSingleDayEventPart()->AdjustLayout(this, pDC, rcEventMax, nEventPlaceNumber);
  156. }
  157. BOOL CXTPCalendarMonthViewEvent::IsVisible()
  158. {
  159. if (!GetViewGroup() || !GetViewGroup()->GetViewDay())
  160. {
  161. ASSERT(FALSE);
  162. return FALSE;
  163. }
  164. CRect rcDayEvents = GetViewGroup()->GetViewDay()->GetDayEventsRect();
  165. BOOL bVisible = m_rcEvent.bottom <= rcDayEvents.bottom;
  166. return bVisible;
  167. }
  168. BOOL CXTPCalendarMonthViewEvent::HitTestEx(CPoint point, XTP_CALENDAR_HITTESTINFO_MONTH_VIEW* pInfo)
  169. {
  170. if (!XTP_SAFE_GET2(GetViewGroup(), GetViewDay(), GetView(), 0))
  171. {
  172. ASSERT(FALSE);
  173. return FALSE;
  174. }
  175. if (!m_rcEventMax.PtInRect(point) || !IsVisible())
  176. {
  177. return FALSE;
  178. }
  179. //-----------------------------------------
  180. XTP_CALENDAR_HITTESTINFO_MONTH_VIEW tmpInfo;
  181. //tmpInfo.pt = point;
  182. tmpInfo.dt = GetViewGroup()->GetViewDay()->GetDayDate();
  183. tmpInfo.dayPOS.nWeekIndex = GetViewGroup()->GetViewDay()->m_nWeekIndex;
  184. tmpInfo.dayPOS.nWeekDayIndex = GetViewGroup()->GetViewDay()->m_nWeekDayIndex;
  185. tmpInfo.pViewDay = GetViewGroup()->GetViewDay();
  186. tmpInfo.pViewGroup = GetViewGroup();
  187. tmpInfo.pViewEvent = this;
  188. tmpInfo.uHitCode = xtpCalendarHitTestUnknown;
  189. //-----------------------------------------
  190. BOOL bIsFirst = (m_nMultiDayEventFlags & xtpCalendarMultiDayFirst);
  191. BOOL bIsLast = (m_nMultiDayEventFlags & xtpCalendarMultiDayLast);
  192. //BOOL bIsMiddle = (m_nMultiDayEventFlags & xtpCalendarMultiDayMiddle);
  193. CRect rcBegin = m_rcEventMax;
  194. rcBegin.right = min(m_rcEvent.left + 5, m_rcEvent.right);
  195. if (!bIsFirst)
  196. {
  197. rcBegin = m_rcEvent;
  198. rcBegin.right = rcBegin.left;
  199. }
  200. CRect rcEnd = m_rcEventMax;
  201. rcEnd.left = max(m_rcEvent.right - 5, m_rcEvent.left);
  202. if (!bIsLast)
  203. {
  204. rcEnd = m_rcEvent;
  205. rcEnd.left = rcEnd.right;
  206. }
  207. CRect rcTime = m_rcEvent;
  208. int nTimeWidth = GetViewGroup()->GetViewDay()->GetView()->GetEventTimeWidth();
  209. rcTime.left = min(rcBegin.right, m_rcEvent.right);
  210. rcTime.right = min(rcTime.left + max(nTimeWidth-4, 0), rcTime.right);
  211. BOOL bTimeUsed = nTimeWidth && !(m_nMultiDayEventFlags & xtpCalendarMultiDayFMLmask);
  212. CRect rcDrag = m_rcEventMax;
  213. rcDrag.right = rcDrag.left + 1;
  214. CRect rcText = m_rcEvent;
  215. rcText.left = bTimeUsed ? rcTime.right : rcBegin.right;
  216. rcText.right = max(rcEnd.left, rcText.left);
  217. // Must be one region without holes between Begin, Time, Text, End parts
  218. ASSERT(rcBegin.right == rcTime.left &&
  219. bTimeUsed ? rcTime.right == rcText.left : rcBegin.right == rcText.left &&
  220. rcText.right == rcEnd.left);
  221. // // for DEBUG
  222. //TRACE(_T("*** Begin(%d, %d) [%s]Time(%d, %d) Text(%d, %d) End(%d, %d) n"), rcBegin.left, rcBegin.right,
  223. //  bTimeUsed ? _T("+") :_T("-"), rcTime.left, rcTime.right,
  224. //  rcText.left, rcText.right, rcEnd.left, rcEnd.right);
  225. if (bIsFirst && rcBegin.PtInRect(point))
  226. {
  227. tmpInfo.uHitCode = xtpCalendarHitTestEventResizeHArea | xtpCalendarHitTestEventResizeBegin;
  228. *pInfo = tmpInfo;
  229. return TRUE;
  230. }
  231. if (bIsLast && rcEnd.PtInRect(point))
  232. {
  233. tmpInfo.uHitCode = xtpCalendarHitTestEventResizeHArea | xtpCalendarHitTestEventResizeEnd;
  234. *pInfo = tmpInfo;
  235. return TRUE;
  236. }
  237. if (bTimeUsed && rcTime.PtInRect(point))
  238. {
  239. tmpInfo.uHitCode = xtpCalendarHitTestEventDragArea;
  240. *pInfo = tmpInfo;
  241. return TRUE;
  242. }
  243. // to repeat outlook logic, bat this is strange (looks like bug)
  244. //if (bIsMiddle && rcDrag.PtInRect(point))
  245. //{
  246. //  tmpInfo.uHitCode = xtpCalendarHitTestEventDragArea;
  247. // *pInfo = tmpInfo;
  248. //  return TRUE;
  249. //}
  250. if (rcText.PtInRect(point))
  251. {
  252. tmpInfo.uHitCode = xtpCalendarHitTestEventTextArea;
  253. *pInfo = tmpInfo;
  254. return TRUE;
  255. }
  256. //-----------------------------------------
  257. return FALSE;
  258. }
  259. CFont* CXTPCalendarMonthViewEvent::GetSubjectEditorFont()
  260. {
  261. CXTPCalendarPaintManager::CMonthViewEventPart* pMEPart =
  262. XTP_SAFE_GET4(GetViewGroup(), GetViewDay(), GetView(), GetPaintManager(), GetMonthViewEventPart(), NULL);
  263. ASSERT(pMEPart);
  264. if (!pMEPart)
  265. {
  266. return NULL;
  267. }
  268. CFont* pFont = &pMEPart->GetTextFont();
  269. return pFont;
  270. }
  271. BOOL CXTPCalendarMonthViewEvent::IsShowEndTime()
  272. {
  273. return XTP_SAFE_GET1(GetCalendarControl(), MonthView_IsShowEndDate(), FALSE);
  274. }
  275. BOOL CXTPCalendarMonthViewEvent::IsTimeAsClock()
  276. {
  277. return XTP_SAFE_GET1(GetCalendarControl(), MonthView_IsShowTimeAsClocks(), FALSE);
  278. }
  279. void CXTPCalendarMonthViewEvent::OnPostAdjustLayout()
  280. {
  281. TBase::OnPostAdjustLayout();
  282. int nMDFmask = xtpCalendarMultiDayNoMultiDay | xtpCalendarMultiDayMaster;
  283. BOOL bOutOfBorders = m_rcText.Width() < m_szText.cx &&
  284.  (m_nMultiDayEventFlags & nMDFmask) != 0;
  285. SetTextOutOfBorders(bOutOfBorders);
  286. }