You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
350 lines
10 KiB
C++
350 lines
10 KiB
C++
2 years ago
|
// XTPCalendarWeekViewEvent.cpp: implementation of the CXTPCalendarWeekViewEvent class.
|
||
|
//
|
||
|
// This file is a part of the XTREME CALENDAR MFC class library.
|
||
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
||
|
//
|
||
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
//
|
||
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
// SINGLE COMPUTER.
|
||
|
//
|
||
|
// CONTACT INFORMATION:
|
||
|
// support@codejock.com
|
||
|
// http://www.codejock.com
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
#include "Common/XTPSmartPtrInternalT.h"
|
||
|
#include "Common/XTPColorManager.h"
|
||
|
|
||
|
#include "XTPCalendarDefines.h"
|
||
|
#include "XTPCalendarOptions.h"
|
||
|
#include "XTPCalendarPtrCollectionT.h"
|
||
|
|
||
|
#include "XTPCalendarEvent.h"
|
||
|
|
||
|
#include "XTPCalendarView.h"
|
||
|
#include "XTPCalendarViewEvent.h"
|
||
|
#include "XTPCalendarViewDay.h"
|
||
|
#include "XTPCalendarViewPart.h"
|
||
|
|
||
|
#include "XTPCalendarWeekViewEvent.h"
|
||
|
#include "XTPCalendarWeekViewDay.h"
|
||
|
|
||
|
#include "XTPCalendarPaintManager.h"
|
||
|
#include "XTPCalendarControl.h"
|
||
|
#include "XTPCalendarTheme.h"
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
// Construction/Destruction
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
IMPLEMENT_DYNAMIC(CXTPCalendarWeekViewEvent, CXTPCalendarViewEvent)
|
||
|
|
||
|
CXTPCalendarWeekViewEvent::CXTPCalendarWeekViewEvent(CXTPCalendarEvent* pEvent, CXTPCalendarWeekViewGroup* pViewGroup)
|
||
|
: TBase(pEvent, pViewGroup)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
CXTPCalendarWeekViewEvent::~CXTPCalendarWeekViewEvent()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
int CXTPCalendarWeekViewEvent::CalcIconsRect(CRect rc)
|
||
|
{
|
||
|
rc.top -= 2;
|
||
|
rc.bottom -= 2;
|
||
|
return TBase::CalcIconsRect(rc);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarWeekViewEvent::AdjustLayout(CDC* pDC, const CRect& rcEventMax, int nEventPlaceNumber)
|
||
|
{
|
||
|
CXTPCalendarEvent* pEvent = GetEvent();
|
||
|
|
||
|
if (!pEvent || !pDC)
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
TBase::AdjustLayout(pDC, rcEventMax, nEventPlaceNumber);
|
||
|
|
||
|
//---------------------------------------------------
|
||
|
CString strLoc = GetItemTextLocation();
|
||
|
CString strEventText = GetItemTextSubject();
|
||
|
if (strLoc.GetLength() > 0)
|
||
|
{
|
||
|
strEventText += _T(" (") + strLoc + _T(")");
|
||
|
}
|
||
|
|
||
|
m_szText = XTP_SAFE_GET3(GetView(), GetPaintManager(),
|
||
|
GetDayViewEventPart(), GetTextExtent(pDC, strEventText), CSize(0));
|
||
|
//---------------------------------------------------
|
||
|
|
||
|
if (!IsMultidayEvent())
|
||
|
{
|
||
|
m_nMultiDayEventFlags = xtpCalendarMultiDayNoMultiDay;
|
||
|
|
||
|
int nEventHeight = XTP_SAFE_GET1(GetView(), GetRowHeight(), 0);
|
||
|
|
||
|
m_rcEventMax.top = rcEventMax.top + nEventHeight * nEventPlaceNumber + 1;
|
||
|
m_rcEventMax.bottom = m_rcEventMax.top + nEventHeight - 2;
|
||
|
|
||
|
m_rcEventMax.left += 1;
|
||
|
m_rcEvent.top = m_rcEventMax.top;
|
||
|
m_rcEvent.bottom = m_rcEventMax.bottom;
|
||
|
m_rcEvent.DeflateRect(4, 0, 4, 0);
|
||
|
m_rcText.CopyRect(m_rcEvent);
|
||
|
|
||
|
int nTimeCellWidth = 0;
|
||
|
|
||
|
if (IsTimeAsClock())
|
||
|
{
|
||
|
nTimeCellWidth = 2 + XTP_SAFE_GET2(GetView(), GetPaintManager(), GetClockSize().cx, 0);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CString strTime = XTP_SAFE_GET1(GetView(), GetItemTextEventTimeMax(), _T(""));
|
||
|
nTimeCellWidth = 2 + XTP_SAFE_GET3(GetView(), GetPaintManager(), GetWeekViewEventPart(), GetTextExtent(pDC, strTime).cx, 0);
|
||
|
}
|
||
|
|
||
|
DWORD dwOpt = XTP_SAFE_GET2(GetCalendarControl(), GetCalendarOptions(), dwAdditionalOptions, 0);
|
||
|
int nText = nTimeCellWidth + CalcIconsRect(m_rcText) + 5;
|
||
|
if (m_rcText.Width() - nText > 1 ||
|
||
|
(dwOpt & (xtpCalendarOptWeekViewShowStartTimeAlways | xtpCalendarOptWeekViewShowEndTimeAlways)))
|
||
|
{
|
||
|
m_rcStartTime.CopyRect(m_rcEvent);
|
||
|
m_rcStartTime.right = min(m_rcStartTime.left + nTimeCellWidth, m_rcEvent.right);
|
||
|
m_rcText.left = m_rcStartTime.right;
|
||
|
|
||
|
if (IsShowEndTime() &&
|
||
|
(m_rcText.Width() - nText > 1 || (dwOpt & xtpCalendarOptWeekViewShowEndTimeAlways)))
|
||
|
{
|
||
|
m_rcEndTime.CopyRect(m_rcStartTime);
|
||
|
m_rcEndTime.OffsetRect(m_rcStartTime.Width() + 1, 0);
|
||
|
m_rcEndTime.right = min(m_rcEndTime.right, m_rcEvent.right);
|
||
|
m_rcText.left = m_rcEndTime.right;
|
||
|
}
|
||
|
|
||
|
m_rcText.left = min(m_rcText.left + 5, m_rcText.right);
|
||
|
}
|
||
|
|
||
|
CRect rcIcon(m_rcText);
|
||
|
rcIcon.OffsetRect(0, (m_rcText.Height() - 11)/2 - 1);
|
||
|
m_rcText.left = min(m_rcText.left + CalcIconsRect(rcIcon) + 3 , m_rcEvent.right);
|
||
|
|
||
|
m_rcSubjectEditor.CopyRect(m_rcText);
|
||
|
m_rcSubjectEditor.left = max(m_rcStartTime.right, m_rcEndTime.right);
|
||
|
m_rcSubjectEditor.right = m_rcEventMax.right;
|
||
|
m_rcSubjectEditor.top++;
|
||
|
m_rcSubjectEditor.bottom--;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//calc icons rect
|
||
|
AdjustMultidayEvent(rcEventMax, nEventPlaceNumber);
|
||
|
|
||
|
if (!pEvent->IsAllDayEvent() &&
|
||
|
m_nMultiDayEventFlags & xtpCalendarMultiDayLast)
|
||
|
{
|
||
|
COleDateTimeSpan spDay(1, 0, 0, 0);
|
||
|
COleDateTime dtDay = XTP_SAFE_GET2(GetViewGroup_(), GetViewDay_(), GetDayDate(), (DATE)0);
|
||
|
if (dtDay != m_ptrEvent->GetEndTime() - spDay)
|
||
|
{
|
||
|
CSize szClock = XTP_SAFE_GET2(GetView(), GetPaintManager(), GetClockSize(), CSize(0));
|
||
|
m_rcLastClock.CopyRect(m_rcEvent);
|
||
|
m_rcLastClock.top -= 1;
|
||
|
m_rcLastClock.bottom -= 1;
|
||
|
m_rcLastClock.right += 1;
|
||
|
m_rcLastClock.left = m_rcLastClock.right - szClock.cx;
|
||
|
m_rcText.right = m_rcLastClock.left;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarWeekViewEvent::AdjustLayout2(CDC* pDC, const CRect& rcEventMax, int nEventPlaceNumber)
|
||
|
{
|
||
|
TBase::AdjustLayout(pDC, rcEventMax, nEventPlaceNumber);
|
||
|
|
||
|
m_nMultiDayEventFlags = 0;
|
||
|
|
||
|
CXTPCalendarView* pView = GetView();
|
||
|
CXTPCalendarEvent* pEvent = GetEvent();
|
||
|
|
||
|
if (!pEvent || !pDC ||
|
||
|
!pView || !XTP_SAFE_GET1(pView, GetTheme(), NULL) )
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
return;
|
||
|
}
|
||
|
CXTPCalendarTheme* pTheme = pView->GetTheme();
|
||
|
|
||
|
// all-day event
|
||
|
if (IsMultidayEvent())
|
||
|
{
|
||
|
// to calculate multiday-flags
|
||
|
AdjustMultidayEvent(rcEventMax, nEventPlaceNumber);
|
||
|
|
||
|
pTheme->GetWeekViewPart()->GetDayPart()->GetMultiDayEventPart()->AdjustLayout(this, pDC, rcEventMax, nEventPlaceNumber);
|
||
|
return;
|
||
|
|
||
|
}
|
||
|
|
||
|
m_nMultiDayEventFlags = xtpCalendarMultiDayNoMultiDay;
|
||
|
|
||
|
pTheme->GetWeekViewPart()->GetDayPart()->GetSingleDayEventPart()->AdjustLayout(this, pDC, rcEventMax, nEventPlaceNumber);
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarWeekViewEvent::Draw(CDC* pDC)
|
||
|
{
|
||
|
XTP_SAFE_CALL3(GetView(), GetPaintManager(), GetWeekViewEventPart(),
|
||
|
OnDraw(pDC, this) );
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarWeekViewEvent::HitTestEx(CPoint point, XTP_CALENDAR_HITTESTINFO* pInfo) const
|
||
|
{
|
||
|
if (!m_rcEventMax.PtInRect(point) || !IsVisible())
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (!pInfo || !GetViewGroup() || !GetViewGroup()->GetViewDay() || !GetEvent())
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
pInfo->dt = GetViewGroup()->GetViewDay()->GetDayDate();
|
||
|
pInfo->pViewDay = GetViewGroup()->GetViewDay();
|
||
|
pInfo->pViewGroup = GetViewGroup();
|
||
|
pInfo->pViewEvent = (CXTPCalendarViewEvent*)this;
|
||
|
|
||
|
BOOL bAllDay = GetEvent()->IsAllDayEvent();
|
||
|
BOOL bNoMDay = (m_nMultiDayEventFlags & xtpCalendarMultiDayFMLmask) == 0;
|
||
|
|
||
|
if (IsVisible() && bNoMDay && !bAllDay)
|
||
|
pInfo->uHitCode = xtpCalendarHitTestEventDragArea;
|
||
|
else
|
||
|
pInfo->uHitCode = xtpCalendarHitTestUnknown;
|
||
|
|
||
|
BOOL bIsResizable = m_nMultiDayEventFlags & xtpCalendarMultiDayFirst ||
|
||
|
m_nMultiDayEventFlags & xtpCalendarMultiDayLast;
|
||
|
|
||
|
CRect rcBegin = m_rcEventMax;
|
||
|
rcBegin.right = min(m_rcEvent.left + 5, m_rcEvent.right);
|
||
|
if ((!bIsResizable || (m_nMultiDayEventFlags & xtpCalendarMultiDayLast)) && !bAllDay)
|
||
|
{
|
||
|
rcBegin = m_rcEvent;
|
||
|
rcBegin.right = rcBegin.left;
|
||
|
}
|
||
|
|
||
|
CRect rcEnd = m_rcEventMax;
|
||
|
rcEnd.left = max(m_rcEvent.right - 5, m_rcEvent.left);
|
||
|
if ((!bIsResizable || (m_nMultiDayEventFlags & xtpCalendarMultiDayFirst)) && !bAllDay)
|
||
|
{
|
||
|
rcEnd = m_rcEvent;
|
||
|
rcEnd.left = rcEnd.right;
|
||
|
}
|
||
|
|
||
|
if (bIsResizable && rcBegin.PtInRect(point) && IsVisible())
|
||
|
{
|
||
|
pInfo->uHitCode = xtpCalendarHitTestEventResizeHArea | xtpCalendarHitTestEventResizeBegin;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
if (bIsResizable && rcEnd.PtInRect(point) && IsVisible())
|
||
|
{
|
||
|
pInfo->uHitCode = xtpCalendarHitTestEventResizeHArea | xtpCalendarHitTestEventResizeEnd;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
CRect rcText(m_rcEvent);
|
||
|
if (bNoMDay && !bAllDay)
|
||
|
{
|
||
|
rcText.left = rcText.left + GetStartTimeRect().Width() + GetEndTimeRect().Width();
|
||
|
rcText.left += 5;
|
||
|
rcText.right = rcEnd.left;
|
||
|
}
|
||
|
|
||
|
if (rcText.PtInRect(point))
|
||
|
{
|
||
|
pInfo->uHitCode = xtpCalendarHitTestEventTextArea;
|
||
|
//*pInfo = tmpInfo;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarWeekViewEvent::IsVisible() const
|
||
|
{
|
||
|
//<<EventVisible>>
|
||
|
if (GetEvent() && !GetEvent()->IsEventVisible())
|
||
|
return FALSE;
|
||
|
//<<EventVisible>>
|
||
|
|
||
|
ASSERT(XTP_SAFE_GET1(GetViewGroup(), GetViewDay(), NULL));
|
||
|
if (!XTP_SAFE_GET1(GetViewGroup(), GetViewDay(), NULL))
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
CRect rcDayEvents = GetViewGroup()->GetViewDay()->GetDayEventsRect();
|
||
|
BOOL bVisible = m_rcEvent.bottom <= rcDayEvents.bottom;
|
||
|
return bVisible;
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarWeekViewEvent::IsShowEndTime() const
|
||
|
{
|
||
|
return XTP_SAFE_GET1(GetCalendarControl(), WeekView_IsShowEndDate(), FALSE);
|
||
|
}
|
||
|
|
||
|
BOOL CXTPCalendarWeekViewEvent::IsTimeAsClock() const
|
||
|
{
|
||
|
return XTP_SAFE_GET1(GetCalendarControl(), WeekView_IsShowTimeAsClocks(), FALSE);
|
||
|
}
|
||
|
|
||
|
CFont* CXTPCalendarWeekViewEvent::GetSubjectEditorFont() const
|
||
|
{
|
||
|
CFont* pFont = &XTP_SAFE_GET3(GetView(), GetPaintManager(), GetWeekViewEventPart(), GetTextFont(), *((CFont*)(NULL)));
|
||
|
ASSERT(pFont);
|
||
|
return pFont;
|
||
|
}
|
||
|
|
||
|
void CXTPCalendarWeekViewEvent::OnPostAdjustLayout()
|
||
|
{
|
||
|
TBase::OnPostAdjustLayout();
|
||
|
|
||
|
BOOL bIsAllDayEvent = XTP_SAFE_GET1(GetEvent(), IsAllDayEvent(), FALSE);
|
||
|
|
||
|
BOOL bAMDay = m_nMultiDayEventFlags & xtpCalendarMultiDayFirst ||
|
||
|
m_nMultiDayEventFlags & xtpCalendarMultiDayMiddle ||
|
||
|
m_nMultiDayEventFlags & xtpCalendarMultiDayLast ||
|
||
|
bIsAllDayEvent;
|
||
|
|
||
|
if (bAMDay)
|
||
|
{
|
||
|
m_rcSubjectEditor.left = m_rcEvent.left;
|
||
|
m_rcSubjectEditor.right = m_rcEvent.right;
|
||
|
if (m_nMultiDayEventFlags & xtpCalendarMultiDayFirst ||
|
||
|
bIsAllDayEvent)
|
||
|
{
|
||
|
m_rcSubjectEditor.left += 1;
|
||
|
}
|
||
|
m_rcReminderGlyph.OffsetRect(0, (m_rcText.Height() - 11)/2 - 1);
|
||
|
m_rcRecurrenceGlyph.OffsetRect(0, (m_rcText.Height() - 11)/2 - 1);
|
||
|
m_rcMeetingGlyph.OffsetRect(0, (m_rcText.Height() - 11)/2 - 1);
|
||
|
m_rcPrivateGlyph.OffsetRect(0, (m_rcText.Height() - 11)/2 - 1);
|
||
|
}
|
||
|
|
||
|
BOOL bOutOfBorders = m_rcText.Width() < m_szText.cx;
|
||
|
SetTextOutOfBorders(bOutOfBorders);
|
||
|
}
|