// TaskListView.h // // (c)1998-2025 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 // ///////////////////////////////////////////////////////////////////////////// #if !defined(__TASKLISTVIEW_H__) # define __TASKLISTVIEW_H__ # if _MSC_VER > 1000 # pragma once # endif // _MSC_VER > 1000 enum TaskImportance { taskImportanceNormal, taskImportanceHigh, taskImportanceLow }; enum TaskStatus { taskStatusNotStarted, taskStatusInProgress, taskStatusCompleted, taskStatusWaiting, taskStatusDeferred, }; class CTaskRecord : public CXTPGridRecord { protected: class CTaskItemType : public CXTPGridRecordItem { public: CTaskItemType(BOOL /*bSharedTask*/) { SetFocusable(FALSE); } }; class CTaskItemImportance : public CXTPGridRecordItem { public: CTaskItemImportance(TaskImportance taskImportance) { SetImportance(taskImportance); } void OnConstraintChanged(XTP_GRIDRECORDITEM_ARGS* /*pItemArgs*/, CXTPGridRecordItemConstraint* pConstraint) { SetImportance((TaskImportance)pConstraint->m_dwData); } DWORD GetSelectedConstraintData(XTP_GRIDRECORDITEM_ARGS* /*pItemArgs*/) { return m_taskImportance; } void SetImportance(TaskImportance taskImportance) { m_taskImportance = taskImportance; SetIconIndex(taskImportance == taskImportanceHigh ? 6 : taskImportance == taskImportanceLow ? 9 : -1); SetGroupPriority(taskImportance == taskImportanceHigh ? IDS_GROUP_IMPOPRTANCE_HIGH : taskImportance == taskImportanceLow ? IDS_GROUP_IMPOPRTANCE_LOW : IDS_GROUP_IMPOPRTANCE_NORMAL); SetSortPriority(GetGroupPriority()); } public: TaskImportance m_taskImportance; }; class CTaskItemAttachment : public CXTPGridRecordItem { public: CTaskItemAttachment::CTaskItemAttachment(BOOL bHasAttachment) { SetIconIndex(bHasAttachment ? 8 : -1); SetGroupPriority(bHasAttachment ? IDS_GROUP_ATTACHMENTS_TRUE : IDS_GROUP_ATTACHMENTS_FALSE); SetSortPriority(GetGroupPriority()); SetFocusable(FALSE); } }; class CTaskItemDueDate : public CXTPGridRecordItemDateTime { public: CTaskItemDueDate(COleDateTime dtDateTime) : CXTPGridRecordItemDateTime(dtDateTime) { m_strFormatString = _T("%a %m/%d/%Y"); } CString GetCaption(CXTPGridColumn* /*pColumn*/) { if (m_odtValue.GetStatus() != COleDateTime::valid || (DATE)m_odtValue == 0) return _T("None"); return m_odtValue.Format(m_strFormatString); } }; class CTaskItemStatus : public CXTPGridRecordItem { public: CTaskItemStatus(TaskStatus taskStatus) { m_taskStatus = taskStatus; } CString GetCaption(CXTPGridColumn* pColumn) { CXTPGridRecordItemConstraint* pConstraint = pColumn->GetEditOptions()->FindConstraint( m_taskStatus); _ASSERTE(pConstraint); return pConstraint->m_strConstraint; } void OnEditChanged(XTP_GRIDRECORDITEM_ARGS* pItemArgs, LPCTSTR szText) { CXTPGridRecordItemConstraint* pConstraint = pItemArgs->pColumn->GetEditOptions()->FindConstraint(szText); if (pConstraint) { m_taskStatus = (TaskStatus)pConstraint->m_dwData; CXTPGridRecordItem* pItemComplete = ((CTaskRecord*)GetRecord())->GetItem(6); if (m_taskStatus == taskStatusCompleted && ((CTaskItemComplete*)pItemComplete)->GetValue() != 100) { ((CTaskItemComplete*)pItemComplete)->SetValue(100); } if (m_taskStatus != taskStatusCompleted && ((CTaskItemComplete*)pItemComplete)->GetValue() == 100) { ((CTaskItemComplete*)pItemComplete)->SetValue(0); } } } TaskStatus m_taskStatus; }; class CTaskItemComplete : public CXTPGridRecordItemNumber { public: CTaskItemComplete(int nComplete) : CXTPGridRecordItemNumber(nComplete, _T("%2.0f%%")) { } void OnEditChanged(XTP_GRIDRECORDITEM_ARGS* pItemArgs, LPCTSTR szText) { CXTPGridRecordItemNumber::OnEditChanged(pItemArgs, szText); if (m_dValue > 100) m_dValue = 100; int nStatus = (int)GetValue(); CXTPGridRecordItem* pItemStatus = ((CTaskRecord*)GetRecord())->GetItem(3); if (nStatus == 100 && ((CTaskItemStatus*)pItemStatus)->m_taskStatus != taskStatusCompleted) { ((CTaskItemStatus*)pItemStatus)->m_taskStatus = taskStatusCompleted; } if (nStatus != 100 && ((CTaskItemStatus*)pItemStatus)->m_taskStatus == taskStatusCompleted) { ((CTaskItemStatus*)pItemStatus)->m_taskStatus = taskStatusInProgress; } } }; public: CTaskRecord(BOOL bSharedTask, TaskImportance taskImportance, BOOL bHasAttachment, TaskStatus taskStatus, CString strSubject, COleDateTime odtDueDate, int nComplete, CString strCategories); virtual void GetItemMetrics(XTP_GRIDRECORDITEM_DRAWARGS* pDrawArgs, XTP_GRIDRECORDITEM_METRICS* pItemMetrics); }; class CTaskListFrame : public CXTPFrameWnd { public: CTaskListFrame(CView* pView) { m_pOwnerView = pView; } protected: CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CView* m_pOwnerView; protected: //{{AFX_MSG(CTaskListFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// // CTaskListView view class CTaskListView : public CXTPGridView { public: enum Column { COLUMN_TYPE = 0, COLUMN_IMPORTANCE = 1, COLUMN_ATTACHMENT = 2, COLUMN_STATUS = 3, COLUMN_SUBJECT = 4, COLUMN_DUE_DATE = 5, COLUMN_COMPLETE = 6, COLUMN_CATEGORIES = 7 }; protected: CTaskListView(); virtual ~CTaskListView(); DECLARE_DYNCREATE(CTaskListView) public: //{{AFX_VIRTUAL(CTaskListView) protected: //}}AFX_VIRTUAL protected: # ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; # endif protected: //{{AFX_MSG(CTaskListView) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // Command handlers afx_msg void OnGridControlAllowEdit(); afx_msg void OnGridControlEditOnClick(); afx_msg void OnGridControlEditOnDelayClick(); afx_msg void OnGridControlEditOnDoubleClick(); afx_msg void OnGridControlFocusSubItems(); afx_msg void OnGridControlAutoSizing(); // Update handlers afx_msg void OnUpdateGridControlAllowEdit(CCmdUI* pCmdUI); afx_msg void OnUpdateGridControlEditOnClick(CCmdUI* pCmdUI); afx_msg void OnUpdateGridControlEditOnDelayClick(CCmdUI* pCmdUI); afx_msg void OnUpdateGridControlEditOnDoubleClick(CCmdUI* pCmdUI); afx_msg void OnUpdateGridControlFocusSubItems(CCmdUI* pCmdUI); afx_msg void OnUpdateGridControlAutoSizing(CCmdUI* pCmdUI); // afx_msg void OnAddTask(); afx_msg void OnGridButtonClick(NMHDR* pNotifyStruct, LRESULT* pResult); // //}}AFX_MSG BOOL Show_XTPDatePicker(CXTPGridControl* pControl, const CRect& rcItem, COleDateTime& rdtDate); BOOL Show_MFCDatePicker(CXTPGridControl* pControl, const CRect& rcItem, COleDateTime& rdtDate); DECLARE_MESSAGE_MAP() private: CFont m_fontLarge; BOOL m_bAutoSizing; }; //{{AFX_INSERT_LOCATION}} #endif // !defined(__TASKLISTVIEW_H__)