todoctrl.h

来自「管理项目进度工具的原代码」· C头文件 代码 · 共 608 行 · 第 1/2 页

H
608
字号
#if !defined(AFX_TODOCTRL_H__5951FDE6_508A_4A9D_A55D_D16EB026AEF7__INCLUDED_)
#define AFX_TODOCTRL_H__5951FDE6_508A_4A9D_A55D_D16EB026AEF7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ToDoCtrl.h : header file
//

#include "TaskListDropTarget.h"
#include "todoctrldata.h"
#include "taskfile.h"
#include "tdcstruct.h"
#include "tdlprioritycombobox.h"
#include "tdlriskcombobox.h"
#include "recurringtaskedit.h"

#include "..\shared\runtimedlg.h"
#include "..\shared\dialoghelper.h"
#include "..\shared\orderedtreectrl.h"
#include "..\shared\fileedit.h"
#include "..\shared\sysimagelist.h"
#include "..\shared\urlricheditctrl.h"
#include "..\shared\colorcombobox.h"
#include "..\shared\autocombobox.h"
#include "..\shared\maskedit.h"
#include "..\shared\timeedit.h"
#include "..\shared\TreeDragDropHelper.h"
#include "..\shared\wndPrompt.h"
#include "..\shared\contentmgr.h"
#include "..\shared\encheckcombobox.h"
#include "..\shared\contenttypecombobox.h"
//#include "..\shared\endatetimectrl.h"

#include "..\3rdparty\colourpicker.h"

/////////////////////////////////////////////////////////////////////////////
// CToDoCtrl dialog

// predeclarations
class CXmlItem;
class CTaskFile;
class CDeferWndMove;
class CDlgUnits;
struct CTRLITEM;
struct TDCCOLUMN;
class CSpellCheckDlg;

class CToDoCtrl : public CRuntimeDlg, protected CDialogHelper
{
// Construction
public:
	CToDoCtrl(CContentMgr& mgr, const CONTENTFORMAT& cfDefault);
	virtual ~CToDoCtrl();

	BOOL Create(const RECT& rect, CWnd* pParentWnd, UINT nID, BOOL bVisible = TRUE);

	TDC_FILE Save(LPCTSTR szFilePath = NULL, BOOL bCheckforLaterChanges = TRUE);
	TDC_FILE Save(CTaskFile& tasks/*out*/, LPCTSTR szFilePath = NULL, BOOL bCheckforLaterChanges = TRUE);

	TDC_FILE Load(LPCTSTR szFilePath, LPCTSTR szArchivePath = NULL, 
					TDC_ARCHIVE nRemove = TDC_REMOVEALL, BOOL bRemoveFlagged = TRUE);
	TDC_FILE Load(CTaskFile& tasks/*out*/, LPCTSTR szFilePath, LPCTSTR szArchivePath = NULL, 
					TDC_ARCHIVE nRemove = TDC_REMOVEALL, BOOL bRemoveFlagged = TRUE);
	
	BOOL DelayLoad(LPCTSTR szFilePath, COleDateTime& dtEarliestDue);

	BOOL Import(LPCTSTR szFilePath, BOOL bAppend);

	int ArchiveDoneTasks(LPCTSTR szFilePath, TDC_ARCHIVE nFlags, BOOL bRemoveFlagged); // returns the number of tasks removed

	void EnableEncryption(BOOL bEnable = TRUE);
	BOOL IsEncrypted() const { return (!m_sPassword.IsEmpty()); }
	static BOOL CanEncrypt(); // returns true only if the required encrytion capabilities are present
	CString GetPassword() const { return m_sPassword; }
	BOOL VerifyPassword(LPCTSTR szExplanation = NULL) const;

	BOOL CheckIn();
	BOOL CheckOut();
	BOOL CheckOut(CString& sCheckedOutTo);
	BOOL IsCheckedOut() const { return m_bCheckedOut; }
	BOOL IsSourceControlled() const { return m_bSourceControlled; }

	void Flush(); // called to end current editing actions
	BOOL IsModified() const { return m_bModified && !IsReadOnly(); }
	void SetModified(BOOL bMod = TRUE);

	inline CString GetFilePath() const { return m_sLastSavePath; }
	inline void ClearFilePath() { m_sLastSavePath.Empty(); }
	inline CString GetProjectName() const { return m_sProjectName; }
	void SetProjectName(LPCTSTR szProjectName);
	CString GetFriendlyProjectName(int nUntitledIndex = -1) const;
	inline void SetFilePath(LPCTSTR szPath) { m_sLastSavePath = szPath; }

	BOOL DeleteAllTasks();
	void NewList();

	int GetTasklist(CTaskFile& tasklist, DWORD dwFlags = 0) const;
	int GetTasks(CTaskFile& tasks, TDC_FILTER nFilter, DWORD dwFlags = 0, LPCTSTR szAllocatedTo = NULL) const;
	int GetSelectedTasks(CTaskFile& tasks, DWORD dwFlags = 0) const;
	BOOL SetTasks(const CTaskFile& tasks, BOOL bAppend);

	void SetReadonly(BOOL bReadOnly) { SetStyle(TDCS_READONLY, bReadOnly); }
	BOOL IsReadOnly() const { return HasStyle(TDCS_READONLY); }

	void SetStyles(const CTDCStyles& styles);
	void SetStyle(TDC_STYLE nStyle, BOOL bOn = TRUE); // one style at a time only 
	BOOL HasStyle(TDC_STYLE nStyle) const; // one style at a time only 

	void SetVisibleColumns(const CTDCColumnArray& aColumns);
	int GetVisibleColumns(CTDCColumnArray& aColumns) const;
	BOOL IsColumnShowing(TDC_COLUMN nColumn) const;

	BOOL SetPriorityColors(const CDWordArray& aColors); // must have 12 elements
	COLORREF GetPriorityColor(int nPriority) const;
    void SetGridlineColor(COLORREF color) { m_tree.SetGridlineColor(color); }
	void SetTaskCompletedColor(COLORREF color);
	void SetCategoryColors(const CTDCColorMap& colors);
	BOOL GetCategoryColor(LPCTSTR szCategory, COLORREF& color) const;
	void SetDueTaskColors(COLORREF crDue, COLORREF crDueToday);
	void GetDueTaskColors(COLORREF& crDue, COLORREF& crDueToday) { crDue = m_crDue; crDueToday = m_crDueToday; }

	// these return the full list of items in each droplist
	int GetAllocToNames(CStringArray& aNames) const { return m_cbAllocTo.GetItems(aNames); }
	int GetAllocByNames(CStringArray& aNames) const { return m_cbAllocBy.GetItems(aNames); }
	int GetCategoryNames(CStringArray& aNames) const { return m_cbCategory.GetItems(aNames); }
	int GetStatusNames(CStringArray& aNames) const { return m_cbStatus.GetItems(aNames); }

	void SetDefaultAllocToNames(const CStringArray& aNames);
	void SetDefaultAllocByNames(const CStringArray& aNames);
	void SetDefaultCategoryNames(const CStringArray& aNames);
	void SetDefaultStatusNames(const CStringArray& aNames);

	HTREEITEM NewTask(LPCTSTR szText, TDC_INSERTWHERE nWhere = TDC_INSERTATTOPOFSELTASKPARENT, 
						BOOL bSelect = TRUE, BOOL bEditText = TRUE);

	BOOL SplitSelectedTask(int nNumSubtasks = 2);
	BOOL CanSplitSelectedTask();

	DWORD GetSelectedTaskID() const { return m_data.GetTaskID(GetSelectedItem()); } 
	TODOITEM* GetSelectedTask() const { return m_data.GetTask(GetSelectedItem()); }
	virtual BOOL HasTask(DWORD dwTaskID);
	virtual BOOL SelectTask(DWORD dwTaskID);
	virtual BOOL IsTaskDone(DWORD dwTaskID) const { return m_data.IsTaskDone(dwTaskID); }

	BOOL DeleteSelectedTask();
	BOOL EditSelectedTask(BOOL bTaskIsNew = FALSE); 
	void SpellcheckSelectedTask(BOOL bTitle); // else comments
	BOOL CanSpellcheckSelectedTaskComments();
	
	COleDateTime GetSelectedTaskDate(TDC_DATE nDate) const;
	BOOL SetSelectedTaskDate(TDC_DATE nDate, const COleDateTime& date);
	BOOL SetSelectedTaskDone(BOOL bDone = TRUE);
	BOOL IsSelectedTaskDone() const;
	BOOL IsSelectedTaskDue() const;
	BOOL OffsetSelectedTaskDate(TDC_DATE nDate, int nAmount, int nUnits, BOOL bAndSubtasks);

	COleDateTime GetEarliestDueDate() const { return m_data.GetEarliestDueDate(); } // entire tasklist

	COLORREF GetSelectedTaskColor() const; // -1 on no item selected
	CString GetSelectedTaskComments() const;
	CString GetSelectedTaskCustomComments(CString& sCommentsTypeID) const;
	CString GetSelectedTaskTitle() const;
	double GetSelectedTaskTimeEstimate(int& nUnits) const;
	double GetSelectedTaskTimeSpent(int& nUnits) const;
	int GetSelectedTaskAllocTo(CStringArray& aAllocTo) const;
	CString GetSelectedTaskAllocBy() const;
	CString GetSelectedTaskStatus() const;
	int GetSelectedTaskCategories(CStringArray& aCats) const;
	CString GetSelectedTaskFileRef() const;
	CString GetSelectedTaskExtID() const;
	int GetSelectedTaskPercent() const;
	CString GetSelectedTaskDependency() const;
	int GetSelectedTaskPriority() const;
	int GetSelectedTaskRisk() const;
	double GetSelectedTaskCost() const;
	BOOL IsSelectedTaskFlagged() const;
	BOOL GetSelectedTaskRecurrence(TDIRECURRENCE& tr) const;
	CString GetSelectedTaskVersion() const;

	double CalcSelectedTaskTimeEstimate(int nUnits = TDITU_HOURS) const;
	double CalcSelectedTaskTimeSpent(int nUnits = TDITU_HOURS) const;
	double CalcSelectedTaskCost() const;

	BOOL SetSelectedTaskColor(COLORREF color);
	BOOL ClearSelectedTaskColor() { return SetSelectedTaskColor((COLORREF)-1); }
	BOOL SetSelectedTaskTitle(LPCTSTR szTitle);
	BOOL SetSelectedTaskPercentDone(int nPercent);
	BOOL SetSelectedTaskTimeEstimate(double dTime, int nUnits = TDITU_HOURS);
	BOOL SetSelectedTaskTimeSpent(double dTime, int nUnits = TDITU_HOURS);
	BOOL SetSelectedTaskTimeEstimateUnits(int nUnits, BOOL bRecalcTime = FALSE);
	BOOL SetSelectedTaskTimeSpentUnits(int nUnits, BOOL bRecalcTime = FALSE);
	BOOL SetSelectedTaskAllocTo(const CStringArray& aAllocTo);
	BOOL SetSelectedTaskAllocBy(LPCTSTR szAllocBy);
	BOOL SetSelectedTaskStatus(LPCTSTR szStatus);
	BOOL SetSelectedTaskCategories(const CStringArray& aCats);
	BOOL SetSelectedTaskPriority(int nPriority); // 0-10 (10 is highest)
	BOOL SetSelectedTaskRisk(int nRisk); // 0-10 (10 is highest)
	BOOL SetSelectedTaskFileRef(LPCTSTR szFilePath);
	BOOL SetSelectedTaskDependency(LPCTSTR szDepends);
	BOOL SetSelectedTaskExtID(LPCTSTR szID);
	BOOL SetSelectedTaskFlag(BOOL bFlagged);
	BOOL SetSelectedTaskCost(double dCost);
	BOOL SetSelectedTaskRecurrence(const TDIRECURRENCE& tr);
	BOOL SetSelectedTaskVersion(LPCTSTR szVersion);
	BOOL SetSelectedTaskComments(LPCTSTR szComments, const CString& sCustomComments);

	BOOL CanPasteText(); // into focused control
	BOOL PasteText(LPCTSTR szText); // into focused control

	BOOL IncrementSelectedTaskPercentDone(int nAmount); // +ve or -ve
	BOOL IncrementSelectedTaskPriority(int nAmount); // +ve or -ve

	BOOL GotoSelectedTaskFileRef();
	CString GetSelectedTaskPath();

	void PauseTimeTracking(BOOL bPause = TRUE) { m_bTimeTrackingPaused = bPause; }
	BOOL TimeTrackSelectedTask();
	BOOL CanTimeTrackSelectedTask() const;
	BOOL IsSelectedTaskBeingTimeTracked() const;
	BOOL IsActivelyTimeTracking() const; // this instant
	CString GetSelectedTaskTimeLogPath() const;
	void EndTimeTracking();
	void ResetTimeTracking() { m_dwTickLast = GetTickCount(); }

	BOOL SetSelectedTaskAttributeAsParent(TDC_ATTRIBUTE nAttrib);

	void SetDefaultTaskAttributes(LPCTSTR szTitle, LPCTSTR szComments, COLORREF color,
									double dTimeEst, int nTimeEstUnits, 
									const CStringArray& aAllocTo, LPCTSTR szAllocBy, 
									LPCTSTR szStatus, const CStringArray& aCats,
									int nPriority, int nRisk, BOOL bAutoStartDate, 
									LPCTSTR szCreatedBy, double dCost, const CONTENTFORMAT& cf);

	void Sort(TDC_SORTBY nBy); // calling twice with the same param will toggle ascending attrib
	TDC_SORTBY GetSortBy() const { return m_nSortBy; }
	void Resort() { Sort(m_nSortBy); }

	// move functions
	BOOL MoveSelectedTask(TDDH_MOVE nDirection);
	BOOL CanMoveSelectedTask(TDDH_MOVE nDirection) const;

	void GotoNextTask(TDC_GOTO nDirection); 
	BOOL CanGotoNextTask(TDC_GOTO nDirection) const;
	void GotoNextTopLevelTask(TDC_GOTO nDirection); 
	BOOL CanGotoNextTopLevelTask(TDC_GOTO nDirection) const;

	BOOL CanExpandSelectedTask(BOOL bExpand) const;
	void ExpandSelectedTask(BOOL bExpand = TRUE);
	void ExpandAllTasks(BOOL bExpand = TRUE);

	// copy/paste functions
	BOOL CutSelectedTask();
	BOOL CopySelectedTask() const;
	void ClearCopiedItem() const;
	BOOL PasteOnSelectedTask();
	BOOL PasteAfterSelectedTask();
	BOOL CanPaste() const;
	static void ReleaseClipboard() { s_clipboard.tasks.Reset(); }

	void CToDoCtrl::ResetFileVersion(unsigned int nTo = 0) { m_nFileVersion = max(nTo, 0); }
	DWORD CToDoCtrl::GetFileVersion() const { return m_nFileVersion == 0 ? 1 : m_nFileVersion; }
    TDC_FILEFMT CompareFileFormat() const; // older, same, newer
	
	// tree related
	inline HTREEITEM GetSelectedItem() const;
	inline UINT GetTaskCount() const { return m_data.GetTaskCount(); }
	inline BOOL ItemHasChildren(HTREEITEM hti) const { return m_tree.ItemHasChildren(hti); }
	inline BOOL ItemHasParent(HTREEITEM hti) const { return (NULL != m_tree.GetParentItem(hti)); }
	inline BOOL TreeHasFocus() { return (GetFocus() == &m_tree); }
	inline CString GetItemText(HTREEITEM hti) const { return m_data.GetTaskTitle(m_tree.GetItemData(hti)); }
	inline int GetSelectedCount() const { return Selection().GetCount(); }
	inline BOOL IsItemSelected(HTREEITEM hti) const { return Selection().HasItem(hti); }
	inline BOOL HasSelection() const { return GetSelectedCount(); }
	inline CString GetItemPath(HTREEITEM hti, int nMaxElementLen = -1) const { return m_tree.TCH().GetItemPath(hti, nMaxElementLen); }
	inline void SetAlternateLineColor(COLORREF color) { m_tree.SetAlternateLineColor(color); }
	
	void SetFocusToTree();
	BOOL IsTreeLabelEditing();
	void SelectItem(HTREEITEM hti);
	void SelectAll();
	void DeselectAll(); // call externally only
	BOOL MultiSelectItems(const CDWordArray& aTasks, int nState = 1, BOOL bRedraw = TRUE);
	BOOL MultiSelectItem(HTREEITEM hti, int nState = 1, BOOL bRedraw = TRUE);
	BOOL MultiSelectItems(HTREEITEM htiFrom, HTREEITEM htiTo, int nState = 1, BOOL bRedraw = TRUE);

	BOOL CanSelectNextTasksInHistory() const { return Selection().HasNextSelection(); }
	void SelectNextTasksInHistory();
	BOOL CanSelectPrevTasksInHistory() const { return Selection().HasPrevSelection(); }
	void SelectPrevTasksInHistory();

	BOOL SetCheckImageList(HIMAGELIST hImageList); // setter responsible for deleting
	BOOL SetTreeFont(HFONT hFont); // setter responsible for deleting
	BOOL SetCommentsFont(HFONT hFont); // setter responsible for deleting

	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;

	// misc
	int GetMinWidth();
	void Spellcheck();
	void SetMaxInfotipCommentsLength(int nLength) { m_nMaxInfotipCommentsLength = max(-1, nLength); } // -1 to switch off
	COleDateTime GetLastTaskModified() { return m_tLastTaskMod; }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?