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.
365 lines
7.8 KiB
C++
365 lines
7.8 KiB
C++
// XTPCalendarEvents.cpp: implementation of the CXTPCalendarEvents 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 "XTPCalendarUtils.h"
|
|
#include "XTPCalendarDefines.h"
|
|
|
|
#include "XTPCalendarEvent.h"
|
|
#include "XTPCalendarEvents.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNAMIC(CXTPCalendarEvents, CCmdTarget)
|
|
|
|
CXTPCalendarEvents::CXTPCalendarEvents()
|
|
{
|
|
}
|
|
|
|
CXTPCalendarEvents::~CXTPCalendarEvents()
|
|
{
|
|
RemoveAll();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
CXTPCalendarEvent* CXTPCalendarEvents::GetAt(int nIndex, BOOL bWithAddRef) const
|
|
{
|
|
CXTPCalendarEvent* pEvent = m_arEvents[nIndex];
|
|
if (bWithAddRef && pEvent)
|
|
{
|
|
pEvent->InternalAddRef();
|
|
}
|
|
return pEvent;
|
|
}
|
|
|
|
|
|
void CXTPCalendarEvents::SetAt(int nIndex, CXTPCalendarEvent* pEvent, BOOL bWithAddRef)
|
|
{
|
|
if (bWithAddRef && pEvent)
|
|
{
|
|
pEvent->InternalAddRef();
|
|
}
|
|
|
|
CXTPCalendarEvent* pPrevEvent = m_arEvents[nIndex];
|
|
if (pPrevEvent)
|
|
{
|
|
pPrevEvent->InternalRelease();
|
|
}
|
|
|
|
m_arEvents[nIndex] = pEvent;
|
|
}
|
|
|
|
void CXTPCalendarEvents::InsertAt(int nIndex, CXTPCalendarEvent* pEvent, BOOL bWithAddRef)
|
|
{
|
|
if (bWithAddRef && pEvent)
|
|
{
|
|
pEvent->InternalAddRef();
|
|
}
|
|
|
|
m_arEvents.InsertAt(nIndex, pEvent);
|
|
}
|
|
|
|
|
|
|
|
void CXTPCalendarEvents::Add(CXTPCalendarEvent* pNewEvent, BOOL bWithAddRef)
|
|
{
|
|
if (bWithAddRef && pNewEvent)
|
|
{
|
|
pNewEvent->InternalAddRef();
|
|
}
|
|
m_arEvents.Add(pNewEvent);
|
|
}
|
|
|
|
|
|
void CXTPCalendarEvents::Append(CXTPCalendarEvents* pEventsArray)
|
|
{
|
|
if (!pEventsArray)
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
int nCount = pEventsArray->GetCount();
|
|
for (int nEvent = 0; nEvent < nCount; nEvent++)
|
|
{
|
|
CXTPCalendarEvent* pEvent = pEventsArray->GetAt(nEvent, FALSE);
|
|
Add(pEvent, TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPCalendarEvents::RemoveAt(int nIndex)
|
|
{
|
|
CXTPCalendarEvent* pEvent = GetAt(nIndex, FALSE);
|
|
m_arEvents.RemoveAt(nIndex);
|
|
if (pEvent)
|
|
{
|
|
pEvent->InternalRelease();
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPCalendarEvents::RemoveAll()
|
|
{
|
|
// cleanup
|
|
int nCount = GetCount();
|
|
for (int nEvent = 0; nEvent < nCount; nEvent++)
|
|
{
|
|
CXTPCalendarEvent* pEvent = m_arEvents.GetAt(nEvent);
|
|
if (pEvent)
|
|
{
|
|
pEvent->InternalRelease();
|
|
}
|
|
}
|
|
|
|
m_arEvents.RemoveAll();
|
|
}
|
|
|
|
|
|
int CXTPCalendarEvents::Find(DWORD dwEventID) const
|
|
{
|
|
int nCount = GetCount();
|
|
for (int nEvent = 0; nEvent < nCount; nEvent++)
|
|
{
|
|
CXTPCalendarEvent* pEvent = m_arEvents.GetAt(nEvent);
|
|
DWORD dwID = pEvent->GetEventID();
|
|
if (dwID == dwEventID)
|
|
{
|
|
return nEvent;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
CXTPCalendarEvent* CXTPCalendarEvents::FindEvent(DWORD dwEventID) const
|
|
{
|
|
CXTPCalendarEvent* pFEvent = NULL;
|
|
|
|
int nFIndex = Find(dwEventID);
|
|
if (nFIndex >= 0)
|
|
{
|
|
pFEvent = GetAt(nFIndex, FALSE);
|
|
}
|
|
return pFEvent;
|
|
}
|
|
|
|
|
|
int CXTPCalendarEvents::Find(CXTPCalendarEvent* pFEvent) const
|
|
{
|
|
int nCount = GetCount();
|
|
for (int nEvent = 0; nEvent < nCount; nEvent++)
|
|
{
|
|
CXTPCalendarEvent* pEvent = m_arEvents.GetAt(nEvent);
|
|
if (pEvent && pEvent->IsEqualIDs(pFEvent))
|
|
{
|
|
return nEvent;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
CXTPCalendarEvent* CXTPCalendarEvents::FindEvent(CXTPCalendarEvent* pFEvent) const
|
|
{
|
|
CXTPCalendarEvent* pFindedEvent = NULL;
|
|
|
|
int nFIndex = Find(pFEvent);
|
|
if (nFIndex >= 0)
|
|
{
|
|
pFindedEvent = GetAt(nFIndex, FALSE);
|
|
}
|
|
return pFindedEvent;
|
|
}
|
|
|
|
void CXTPCalendarEvents::Sort(T_CompareFunc pCompareFunc)
|
|
{
|
|
typedef int (_cdecl *GENERICCOMPAREFUNC)(const void *, const void*);
|
|
|
|
qsort(m_arEvents.GetData(), (size_t)m_arEvents.GetSize(), sizeof(CXTPCalendarEvent*), (GENERICCOMPAREFUNC)pCompareFunc);
|
|
}
|
|
|
|
int _cdecl CXTPCalendarEvents::CompareEvents_ForView(const CXTPCalendarEvent** ppEv1, const CXTPCalendarEvent** ppEv2)
|
|
{
|
|
if (*ppEv1 == NULL || *ppEv2 == NULL)
|
|
{
|
|
ASSERT(FALSE);
|
|
return XTPCompare(*ppEv1, *ppEv2);
|
|
}
|
|
|
|
int nPeriodDays1 = (*ppEv1)->GetEventPeriodDays();
|
|
int nPeriodDays2 = (*ppEv2)->GetEventPeriodDays();
|
|
|
|
int nAllDayEvent1 = (*ppEv1)->IsAllDayEvent() ? 1 : 0;
|
|
int nAllDayEvent2 = (*ppEv2)->IsAllDayEvent() ? 1 : 0;
|
|
|
|
BOOL bIsMultidayEvent = (nAllDayEvent1 && nAllDayEvent2 || nPeriodDays1 > 1 && nPeriodDays2 > 1);
|
|
int nCmp = 0;
|
|
//---------------------------------------------------------------------------
|
|
if (bIsMultidayEvent)
|
|
{
|
|
nCmp = XTPCompare((*ppEv1)->GetStartTime(), (*ppEv2)->GetStartTime());
|
|
if (nCmp)
|
|
{
|
|
//extra criteria <<
|
|
if (nCmp == 0)
|
|
nCmp = XTPCompare((*ppEv1)->GetEndTime(), (*ppEv2)->GetEndTime());
|
|
//extra criteria >>
|
|
return nCmp;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
nCmp = XTPCompare(nPeriodDays2, nPeriodDays1);
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
|
|
nCmp = XTPCompare(nAllDayEvent2, nAllDayEvent1);
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
|
|
if (!bIsMultidayEvent)
|
|
{
|
|
nCmp = XTPCompare((*ppEv1)->GetStartTime(), (*ppEv2)->GetStartTime());
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
}
|
|
|
|
nCmp = XTPCompare((*ppEv1)->GetDurationMinutes(), (*ppEv2)->GetDurationMinutes());
|
|
if (nCmp)
|
|
{
|
|
return -nCmp;
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
nCmp = XTPCompare((*ppEv1)->GetSubject(), (*ppEv2)->GetSubject());
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
nCmp = CompareEvents_ByID(ppEv1, ppEv2);
|
|
|
|
return nCmp;
|
|
}
|
|
|
|
int _cdecl CXTPCalendarEvents::CompareEvents_ForViewByStart(const CXTPCalendarEvent** ppEv1, const CXTPCalendarEvent** ppEv2)
|
|
{
|
|
if (*ppEv1 == NULL || *ppEv2 == NULL)
|
|
{
|
|
ASSERT(FALSE);
|
|
return XTPCompare(*ppEv1, *ppEv2);
|
|
}
|
|
|
|
int nPeriodDays1 = (*ppEv1)->GetEventPeriodDays();
|
|
int nPeriodDays2 = (*ppEv2)->GetEventPeriodDays();
|
|
|
|
int nAllDayEvent1 = (*ppEv1)->IsAllDayEvent() ? 1 : 0;
|
|
int nAllDayEvent2 = (*ppEv2)->IsAllDayEvent() ? 1 : 0;
|
|
|
|
int nCmp = 0;
|
|
//---------------------------------------------------------------------------
|
|
nCmp = XTPCompare((*ppEv1)->GetStartTime(), (*ppEv2)->GetStartTime());
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
nCmp = XTPCompare(nPeriodDays2, nPeriodDays1);
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
|
|
nCmp = XTPCompare(nAllDayEvent2, nAllDayEvent1);
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
|
|
nCmp = XTPCompare((*ppEv1)->GetDurationMinutes(), (*ppEv2)->GetDurationMinutes());
|
|
if (nCmp)
|
|
{
|
|
return -nCmp;
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
nCmp = XTPCompare((*ppEv1)->GetSubject(), (*ppEv2)->GetSubject());
|
|
if (nCmp)
|
|
{
|
|
return nCmp;
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
nCmp = CompareEvents_ByID(ppEv1, ppEv2);
|
|
|
|
return nCmp;
|
|
}
|
|
|
|
int _cdecl CXTPCalendarEvents::CompareEvents_ByID(const CXTPCalendarEvent** ppEv1, const CXTPCalendarEvent** ppEv2)
|
|
{
|
|
if (*ppEv1 == NULL || *ppEv2 == NULL)
|
|
{
|
|
ASSERT(FALSE);
|
|
return XTPCompare(*ppEv1, *ppEv2);
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
DWORD dwID1 = (*ppEv1)->GetEventID();
|
|
DWORD dwID2 = (*ppEv2)->GetEventID();
|
|
|
|
int nCmp = XTPCompare(dwID1, dwID2);
|
|
|
|
return nCmp;
|
|
}
|
|
|
|
void CXTPCalendarEvents::CloneEvents()
|
|
{
|
|
int nCount = GetCount();
|
|
for (int i = 0; i < nCount; i++)
|
|
{
|
|
CXTPCalendarEvent* pEvOrig = GetAt(i, FALSE);
|
|
CXTPCalendarEventPtr ptrEvClone = pEvOrig ? pEvOrig->CloneEvent() : NULL;
|
|
if (ptrEvClone)
|
|
{
|
|
SetAt(i, ptrEvClone);
|
|
}
|
|
else
|
|
{
|
|
RemoveAt(i);
|
|
}
|
|
}
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|