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

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarViewEvent.cpp: implementation of the CXTPCalendarViewEvent 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 "Common/XTPVC50Helpers.h"
  22. #include "Common/XTPMarkupRender.h"
  23. #include "XTPCalendarViewEvent.h"
  24. #include "XTPCalendarView.h"
  25. #include "XTPCalendarControl.h"
  26. #include "XTPCalendarViewDay.h"
  27. #include "XTPCalendarTheme.h"
  28. #include "XTPCalendarCustomProperties.h"
  29. #ifdef _DEBUG
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #define new DEBUG_NEW
  33. #endif
  34. //////////////////////////////////////////////////////////////////////
  35. //class CXTPCalendarViewEventSubjectEditor : public CEdit
  36. IMPLEMENT_DYNAMIC(CXTPCalendarViewEvent, CXTPCalendarWMHandler)
  37. BEGIN_MESSAGE_MAP(CXTPCalendarViewEventSubjectEditor, CEdit)
  38. ON_WM_GETDLGCODE()
  39. END_MESSAGE_MAP()
  40. CXTPCalendarViewEventSubjectEditor::CXTPCalendarViewEventSubjectEditor(CXTPCalendarControl* pOwner)
  41. {
  42. ASSERT(pOwner);
  43. m_pOwner = pOwner;
  44. }
  45. CXTPCalendarViewEventSubjectEditor::~CXTPCalendarViewEventSubjectEditor()
  46. {
  47. }
  48. BOOL CXTPCalendarViewEventSubjectEditor::OnWndMsg(UINT message, WPARAM wParam,
  49.   LPARAM lParam, LRESULT* pResult)
  50. {
  51. ASSERT(m_pOwner);
  52. if (m_pOwner)
  53. {
  54. if(message == WM_MOUSEMOVE)
  55. {
  56. CPoint pt(lParam);
  57. MapWindowPoints(m_pOwner, &pt, 1);
  58. lParam = MAKELPARAM(pt.x, pt.y);
  59. }
  60. BOOL bHandled = m_pOwner->OnWndMsg_Children(message, wParam, lParam, pResult);
  61. if (bHandled)
  62. {
  63. return TRUE;
  64. }
  65. }
  66. return CEdit::OnWndMsg(message, wParam, lParam, pResult);
  67. }
  68. UINT CXTPCalendarViewEventSubjectEditor::OnGetDlgCode()
  69. {
  70. return DLGC_WANTARROWS | DLGC_WANTTAB | DLGC_WANTALLKEYS;
  71. }
  72. //////////////////////////////////////////////////////////////////////
  73. CXTPCalendarViewEvent::CXTPCalendarViewEvent(CXTPCalendarEvent* pEvent, CXTPCalendarViewGroup* pViewGroup)
  74. {
  75. UNUSED_ALWAYS(pViewGroup);
  76. m_bShowingToolTip = FALSE;
  77. ASSERT(pEvent);
  78. m_ptrEvent = pEvent;
  79. CMDTARGET_ADDREF(m_ptrEvent);
  80. m_pMasterView = NULL;
  81. m_pUIElement = NULL;
  82. m_bSelected = FALSE;
  83. m_nMultiDayEventFlags = xtpCalendarMultiDayUnknown;
  84. m_nEventPlaceNumber = 0;
  85. m_nTimerID_ShowToolTip = 0;
  86. m_pSubjectEditor = NULL;
  87. //m_rcFirstClock.SetRect(0, 0, 0, 0);
  88. //m_rcLastClock.SetRect(0, 0, 0, 0);
  89. //m_rcStartTime.SetRect(0, 0, 0, 0);
  90. //m_rcEndTime.SetRect(0, 0, 0, 0);
  91. //  m_rcGlyphs.SetRect(0, 0, 0, 0);
  92. m_rcText.SetRect(0, 0, 0, 0);
  93. m_szText.cx = 0;
  94. m_szText.cy = 0;
  95. m_bMultyDayTextAlign = FALSE;
  96. m_bTextOutOfBorders = TRUE;
  97. }
  98. CXTPCalendarViewEvent::~CXTPCalendarViewEvent()
  99. {
  100. //---------------------------------------------------------------------------
  101. if (m_pSubjectEditor)
  102. {
  103. ASSERT(FALSE);
  104. delete m_pSubjectEditor;
  105. m_pSubjectEditor = NULL;
  106. }
  107. CMDTARGET_RELEASE(m_ptrEvent);
  108. CMDTARGET_RELEASE(m_pMasterView);
  109. XTPMarkupReleaseElement(m_pUIElement);
  110. ASSERT(m_nTimerID_ShowToolTip == 0);
  111. }
  112. void CXTPCalendarViewEvent::OnBeforeDestroy()
  113. {
  114. //---------------------------------------------------------------------------
  115. if (IsEditingSubject())
  116. {
  117. XTP_SAFE_CALL3(GetViewGroup_(), GetViewDay_(), GetView_(), EndEditSubject(xtpCalendarEditSubjectCommit, FALSE) );
  118. }
  119. //---------------------------------------------------------------------------
  120. if (m_nTimerID_ShowToolTip)
  121. {
  122. KillTimer(m_nTimerID_ShowToolTip);
  123. m_nTimerID_ShowToolTip = 0;
  124. }
  125. if (IsShowingToolTip())
  126. {
  127. HideToolTip();
  128. }
  129. }
  130. CXTPCalendarControl* CXTPCalendarViewEvent::GetCalendarControl()
  131. {
  132. return XTP_SAFE_GET2(GetViewGroup_(), GetViewDay_(), GetCalendarControl(), NULL);
  133. }
  134. void CXTPCalendarViewEvent::AdjustLayout(CDC* pDC, const CRect& rcEventMax, int nEventPlaceNumber)
  135. {
  136. UNREFERENCED_PARAMETER(pDC);
  137. m_rcEvent.CopyRect(&rcEventMax);
  138. m_rcEventMax.CopyRect(&rcEventMax);
  139. m_rcSubjectEditor.CopyRect(&rcEventMax);
  140. m_rcToolTip.CopyRect(&rcEventMax);
  141. m_rcText.CopyRect(&rcEventMax);
  142. m_rcStartTime.CopyRect(m_rcEvent);
  143. m_rcStartTime.DeflateRect(0, 0, m_rcStartTime.Width(), m_rcStartTime.Height());
  144. m_rcEndTime.CopyRect(m_rcStartTime);
  145. m_nEventPlaceNumber = nEventPlaceNumber;
  146. }
  147. void CXTPCalendarViewEvent::OnMouseMove(UINT nFlags, CPoint point)
  148. {
  149. UNREFERENCED_PARAMETER(nFlags);
  150. CXTPCalendarView* pView =  XTP_SAFE_GET2(GetViewGroup_(), GetViewDay_(), GetView_(), NULL);
  151. if (!pView || !GetCalendarControl())
  152. {
  153. ASSERT(FALSE);
  154. return;
  155. }
  156. XTP_CALENDAR_HITTESTINFO hitInfo;
  157. BOOL bIsNoDragging = pView->GetDraggingMode() == xtpCalendaDragModeUnknown;
  158. BOOL bHideTooltip = TRUE;
  159. BOOL bHit = HitTest(point, &hitInfo);
  160. // to check that mouse is not over some topmost element (like Expand/Scroll button)
  161. if (bHit)
  162. {
  163. bHit = XTP_SAFE_GET3(GetViewGroup_(), GetViewDay_(), GetView_(), HitTest(point, &hitInfo), FALSE) &&
  164. ((hitInfo.uHitCode & xtpCalendarHitTestEvent_Mask) && hitInfo.pViewEvent == this);
  165. }
  166. if (bHit)
  167. {
  168. int eDragMode = pView->_GetDraggingMode(&hitInfo);
  169. BOOL bDragEnabled = !pView->IsEditOperationDisabledNotify(pView->_DragMod2Operation(eDragMode), this);
  170. if (bDragEnabled && hitInfo.uHitCode & xtpCalendarHitTestEventResizeHArea)
  171. {
  172. GetCalendarControl()->m_mouseMode = xtpCalendarMouseEventPreResizeH;
  173. }
  174. else if (bDragEnabled && hitInfo.uHitCode & xtpCalendarHitTestEventResizeVArea)
  175. {
  176. GetCalendarControl()->m_mouseMode = xtpCalendarMouseEventPreResizeV;
  177. }
  178. else if (bDragEnabled && hitInfo.uHitCode & xtpCalendarHitTestEventDragArea)
  179. {
  180. GetCalendarControl()->m_mouseMode = xtpCalendarMouseEventPreDrag;
  181. }
  182. else if (hitInfo.uHitCode & xtpCalendarHitTestEventTextArea)
  183. {
  184. bHideTooltip = !!(nFlags & MK_LBUTTON);
  185. BOOL bShow = !IsMultidayEvent() || XTP_SAFE_GET2(pView, GetResources(), GetCount(), 0) > 1;
  186. if (bShow && bIsNoDragging && !IsEditingSubject() && !pView->IsEditingSubject() &&
  187. !IsShowingToolTip() && !(nFlags&MK_LBUTTON) && m_bTextOutOfBorders)
  188. {
  189. if (m_nTimerID_ShowToolTip == 0)
  190. {
  191. UINT uTimeOut_ms = GetShowToolTipTimeOut();
  192. m_nTimerID_ShowToolTip = SetTimer(uTimeOut_ms);
  193. ASSERT(m_nTimerID_ShowToolTip);
  194. DBG_TRACE_TIMER(_T("SET Timer: ID =%d, m_nTimerID_ShowToolTip, CXTPCalendarViewEvent::OnMouseMove(xtpCalendarHitTestEvent_Mask) n"), m_nTimerID_ShowToolTip);
  195. }
  196. }
  197. }
  198. }
  199. else // we are not under Event view area
  200. {
  201. // kill waiting for mouse under event view area
  202. if (m_nTimerID_ShowToolTip)
  203. {
  204. KillTimer(m_nTimerID_ShowToolTip);
  205. m_nTimerID_ShowToolTip = 0;
  206. }
  207. }
  208. if (bHideTooltip && IsShowingToolTip())
  209. {
  210. HideToolTip();
  211. }
  212. }
  213. //void CXTPCalendarViewEvent::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
  214. //{
  215. //  UNREFERENCED_PARAMETER(nChar);
  216. //  UNREFERENCED_PARAMETER(nRepCnt);
  217. //  UNREFERENCED_PARAMETER(nFlags);
  218. //}
  219. //
  220. //void CXTPCalendarViewEvent::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  221. //{
  222. //  UNREFERENCED_PARAMETER(nChar);
  223. //  UNREFERENCED_PARAMETER(nRepCnt);
  224. //  UNREFERENCED_PARAMETER(nFlags);
  225. //}
  226. //
  227. //BOOL CXTPCalendarViewEvent::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  228. //{
  229. //  UNREFERENCED_PARAMETER(nChar);
  230. //  UNREFERENCED_PARAMETER(nRepCnt);
  231. //  UNREFERENCED_PARAMETER(nFlags);
  232. //  return FALSE;
  233. //}
  234. void CXTPCalendarViewEvent::AddMultiDayEvent_Slave(CXTPCalendarViewEvent* pSlaveView, int nMasterEventPlace)
  235. {
  236. if (!pSlaveView || !pSlaveView->GetViewGroup_() || !GetEvent())
  237. {
  238. ASSERT(FALSE);
  239. return;
  240. }
  241. pSlaveView->GetViewGroup_()->ExchangeEventPlace(pSlaveView, nMasterEventPlace);
  242. pSlaveView->SetMultiDayEvent_MasterSlave(FALSE, this);
  243. if (!pSlaveView->IsVisible())
  244. {
  245. return;
  246. }
  247. //  ASSERT(m_rcEvent.top == pSlaveView->m_rcEvent.top);
  248. //  ASSERT(m_rcEventMax.bottom == pSlaveView->m_rcEventMax.bottom);
  249. m_rcEvent.right = pSlaveView->m_rcEvent.right;
  250. m_rcEventMax.right = pSlaveView->m_rcEventMax.right;
  251. // correct right margins
  252. m_rcText.right = m_rcEvent.right;
  253. m_rcLastClock.CopyRect(m_rcText);
  254. m_rcLastClock.left = m_rcLastClock.right;
  255. m_rcLastClock.bottom = m_rcLastClock.top;
  256. //pSlaveView->SetMultiDayEvent_MasterSlave(FALSE, this);
  257. int nMDEFlags = pSlaveView->GetMultiDayEventFlags();
  258. if (nMDEFlags & xtpCalendarMultiDayLast)
  259. {
  260. m_nMultiDayEventFlags |= xtpCalendarMultiDayLast;
  261. COleDateTime dtEE(GetEvent()->GetEndTime());
  262. if (dtEE == CXTPCalendarUtils::ResetTime(dtEE) || GetEvent()->IsAllDayEvent())
  263. {
  264. m_rcLastClock.left = m_rcLastClock.right;
  265. }
  266. else
  267. {
  268. // correct last clock rect
  269. CSize szClock = XTP_SAFE_GET4(GetViewGroup_(), GetViewDay_(), GetView_(), GetPaintManager(), GetClockSize(), CSize(0) );
  270. m_rcLastClock.left = m_rcLastClock.right - szClock.cx -1;
  271. m_rcLastClock.bottom = m_rcLastClock.top + szClock.cy;
  272. m_rcText.right -= szClock.cx;
  273. }
  274. }
  275. }
  276. BOOL CXTPCalendarViewEvent::IsMultidayEvent()
  277. {
  278. if (!m_ptrEvent)
  279. {
  280. ASSERT(FALSE);
  281. return FALSE;
  282. }
  283. if (m_ptrEvent->IsAllDayEvent())
  284. {
  285. return TRUE;
  286. }
  287. int nDays = m_ptrEvent->GetEventPeriodDays();
  288. return nDays > 1;
  289. }
  290. void CXTPCalendarViewEvent::OnPostAdjustLayout()
  291. {
  292. if (IsMultidayEvent())
  293. {
  294. m_rcSubjectEditor.CopyRect(&m_rcEvent);
  295. m_rcSubjectEditor.left += 1;
  296. m_rcText.CopyRect(m_rcEvent);
  297. m_rcText.left += min(m_rcText.Width()-1, m_rcFirstClock.Width() + 4);
  298. m_rcText.right -= min(m_rcText.Width()-1, m_rcLastClock.Width() + 4);
  299. int nGlyphs = CalcIconsRect(m_rcEvent);
  300. CRect rcGlyphs(max(m_rcText.CenterPoint().x - (m_szText.cx/2 + nGlyphs + 3), m_rcText.left),
  301.    m_rcText.top,
  302.    m_rcText.right,
  303.    m_rcText.bottom
  304.  );
  305. if (m_rcText.CenterPoint().x <= m_rcText.left + nGlyphs + m_szText.cx/2) //
  306. {
  307. m_rcText.left = min(m_rcText.left + CalcIconsRect(rcGlyphs), m_rcText.right);
  308. m_bMultyDayTextAlign = TRUE;
  309. }
  310. else
  311. {
  312. m_bMultyDayTextAlign = FALSE;
  313. CalcIconsRect(rcGlyphs);
  314. }
  315. }
  316. m_rcToolTip = m_rcEvent;
  317. AdjustSubjectEditor();
  318. }
  319. void CXTPCalendarViewEvent::AdjustMultidayEvent(CRect rcEventMax, int nEventPlaceNumber)
  320. {
  321. if (!XTP_SAFE_GET3(GetViewGroup_(), GetViewDay_(), GetView_(), GetPaintManager(), NULL)
  322. || !m_ptrEvent)
  323. {
  324. ASSERT(FALSE);
  325. return;
  326. }
  327. int nRowHeight = GetViewGroup_()->GetViewDay_()->GetView_()->GetRowHeight();
  328. m_nMultiDayEventFlags = 0;
  329. m_rcEventMax.top = rcEventMax.top + nRowHeight * nEventPlaceNumber + 1;
  330. m_rcEventMax.bottom = m_rcEventMax.top + nRowHeight - 2;
  331. m_rcEvent.CopyRect(&m_rcEventMax);
  332. m_rcEvent.left += 4;
  333. m_rcEvent.right -= 4;
  334. if (!IsMultidayEvent())
  335. {
  336. m_nMultiDayEventFlags = xtpCalendarMultiDayNoMultiDay;
  337. return;
  338. }
  339. COleDateTime dtDay = GetViewGroup_()->GetViewDay_()->GetDayDate();
  340. COleDateTime dtStartDay = CXTPCalendarUtils::ResetTime(m_ptrEvent->GetStartTime());
  341. COleDateTime dtEndDay = CXTPCalendarUtils::RetriveEventEndDate(m_ptrEvent);
  342. //TRACE(dtStartDay.Format(_T("%A, %B %d, %Y %H %M %sn")));
  343. //TRACE(dtEndDay.Format(_T("%A, %B %d, %Y %H %M %sn")));
  344. ASSERT(dtDay == dtStartDay || dtDay == dtEndDay || dtDay > dtStartDay && dtDay < dtEndDay);
  345. m_rcText.CopyRect(m_rcEvent);
  346. m_rcFirstClock.CopyRect(m_rcEvent);
  347. m_rcFirstClock.right = m_rcFirstClock.left;
  348. m_rcFirstClock.bottom = m_rcFirstClock.top;
  349. CSize szClock(GetViewGroup_()->GetViewDay_()->GetView_()->GetPaintManager()->GetClockSize());
  350. if (dtDay == dtStartDay)
  351. {
  352. m_nMultiDayEventFlags |= xtpCalendarMultiDayFirst;
  353. if (!m_ptrEvent->IsAllDayEvent() && dtDay != m_ptrEvent->GetStartTime())
  354. {
  355. m_rcFirstClock.right = m_rcFirstClock.left + szClock.cx;
  356. m_rcFirstClock.bottom = m_rcFirstClock.top + szClock.cy;
  357. m_rcText.left += m_rcFirstClock.right + 4;
  358. }
  359. }
  360. if (dtDay == dtEndDay)
  361. {
  362. m_nMultiDayEventFlags |= xtpCalendarMultiDayLast;
  363. }
  364. COleDateTimeSpan spDay(1, 0, 0, 0);
  365. if (dtDay == m_ptrEvent->GetEndTime() - spDay)
  366. {
  367. m_nMultiDayEventFlags |= xtpCalendarMultiDayLast;
  368. }
  369. else if (dtDay > dtStartDay && dtDay < dtEndDay)
  370. {
  371. m_nMultiDayEventFlags |= xtpCalendarMultiDayMiddle;
  372. }
  373. //m_rcGlyphs.CopyRect(rcEventMax);
  374. m_rcStartTime.CopyRect(m_rcEventMax);
  375. m_rcStartTime.right = m_rcStartTime.left;
  376. m_rcEndTime.CopyRect(m_rcEventMax);
  377. m_rcStartTime.left = m_rcStartTime.right;
  378. }
  379. void CXTPCalendarViewEvent::_MoveRectY(int nYbasePrev, int nYbaseNew, CRect& rRC)
  380. {
  381. int nOffset = rRC.top - nYbasePrev;
  382. rRC.bottom = rRC.Height() + nYbaseNew + nOffset;
  383. rRC.top = nYbaseNew + nOffset;
  384. }
  385. void CXTPCalendarViewEvent::ChangeEventPlace(int nNewPlace)
  386. {
  387. int nEventHeight = XTP_SAFE_GET3(GetViewGroup_(), GetViewDay_(), GetView_(), GetRowHeight(), 1);
  388. int nY0 = m_rcEvent.top;
  389. int nEventsTop = m_rcEvent.top - m_nEventPlaceNumber * nEventHeight - 1;
  390. int nY1 = nEventsTop + nNewPlace * nEventHeight + 1;
  391. _ChangeEventPlace(nNewPlace, nY0, nY1);
  392. }
  393. void CXTPCalendarViewEvent::_ChangeEventPlace(int nNewPlace, int nYbasePrev, int nYbaseNew)
  394. {
  395. _MoveRectY(nYbasePrev, nYbaseNew, m_rcFirstClock);
  396. _MoveRectY(nYbasePrev, nYbaseNew, m_rcLastClock);
  397. _MoveRectY(nYbasePrev, nYbaseNew, m_rcStartTime);
  398. _MoveRectY(nYbasePrev, nYbaseNew, m_rcEndTime);
  399. _MoveRectY(nYbasePrev, nYbaseNew, m_rcReminderGlyph);
  400. _MoveRectY(nYbasePrev, nYbaseNew, m_rcRecurrenceGlyph);
  401. _MoveRectY(nYbasePrev, nYbaseNew, m_rcMeetingGlyph);
  402. _MoveRectY(nYbasePrev, nYbaseNew, m_rcPrivateGlyph);
  403. _MoveRectY(nYbasePrev, nYbaseNew, m_rcEvent);
  404. _MoveRectY(nYbasePrev, nYbaseNew, m_rcEventMax);
  405. _MoveRectY(nYbasePrev, nYbaseNew, m_rcSubjectEditor);
  406. _MoveRectY(nYbasePrev, nYbaseNew, m_rcToolTip);
  407. _MoveRectY(nYbasePrev, nYbaseNew, m_rcText);
  408. m_nEventPlaceNumber = nNewPlace;
  409. }
  410. void CXTPCalendarViewEvent::SetMultiDayEvent_MasterSlave(BOOL bMaster, CXTPCalendarViewEvent* pMasterView)
  411. {
  412. m_nMultiDayEventFlags |= bMaster ? xtpCalendarMultiDayMaster : xtpCalendarMultiDaySlave;
  413. ASSERT(bMaster && !pMasterView || !bMaster && pMasterView);
  414. CMDTARGET_RELEASE(m_pMasterView);
  415. m_pMasterView = pMasterView;
  416. CMDTARGET_ADDREF(m_pMasterView);
  417. }
  418. UINT CXTPCalendarViewEvent::SetTimer(UINT uTimeOut_ms)
  419. {
  420. return XTP_SAFE_GET1(GetViewGroup_(), SetTimer(uTimeOut_ms), 0);
  421. }
  422. void CXTPCalendarViewEvent::KillTimer(UINT uTimerID)
  423. {
  424. XTP_SAFE_CALL1(GetViewGroup_(), KillTimer(uTimerID) );
  425. }
  426. BOOL CXTPCalendarViewEvent::OnTimer(UINT_PTR uTimerID)
  427. {
  428. if (!uTimerID)
  429. {
  430. ASSERT(FALSE);
  431. return FALSE;
  432. }
  433. if (uTimerID == m_nTimerID_ShowToolTip)
  434. {
  435. ShowToolTip();
  436. return TRUE;
  437. }
  438. return FALSE;
  439. }
  440. CXTPCalendarViewEvent* CXTPCalendarViewEvent::StartEditSubject()
  441. {
  442. //- Forward editing process to master event ---------------------------------
  443. if (m_pMasterView)
  444. {
  445. if (!m_pMasterView->IsEditingSubject())
  446. {
  447. m_pMasterView->StartEditSubject();
  448. }
  449. return m_pMasterView;
  450. }
  451. // ensure that previous one is destroyed.
  452. if (m_pSubjectEditor)
  453. {
  454. ASSERT(FALSE);
  455. delete m_pSubjectEditor;
  456. m_pSubjectEditor = NULL;
  457. }
  458. CXTPCalendarControl* pControl = GetCalendarControl();
  459. if (!pControl)
  460. {
  461. ASSERT(FALSE);
  462. return NULL;
  463. }
  464. if (IsShowingToolTip())
  465. {
  466. HideToolTip();
  467. }
  468. // let theme to customize subject editor
  469. if (pControl->GetTheme())
  470. {
  471. m_pSubjectEditor = pControl->GetTheme()->StartEditSubject(this);
  472. if (m_pSubjectEditor)
  473. {
  474. return this;
  475. }
  476. }
  477. //- create and show text editor ---------------------------------------------
  478. m_pSubjectEditor = new CXTPCalendarViewEventSubjectEditor(pControl);
  479. if (!m_pSubjectEditor)
  480. {
  481. return NULL;
  482. }
  483. DWORD dwEditStyles = WS_CHILD | WS_VISIBLE | GetSubjectEditorStyles()
  484.  | ES_MULTILINE | ES_AUTOHSCROLL;
  485. m_pSubjectEditor->Create(dwEditStyles, m_rcSubjectEditor, pControl, 0);
  486. //m_pSubjectEditor->CreateEx(WS_EX_TRANSPARENT, _T("EDIT"), NULL,
  487. //                         dwEditStyles, m_rcSubjectEditor, pControl, 0);
  488. m_pSubjectEditor->SetFocus();
  489. CFont* pEditorFont = GetSubjectEditorFont();
  490. if (pEditorFont)
  491. {
  492. m_pSubjectEditor->SetFont(pEditorFont);
  493. }
  494. m_pSubjectEditor->SetWindowText(XTP_SAFE_GET1(m_ptrEvent, GetSubject(), _T("")));
  495. m_pSubjectEditor->SetSel(0, 0);
  496. //---------------------------------------------------------------------------
  497. return this;
  498. }
  499. CString CXTPCalendarViewEvent::GetEditingSubjectFromEditor()
  500. {
  501. if (!m_pSubjectEditor)
  502. {
  503. ASSERT(FALSE);
  504. return _T("");
  505. }
  506. CString strSubject;
  507. m_pSubjectEditor->GetWindowText(strSubject);
  508. REPLACE_S(strSubject, _T(" rrn "), _T(" "));
  509. REPLACE_S(strSubject, _T(" rrn"), _T(" "));
  510. REPLACE_S(strSubject, _T("rrn "), _T(" "));
  511. REPLACE_S(strSubject, _T("rn"), _T(" "));
  512. REPLACE_S(strSubject, _T("n"), _T(" "));
  513. REPLACE_S(strSubject, _T("r"), _T(" "));
  514. return strSubject;
  515. }
  516. CString CXTPCalendarViewEvent::EndEditSubject()
  517. {
  518. if (!m_pSubjectEditor)
  519. {
  520. ASSERT(FALSE);
  521. return _T("");
  522. }
  523. CString strSubject = GetEditingSubjectFromEditor();
  524. //---------------------------------------------------------------------------
  525. delete m_pSubjectEditor;
  526. m_pSubjectEditor = NULL;
  527. //---------------------------------------------------------------------------
  528. return strSubject;
  529. }
  530. BOOL CXTPCalendarViewEvent::IsShowingToolTip()
  531. {
  532. return m_bShowingToolTip;
  533. }
  534. void CXTPCalendarViewEvent::ShowToolTip()
  535. {
  536. if (m_nTimerID_ShowToolTip)
  537. {
  538. KillTimer(m_nTimerID_ShowToolTip);
  539. m_nTimerID_ShowToolTip = 0;
  540. }
  541. BOOL bFocused = CWnd::GetFocus() == (CWnd*)GetCalendarControl();
  542. if (!bFocused)
  543. {
  544. return;
  545. }
  546. // create tooltip text
  547. CString strTip = GetToolText();
  548. // show tooltip window
  549. if (GetCalendarControl())
  550. {
  551. GetCalendarControl()->ShowToolTip(strTip, m_rcToolTip, GetSubjectEditorFont());
  552. m_bShowingToolTip = TRUE;
  553. }
  554. }
  555. void CXTPCalendarViewEvent::HideToolTip()
  556. {
  557. if (GetCalendarControl())
  558. {
  559. GetCalendarControl()->HideToolTip();
  560. }
  561. m_bShowingToolTip = FALSE;
  562. }
  563. CString CXTPCalendarViewEvent::FormatEventTime(COleDateTime dtTime)
  564. {
  565. return XTP_SAFE_GET3(GetViewGroup_(), GetViewDay_(), GetView_(), FormatEventTime(dtTime), _T("") );
  566. }
  567. CString CXTPCalendarViewEvent::GetToolText()
  568. {
  569. if (!m_ptrEvent)
  570. {
  571. ASSERT(FALSE);
  572. return _T("");
  573. }
  574. CString strTime;
  575. if (!IsMultidayEvent())
  576. {
  577. COleDateTime dtStart = m_ptrEvent->GetStartTime();
  578. COleDateTime dtEnd = m_ptrEvent->GetEndTime();
  579. DWORD dwTimeFlags = xtpCalendarItemText_EventStartTimeText;
  580. if (!CXTPCalendarUtils::IsEqual(dtStart, dtEnd))
  581. dwTimeFlags = dwTimeFlags | xtpCalendarItemText_EventEndTimeText;
  582. strTime = GetItemText(dwTimeFlags);
  583. }
  584. if (!strTime.IsEmpty())
  585. {
  586. strTime += _T(" ");
  587. }
  588. CString strTip = strTime + m_ptrEvent->GetSubject();
  589. // add Location for Office2007 theme
  590. CXTPCalendarControl* pControl = GetCalendarControl();
  591. if (pControl)
  592. {
  593. if (pControl->GetPaintTheme() == xtpCalendarThemeOffice2007)
  594. {
  595. CString strLocation(m_ptrEvent->GetLocation());
  596. if (strLocation.GetLength() > 0)
  597. {
  598. strTip += _T("n(") + strLocation + _T(")");
  599. }
  600. }
  601. }
  602. //---------------------------------------------------------
  603. DWORD dwFlags = XTP_SAFE_GET1(GetCalendarControl(), GetAskItemTextFlags(), 0);
  604. if (dwFlags & xtpCalendarItemText_EventToolTipText)
  605. {
  606. XTP_CALENDAR_GETITEMTEXT_PARAMS objRequest;
  607. ::ZeroMemory(&objRequest, sizeof(objRequest));
  608. objRequest.nItem = (int)xtpCalendarItemText_EventToolTipText;
  609. objRequest.pstrText = &strTip;
  610. objRequest.pViewEvent = this;
  611. XTP_SAFE_CALL1(GetCalendarControl(), SendNotificationAlways(XTP_NC_CALENDAR_GETITEMTEXT, (WPARAM)&objRequest, 0));
  612. }
  613. return strTip;
  614. }
  615. int CXTPCalendarViewEvent::CalcIconsRect(CRect rc)
  616. {
  617. rc.top += 2;
  618. rc.bottom += 2;
  619. m_rcReminderGlyph.CopyRect(rc);
  620. m_rcPrivateGlyph.CopyRect(rc);
  621. m_rcRecurrenceGlyph.CopyRect(rc);
  622. m_rcMeetingGlyph.CopyRect(rc);
  623. m_rcReminderGlyph.right = m_rcReminderGlyph.left;
  624. m_rcPrivateGlyph.right = m_rcPrivateGlyph.left;
  625. m_rcRecurrenceGlyph.right = m_rcRecurrenceGlyph.left;
  626. m_rcMeetingGlyph.right = m_rcMeetingGlyph.left;
  627. m_rcReminderGlyph.bottom = m_rcReminderGlyph.top + 11;
  628. m_rcPrivateGlyph.bottom = m_rcPrivateGlyph.top + 11;
  629. m_rcRecurrenceGlyph.bottom = m_rcRecurrenceGlyph.top + 11;
  630. m_rcMeetingGlyph.bottom = m_rcMeetingGlyph.top + 11;
  631. CPoint ptX(rc.left, rc.top);
  632. CPoint ptY(rc.left, rc.top);
  633. int nMinsize = 0;
  634. if (GetEvent() && GetEvent()->IsReminder())
  635. {
  636. m_rcReminderGlyph.right = min(m_rcReminderGlyph.right + 15, rc.right);
  637. ptX.Offset(15, 0);
  638. ptY.Offset(0, 11);
  639. }
  640. if (GetEvent() && GetEvent()->IsPrivate())
  641. {
  642. if (rc.bottom - (ptY.y + 11) > 11)
  643. {
  644. m_rcPrivateGlyph.left = min(ptY.x, rc.right);
  645. m_rcPrivateGlyph.top = min(ptY.y, rc.bottom);
  646. ptY.Offset(0, 11);
  647. }
  648. else
  649. {
  650. m_rcPrivateGlyph.left = min(ptX.x, rc.right);
  651. m_rcPrivateGlyph.top = min(ptX.y, rc.bottom);
  652. ptX.Offset(11, 0);
  653. }
  654. m_rcPrivateGlyph.right = min(m_rcPrivateGlyph.left + 11, rc.right);
  655. m_rcPrivateGlyph.bottom = min(m_rcPrivateGlyph.top + 11, rc.bottom);
  656. nMinsize = 15;
  657. }
  658. int nRecurrenceState = XTP_SAFE_GET1(GetEvent(), GetRecurrenceState(), xtpCalendarRecurrenceNotRecurring);
  659. if ((nRecurrenceState & xtpCalendarRecurrenceMaster) ||
  660. (nRecurrenceState == xtpCalendarRecurrenceOccurrence) ||
  661. (nRecurrenceState == xtpCalendarRecurrenceException)
  662.  )
  663. {
  664. if (rc.bottom - (ptY.y + 11) > 11)
  665. {
  666. m_rcRecurrenceGlyph.left = min(ptY.x, rc.right);
  667. m_rcRecurrenceGlyph.top = min(ptY.y, rc.bottom);
  668. ptY.Offset(0, 11);
  669. }
  670. else
  671. {
  672. m_rcRecurrenceGlyph.left = min(ptX.x, rc.right);
  673. m_rcRecurrenceGlyph.top = min(ptX.y, rc.bottom);
  674. ptX.Offset(15, 0);
  675. }
  676. m_rcRecurrenceGlyph.right = min(m_rcRecurrenceGlyph.left + 15, rc.right);
  677. m_rcRecurrenceGlyph.bottom = min(m_rcRecurrenceGlyph.top + 11, rc.bottom);
  678. nMinsize = 15;
  679. }
  680. if (GetEvent() && GetEvent()->IsMeeting())
  681. {
  682. if (rc.bottom - (ptY.y + 11) > 11)
  683. {
  684. m_rcMeetingGlyph.left = min(ptY.x, rc.right);
  685. m_rcMeetingGlyph.top = min(ptY.y, rc.bottom);
  686. ptY.Offset(0, 11);
  687. }
  688. else
  689. {
  690. m_rcMeetingGlyph.left = min(ptX.x, rc.right);
  691. m_rcMeetingGlyph.top = min(ptX.y, rc.bottom);
  692. ptX.Offset(15, 0);
  693. }
  694. m_rcMeetingGlyph.right = min(m_rcMeetingGlyph.left + 15, rc.right);
  695. m_rcMeetingGlyph.bottom = min(m_rcMeetingGlyph.top + 11, rc.bottom);
  696. nMinsize = 15;
  697. }
  698. return max((ptX.x)- rc.left, nMinsize);
  699. }
  700. void CXTPCalendarViewEvent::AdjustSubjectEditor()
  701. {
  702. if (IsEditingSubject() && m_pSubjectEditor)
  703. {
  704. m_pSubjectEditor->MoveWindow(&m_rcSubjectEditor, FALSE);
  705. }
  706. }
  707. BOOL CXTPCalendarViewEvent::IsSelected() const
  708. {
  709. CXTPCalendarViewEvents* pSelEvents = XTP_SAFE_GET3(GetViewGroup_(), GetViewDay_(), GetView_(), GetSelectedViewEvents(), NULL);
  710. if (!pSelEvents)
  711. {
  712. return FALSE;
  713. }
  714. int nFIndex = pSelEvents->Find(m_ptrEvent);
  715. return nFIndex >= 0;
  716. }
  717. void CXTPCalendarViewEvent::SetSelected(BOOL bSet)
  718. {
  719. XTP_SAFE_CALL3(GetViewGroup_(), GetViewDay_(), GetView_(), SelectViewEvent(this, bSet) );
  720. }
  721. CString CXTPCalendarViewEvent::GetItemText(DWORD dwItemFlag, LPCTSTR pcszDefaultText)
  722. {
  723. if (!GetCalendarControl() || !m_ptrEvent)
  724. {
  725. ASSERT(FALSE);
  726. return _T("");
  727. }
  728. DWORD dwFlags = GetCalendarControl()->GetAskItemTextFlags();
  729. CString strText;
  730. if (pcszDefaultText)
  731. {
  732. strText = pcszDefaultText;
  733. }
  734. else
  735. {
  736. if (dwItemFlag & xtpCalendarItemText_EventSubject)
  737. {
  738. strText = m_ptrEvent->GetSubject();
  739. }
  740. else if (dwItemFlag & xtpCalendarItemText_EventLocation)
  741. {
  742. strText = m_ptrEvent->GetLocation();
  743. }
  744. else if (dwItemFlag & xtpCalendarItemText_EventBody)
  745. {
  746. strText = m_ptrEvent->GetBody();
  747. }
  748. else if (dwItemFlag & (xtpCalendarItemText_EventStartTimeText | xtpCalendarItemText_EventEndTimeText))
  749. {
  750. if (dwItemFlag & xtpCalendarItemText_EventStartTimeText)
  751. strText = FormatEventTime(m_ptrEvent->GetStartTime());
  752. if (dwItemFlag & xtpCalendarItemText_EventEndTimeText)
  753. {
  754. if (!strText.IsEmpty())
  755. strText += _T("-");
  756. strText += FormatEventTime(m_ptrEvent->GetEndTime());
  757. }
  758. }
  759. else if (dwItemFlag & xtpCalendarItemText_EventMarkupTemplate)
  760. {
  761. COleVariant oleMTempl;
  762. BOOL bProp = m_ptrEvent->GetCustomProperties()->GetProperty(cszEventCustProp_MarkupTemplate, oleMTempl);
  763. if (bProp &&oleMTempl.vt == VT_BSTR)
  764. {
  765. strText = oleMTempl.bstrVal;
  766. }
  767. }
  768. else
  769. {
  770. ASSERT(FALSE);
  771. return _T("");
  772. }
  773. }
  774. if ((dwItemFlag & xtpCalendarItemText_EventMarkupTemplate) == 0)
  775. strText.Left(XTP_CALENDAR_DRAW_EVENTITEMTEXT_MAX);
  776. if (dwFlags & dwItemFlag)
  777. {
  778. XTP_CALENDAR_GETITEMTEXT_PARAMS objRequest;
  779. ::ZeroMemory(&objRequest, sizeof(objRequest));
  780. objRequest.nItem = (int)dwItemFlag;
  781. objRequest.pstrText = &strText;
  782. objRequest.pViewEvent = this;
  783. GetCalendarControl()->SendNotificationAlways(XTP_NC_CALENDAR_GETITEMTEXT, (WPARAM)&objRequest, 0);
  784. }
  785. return strText;
  786. }
  787. CString CXTPCalendarViewEvent::GetMarkupText()
  788. {
  789. //  /Calendar/Events/Event/Subject
  790. //  /Calendar/Events/Event/Location
  791. //  /Calendar/Events/Event/Body
  792. //  /Calendar/Events/Event/StartTime
  793. //  /Calendar/Events/Event/EndTime
  794. //TODO: Add NoCase parameters replacement.
  795. CString strMarkupTemplate = GetItemText(xtpCalendarItemText_EventMarkupTemplate);
  796. //strMarkupTemplate = _T("<StackPanel><TextBlock Background='#00ebff' Padding='12, 0, 2, 0'><Bold>%S</Bold></TextBlock><Border Height='1'/><TextBlock Foreground='Green'>[%L]</TextBlock><Border Height='1'/><TextBlock>%B</TextBlock></StackPanel>");
  797. //strMarkupTemplate = _T("<StackPanel><TextBlock Padding='12, 0, 2, 0'><Bold>%S</Bold></TextBlock><Border Height='1'/><TextBlock Foreground='Green'>[%L]</TextBlock><Border Height='1'/><TextBlock>%B</TextBlock></StackPanel>");
  798. TRIMLEFT_S(strMarkupTemplate, _T(" tnr"));
  799. TRIMRIGHT_S(strMarkupTemplate, _T(" tnr"));
  800. if (strMarkupTemplate.Find(cszCalendarMarkupPrm_Subject) >= 0)
  801. REPLACE_S(strMarkupTemplate, cszCalendarMarkupPrm_Subject, GetItemTextSubject());
  802. if (strMarkupTemplate.Find(cszCalendarMarkupPrm_Location) >= 0)
  803. REPLACE_S(strMarkupTemplate, cszCalendarMarkupPrm_Location, GetItemTextLocation());
  804. if (strMarkupTemplate.Find(cszCalendarMarkupPrm_Body) >= 0)
  805. REPLACE_S(strMarkupTemplate, cszCalendarMarkupPrm_Body, GetItemTextBody());
  806. if (strMarkupTemplate.Find(cszCalendarMarkupPrm_StartTime) >= 0)
  807. REPLACE_S(strMarkupTemplate, cszCalendarMarkupPrm_StartTime, GetItemTextStartTime());
  808. if (strMarkupTemplate.Find(cszCalendarMarkupPrm_EndTime) >= 0)
  809. REPLACE_S(strMarkupTemplate, cszCalendarMarkupPrm_EndTime, GetItemTextEndTime());
  810. return strMarkupTemplate;
  811. }
  812. CXTPMarkupUIElement* CXTPCalendarViewEvent::GetMarkupUIElement()
  813. {
  814. if (!GetCalendarControl() || !GetCalendarControl()->IsMarkupEnabled())
  815. return NULL;
  816. CXTPMarkupContext* pMarkupContext = GetCalendarControl()->GetMarkupContext();
  817. ASSERT(pMarkupContext);
  818. CString strMKText = GetMarkupText();
  819. if (!pMarkupContext || strMKText.IsEmpty())
  820. return NULL;
  821. if (!m_pUIElement || strMKText != m_strUIElementText)
  822. {
  823. XTPMarkupReleaseElement(m_pUIElement);
  824. m_pUIElement = XTPMarkupParseText(pMarkupContext, strMKText);
  825. m_strUIElementText = strMKText;
  826. }
  827. return m_pUIElement;
  828. }
  829. //////////////////////////////////////////////////////////////////////////
  830. //  CXTPCalendarViewEvents
  831. //
  832. CXTPCalendarViewEvents::CXTPCalendarViewEvents()
  833. {
  834. }
  835. CXTPCalendarViewEvents::~CXTPCalendarViewEvents()
  836. {
  837. }
  838. int CXTPCalendarViewEvents::Find(CXTPCalendarEvent* pEvent)
  839. {
  840. if (!pEvent)
  841. {
  842. ASSERT(FALSE);
  843. return -1;
  844. }
  845. int nCount = GetCount();
  846. for (int i = 0; i < nCount; i++)
  847. {
  848. CXTPCalendarViewEvent* pViewEvent = GetAt(i);
  849. CXTPCalendarEvent* pEv = pViewEvent ? pViewEvent->GetEvent() : NULL;
  850. if (pEv && pEvent->IsEqualIDs(pEv) && pEvent->IsEqualStartEnd(pEv))
  851. {
  852. return i;
  853. }
  854. }
  855. return -1;
  856. }
  857. void CXTPCalendarViewEvents::Remove(CXTPCalendarEvent* pEvent)
  858. {
  859. if (!pEvent)
  860. {
  861. ASSERT(FALSE);
  862. return;
  863. }
  864. int nCount = GetCount();
  865. for (int i = nCount -1 ; i >= 0; i--)
  866. {
  867. CXTPCalendarViewEvent* pViewEvent = GetAt(i);
  868. CXTPCalendarEvent* pEv = XTP_SAFE_GET1(pViewEvent, GetEvent(), NULL);
  869. if (pEv && pEvent->IsEqualIDs(pEv) && pEvent->IsEqualStartEnd(pEv))
  870. {
  871. RemoveAt(i);
  872. }
  873. }
  874. }