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.

440 lines
12 KiB
C++

// XTPCalendarTimeLineViewTimeScale.cpp: implementation of the
// CXTPCalendarTimeLineViewTimeScale 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/XTPColorManager.h"
#include "Common/XTPSmartPtrInternalT.h"
#include "XTPCalendarDefines.h"
#include "XTPCalendarUtils.h"
#include "XTPCalendarPtrCollectionT.h"
#include "XTPCalendarView.h"
#include "XTPCalendarViewPart.h"
#include "XTPCalendarControl.h"
#include "XTPCalendarTimeLineViewTimeScale.h"
#include "XTPCalendarTimeLineView.h"
#include "XTPCalendarPaintManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CXTPCalendarTimeLineViewTimeScale::CXTPCalendarTimeLineViewTimeScale(
CXTPCalendarTimeLineView* pView)
{
m_rcScale.SetRectEmpty();
m_rcRect.SetRectEmpty();
m_pParentView = pView;
m_pTimeScaleParams = NULL;
m_dtStartViewDate = COleDateTime::GetCurrentTime();
SetTimeScaleParams(xtpTSPID_Day);
}
CXTPCalendarTimeLineViewTimeScale::~CXTPCalendarTimeLineViewTimeScale()
{
CMDTARGET_RELEASE(m_pTimeScaleParams);
}
void CXTPCalendarTimeLineViewTimeScale::SetTimeScaleParams(int eTimeScaleParamsID)
{
CMDTARGET_RELEASE(m_pTimeScaleParams);
switch (eTimeScaleParamsID)
{
case xtpTSPID_Day:
m_pTimeScaleParams = new CXTPCalendarTLV_TimeScaleParams_Day(this);
break;
case xtpTSPID_Week:
m_pTimeScaleParams = new CXTPCalendarTLV_TimeScaleParams_Week(this);
break;
case xtpTSPID_Month:
m_pTimeScaleParams = new CXTPCalendarTLV_TimeScaleParams_Month(this);
break;
case xtpTSPID_WorkWeek:
m_pTimeScaleParams = new CXTPCalendarTLV_TimeScaleParams_Week(this);
break;
default:
ASSERT(FALSE);
m_pTimeScaleParams = new CXTPCalendarTLV_TimeScaleParams_Day(this);
}
}
void CXTPCalendarTimeLineViewTimeScale::SetTimeScaleParams2(CXTPCalendarTLV_TimeScaleParams* pSParams)
{
if (!pSParams)
{
ASSERT(FALSE);
return;
}
ASSERT(pSParams->GetParentTimeScale() == this);
m_pTimeScaleParams = pSParams;
}
void CXTPCalendarTimeLineViewTimeScale::AdjustLayout(CRect rcParentRect)
{
if (!m_pTimeScaleParams)
{
ASSERT(FALSE);
return;
}
m_rcRect.CopyRect(&rcParentRect);
m_rcScale.CopyRect(&rcParentRect);
CClientDC dc(GetView()->GetCalendarControl());
int nHeight = 68;
CXTPCalendarTimeLineViewTimeScalePart* pPart = m_pTimeScaleParams->GetPart();
if (pPart)
nHeight = pPart->CalcHeigt(&dc);
m_rcScale.bottom = m_rcScale.top + nHeight;
m_rcRect.bottom = m_rcScale.bottom;
}
CRect CXTPCalendarTimeLineViewTimeScale::GetClientRect(int nYstart)
{
CRect rcClient = m_rcRect;
rcClient.top += nYstart;
rcClient.bottom += nYstart;
return rcClient;
}
void CXTPCalendarTimeLineViewTimeScale::Draw(CDC* pDC)
{
if (!m_pTimeScaleParams)
return;
m_pTimeScaleParams->GetPart()->Draw(pDC, m_rcScale, GetView());
}
BOOL CXTPCalendarTimeLineViewTimeScale::HitTestEx(CPoint pt, XTP_CALENDAR_HITTESTINFO* pHitTest) const
{
return m_rcScale.PtInRect(pt);
}
////////////////////////////////////////////////////////////////////////////
//class CXTPCalendarTLV_TimeScaleParams : public CXTPInternalUnknown
CXTPCalendarTLV_TimeScaleParams::CXTPCalendarTLV_TimeScaleParams(
int nTimeScaleParamsID,
CXTPCalendarTimeLineViewTimeScale* pTimeScale)
{
m_nTimeScaleParamsID = nTimeScaleParamsID;
::ZeroMemory(&m_scaleInterval, sizeof(m_scaleInterval));
m_nScaleIntervalWidth_px = 0;
m_pTimeScale = pTimeScale;
}
CXTPCalendarTLV_TimeScaleParams::~CXTPCalendarTLV_TimeScaleParams()
{
}
void CXTPCalendarTLV_TimeScaleParams::SetScaleInterval(int eType, int nValue)
{
ASSERT(eType && nValue > 0);
m_scaleInterval.m_eType = eType;
m_scaleInterval.m_nValue = nValue;
}
COleDateTimeSpan CXTPCalendarTLV_TimeScaleParams::GetScaleInterval() const
{
COleDateTimeSpan spInterval(0);
switch (m_scaleInterval.m_eType)
{
case xtpDTScale_Sec:
spInterval.SetDateTimeSpan(0, 0, 0, m_scaleInterval.m_nValue);
break;
case xtpDTScale_Min:
spInterval.SetDateTimeSpan(0, 0, m_scaleInterval.m_nValue, 0);
break;
case xtpDTScale_Hour:
spInterval.SetDateTimeSpan(0, m_scaleInterval.m_nValue, 0, 0);
break;
case xtpDTScale_Day:
spInterval.SetDateTimeSpan(m_scaleInterval.m_nValue, 0, 0, 0);
break;
case xtpDTScale_WorkWeek:
spInterval.SetDateTimeSpan(m_scaleInterval.m_nValue * 5, 0, 0, 0);
break;
case xtpDTScale_Week:
spInterval.SetDateTimeSpan(m_scaleInterval.m_nValue * 7, 0, 0, 0);
break;
case xtpDTScale_Month:
spInterval.SetDateTimeSpan(m_scaleInterval.m_nValue * 31, 0, 0, 0);
break;
case xtpDTScale_Year:
spInterval.SetDateTimeSpan(m_scaleInterval.m_nValue * 366, 0, 0, 0);
break;
default:
ASSERT(FALSE);
}
return spInterval;
}
COleDateTime CXTPCalendarTLV_TimeScaleParams::CalcScaleIntervalBegin(
COleDateTime dtStart)
{
if (!m_scaleInterval.m_nValue)
{
ASSERT(FALSE);
return dtStart;
}
COleDateTime dtBegin = dtStart;
int nFirstDayOfWeekIndex = 0;
COleDateTimeSpan spAdd;
LONGLONG nVal = 0;
LONGLONG nDiv = 0;
//int nMod = 0;
LONGLONG nNewVal = 0;
LONGLONG nllDays_total = (int)(DATE)dtStart;
switch (m_scaleInterval.m_eType)
{
case xtpDTScale_Sec:
nVal = dtStart.GetSecond() + nllDays_total * 24 * 60 * 60;
nDiv = nVal / m_scaleInterval.m_nValue;
nNewVal = nDiv * m_scaleInterval.m_nValue;
dtBegin = (DATE)(nNewVal / (24 * 60 * 60));
dtBegin = CXTPCalendarUtils::UpdateTime(dtBegin, (int)(nNewVal % (24 * 60 * 60)),
(int)(nNewVal % (60 * 60)), (int)(nNewVal % 60));
/*nVal = dtStart.GetSecond();
nDiv = nVal / m_scaleInterval.m_nValue;
//nMod = nVal % m_scaleInterval.m_nValue;
nNewVal = (nDiv + (nMod ? 1 : 0)) * m_scaleInterval.m_nValue;
spAdd.SetDateTimeSpan(0, 0, 0, nNewVal);
dtBegin = CXTPCalendarUtils::UpdateTime(dtBegin, dtStart.GetHour(), dtStart.GetMinute(), 0);
dtBegin += spAdd;*/
break;
case xtpDTScale_Min:
nVal = dtStart.GetMinute() /*+ (dtStart.GetSecond() ? 1 : 0)*/;
nDiv = nVal / m_scaleInterval.m_nValue;
//nMod = nVal % m_scaleInterval.m_nValue;
//nNewVal = (nDiv +(nMod?1:0)) * m_scaleInterval.m_nValue;
nNewVal = nDiv * m_scaleInterval.m_nValue;
spAdd.SetDateTimeSpan(0, 0, (int)nNewVal, 0);
dtBegin = CXTPCalendarUtils::UpdateTime(dtStart, dtStart.GetHour(), 0, 0);
dtBegin += spAdd;
break;
case xtpDTScale_Hour:
nVal = dtStart.GetHour();
nDiv = nVal / m_scaleInterval.m_nValue;
nNewVal = (nDiv) * m_scaleInterval.m_nValue;
spAdd.SetDateTimeSpan(0, (int)nNewVal, 0, 0);
dtBegin = CXTPCalendarUtils::ResetTime(dtBegin);
dtBegin += spAdd;
break;
case xtpDTScale_Day:
nVal = dtStart.GetDay();
nDiv = nVal / m_scaleInterval.m_nValue;
nNewVal = (nDiv) * m_scaleInterval.m_nValue;
//spAdd.SetDateTimeSpan((int)max(0, nNewVal - 1), 0, 0, 0);
//dtBegin = CXTPCalendarUtils::ResetTime(dtBegin);
//CXTPCalendarUtils::UpdateMonthDay(dtBegin, 1);
//dtBegin += spAdd;
dtBegin = CXTPCalendarUtils::ResetTime(dtBegin);
CXTPCalendarUtils::UpdateMonthDay(dtBegin, (int)nNewVal);
break;
case xtpDTScale_Week:
// update first day of week
nFirstDayOfWeekIndex = XTP_SAFE_GET3(m_pTimeScale, GetView(), GetCalendarControl(), GetFirstDayOfWeek(), 2);
dtBegin = CXTPCalendarUtils::ShiftDateToWeekBegin(dtStart, nFirstDayOfWeekIndex);
nVal = (int)(DATE)dtStart;
nDiv = nVal / m_scaleInterval.m_nValue;
nNewVal = (nDiv) * m_scaleInterval.m_nValue;
dtBegin = (DATE)nNewVal;
break;
case xtpDTScale_WorkWeek:
// update first day of week
nFirstDayOfWeekIndex = XTP_SAFE_GET3(m_pTimeScale, GetView(), GetCalendarControl(), GetFirstDayOfWeek(), 2);
dtBegin = CXTPCalendarUtils::ShiftDateToWeekBegin(dtStart, nFirstDayOfWeekIndex);
nVal = (int)(DATE)dtStart;
nDiv = nVal / m_scaleInterval.m_nValue;
nNewVal = (nDiv) * m_scaleInterval.m_nValue;
dtBegin = (DATE)nNewVal;
break;
case xtpDTScale_Month:
dtBegin = CXTPCalendarUtils::ResetTime(dtStart);
nVal = dtStart.GetMonth() + (dtStart.GetYear() - 1900) * 12;
nDiv = nVal / m_scaleInterval.m_nValue;
nNewVal = (nDiv) * m_scaleInterval.m_nValue;
{
int nNewYear = (int)(nNewVal / 12 + 1900);
int nNewMonth = (int)(nNewVal % 12);
dtBegin.SetDate(nNewYear, nNewMonth, 1);
}
break;
case xtpDTScale_Year:
dtBegin = CXTPCalendarUtils::ResetTime(dtStart);
nVal = dtStart.GetYear();
nDiv = nVal / m_scaleInterval.m_nValue;
nNewVal = (nDiv) * m_scaleInterval.m_nValue;
dtBegin.SetDate((int)nNewVal, 1, 1);
break;
default:
ASSERT(FALSE);
}
return dtBegin;
}
////////////////////////////////////////////////////////////////////////////
CXTPCalendarTLV_TimeScaleParams_Day::CXTPCalendarTLV_TimeScaleParams_Day(
CXTPCalendarTimeLineViewTimeScale* pTimeScale) :
CXTPCalendarTLV_TimeScaleParams(xtpTSPID_Day, pTimeScale)
{
SetScaleInterval(xtpDTScale_Min, 30);
//SetScaleInterval(xtpDTScale_Hour, 1);
m_nScaleIntervalWidth_px = 31;
}
CXTPCalendarTLV_TimeScaleParams_Day::~CXTPCalendarTLV_TimeScaleParams_Day()
{
}
//CString CXTPCalendarTLV_TimeScaleParams_Day::FormatLowerScaleLabel(COleDateTime dtDateTime)
//{
// return _T("");
//}
//void CXTPCalendarTLV_TimeScaleParams_Day::DrawLowerScale(CDC* pDC, DATE dtStart, const CRect& rcRect)
//{
//
//}
////////////////////////////////////////////////////////////////////////////
CXTPCalendarTLV_TimeScaleParams_Week::CXTPCalendarTLV_TimeScaleParams_Week(
CXTPCalendarTimeLineViewTimeScale* pTimeScale) :
CXTPCalendarTLV_TimeScaleParams(xtpTSPID_Week, pTimeScale)
{
SetScaleInterval(xtpDTScale_Day, 1);
m_nScaleIntervalWidth_px = 86;
}
CXTPCalendarTLV_TimeScaleParams_Week::~CXTPCalendarTLV_TimeScaleParams_Week()
{
}
//CString CXTPCalendarTLV_TimeScaleParams_Week::FormatLowerScaleLabel(COleDateTime dtDateTime)
//{
// return _T("");
//}
//void CXTPCalendarTLV_TimeScaleParams_Week::DrawLowerScale(CDC* pDC, DATE dtStart, const CRect& rcRect)
//{
//
//}
////////////////////////////////////////////////////////////////////////////
CXTPCalendarTLV_TimeScaleParams_Month::CXTPCalendarTLV_TimeScaleParams_Month(
CXTPCalendarTimeLineViewTimeScale* pTimeScale) :
CXTPCalendarTLV_TimeScaleParams(xtpTSPID_Month, pTimeScale)
{
SetScaleInterval(xtpDTScale_Day, 1);
m_nScaleIntervalWidth_px = 30;
}
CXTPCalendarTLV_TimeScaleParams_Month::~CXTPCalendarTLV_TimeScaleParams_Month()
{
}
//CString CXTPCalendarTLV_TimeScaleParams_Month::FormatLowerScaleLabel(COleDateTime dtDateTime)
//{
// return _T("");
//}
//void CXTPCalendarTLV_TimeScaleParams_Month::DrawLowerScale(CDC* pDC, DATE dtStart, const CRect& rcRect)
//{
//
//}
CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Day::GetPart() const
{
return GetParentTimeScale()->GetView()->GetPaintManager()->GetTimeLineViewTimeScalePart_Day();
}
CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Week::GetPart() const
{
return GetParentTimeScale()->GetView()->GetPaintManager()->GetTimeLineViewTimeScalePart_Week();
}
CXTPCalendarTimeLineViewTimeScalePart* CXTPCalendarTLV_TimeScaleParams_Month::GetPart() const
{
return GetParentTimeScale()->GetView()->GetPaintManager()->GetTimeLineViewTimeScalePart_Month();
}