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.

300 lines
6.7 KiB
C++

2 years ago
// XTPChartContent.cpp
//
// This file is a part of the XTREME TOOLKIT PRO 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/XTPMarkupRender.h"
#include "Types/XTPChartTypes.h"
#include "XTPChartDefines.h"
#include "XTPChartElement.h"
#include <Chart/XTPChartLegendItem.h>
#include "XTPChartElementView.h"
#include "XTPChartContent.h"
#include "XTPChartPanel.h"
#include "XTPChartDiagram.h"
#include "XTPChartTitle.h"
#include "XTPChartSeries.h"
#include "XTPChartSeriesStyle.h"
#include "XTPChartSeriesPoint.h"
#include "XTPChartContentView.h"
#include "XTPChartControl.h"
#include "XTPChartLegend.h"
#include "Drawing/XTPChartDeviceContext.h"
#include "Drawing/XTPChartDeviceCommand.h"
#include "Appearance/XTPChartAppearance.h"
#include "Appearance/XTPChartBorder.h"
//////////////////////////////////////////////////////////////////////////
// CXTPChartContent
IMPLEMENT_DYNAMIC(CXTPChartContent, CXTPChartElement)
CXTPChartContent::CXTPChartContent()
{
m_pTitles = new CXTPChartTitleCollection(this);
m_pSeries = new CXTPChartSeriesCollection(this);
m_pLegend = new CXTPChartLegend(this);
m_pPanels = new CXTPChartPanelCollection(this);
m_pAppearance = new CXTPChartAppearance(this);
m_pBorder = new CXTPChartBorder(this);
m_pMarkupContext = NULL;
m_nPanelDistance = 10;
m_nPanelDirection = xtpChartPanelHorizontal;
CXTPChartDeviceContext::Register(TRUE);
}
CXTPChartContent::~CXTPChartContent()
{
SAFE_RELEASE(m_pTitles);
SAFE_RELEASE(m_pSeries);
SAFE_RELEASE(m_pPanels);
SAFE_RELEASE(m_pLegend);
SAFE_RELEASE(m_pAppearance);
SAFE_RELEASE(m_pBorder);
XTPMarkupReleaseContext(m_pMarkupContext);
CXTPChartDeviceContext::Register(FALSE);
}
CXTPChartContentView* CXTPChartContent::CreateView(CXTPChartDeviceContext* pDC, CRect rcBounds)
{
CXTPChartContentView* pContentView = new CXTPChartContentView(pDC->GetContainer(), this);
pContentView->CreateView(pDC);
pContentView->CalculateView(pDC, rcBounds);
return pContentView;
}
CXTPChartDeviceCommand* CXTPChartContent::CreateDeviceComand(CXTPChartDeviceContext* pDC, CRect rcBounds)
{
CXTPChartElementView* pView = CreateView(pDC, rcBounds);
CXTPChartDeviceCommand* pCommand = NULL;
if (pView)
{
pCommand = pView->CreateDeviceCommand(pDC);
}
SAFE_RELEASE(pView);
return pCommand;
}
void CXTPChartContent::DrawContent(CXTPChartDeviceContext* pDC, CRect rcBounds)
{
CXTPChartDeviceCommand* pCommand = CreateDeviceComand(pDC, rcBounds);
if (pCommand)
{
pDC->Execute(pCommand);
delete pCommand;
}
}
void CXTPChartContent::OnSeriesStyleChanged(CXTPChartSeries* pSeries)
{
int i;
ASSERT(pSeries->GetStyle());
CXTPChartDiagram* pDiagram = pSeries->GetDiagram();
if (pDiagram)
{
if (pSeries->GetStyle()->IsStyleDiagram(pSeries->GetDiagram()))
return;
pSeries->SetDiagram(NULL);
}
for (i = 0; i < m_pPanels->GetCount(); i++)
{
CXTPChartDiagram* pDiagram = DYNAMIC_DOWNCAST(CXTPChartDiagram, m_pPanels->GetAt(i));
if (!pDiagram)
continue;
if (pSeries->SetDiagram(pDiagram))
{
return;
}
}
pDiagram = pSeries->GetStyle()->CreateDiagram();
VERIFY(pSeries->SetDiagram(pDiagram));
m_pPanels->Add(pDiagram);
}
void CXTPChartContent::UpdateDiagram()
{
int i;
int nIndex = 0;
for (i = 0; i < GetSeries()->GetCount(); i++)
{
CXTPChartSeries* pSeries = GetSeries()->GetAt(i);
if (!pSeries->IsVisible())
continue;
if (!pSeries->GetStyle())
continue;
if (pSeries->GetStyle()->IsColorEach())
{
for (int j = 0; j < pSeries->GetPoints()->GetCount(); j++)
{
pSeries->GetPoints()->GetAt(j)->m_nPaletteIndex = nIndex++;
}
}
else
{
pSeries->m_nPaletteIndex = nIndex++;
}
}
}
CXTPChartDeviceContext* CXTPChartContent::CreateDeviceContext(CXTPChartContainer* pContainer, HDC hDC, CRect rcBounds, BOOL bWindowDC)
{
UNREFERENCED_PARAMETER(rcBounds);
UNREFERENCED_PARAMETER(bWindowDC);
UpdateDiagram();
return new CXTPChartDeviceContext(pContainer, hDC);
}
CXTPChartDiagram* CXTPChartContent::GetPrimaryDiagram() const
{
if (m_pPanels->GetCount() == 0)
return NULL;
return DYNAMIC_DOWNCAST(CXTPChartDiagram, m_pPanels->GetAt(0));
}
CXTPChartColor CXTPChartContent::GetActualBackgroundColor() const
{
if (m_clrBackground.IsEmpty())
return m_pAppearance->GetContentAppearance()->BackgroundColor;
return m_clrBackground;
}
CXTPChartColor CXTPChartContent::GetActualBorderColor() const
{
if (m_pBorder->GetColor().IsEmpty())
return m_pAppearance->GetContentAppearance()->BorderColor;
return m_pBorder->GetColor();
}
CXTPChartColor CXTPChartContent::GetBackgroundColor() const
{
return m_clrBackground;
}
void CXTPChartContent::OnChartChanged(XTPChartUpdateOptions updateOptions /* = xtpChartUpdateView */)
{
for (int i = 0; i < m_arrContainers.GetSize(); i++)
{
m_arrContainers[i]->OnChartChanged(updateOptions);
}
}
void CXTPChartContent::DoPropExchange(CXTPPropExchange* pPX)
{
PX_Int(pPX, _T("PanelDistance"), m_nPanelDistance, 10);
PX_Enum(pPX, _T("PanelDirection"), m_nPanelDirection, xtpChartPanelHorizontal);
PX_Color(pPX, _T("Background"), m_clrBackground);
CXTPPropExchangeSection secBorder(pPX->GetSection(_T("Border")));
m_pBorder->DoPropExchange(&secBorder);
CXTPPropExchangeSection secLegend(pPX->GetSection(_T("Legend")));
m_pLegend->DoPropExchange(&secLegend);
CXTPPropExchangeSection secTitles(pPX->GetSection(_T("Titles")));
m_pTitles->DoPropExchange(&secTitles);
CXTPPropExchangeSection secPanels(pPX->GetSection(_T("Panels")));
m_pPanels->DoPropExchange(&secPanels);
CXTPPropExchangeSection secSeries(pPX->GetSection(_T("Series")));
m_pSeries->DoPropExchange(&secSeries);
}
void CXTPChartContent::EnableMarkup(BOOL bEnable)
{
XTPMarkupReleaseContext(m_pMarkupContext);
if (bEnable)
{
m_pMarkupContext = XTPMarkupCreateContext();
}
}
void CXTPChartContent::AddContainer(CXTPChartContainer* pContainer)
{
m_arrContainers.Add(pContainer);
}
void CXTPChartContent::RemoveContainer(CXTPChartContainer* pContainer)
{
for (int i = 0; i < m_arrContainers.GetSize(); i++)
{
if (m_arrContainers.GetAt(i) == pContainer)
{
m_arrContainers.RemoveAt(i);
return;
}
}
}