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.

308 lines
6.4 KiB
C++

// XTPReportRecord.cpp : implementation of the CXTPReportRecord class.
//
// This file is a part of the XTREME REPORTCONTROL 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/XTPPropExchange.h"
#include "Common/XTPCustomHeap.h"
#include "XTPReportDefines.h"
#include "XTPReportRecordItem.h"
#include "XTPReportColumn.h"
#include "XTPReportRecord.h"
#include "XTPReportRecords.h"
#include "ItemTypes/XTPReportRecordItemPreview.h"
#include "ItemTypes/XTPReportRecordItemVariant.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_SERIAL(CXTPReportRecord, CCmdTarget, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
CXTPReportRecord::CXTPReportRecord()
: m_bVisible (TRUE)
, m_bLocked (FALSE)
, m_bExpanded (FALSE)
, m_bEditable (TRUE)
, m_bSelected (FALSE)
, m_pPreviewItem(NULL)
, m_pControl (NULL)
, m_pRecords (NULL)
, m_pChildren (NULL)
{
m_nIndex = -1;
m_vtBookmark.vt = VT_EMPTY;
//<<TC>>
m_nFreeHeight = 0;
//<<TC>>
}
CXTPReportRecord::~CXTPReportRecord()
{
RemoveAll();
if (m_pChildren)
m_pChildren->InternalRelease();
}
void CXTPReportRecord::RemoveAll()
{
for (int nItem = GetItemCount() - 1; nItem >= 0; nItem--)
{
CXTPReportRecordItem* pItem = m_arrItems.GetAt(nItem);
if (pItem)
pItem->InternalRelease();
}
m_arrItems.RemoveAll();
CMDTARGET_RELEASE(m_pPreviewItem);
}
void CXTPReportRecord::Delete()
{
ASSERT(m_pRecords);
if (m_pRecords) m_pRecords->RemoveAt(m_nIndex);
}
BOOL CXTPReportRecord::HasChildren() const
{
return m_pChildren && (m_pChildren->GetCount() > 0);
}
CXTPReportRecords* CXTPReportRecord::GetChilds()
{
if (m_pChildren == NULL)
{
m_pChildren = new CXTPReportRecords(this);
}
if (GetRecords())
{
BOOL bCase = GetRecords()->IsCaseSensitive();
m_pChildren->SetCaseSensitive(bCase);
}
return m_pChildren;
}
CXTPReportRecordItem* CXTPReportRecord::GetItem(CXTPReportColumn* pColumn) const
{
if (this == NULL)
return NULL;
return GetItem(pColumn->GetItemIndex());
}
int CXTPReportRecord::IndexOf(const CXTPReportRecordItem* pItem) const
{
for (int nItem = 0; nItem < GetItemCount(); nItem++)
{
if (GetItem(nItem) == pItem)
return nItem;
}
return -1;
}
CXTPReportRecordItem* CXTPReportRecord::AddItem(CXTPReportRecordItem* pItem)
{
m_arrItems.Add(pItem);
pItem->m_pControl = this->m_pControl;
pItem->m_pRecord = this;
return pItem;
}
CXTPReportRecordItemPreview* CXTPReportRecord::GetItemPreview() const
{
return m_pPreviewItem;
}
void CXTPReportRecord::SetEditable(BOOL bEditable)
{
m_bEditable = bEditable;
}
void CXTPReportRecord::SetPreviewItem(CXTPReportRecordItemPreview* pItemPreview)
{
if (m_pPreviewItem)
m_pPreviewItem->InternalRelease();
m_pPreviewItem = pItemPreview;
m_pPreviewItem->m_pRecord = this;
}
BOOL CXTPReportRecord::IsFiltered() const
{
return FALSE;
}
int CXTPReportRecord::GetIndex() const
{
return m_nIndex;
}
void CXTPReportRecord::DoPropExchange(CXTPPropExchange* pPX)
{
PX_Bool(pPX, _T("Locked"), m_bLocked);
PX_Bool(pPX, _T("Editable"), m_bEditable);
BOOL bPreview = m_pPreviewItem != NULL;
PX_Bool(pPX, _T("Preview"), bPreview);
int nCount = GetItemCount();
CXTPPropExchangeEnumeratorPtr pEnumItems(pPX->GetEnumerator(_T("Item")));
if (pPX->IsStoring())
{
POSITION posItem = pEnumItems->GetPosition((DWORD)nCount);
for (int i = 0; i < nCount; i++)
{
CXTPReportRecordItem* pItem = GetItem(i);
ASSERT(pItem);
if (!pItem)
AfxThrowArchiveException(CArchiveException::badClass);
CXTPPropExchangeSection secItem(pEnumItems->GetNext(posItem));
PX_Object(&secItem, pItem, RUNTIME_CLASS(CXTPReportRecordItem));
}
}
else
{
RemoveAll();
POSITION posItem = pEnumItems->GetPosition();
while (posItem)
{
CXTPReportRecordItem* pItem = NULL;
CXTPPropExchangeSection sec(pEnumItems->GetNext(posItem));
PX_Object(&sec, pItem, RUNTIME_CLASS(CXTPReportRecordItem));
if (!pItem)
AfxThrowArchiveException(CArchiveException::badClass);
AddItem(pItem);
}
}
//------------------------------------------------------------
if (bPreview)
{
CXTPPropExchangeSection secPreviewItem(pPX->GetSection(_T("PreviewItem")));
if (pPX->IsLoading())
{
CMDTARGET_RELEASE(m_pPreviewItem);
}
PX_Object(&secPreviewItem, m_pPreviewItem, RUNTIME_CLASS(CXTPReportRecordItemPreview));
if (m_pPreviewItem && pPX->IsLoading())
{
m_pPreviewItem->m_pRecord = this;
}
}
//------------------------------------------------------------
if (pPX->GetSchema() > _XTP_SCHEMA_1041)
{
BOOL bHasChildren = HasChildren();
PX_Bool(pPX, _T("HasChildren"), bHasChildren, FALSE);
if (bHasChildren)
{
CXTPPropExchangeSection secChildren(pPX->GetSection(_T("Children")));
GetChilds()->_DoPropExchange(&secChildren);
}
else if (m_pChildren)
{
m_pChildren->RemoveAll();
}
}
}
void CXTPReportRecord::TreeAddRef()
{
InternalAddRef();
if (HasChildren())
{
for (int nChild = 0; nChild < GetChilds()->GetCount(); nChild++)
{
GetChilds()->GetAt(nChild)->TreeAddRef();
}
}
}
void CXTPReportRecord::TreeRelease()
{
if (HasChildren())
{
for (int nChild = 0; nChild < GetChilds()->GetCount(); nChild++)
{
GetChilds()->GetAt(nChild)->TreeRelease();
}
}
InternalRelease();
}
CXTPMarkupContext* CXTPReportRecord::GetMarkupContext() const
{
CXTPReportRecords* pRecords = m_pRecords;
while (pRecords != NULL)
{
CXTPMarkupContext* pMarkupContext = pRecords->GetMarkupContext();
if (pMarkupContext)
return pMarkupContext;
if (pRecords->m_pOwnerRecord)
pRecords = pRecords->m_pOwnerRecord->GetRecords();
else
return NULL;
}
return NULL;
}
CXTPReportRecord* CXTPReportRecord::GetParentRecord() const
{
if (m_pRecords && m_pRecords->GetOwnerRecord())
return m_pRecords->GetOwnerRecord();
return NULL;
}
void CXTPReportRecord::SetExpanded(BOOL bExpanded)
{
m_bExpanded = bExpanded;
}