// MessageRecord.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 "MessageRecord.h" #include "GridSampleView.h" #ifdef _DEBUG # undef THIS_FILE static char THIS_FILE[] = __FILE__; # define new DEBUG_NEW #endif IMPLEMENT_SERIAL(CMessageRecord, CXTPGridRecord, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT) IMPLEMENT_SERIAL(CMessageRecordItemPrice, CXTPGridRecordItemNumber, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT) IMPLEMENT_SERIAL(CMessageRecordItemCheck, CXTPGridRecordItemText, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT) IMPLEMENT_SERIAL(CMessageRecordItemImportance, CXTPGridRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT) IMPLEMENT_SERIAL(CMessageRecordItemAttachment, CXTPGridRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT) IMPLEMENT_SERIAL(CMessageRecordItemIcon, CXTPGridRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT) IMPLEMENT_SERIAL(CMessageRecordItemDate, CXTPGridRecordItemDateTime, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT) ////////////////////////////////////////////////////////////////////////// // CMessageRecordItemPrice CMessageRecordItemPrice::CMessageRecordItemPrice(double dValue) : CXTPGridRecordItemNumber(dValue, _T("$ %.2f")) { } CString CMessageRecordItemPrice::GetGroupCaption(CXTPGridColumn* /*pColumn*/) { if (m_dValue > 20) return _T("Record Price > 20"); if (m_dValue > 5) return _T("Record Price 5 - 20"); return _T("Record Price < 5"); } int CMessageRecordItemPrice::CompareGroupCaption(CXTPGridColumn* pColumn, CXTPGridRecordItem* pItem) { return GetGroupCaption(pColumn).Compare(pItem->GetGroupCaption(pColumn)); } ////////////////////////////////////////////////////////////////////////// // CMessageRecordItemCheck CMessageRecordItemCheck::CMessageRecordItemCheck(BOOL bCheck) { HasCheckbox(TRUE); SetChecked(bCheck); } int CMessageRecordItemCheck::GetGroupCaptionID(CXTPGridColumn* /*pColumn*/) { return IsChecked() ? IDS_GROUP_CHECKED_TRUE : IDS_GROUP_CHECKED_FALSE; } int CMessageRecordItemCheck::Compare(CXTPGridColumn* /*pColumn*/, CXTPGridRecordItem* pItem) { return int(IsChecked()) - int(pItem->IsChecked()); } ////////////////////////////////////////////////////////////////////////// // CMessageRecordItemImportance CMessageRecordItemImportance::CMessageRecordItemImportance(MESSAGE_IMPORTANCE eImportance) : m_eImportance(eImportance) { SetIconIndex(eImportance == msgImportanceHigh ? 6 : eImportance == msgImportanceLow ? 9 : -1); SetGroupPriority(m_eImportance == msgImportanceHigh ? IDS_GROUP_IMPOPRTANCE_HIGH : m_eImportance == msgImportanceLow ? IDS_GROUP_IMPOPRTANCE_LOW : IDS_GROUP_IMPOPRTANCE_NORMAL); SetSortPriority(GetGroupPriority()); CString strToolTip; strToolTip.LoadString(GetGroupPriority()); SetTooltip(strToolTip); } void CMessageRecordItemImportance::DoPropExchange(CXTPPropExchange* pPX) { CXTPGridRecordItem::DoPropExchange(pPX); PX_Enum(pPX, _T("Importance"), m_eImportance, msgImportanceNormal); } ////////////////////////////////////////////////////////////////////////// // CMessageRecordItemAttachment CMessageRecordItemAttachment::CMessageRecordItemAttachment(BOOL bHasAttachment) : m_bHasAttachment(bHasAttachment) { SetIconIndex(bHasAttachment ? 8 : -1); SetGroupPriority(m_bHasAttachment ? IDS_GROUP_ATTACHMENTS_TRUE : IDS_GROUP_ATTACHMENTS_FALSE); SetSortPriority(GetGroupPriority()); } void CMessageRecordItemAttachment::DoPropExchange(CXTPPropExchange* pPX) { CXTPGridRecordItem::DoPropExchange(pPX); PX_Bool(pPX, _T("HasAttachment"), m_bHasAttachment); } ////////////////////////////////////////////////////////////////////////// // CMessageRecordItemIcon CMessageRecordItemIcon::CMessageRecordItemIcon(BOOL bRead) : m_bRead(bRead) { UpdateReadIcon(); } void CMessageRecordItemIcon::UpdateReadIcon() { SetIconIndex(m_bRead ? 4 : 3); } int CMessageRecordItemIcon::Compare(CXTPGridColumn* /*pColumn*/, CXTPGridRecordItem* pItem) { return int(m_bRead) - int(((CMessageRecordItemIcon*)pItem)->m_bRead); } CString CMessageRecordItemIcon::GetGroupCaption(CXTPGridColumn* /*pColumn*/) { if (m_bRead) return _T("Message status: Read"); else return _T("Message status: Unread"); } int CMessageRecordItemIcon::CompareGroupCaption(CXTPGridColumn* pColumn, CXTPGridRecordItem* pItem) { return GetGroupCaption(pColumn).Compare(pItem->GetGroupCaption(pColumn)); } void CMessageRecordItemIcon::DoPropExchange(CXTPPropExchange* pPX) { CXTPGridRecordItem::DoPropExchange(pPX); PX_Bool(pPX, _T("Read"), m_bRead); } ////////////////////////////////////////////////////////////////////////// // CMessageRecordItemSent CMessageRecordItemDate::CMessageRecordItemDate(COleDateTime odtValue) : CXTPGridRecordItemDateTime(odtValue) { } int CMessageRecordItemDate::GetGroupCaptionID(CXTPGridColumn* /*pColumn*/) { COleDateTime odtNow(COleDateTime::GetCurrentTime()); if (m_odtValue.GetYear() < odtNow.GetYear()) return IDS_GROUP_DATE_OLDER; if (m_odtValue.GetMonth() < odtNow.GetMonth()) return IDS_GROUP_DATE_THISYEAR; if (m_odtValue.GetDay() < odtNow.GetDay()) return IDS_GROUP_DATE_THISMONTH; if (m_odtValue.m_dt <= odtNow.m_dt) return IDS_GROUP_DATE_TODAY; return -1; } ////////////////////////////////////////////////////////////////////// // CMessageRecord class ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMessageRecord::CMessageRecord() { m_pItemIcon = NULL; m_pItemReceived = NULL; m_pItemSize = NULL; CreateItems(); } CMessageRecord::CMessageRecord(MESSAGE_IMPORTANCE eImportance, BOOL bChecked, int nAttachmentBitmap, CString strFromName, CString strSubject, COleDateTime odtReceived, int nMessageSize, BOOL bRead, double dPrice, COleDateTime odtSent, COleDateTime odtCreated, CString strConversation, CString strContact, CString strMessage, CString strCC, CString strCategories, CString strAutoforward, CString strDoNotAutoarch, CString strDueBy, CString strPreview) { AddItem(new CMessageRecordItemImportance(eImportance)); m_pItemIcon = new CMessageRecordItemIcon(bRead); AddItem(m_pItemIcon); AddItem(new CMessageRecordItemAttachment(nAttachmentBitmap)); m_pItemFrom = new CXTPGridRecordItemText(strFromName); AddItem(m_pItemFrom); m_pItemSubject = new CXTPGridRecordItemText(strSubject); AddItem(m_pItemSubject); m_pItemReceived = new CMessageRecordItemDate(odtReceived); AddItem(m_pItemReceived); m_pItemSize = new CXTPGridRecordItemNumber(nMessageSize); AddItem(m_pItemSize); CMessageRecordItemCheck* pItemCheck = new CMessageRecordItemCheck(bChecked); #if _XTPLIB_VERSION_PREFIX >= 1511 pItemCheck->SetCanEditCheckboxItem(TRUE); #endif AddItem(pItemCheck); AddItem(new CMessageRecordItemPrice(dPrice)); AddItem(new CMessageRecordItemDate(odtCreated)); AddItem(new CMessageRecordItemDate(odtSent)); AddItem(new CXTPGridRecordItemText(strConversation)); AddItem(new CXTPGridRecordItemText(strContact)); AddItem(new CXTPGridRecordItemText(strMessage)); AddItem(new CXTPGridRecordItemText(strCC)); AddItem(new CXTPGridRecordItemText(strCategories)); AddItem(new CXTPGridRecordItemText(strAutoforward)); AddItem(new CXTPGridRecordItemText(strDoNotAutoarch)); AddItem(new CXTPGridRecordItemText(strDueBy)); SetPreviewItem(new CXTPGridRecordItemPreview(strPreview)); } void CMessageRecord::CreateItems() { // Initialize record items with empty values COleDateTime dtNow(COleDateTime::GetCurrentTime()); // 0 AddItem(new CMessageRecordItemImportance(msgImportanceNormal)); // 1 *** m_pItemIcon = (CMessageRecordItemIcon*)AddItem(new CMessageRecordItemIcon(TRUE)); // 2 AddItem(new CMessageRecordItemAttachment(0)); // 3 AddItem(new CXTPGridRecordItemText(_T(""))); // 4 AddItem(new CXTPGridRecordItemText(_T(""))); // 5 *** m_pItemReceived = (CMessageRecordItemDate*)AddItem(new CMessageRecordItemDate(dtNow)); // 6 *** m_pItemSize = AddItem(new CXTPGridRecordItemNumber(0)); AddItem(new CMessageRecordItemCheck(FALSE)); AddItem(new CMessageRecordItemPrice(0)); AddItem(new CMessageRecordItemDate(dtNow)); AddItem(new CMessageRecordItemDate(dtNow)); AddItem(new CXTPGridRecordItemText(_T(""))); AddItem(new CXTPGridRecordItemText(_T(""))); AddItem(new CXTPGridRecordItemText(_T(""))); AddItem(new CXTPGridRecordItemText(_T(""))); AddItem(new CXTPGridRecordItemText(_T(""))); AddItem(new CXTPGridRecordItemText(_T(""))); AddItem(new CXTPGridRecordItemText(_T(""))); AddItem(new CXTPGridRecordItemText(_T(""))); SetPreviewItem(new CXTPGridRecordItemPreview(_T(""))); } CMessageRecord::~CMessageRecord() { } BOOL CMessageRecord::SetRead(BOOL bRead) { BOOL bUpdate = FALSE; if (m_pItemIcon->m_bRead != bRead) { bUpdate = TRUE; m_pItemIcon->m_bRead = bRead; m_pItemIcon->UpdateReadIcon(); } return bUpdate; } void CMessageRecord::GetItemMetrics(XTP_GRIDRECORDITEM_DRAWARGS* pDrawArgs, XTP_GRIDRECORDITEM_METRICS* pItemMetrics) { if (m_pItemIcon && !m_pItemIcon->m_bRead && !pDrawArgs->pItem->IsPreviewItem()) pItemMetrics->pFont = &pDrawArgs->pControl->GetPaintManager()->m_xtpFontBoldText; CGridSampleView* pView = DYNAMIC_DOWNCAST(CGridSampleView, pDrawArgs->pControl->GetParent()); // If automatic formatting option is enabled, sample code below will be executed. // There you can see an example of "late" customization for colors, fonts, etc. if (pView && pView->m_bAutomaticFormating) { if ((pDrawArgs->pRow->GetIndex() % 2) && !pDrawArgs->pItem->IsPreviewItem()) { pItemMetrics->clrBackground = RGB(245, 245, 245); } if (m_pItemReceived->GetGroupCaptionID(NULL) <= IDS_GROUP_DATE_THISYEAR && !pDrawArgs->pItem->IsPreviewItem()) { 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->pFont = &m_fontStriked; } if (pDrawArgs->pItem->GetCaption(pDrawArgs->pColumn).Find(_T("Undeliverable")) >= 0) { pItemMetrics->clrForeground = RGB(0xFF, 0, 0); } } } void CMessageRecord::DoPropExchange(CXTPPropExchange* pPX) { CXTPGridRecord::DoPropExchange(pPX); if (pPX->IsLoading()) { // 1 - m_pItemIcon = (CMessageRecordItemIcon*)AddItem(new CMessageRecordItemIcon(TRUE)); ASSERT_KINDOF(CMessageRecordItemIcon, GetItem(1)); m_pItemIcon = DYNAMIC_DOWNCAST(CMessageRecordItemIcon, GetItem(1)); _ASSERTE(m_pItemIcon); // 5 - m_pItemReceived = (CMessageRecordItemDate*)AddItem(new // CMessageRecordItemDate(dtNow)); ASSERT_KINDOF(CMessageRecordItemDate, GetItem(5)); m_pItemReceived = DYNAMIC_DOWNCAST(CMessageRecordItemDate, GetItem(5)); _ASSERTE(m_pItemReceived); // 6 - m_pItemSize = AddItem(new CXTPGridRecordItemNumber(0)); ASSERT_KINDOF(CXTPGridRecordItemNumber, GetItem(6)); m_pItemSize = DYNAMIC_DOWNCAST(CXTPGridRecordItemNumber, GetItem(6)); _ASSERTE(m_pItemSize); } }