todoctrldata.h
来自「管理项目进度工具的原代码」· C头文件 代码 · 共 295 行
H
295 行
// ToDoCtrlData.h: interface for the CToDoCtrlData class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TODOCTRLDATA_H__02C3C360_45AB_45DC_B1BF_BCBEA472F0C7__INCLUDED_)
#define AFX_TODOCTRLDATA_H__02C3C360_45AB_45DC_B1BF_BCBEA472F0C7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "tdcstruct.h"
#include "tdcenum.h"
#include <afxtempl.h>
#include "..\3rdparty\fixalloc.h"
class TODOITEM
{
public:
TODOITEM(LPCTSTR szTitle, LPCTSTR szComments = NULL);
TODOITEM();
TODOITEM(const TODOITEM& tdi);
BOOL HasLastMod() const;
BOOL HasCreation() const;
BOOL HasStart() const;
BOOL HasDue() const;
BOOL IsDone() const;
void ClearStart();
void ClearDue();
void ClearDone();
BOOL IsDue() const;
BOOL IsDue(const COleDateTime& dateDueBy) const;
void SetModified();
void ResetCalcs() const;
CString GetFirstCategory() const;
CString GetFirstAllocTo() const;
BOOL GetNextOccurence(COleDateTime& dtNext) const;
// ------------------------------------------
CString sTitle;
CString sComments, sCustomComments;
CString sCommentsTypeID;
COLORREF color;
COleDateTime dateStart, dateDue, dateDone, dateCreated;
int nPriority;
double dCost;
CStringArray aAllocTo;
CString sAllocBy;
CString sStatus;
CStringArray aCategories;
CString sCreatedBy;
int nPercentDone;
CString sFileRefPath;
double dTimeEstimate, dTimeSpent;
int nTimeEstUnits, nTimeSpentUnits;
COleDateTime tLastMod;
BOOL bFlagged;
int nRisk;
CString sExternalID;
CString sDependency;
TDIRECURRENCE trRecurrence;
CString sVersion;
// cached calculations for drawing optimization
// mutable so that they can be updated in const methods
mutable int nCalcPriority;
mutable int nCalcPriorityIncDue;
mutable int nCalcPercent;
mutable int nCalcRisk;
mutable double dCalcTimeEstimate, dCalcTimeSpent;
mutable double dCalcCost;
mutable COleDateTime dateEarliestDue;
mutable BOOL bGoodAsDone, bDue;
mutable int nSubtasksCount, nSubtasksDone;
DECLARE_FIXED_ALLOC(TODOITEM);
};
typedef CMap<DWORD, DWORD, TODOITEM*, TODOITEM*&> CTDIMap;
typedef CMap<DWORD, DWORD, HTREEITEM, HTREEITEM&> CHTIMap;
class CToDoCtrlData
{
public:
CToDoCtrlData(CTreeCtrl& tree, const CWordArray& aStyles);
virtual ~CToDoCtrlData();
inline UINT GetTaskCount() const { return m_mapTDItems.GetCount(); }
inline DWORD GetTaskID(HTREEITEM hti) const { return hti ? m_tree.GetItemData(hti) : 0; }
HTREEITEM GetItem(DWORD dwID) const;
TODOITEM* NewTask(const TODOITEM* pTDIRef = NULL);
TODOITEM* GetTask(DWORD dwID) const;
TODOITEM* GetTask(HTREEITEM hti) const;
void DeleteTask(DWORD dwID);
void DeleteAllTasks(BOOL bIncTree = TRUE);
void AddTask(DWORD dwID, TODOITEM* pTDI);
double GetEarliestDueDate() const;
void Sort(TDC_SORTBY nBy, BOOL bAscending, HTREEITEM htiRoot = NULL);
void SetSortDueTodayHigh(BOOL bHigh);
// Gets
CString GetTaskTitle(DWORD dwID) const;
COleDateTime GetTaskDate(DWORD dwID, TDC_DATE nDate) const;
BOOL IsTaskDone(DWORD dwID) const;
COLORREF GetTaskColor(DWORD dwID) const; // -1 on no item selected
CString GetTaskComments(DWORD dwID) const;
CString GetTaskCustomComments(DWORD dwID, CString& sCommentsTypeID) const;
int GetTaskPercent(DWORD dwID, BOOL bCheckIfDone) const;
double GetTaskTimeEstimate(DWORD dwID, int& nUnits) const;
double GetTaskTimeSpent(DWORD dwID, int& nUnits) const;
double GetTaskCost(DWORD dwID) const;
int GetTaskAllocTo(DWORD dwID, CStringArray& aAllocTo) const;
CString GetTaskAllocBy(DWORD dwID) const;
CString GetTaskCreatedBy(DWORD dwID) const;
CString GetTaskStatus(DWORD dwID) const;
int GetTaskCategories(DWORD dwID, CStringArray& aCategories) const;
CString GetTaskDependency(DWORD dwID) const;
CString GetTaskFileRef(DWORD dwID) const;
CString GetTaskExtID(DWORD dwID) const;
int GetTaskPriority(DWORD dwID) const;
int GetTaskRisk(DWORD dwID) const;
BOOL IsTaskFlagged(DWORD dwID) const;
BOOL GetTaskRecurrence(DWORD dwID, TDIRECURRENCE& tr) const;
BOOL GetTaskNextOccurrence(DWORD dwID, COleDateTime& dtNext) const;
CString GetTaskVersion(DWORD dwID) const;
COLORREF GetTaskColor(HTREEITEM hti) const;
double GetTaskTimeEstimate(HTREEITEM hti, int& nUnits) const;
double GetTaskTimeSpent(HTREEITEM hti, int& nUnits) const;
int GetTaskPercent(HTREEITEM hti) const;
int GetTaskAllocTo(HTREEITEM hti, CStringArray& aAllocTo) const;
CString GetTaskAllocBy(HTREEITEM hti) const;
CString GetTaskStatus(HTREEITEM hti) const;
int GetTaskCategories(HTREEITEM hti, CStringArray& aCategories) const;
CString GetTaskExtID(HTREEITEM hti) const;
int GetTaskPriority(HTREEITEM hti) const;
int GetTaskRisk(HTREEITEM hti) const;
BOOL DeleteTask(HTREEITEM hti);
int GetItemPos(HTREEITEM hti, HTREEITEM htiSearch) const; // returns 0 if not found
BOOL IsParentTaskDone(HTREEITEM hti) const; // this is recursive
int AreChildTasksDone(HTREEITEM hti) const; // 1=yes, 0=no, -1=no children
BOOL IsTaskFlagged(HTREEITEM hti) const;
double GetTaskCost(HTREEITEM hti) const;
COleDateTime GetTaskDate(HTREEITEM hti, TDC_DATE nDate) const;
BOOL GetTaskRecurrence(HTREEITEM hti, TDIRECURRENCE& tr) const;
CString GetTaskVersion(HTREEITEM hti) const;
int GetTaskDependents(DWORD dwTaskID, CDWordArray& aDependents) const;
int GetTaskDependencies(DWORD dwTaskID, CDWordArray& aDepends) const;
BOOL HasCircularDependencies(DWORD dwTaskID) const;
BOOL IsTaskDue(HTREEITEM hti, BOOL bToday = FALSE) const;
double GetEarliestDueDate(HTREEITEM hti, BOOL bCheckChildren) const;
int GetHighestPriority(HTREEITEM hti, BOOL bIncludeDue = TRUE) const;
int GetHighestRisk(HTREEITEM hti) const;
int CalcPercentDone(HTREEITEM hti) const;
double CalcCost(HTREEITEM hti) const;
double CalcTimeEstimate(HTREEITEM hti, int nUnits) const;
double CalcTimeSpent(HTREEITEM hti, int nUnits) const;
BOOL GetSubtaskTotals(HTREEITEM hti, int& nSubtasksTotal, int& nSubtasksDone) const;
CString GetTaskPath(HTREEITEM hti, int nMaxElementLen = -1) const; // nMaxElementLen relates to each element of the path
CString GetLongestVisibleExternalID(HTREEITEM hti) const;
CString GetLongestVisibleCategory(HTREEITEM hti) const;
CString GetLongestVisibleAllocTo(HTREEITEM hti) const;
CString GetLongestVisibleExternalID() const;
CString GetLongestVisibleCategory() const;
CString GetLongestVisibleAllocTo() const;
CString GetLongestVisibleExternalID(HTREEITEM hti, const TODOITEM* pTDI) const;
CString GetLongestVisibleCategory(HTREEITEM hti, const TODOITEM* pTDI) const;
CString GetLongestVisibleAllocTo(HTREEITEM hti, const TODOITEM* pTDI) const;
BOOL IsTaskDue(HTREEITEM hti, const TODOITEM* tdi, BOOL bToday = FALSE) const;
double GetEarliestDueDate(HTREEITEM hti, const TODOITEM* pTDI, BOOL bCheckChildren) const;
int GetHighestPriority(HTREEITEM hti, const TODOITEM* pTDI, BOOL bIncludeDue = TRUE) const;
int GetHighestRisk(HTREEITEM hti, const TODOITEM* pTDI) const;
double CalcCost(HTREEITEM hti, const TODOITEM* pTDI) const;
double CalcTimeEstimate(HTREEITEM hti, const TODOITEM* pTDI, int nUnits) const;
double CalcTimeSpent(HTREEITEM hti, const TODOITEM* pTDI, int nUnits) const;
int CalcPercentDone(HTREEITEM hti, const TODOITEM* pTDI) const;
int CalcPercentFromTime(HTREEITEM hti, const TODOITEM* pTDI) const; // spent / estimate
BOOL GetSubtaskTotals(HTREEITEM hti, const TODOITEM* pTDI,
int& nSubtasksTotal, int& nSubtasksDone) const;
// Sets. 0 = failed, 1 = success, -1 = success (no change)
int SetTaskDate(DWORD dwID, TDC_DATE nDate, const COleDateTime& date);
int OffsetTaskDate(DWORD dwID, TDC_DATE nDate, int nAmount, int nUnits);
int SetTaskDone(DWORD dwID, BOOL bDone, int& nPrevPercent);
int SetTaskColor(DWORD dwID, COLORREF color);
int ClearTaskColor(DWORD dwID) { SetTaskColor(dwID, (COLORREF)-1); }
int SetTaskComments(DWORD dwID, LPCTSTR szComments);
int SetTaskCustomComments(DWORD dwID, const CString& sComments, LPCTSTR szCommentsTypeID); // can't be LPCTSTR cos not NULL terminated
int SetTaskPercent(DWORD dwID, int nPercent);
int SetTaskTimeEstimate(DWORD dwID, double dTime, int nUnits = TDITU_HOURS);
int SetTaskTimeSpent(DWORD dwID, double dTime, int nUnits = TDITU_HOURS);
int SetTaskCost(DWORD dwID, double dCost);
int SetTaskAllocTo(DWORD dwID, const CStringArray& aAllocTo);
int SetTaskAllocBy(DWORD dwID, LPCTSTR szAllocBy);
int SetTaskStatus(DWORD dwID, LPCTSTR szStatus);
int SetTaskCategories(DWORD dwID, const CStringArray& aCategories);
int SetTaskDependency(DWORD dwID, LPCTSTR szDepends);
int SetTaskExtID(DWORD dwID, LPCTSTR szID);
int SetTaskFileRef(DWORD dwID, LPCTSTR szFilePath);
int SetTaskPriority(DWORD dwID, int nPriority); // 0-10 (10 is highest)
int SetTaskRisk(DWORD dwID, int nRisk); // 0-10 (10 is highest)
int SetTaskTitle(DWORD dwID, LPCTSTR szTitle);
int SetTaskAttributeAsParent(HTREEITEM hti, TDC_ATTRIBUTE nAttrib);
int SetTaskFlag(DWORD dwID, BOOL bFlagged);
int SetTaskRecurrence(DWORD dwID, const TDIRECURRENCE& tr);
int SetTaskVersion(DWORD dwID, LPCTSTR szVersion);
int OffsetTaskDate(HTREEITEM hti, TDC_DATE nDate, int nAmount, int nUnits, BOOL bAndSubtasks);
int FindTasks(const SEARCHPARAMS& params, CResultArray& aResults) const;
DWORD FindFirstTask(const SEARCHPARAMS& params, SEARCHRESULT& result) const;
BOOL TaskMatches(DWORD dwID, const SEARCHPARAMS& params, SEARCHRESULT& result) const;
void BuildHTIMap(CHTIMap& mapHTI, HTREEITEM htiRoot = NULL) const;
void UpdateHTIMapEntry(CHTIMap& mapHTI, HTREEITEM hti) const;
BOOL IsTaskFullyDone(HTREEITEM hti, const TODOITEM* pTDI, BOOL bCheckSiblings) const;
void ResetCachedCalculations() const;
BOOL IsTaskTimeTrackable(HTREEITEM hti) const;
BOOL IsTaskDone(HTREEITEM hti, DWORD dwExtraCheck = TDCCHECKNONE) const;
void ApplyLastChangeToSubtasks(HTREEITEM hti, const TODOITEM* pTDI, TDC_ATTRIBUTE nAttrib);
int SaveTreeExpandedState(LPCTSTR szRegKey, HTREEITEM hti = NULL, int nStart = 0);
void LoadTreeExpandedState(LPCTSTR szRegKey);
// void RefreshItemCheckState(HTREEITEM hti, int nDone = -1, BOOL bRefreshParents = FALSE);
// void RefreshAllCheckStates(HTREEITEM htiRoot = NULL);
static int MapTimeUnits(const CString& sUnits);
static CString MapTimeUnits(int nUnits);
protected:
CTDIMap m_mapTDItems; // the real data
CTreeCtrl& m_tree; // CToDoCtrl tree
const CWordArray& m_aStyles; // CToDoCtrl styles
BOOL m_bSortDueTodayHigh;
protected:
DWORD FindFirstTask(HTREEITEM hti, const SEARCHPARAMS& params, SEARCHRESULT& result) const;
int FindTasks(HTREEITEM hti, const SEARCHPARAMS& params, CResultArray& aResults) const;
BOOL TaskMatches(HTREEITEM hti, const SEARCHPARAMS& params, SEARCHRESULT& result) const;
// internal use only
void SumPercentDone(HTREEITEM hti, const TODOITEM* pTDI,
double& dTotalPercent, double& dTotalWeighting) const;
static BOOL TaskMatches(const COleDateTime& date, const SEARCHPARAMS& params, SEARCHRESULT& result);
static BOOL TaskMatches(const CString& sText, const SEARCHPARAMS& params, SEARCHRESULT& result);
static BOOL TaskMatches(double dValue, const SEARCHPARAMS& params, SEARCHRESULT& result);
static BOOL TaskMatches(int nValue, const SEARCHPARAMS& params, SEARCHRESULT& result);
static BOOL TaskMatches(const CStringArray& aItems, const SEARCHPARAMS& params, SEARCHRESULT& result);
inline BOOL HasStyle(int nStyle) const { return m_aStyles[nStyle] ? TRUE : FALSE; }
// sort helper structure
struct TDSORTSTRUCT
{
CToDoCtrlData* pData;
const CHTIMap* pMapHTItems;
TDC_SORTBY nSortBy;
BOOL bAscending;
};
void Sort(HTREEITEM hti, const TDSORTSTRUCT& ss);
int CompareTasks(TODOITEM* pTDI1, HTREEITEM hti1, TODOITEM* pTDI2, HTREEITEM hti2,
TDC_SORTBY nSortBy, BOOL bAscending);
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
static int Compare(const COleDateTime& date1, const COleDateTime& date2);
static int Compare(const CString& sText1, const CString& sText2, BOOL bCheckEmpty = FALSE);
static int Compare(int nNum1, int nNum2);
static int Compare(double dNum1, double dNum2);
};
#endif // !defined(AFX_TODOCTRLDATA_H__02C3C360_45AB_45DC_B1BF_BCBEA472F0C7__INCLUDED_)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?