taskfile.cpp
来自「管理项目进度工具的原代码」· C++ 代码 · 共 1,983 行 · 第 1/4 页
CPP
1,983 行
}
return FALSE;
}
BOOL CTaskFile::SetTaskCreationDate(HTASKITEM hTask, const COleDateTime& date, BOOL bISO)
{
if (SetTaskDate(hTask, TDL_TASKCREATIONDATE, date, FALSE))
{
SetTaskCChar(hTask, TDL_TASKCREATIONDATESTRING, CDateHelper::FormatDate(date, bISO));
return true;
}
return FALSE;
}
BOOL CTaskFile::SetTaskDoneDate(HTASKITEM hTask, const COleDateTime& date, BOOL bISO)
{
if (SetTaskDate(hTask, TDL_TASKDONEDATE, date, FALSE))
{
SetTaskCChar(hTask, TDL_TASKDONEDATESTRING, CDateHelper::FormatDate(date, bISO));
return true;
}
return FALSE;
}
BOOL CTaskFile::SetTaskDueDate(HTASKITEM hTask, const COleDateTime& date, BOOL bISO)
{
if (SetTaskDate(hTask, TDL_TASKDUEDATE, date, FALSE))
{
SetTaskCChar(hTask, TDL_TASKDUEDATESTRING, CDateHelper::FormatDate(date, bISO));
return true;
}
return FALSE;
}
BOOL CTaskFile::SetTaskStartDate(HTASKITEM hTask, const COleDateTime& date, BOOL bISO)
{
if (SetTaskDate(hTask, TDL_TASKSTARTDATE, date, FALSE))
{
SetTaskCChar(hTask, TDL_TASKSTARTDATESTRING, CDateHelper::FormatDate(date, bISO));
return true;
}
return FALSE;
}
BOOL CTaskFile::SetTaskRecurrence(HTASKITEM hTask, const TDIRECURRENCE& tr, LPCTSTR szRegularity)
{
if (SetTaskRecurrence(hTask, (int)tr.nRegularity, tr.dwSpecific1, tr.dwSpecific2, tr.bRecalcFromDue))
{
SetTaskCChar(hTask, TDL_TASKRECURRENCE, szRegularity); // set human readable
return true;
}
return false;
}
bool CTaskFile::SetTaskRecurrence(HTASKITEM hTask, int nRegularity, DWORD dwSpecific1,
DWORD dwSpecific2, BOOL bRecalcFromDue)
{
CXmlItem* pXI = TaskFromHandle(hTask);
if (pXI)
{
CXmlItem* pXIRecur = pXI->GetItem(TDL_TASKRECURRENCE);
if (!pXIRecur)
pXIRecur = pXI->AddItem(TDL_TASKRECURRENCE);
pXIRecur->SetItemValue(TDL_TASKRECURRENCEREG, nRegularity);
pXIRecur->SetItemValue(TDL_TASKRECURRENCESPEC1, (int)dwSpecific1);
pXIRecur->SetItemValue(TDL_TASKRECURRENCESPEC2, (int)dwSpecific2);
if (bRecalcFromDue)
pXIRecur->SetItemValue(TDL_TASKRECURRENCEFROMDUE, TRUE);
else
pXIRecur->DeleteItem(TDL_TASKRECURRENCEFROMDUE);
return true;
}
return false;
}
bool CTaskFile::SetTaskVersion(HTASKITEM hTask, const char* szVersion)
{
return SetTaskCChar(hTask, TDL_TASKVERSION, szVersion);
}
BOOL CTaskFile::SetTaskTextColor(HTASKITEM hTask, COLORREF color)
{
return SetTaskULong(hTask, TDL_TASKTEXTCOLOR, color) &&
SetTaskCChar(hTask, TDL_TASKTEXTWEBCOLOR, GetWebColor(color));
}
BOOL CTaskFile::SetTaskPriorityColor(HTASKITEM hTask, COLORREF color)
{
return SetTaskULong(hTask, TDL_TASKPRIORITYCOLOR, color) &&
SetTaskCChar(hTask, TDL_TASKPRIORITYWEBCOLOR, GetWebColor(color));
}
BOOL CTaskFile::SetTaskCalcTimeEstimate(HTASKITEM hTask, double dTime)
{
return SetTaskDouble(hTask, TDL_TASKCALCTIMEESTIMATE, dTime);
}
BOOL CTaskFile::SetTaskCalcTimeSpent(HTASKITEM hTask, double dTime)
{
return SetTaskDouble(hTask, TDL_TASKCALCTIMESPENT, dTime);
}
BOOL CTaskFile::SetTaskEarliestDueDate(HTASKITEM hTask, const COleDateTime& date)
{
return SetTaskDate(hTask, TDL_TASKEARLIESTDUEDATE, date, FALSE);
}
BOOL CTaskFile::SetTaskCalcCompletion(HTASKITEM hTask, int nPercent)
{
return SetTaskUChar(hTask, TDL_TASKCALCCOMPLETION, (unsigned char)nPercent);
}
BOOL CTaskFile::SetTaskHighestPriority(HTASKITEM hTask, int nPriority)
{
if (nPriority != FT_NOPRIORITY)
nPriority = (char)max(0, min(10, nPriority));
return SetTaskInt(hTask, TDL_TASKHIGHESTPRIORITY, nPriority);
}
BOOL CTaskFile::SetTaskHighestRisk(HTASKITEM hTask, int nRisk)
{
if (nRisk != FT_NORISK)
nRisk = (char)max(0, min(10, nRisk));
return SetTaskInt(hTask, TDL_TASKHIGHESTRISK, nRisk);
}
BOOL CTaskFile::SetTaskCalcCost(HTASKITEM hTask, double dCost)
{
return SetTaskDouble(hTask, TDL_TASKCALCCOST, dCost);
}
bool CTaskFile::SetTaskPosition(HTASKITEM hTask, unsigned long nPos)
{
return SetTaskULong(hTask, TDL_TASKPOS, nPos);
}
bool CTaskFile::SetTaskRisk(HTASKITEM hTask, unsigned char nRisk)
{
return SetTaskUChar(hTask, TDL_TASKRISK, (unsigned char)max(0, min(10, nRisk)));
}
bool CTaskFile::SetTaskRisk(HTASKITEM hTask, int nRisk)
{
if (nRisk != FT_NORISK)
nRisk = (char)max(-1, min(10, nRisk));
return SetTaskInt(hTask, TDL_TASKRISK, nRisk);
}
bool CTaskFile::SetTaskExternalID(HTASKITEM hTask, const char* szID)
{
return SetTaskCChar(hTask, TDL_TASKEXTERNALID, szID);
}
////////////////////////////////////////////////
// utility functions
time_t CTaskFile::GetTaskDate(HTASKITEM hTask, LPCTSTR szDateItem, BOOL bIncTime) const
{
COleDateTime date = GetTaskDateOle(hTask, szDateItem, bIncTime);
if (date.m_dt)
{
tm time = { date.GetSecond(),
date.GetMinute(),
date.GetHour(),
date.GetDay(),
date.GetMonth() - 1,
date.GetYear() - 1900,
date.GetDayOfWeek() - 1,
date.GetDayOfYear(),
-1};
time_t timet = mktime(&time);
return (timet == -1) ? 0 : timet;
}
return 0;
}
COleDateTime CTaskFile::GetTaskDateOle(HTASKITEM hTask, LPCTSTR szDateItem, BOOL bIncTime) const
{
double dDate = GetTaskDouble(hTask, szDateItem);
if (!bIncTime)
dDate = floor(dDate);
return dDate;
}
unsigned char CTaskFile::GetTaskUChar(HTASKITEM hTask, LPCTSTR szUCharItem) const
{
unsigned long lVal = GetTaskULong(hTask, szUCharItem);
return (unsigned char)min(max(0, lVal), 255);
}
unsigned long CTaskFile::GetTaskULong(HTASKITEM hTask, LPCTSTR szULongItem) const
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, 0);
return (unsigned long)pXITask->GetItemValueI(szULongItem);
}
int CTaskFile::GetTaskInt(HTASKITEM hTask, LPCTSTR szIntItem) const
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, 0);
return pXITask->GetItemValueI(szIntItem);
}
const char* CTaskFile::GetTaskCChar(HTASKITEM hTask, LPCTSTR szCCharItem) const
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, NULL);
return pXITask->GetItemValue(szCCharItem);
}
double CTaskFile::GetTaskDouble(HTASKITEM hTask, LPCTSTR szDoubleItem) const
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, 0.0);
return pXITask->GetItemValueF(szDoubleItem);
}
double CTaskFile::GetTaskTime(HTASKITEM hTask, LPCTSTR szTimeItem) const
{
return GetTaskDouble(hTask, szTimeItem);
}
char CTaskFile::GetTaskTimeUnits(HTASKITEM hTask, LPCTSTR szUnitsItem) const
{
return (char)GetTaskUChar(hTask, szUnitsItem);
}
////////////////////////////////////////////////////////////////////
bool CTaskFile::SetTaskDate(HTASKITEM hTask, LPCTSTR szDateItem, const COleDateTime& tVal,
BOOL bIncTime)
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, false);
double dDate = bIncTime ? tVal.m_dt : floor(tVal.m_dt);
return (pXITask->SetItemValue(szDateItem, dDate) != NULL);
}
bool CTaskFile::SetTaskDate(HTASKITEM hTask, LPCTSTR szDateItem, time_t tVal, BOOL bIncTime)
{
//fabio_2005
#if _MSC_VER >= 1400
errno_t err;
tm* pTime =NULL;
// Get time as 64-bit integer.
// Convert to local time
err= localtime_s(pTime ,&tVal );
#else
tm* pTime = localtime(&tVal);
#endif
if (!pTime)
return false;
// else
COleDateTime date(pTime->tm_year + 1900,
pTime->tm_mon + 1,
pTime->tm_mday,
pTime->tm_hour,
pTime->tm_min,
pTime->tm_sec);
return SetTaskDate(hTask, szDateItem, date, bIncTime);
}
bool CTaskFile::SetTaskUChar(HTASKITEM hTask, LPCTSTR szUCharItem, unsigned char cVal)
{
return SetTaskULong(hTask, szUCharItem, cVal);
}
bool CTaskFile::SetTaskULong(HTASKITEM hTask, LPCTSTR szULongItem, unsigned long lVal)
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, false);
return (pXITask->SetItemValue(szULongItem, (int)lVal) != NULL);
}
bool CTaskFile::SetTaskInt(HTASKITEM hTask, LPCTSTR szIntItem, int iVal)
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, false);
return (pXITask->SetItemValue(szIntItem, iVal) != NULL);
}
bool CTaskFile::SetTaskCChar(HTASKITEM hTask, LPCTSTR szCCharItem, const char* szVal, BOOL bCData)
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, false);
return (pXITask->SetItemValue(szCCharItem, szVal, bCData) != NULL);
}
bool CTaskFile::SetTaskDouble(HTASKITEM hTask, LPCTSTR szDoubleItem, double dVal)
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, false);
return (pXITask->SetItemValue(szDoubleItem, dVal) != NULL);
}
bool CTaskFile::SetTaskTime(HTASKITEM hTask, LPCTSTR szTimeItem, double dTime,
LPCTSTR szUnitsItem, char cUnits)
{
char* szUnits;
switch (cUnits)
{
case 'i':
case 'I': szUnits = "I"; // minutes
break;
case 'h':
case 'H': szUnits = "H";
break;
case 'd':
case 'D': szUnits = "D";
break;
case 'w':
case 'W': szUnits = "W";
break;
case 'm':
case 'M': szUnits = "M";
break;
case 'y':
case 'Y': szUnits = "Y";
break;
default: // all else
return false;
}
return SetTaskDouble(hTask, szTimeItem, dTime) &&
SetTaskCChar(hTask, szUnitsItem, szUnits);
}
CString CTaskFile::GetWebColor(COLORREF color)
{
unsigned char cRed = GetRValue(color);
unsigned char cGreen = GetGValue(color);
unsigned char cBlue = GetBValue(color);
static CString sColor;
sColor.Format("#%02X%02X%02X", cRed, cGreen, cBlue);
return sColor;
}
const char* CTaskFile::GetTaskArrayItem(HTASKITEM hTask, const char* szNumItemTag,
const char* szItemTag, int nIndex) const
{
if (nIndex == 0)
return GetTaskCChar(hTask, szItemTag); // first item
// else
int nCount = GetTaskUChar(hTask, szNumItemTag);
if (!nCount || nIndex < 1 || nIndex > nCount - 1)
return NULL;
CString sItem;
sItem.Format("%s%d", szItemTag, nIndex);
return GetTaskCChar(hTask, sItem);
}
bool CTaskFile::AddTaskArrayItem(HTASKITEM hTask, const char* szNumItemTag,
const char* szItemTag, const char* szItem)
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, false);
int nCount = pXITask->GetItemValueI(szNumItemTag);
// see if it already exists
if (nCount || pXITask->GetItem(szItemTag))
{
CString sValue = pXITask->GetItemValue(szItemTag);
if (sValue.CompareNoCase(szItem) == 0)
return false; // already exists
// the rest have numbers after their names
for (int nItem = 1; nItem < nCount; nItem++)
{
CString sItem;
sItem.Format("%s%d", szItemTag, nItem);
CString sValue = pXITask->GetItemValue(sItem);
if (sValue.CompareNoCase(szItem) == 0)
return false; // already exists
}
}
// does the task have an existing item?
if (!pXITask->GetItem(szItemTag))
{
pXITask->AddItem(szNumItemTag, 1); // num
pXITask->AddItem(szItemTag, szItem); // first item
}
else // append
{
// increment item count
pXITask->SetItemValue(szNumItemTag, nCount + 1);
CString sItem;
sItem.Format("%s%d", szItemTag, nCount);
pXITask->AddItem(sItem, szItem);
}
return true;
}
int CTaskFile::GetTaskArray(HTASKITEM hTask, const char* szNumItemTag,
const char* szItemTag, CStringArray& aItems) const
{
aItems.RemoveAll();
// first item
CString sItem = GetTaskCChar(hTask, szItemTag);
if (!sItem.IsEmpty())
{
aItems.Add(sItem);
// rest
int nCount = GetTaskUChar(hTask, szNumItemTag);
for (int nItem = 1; nItem < nCount; nItem++)
aItems.Add(GetTaskArrayItem(hTask, szNumItemTag, szItemTag, nItem));
}
return aItems.GetSize();
}
BOOL CTaskFile::SetTaskArray(HTASKITEM hTask, const char* szNumItemTag,
const char* szItemTag, const CStringArray& aItems)
{
CXmlItem* pXITask = NULL;
GET_TASK(pXITask, hTask, FALSE);
// delete any existing categories
pXITask->DeleteItem(szItemTag);
pXITask->DeleteItem(szNumItemTag);
// then add these
int nCount = aItems.GetSize();
for (int nItem = 0; nItem < nCount; nItem++)
AddTaskArrayItem(hTask, szNumItemTag, szItemTag, aItems[nItem]);
return TRUE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?