// TaskListView.cpp // // (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 // ///////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "GridSample.h" #include "TaskListView.h" #include "GridSampleView.h" #if _MSC_VER >= 1200 // MFC 6.0 # include // MFC support for Internet Explorer 4 Common Controls # include "MonthCalCtrlEx.h" #endif #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////// // CTaskListFrame BEGIN_MESSAGE_MAP(CTaskListFrame, CFrameWnd) //{{AFX_MSG_MAP(CTaskListFrame) ON_WM_CREATE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; int CTaskListFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } #ifdef _XTP_INCLUDE_COMMANDBARS if (!InitCommandBars()) return -1; CXTPCommandBars* pCommandBars = GetCommandBars(); pCommandBars->SetMenu(_T("Menu Bar"), IDR_TASKLIST); pCommandBars->SetTheme(xtpThemeNativeWinXP); pCommandBars->GetPaintManager()->m_bAutoResizeIcons = TRUE; #endif return 0; } void CTaskListFrame::OnDestroy() { ((CGridSampleView*)m_pOwnerView)->m_pTaskFrame = NULL; CFrameWnd::OnDestroy(); } ////////////////////////////////////////////////////////////////////////// // CTaskRecord CTaskRecord::CTaskRecord(BOOL bSharedTask, TaskImportance taskImportance, BOOL bHasAttachment, TaskStatus taskStatus, CString strSubject, COleDateTime odtDueDate, int nComplete, CString strCategories) { AddItem(new CTaskItemType(bSharedTask)); AddItem(new CTaskItemImportance(taskImportance)); AddItem(new CTaskItemAttachment(bHasAttachment)); AddItem(new CTaskItemStatus(taskStatus)); AddItem(new CXTPGridRecordItemText(strSubject)); AddItem(new CTaskItemDueDate(odtDueDate)); AddItem(new CTaskItemComplete(nComplete)); AddItem(new CXTPGridRecordItemText(strCategories)); } void CTaskRecord::GetItemMetrics(XTP_GRIDRECORDITEM_DRAWARGS* pDrawArgs, XTP_GRIDRECORDITEM_METRICS* pItemMetrics) { if (((CTaskItemStatus*)GetItem(3))->m_taskStatus == taskStatusCompleted) { static CFont m_fontStriked; if (!m_fontStriked.GetSafeHandle()) { LOGFONT lf; pDrawArgs->pControl->GetPaintManager()->m_xtpFontText.GetLogFont(&lf); lf.lfStrikeOut = TRUE; m_fontStriked.CreateFontIndirect(&lf); } pItemMetrics->clrForeground = RGB(128, 128, 128); pItemMetrics->pFont = &m_fontStriked; } } ///////////////////////////////////////////////////////////////////////////// // CTaskListView IMPLEMENT_DYNCREATE(CTaskListView, CXTPGridView) CTaskListView::CTaskListView() : m_bAutoSizing(TRUE) { } CTaskListView::~CTaskListView() { } BEGIN_MESSAGE_MAP(CTaskListView, CXTPGridView) //{{AFX_MSG_MAP(CTaskListView) ON_WM_CREATE() ON_COMMAND(ID_GRIDCONTROL_ALLOWEDIT, OnGridControlAllowEdit) ON_COMMAND(ID_GRIDCONTROL_EDITONCLICK, OnGridControlEditOnClick) ON_COMMAND(ID_GRIDCONTROL_EDITONDELAYCLICK, OnGridControlEditOnDelayClick) ON_COMMAND(ID_GRIDCONTROL_EDITONDOUBLECLICK, OnGridControlEditOnDoubleClick) ON_COMMAND(ID_GRIDCONTROL_FOCUSSUBITEMS, OnGridControlFocusSubItems) ON_COMMAND(ID_GRIDCONTROL_AUTOSIZING, OnGridControlAutoSizing) ON_UPDATE_COMMAND_UI(ID_GRIDCONTROL_ALLOWEDIT, OnUpdateGridControlAllowEdit) ON_UPDATE_COMMAND_UI(ID_GRIDCONTROL_EDITONCLICK, OnUpdateGridControlEditOnClick) ON_UPDATE_COMMAND_UI(ID_GRIDCONTROL_EDITONDELAYCLICK, OnUpdateGridControlEditOnDelayClick) ON_UPDATE_COMMAND_UI(ID_GRIDCONTROL_EDITONDOUBLECLICK, OnUpdateGridControlEditOnDoubleClick) ON_UPDATE_COMMAND_UI(ID_GRIDCONTROL_FOCUSSUBITEMS, OnUpdateGridControlFocusSubItems) ON_UPDATE_COMMAND_UI(ID_GRIDCONTROL_AUTOSIZING, OnUpdateGridControlAutoSizing) ON_COMMAND(ID_EDIT_ADDTASK, OnAddTask) //}}AFX_MSG_MAP ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) ON_NOTIFY(XTP_NM_GRID_INPLACEBUTTONDOWN, XTP_ID_GRID_CONTROL, OnGridButtonClick) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTaskListView diagnostics #ifdef _DEBUG void CTaskListView::AssertValid() const { CView::AssertValid(); } void CTaskListView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CTaskListView message handlers class CTaskListPaintManager : public CXTPGridPaintManager { public: virtual int GetRowHeight(CDC* pDC, CXTPGridRow* pRow, int nTotalWidth) { return 50; } }; int CTaskListView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CXTPGridView::OnCreate(lpCreateStruct) == -1) return -1; CXTPGridControl& wndGrid = GetGridCtrl(); // wndGrid.SetPaintManager(new CTaskListPaintManager()); int nWidth = 0; CString type = _T("RT_SVG"); CXTPImageManager* imgMgr = wndGrid.GetImageManager(); nWidth = XTP_DPI_X(16); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_DOCUMENT, 0, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_EXCLAMATION_BLUE, 1, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_BOOKMARK, 2, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_MAIL, 3, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_MAIL_OPEN, 4, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_MAIL_ARROW_LEFT, 5, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_EXCLAMATION_RED, 6, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_PIN_BLUE, 7, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_PIN_RED, 8, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_SMALL_BUTTON_ARROW_DOWN, 9, nWidth); nWidth = XTP_DPI_X(32); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_DOCUMENT, 0, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_EXCLAMATION_BLUE, 1, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_BOOKMARK, 2, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_MAIL, 3, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_MAIL_OPEN, 4, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_MAIL_ARROW_LEFT, 5, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_EXCLAMATION_RED, 6, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_PIN_BLUE, 7, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_PIN_RED, 8, nWidth); imgMgr->SetVectorIcon(type, IDR_SVG_GRID_LARGE_BUTTON_ARROW_DOWN, 9, nWidth); wndGrid.AddColumn(new CXTPGridColumn(COLUMN_TYPE, _T("Type"), 18, FALSE, 0)); CXTPGridColumn* pColumnImportance = wndGrid.AddColumn( new CXTPGridColumn(COLUMN_IMPORTANCE, _T("Importants"), 18, FALSE, 1)); wndGrid.AddColumn(new CXTPGridColumn(COLUMN_ATTACHMENT, _T("Attachments"), 18, FALSE, 7)); CXTPGridColumn* pColumnStatus = wndGrid.AddColumn( new CXTPGridColumn(COLUMN_STATUS, _T("Status"), 100, m_bAutoSizing)); CXTPGridColumn* pColumnSubject = wndGrid.AddColumn( new CXTPGridColumn(COLUMN_SUBJECT, _T("Subject"), 200, m_bAutoSizing)); CXTPGridColumn* pColumnDueDate = wndGrid.AddColumn( new CXTPGridColumn(COLUMN_DUE_DATE, _T("Due Date"), 100, m_bAutoSizing)); CXTPGridColumn* pColumnPercent = wndGrid.AddColumn( new CXTPGridColumn(COLUMN_COMPLETE, _T("% Complete"), 100, m_bAutoSizing)); wndGrid.AddColumn(new CXTPGridColumn(COLUMN_CATEGORIES, _T("Categories"), 80, m_bAutoSizing)); pColumnStatus->GetEditOptions()->AddConstraint(_T("Not Started"), taskStatusNotStarted); pColumnStatus->GetEditOptions()->AddConstraint(_T("In Progress"), taskStatusInProgress); pColumnStatus->GetEditOptions()->AddConstraint(_T("Completed"), taskStatusCompleted); pColumnStatus->GetEditOptions()->AddConstraint(_T("Waiting on someone else"), taskStatusWaiting); pColumnStatus->GetEditOptions()->AddConstraint(_T("Deferred"), taskStatusDeferred); pColumnStatus->GetEditOptions()->m_bConstraintEdit = FALSE; pColumnStatus->GetEditOptions()->m_bAllowEdit = TRUE; pColumnStatus->GetEditOptions()->AddComboButton(); pColumnSubject->GetEditOptions()->m_nMaxLength = 40; pColumnSubject->GetEditOptions()->m_bSelectTextOnEdit = TRUE; pColumnSubject->GetEditOptions()->m_dwEditStyle = ES_MULTILINE; pColumnImportance->GetEditOptions()->AddConstraint(_T("Low"), taskImportanceLow); pColumnImportance->GetEditOptions()->AddConstraint(_T("Normal"), taskImportanceNormal); pColumnImportance->GetEditOptions()->AddConstraint(_T("High"), taskImportanceHigh); pColumnImportance->GetEditOptions()->m_bAllowEdit = FALSE; pColumnImportance->GetEditOptions()->AddComboButton(); pColumnDueDate->GetEditOptions()->AddComboButton(); pColumnPercent->GetEditOptions()->AddSpinButton(TRUE); COleDateTime dtNone; COleDateTime dtNow = COleDateTime::GetCurrentTime(); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceNormal, TRUE, taskStatusNotStarted, _T("Support Email: Docking Pane ToggleDocking"), dtNone, 0, _T(""))); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceHigh, TRUE, taskStatusNotStarted, _T("Feature Request: New Event for CommandBars"), dtNow, 0, _T(""))); wndGrid.AddRecord( new CTaskRecord(FALSE, taskImportanceNormal, TRUE, taskStatusInProgress, _T("Support Email: Menus go wrong if another form has topmost setting"), dtNone, 10, _T(""))); wndGrid.AddRecord(new CTaskRecord(FALSE, taskImportanceNormal, TRUE, taskStatusInProgress, _T("Support Email: Update Xtreme Suite from 8.6 to 8.7"), dtNone, 0, _T(""))); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceLow, TRUE, taskStatusInProgress, _T("Support Email: Bug in Tree-View on Label Edit"), dtNone, 0, _T(""))); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceNormal, TRUE, taskStatusInProgress, _T("Support Email: About tooltips"), dtNone, 70, _T(""))); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceHigh, TRUE, taskStatusCompleted, _T("Support Email: Help Taskpanel And ShortcutBar"), dtNow, 100, _T(""))); wndGrid.AddRecord( new CTaskRecord(TRUE, taskImportanceNormal, FALSE, taskStatusCompleted, _T("Support Email: RE: Docking Pane Window Overlapping Issues"), dtNow, 100, _T(""))); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceNormal, FALSE, taskStatusCompleted, _T("Support Email: CXTPPropertyGridItem"), dtNone, 100, _T(""))); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceNormal, TRUE, taskStatusCompleted, _T("Support Email: Toolbar Oddity"), dtNone, 100, _T(""))); wndGrid.AddRecord(new CTaskRecord(TRUE, taskImportanceNormal, TRUE, taskStatusCompleted, _T("Support Email: CXTPTabControl"), dtNone, 100, _T(""))); wndGrid.GetGridHeader()->AllowColumnRemove(FALSE); wndGrid.AllowEdit(TRUE); wndGrid.FocusSubItems(TRUE); wndGrid.Populate(); wndGrid.GetPaintManager()->SetGridStyle(TRUE, xtpGridGridSolid); #if _XTPLIB_VERSION_PREFIX >= 1511 // wndGrid.GetPaintManager()->SetColumnStyle(xtpGridColumnResource); #else // wndGrid.GetPaintManager()->SetColumnStyle(xtpGridColumnOffice2007); #endif wndGrid.GetPaintManager()->m_bShowNonActiveInPlaceButton = TRUE; wndGrid.SetFocus(); return 0; } void CTaskListView::OnGridControlAllowEdit() { GetGridCtrl().AllowEdit(!GetGridCtrl().IsAllowEdit()); } void CTaskListView::OnUpdateGridControlAllowEdit(CCmdUI* pCmdUI) { pCmdUI->SetCheck(GetGridCtrl().IsAllowEdit() ? TRUE : FALSE); } void CTaskListView::OnGridControlEditOnClick() { GetGridCtrl().EditOnClick(!GetGridCtrl().IsEditOnClick()); } void CTaskListView::OnUpdateGridControlEditOnClick(CCmdUI* pCmdUI) { pCmdUI->SetCheck(GetGridCtrl().IsEditOnClick() ? 1 : 0); pCmdUI->Enable(GetGridCtrl().IsAllowEdit()); } void CTaskListView::OnGridControlEditOnDelayClick() { GetGridCtrl().EditOnDelayClick(!GetGridCtrl().IsEditOnDelayClick()); } void CTaskListView::OnUpdateGridControlEditOnDelayClick(CCmdUI* pCmdUI) { pCmdUI->SetCheck(GetGridCtrl().IsEditOnDelayClick() ? 1 : 0); pCmdUI->Enable(GetGridCtrl().IsAllowEdit()); } void CTaskListView::OnGridControlEditOnDoubleClick() { #if _XTPLIB_VERSION_PREFIX >= 1511 GetGridCtrl().EditOnDoubleClick(!GetGridCtrl().IsEditOnDoubleClick()); #endif } void CTaskListView::OnUpdateGridControlEditOnDoubleClick(CCmdUI* pCmdUI) { #if _XTPLIB_VERSION_PREFIX >= 1511 pCmdUI->SetCheck(GetGridCtrl().IsEditOnDoubleClick() ? 1 : 0); pCmdUI->Enable(GetGridCtrl().IsAllowEdit()); #endif } void CTaskListView::OnGridControlFocusSubItems() { GetGridCtrl().FocusSubItems(!GetGridCtrl().IsFocusSubItems()); } void CTaskListView::OnUpdateGridControlFocusSubItems(CCmdUI* pCmdUI) { pCmdUI->SetCheck(GetGridCtrl().IsFocusSubItems() ? 1 : 0); } void CTaskListView::OnUpdateGridControlAutoSizing(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_bAutoSizing ? 1 : 0); } void CTaskListView::OnGridControlAutoSizing() { m_bAutoSizing = !m_bAutoSizing; for (int nColumn = 3; nColumn < GetGridCtrl().GetColumns()->GetCount(); nColumn++) { GetGridCtrl().GetColumns()->GetAt(nColumn)->SetAutoSize(m_bAutoSizing); } GetGridCtrl().GetGridHeader()->SetAutoColumnSizing(m_bAutoSizing); } void CTaskListView::OnAddTask() { CTaskRecord* pRecord = (CTaskRecord*)GetGridCtrl().AddRecord( new CTaskRecord(TRUE, taskImportanceNormal, FALSE, taskStatusNotStarted, _T(""), COleDateTime(), 0, _T(""))); GetGridCtrl().Populate(); CXTPGridRow* pRow = GetGridCtrl().GetRows()->Find(pRecord); if (pRow) { XTP_GRIDRECORDITEM_ARGS itemArgs(&GetGridCtrl(), pRow, GetGridCtrl().GetColumns()->Find(COLUMN_SUBJECT)); GetGridCtrl().EditItem(&itemArgs); } } void CTaskListView::OnGridButtonClick(NMHDR* pNotifyStruct, LRESULT* pResult) { XTP_NM_GRIDINPLACEBUTTON* pItemNotify = (XTP_NM_GRIDINPLACEBUTTON*)pNotifyStruct; _ASSERTE(pItemNotify->pButton); if (!pItemNotify->pButton->pColumn || pItemNotify->pButton->pColumn->GetItemIndex() != COLUMN_DUE_DATE) return; CRect rcRow = pItemNotify->pButton->pRow->GetRect(); CRect rcCol = pItemNotify->pButton->pColumn->GetRect(); CRect rcItem = rcRow; rcItem.left = rcCol.left; rcItem.right = rcCol.right; CXTPGridRecordItemDateTime* pItemDateTime = DYNAMIC_DOWNCAST(CXTPGridRecordItemDateTime, pItemNotify->pItem); if (!pItemDateTime) { _ASSERTE(FALSE); return; } COleDateTime dtDateValue = pItemDateTime->GetValue(); if (dtDateValue.GetStatus() != COleDateTime::valid || dtDateValue == 0) { dtDateValue = COleDateTime::GetCurrentTime(); #if defined(_XTP_INCLUDE_CALENDAR) && !defined(_XTP_EXCLUDE_CALENDAR) dtDateValue = CXTPCalendarUtils::ResetTime(dtDateValue); #endif } CXTPGridControl* pControl = pItemNotify->pButton->pControl; BOOL bResult = -1; // -1 means that XTP DatePicker is not supported in this build. //#define DBG_DATE_PICKERS #ifdef DBG_DATE_PICKERS static int s_nRotator = 0; s_nRotator++; if (s_nRotator % 2 == 0) #endif GetGridCtrl().SetFocus(); bResult = Show_XTPDatePicker(pControl, rcItem, dtDateValue); if (bResult < 0) { bResult = Show_MFCDatePicker(pControl, rcItem, dtDateValue); } if (!bResult) { return; } CString strNewVal = dtDateValue.Format(); // pItemNotify->pButton->pControl->GetInplaceEdit()->SetWindowText(strNewVal); pItemNotify->pItem->OnEditChanged(NULL, strNewVal); // uncomment to end editing after pop-up date picker closed. // pItemNotify->pButton->pControl->EditItem(NULL); pItemNotify->pButton->pControl->RedrawControl(); *pResult = (LRESULT)TRUE; } BOOL CTaskListView::Show_XTPDatePicker(CXTPGridControl* pControl, const CRect& rcItem, COleDateTime& rdtDate) { #if defined(_XTP_INCLUDE_CALENDAR) && !defined(_XTP_EXCLUDE_CALENDAR) CXTPDatePickerControl wndDatePicker; if (!wndDatePicker.GetSelectedDays()) { _ASSERTE(FALSE); return FALSE; } wndDatePicker.SetMaxSelCount(1); wndDatePicker.GetSelectedDays()->Select(rdtDate); wndDatePicker.EnsureVisible(rdtDate); CRect rcSize; if (!wndDatePicker.GetMinReqRect(&rcSize, 1, 1)) { _ASSERTE(FALSE); return FALSE; } rcSize.InflateRect(5, 5); CRect rcPopUp = rcItem; pControl->ClientToScreen(&rcPopUp); rcPopUp.right = rcPopUp.left + rcSize.Width(); rcPopUp.top = rcPopUp.bottom; rcPopUp.bottom = rcPopUp.bottom + rcSize.Height(); BOOL bResult = wndDatePicker.GoModal(rcPopUp, pControl); if (bResult) { int nSelCount = wndDatePicker.GetSelectedDays()->GetSelectedBlocksCount(); if (nSelCount) { rdtDate = (DATE)wndDatePicker.GetSelectedDays()->GetSelectedBlock(0).nDateBegin; } } return bResult; #else return -1; #endif } BOOL CTaskListView::Show_MFCDatePicker(CXTPGridControl* pControl, const CRect& rcItem, COleDateTime& rdtDate) { #if _MSC_VER >= 1200 // MFC 6.0 CMonthCalCtrlEx wndMFCDatePicker; CPoint pt(rcItem.left, rcItem.bottom); pControl->ClientToScreen(&pt); BOOL bResult = wndMFCDatePicker.GoModal(pt, pControl, rdtDate); return bResult; #else return FALSE; #endif }