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++

// 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);
}
}
}
/////////////////////////////////////////////////////////////////////////////