⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 excerptview.cpp

📁 一个邮件客户端源代码,包括收发邮件,安排日程等很多内容
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}


void CExcerptView::OnTextPreview() 
{
	CListCtrl &list = GetListCtrl();

	for( int i = list.GetItemCount(); i; --i )
	{
		if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
		{
			( (CExcerpt*) list.GetItemData( i-1 ) )->QuickPreviewText();
		}
	}
}


void CExcerptView::OnMouseMove(UINT nFlags, CPoint point) 
{
	BOOL bTipShown = FALSE;
	if( nFlags == 0 )
	{
		CRect rcItem;
		int nCol = -1;
		int nItem = GetItemFromPoint(point, nCol, &rcItem);

		if (nItem>=0)
		{
			CString s = GetListCtrl().GetItemText(nItem, nCol);
			CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
			LOGFONT* pFont = NULL;
			if (pEx && !pEx->WasRead())
				pFont = &m_lfBold;
			m_TitleTip.Show(rcItem, s, 0, 0, pFont);
			bTipShown = TRUE;
		}
	}
	
	if (!bTipShown)
		m_TitleTip.Hide();

	CListViewEx::OnMouseMove(nFlags, point);
}

void CExcerptView::GetItemColors(int nItem, COLORREF& clrText, 
								COLORREF& clrBk, BOOL bSelected)
{
	CListViewEx::GetItemColors(nItem, clrText, clrBk, bSelected);

	CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
	// set color for filtered message
	if (pEx->m_dwFiltered & MFA_COLOR)
	{
		if (!bSelected)
			clrText = pEx->m_Color;
	}
	else if (pEx->m_dwFiltered == MFA_FRIEND && 
		(theApp.m_dwFlags & MMF_COLOR_FRIEND))
	{
		if (!bSelected)
			clrText = theApp.m_clrFriends;
	}
}

void CExcerptView::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	if (!lpDrawItemStruct)
		return;
	int nItem = lpDrawItemStruct->itemID;
	CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
	CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
	// select bold font for unread messages
	if (!m_fntBold.m_hObject)
	{
		CFont* pF = GetFont();
		if (pF)
		{
			pF->GetObject(sizeof(LOGFONT), &m_lfBold);
			m_lfBold.lfWeight = 800;
			m_fntBold.CreateFontIndirect(&m_lfBold);
		}
	}
	CFont* pOldF = NULL;
	if (m_fntBold.m_hObject && pEx && !pEx->WasRead())
	{
		pOldF = pDC->SelectObject(&m_fntBold);
	}

	CListViewEx::DrawItem(lpDrawItemStruct);

	if (pOldF)
		pDC->SelectObject(pOldF);
}


void CExcerptView::DrawSubItem(CDC* pDC, int nItem, int nColumn, CRect& rcLabel, int nJustify, BOOL bSelected)
{
	CListViewEx::DrawSubItem(pDC, nItem, nColumn, rcLabel, nJustify, bSelected);

	if (nColumn != COLUMN_SIZE)
		return;
	
	CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
	if (!pEx || pEx->m_nLoadedSize==0 || rcLabel.Width()<16)
		return;

	if (pEx->m_nLoadedSize<(pEx->m_intSize-2))	// sometimes 2 bytes are not downloaded?
	{
		int nPrc = (pEx->m_nLoadedSize*100)/pEx->m_intSize;
		CRect rcInvert(rcLabel);
		rcInvert.right = rcInvert.left + (rcLabel.Width()*nPrc)/100;
		pDC->InvertRect(rcInvert);
	}
	else
	{
		int nImage = 2;
		if (bSelected)
		{
			if (GetFocus()==this)
				m_imageListSmall.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
			else
				m_imageListSmall.SetBkColor(::GetSysColor(COLOR_INACTIVECAPTIONTEXT));
			nImage = 3;
		}
		else
			m_imageListSmall.SetBkColor(m_clrTextBk);
		m_imageListSmall.Draw(pDC, nImage, rcLabel.TopLeft(), ILD_NORMAL);
	}
}

LRESULT CExcerptView::OnLanguage(WPARAM, LPARAM)
{
	CString strColumn;
	
	int nCols = sizeof(aColTitles)/sizeof(aColTitles[0]);
	for (int i=0; i<nCols; i++)
	{
		LOAD_STRING(strColumn, aColTitles[i]);
		SetColTitle(i, strColumn);
	}
	return 0;
}

void CExcerptView::OnAllRead() 
{
	CListCtrl &list = GetListCtrl();

	for( int i = list.GetItemCount(); i; --i )
	{
		( (CExcerpt*) list.GetItemData( i-1 ) )->MarkAsRead(TRUE);
	}

}

void CExcerptView::OnMarkRead() 
{
	DoMarkRead(TRUE);
}

void CExcerptView::OnMarkNew() 
{
	DoMarkRead(FALSE);
}

void CExcerptView::OnMarkSpam() 
{
	DoMarkRead(TRUE, FALSE);
}

void CExcerptView::OnMarkGood() 
{
	DoMarkRead(FALSE, FALSE);
}

void CExcerptView::DoMarkRead(BOOL bRead, BOOL bWhat) 
{
	CListCtrl &list = GetListCtrl();

	for( int i = list.GetItemCount(); i; --i )
	{
		if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
		{
			if (bWhat)
				( (CExcerpt*) list.GetItemData( i-1 ) )->MarkAsRead(bRead);
			else
				( (CExcerpt*) list.GetItemData( i-1 ) )->MarkAsSpam(bRead);
		}
	}
}
void CExcerptView::OnFilters() 
{
	DFilters dlg((CMagicDoc*)GetDocument());
	dlg.DoModal();
}


void CExcerptView::OnFileApplyfilters() 
{
	CListCtrl &list = GetListCtrl();

	for( int i = list.GetItemCount(); i; --i )
	{
		( (CExcerpt*) list.GetItemData( i-1 ) )->RecheckByFilters();
	}
}

void CExcerptView::OnHeaderEndDrag(LPNMHEADER /*pHeader*/, LRESULT* pResult)
{
	RedrawWindow(NULL, NULL, RDW_INTERNALPAINT | RDW_INVALIDATE);
	*pResult = 0;
}

void CExcerptView::GetSelAddresses(CStringArray& asFrom, int nType)
{
	CListCtrl &list = GetListCtrl();

	for( int i = list.GetItemCount(); i; --i )
	{
		if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
		{
			CString sFull;
			if (nType == IDP_COLUMN_FROM)
			{
				sFull = ( (CExcerpt*) list.GetItemData( i-1 ) )->m_strFrom;
				GetAddressesFrom(sFull, asFrom);
			}
			else if (nType == IDP_COLUMN_TO)
			{
				sFull = ( (CExcerpt*) list.GetItemData( i-1 ) )->m_strToName;
				GetAddressesFrom(sFull, asFrom);
			}
			else if (nType == IDP_COLUMN_SUBJ)
			{
				sFull = ( (CExcerpt*) list.GetItemData( i-1 ) )->m_strSubject;
				asFrom.Add(sFull);
			}
		}
	}
}

void AddItemsToList(CStringArray& asFrom, LPCTSTR sFile, BOOL bDomains)
{
	if (asFrom.GetSize()<=0)
		return;
	CString sPath;
	if (!FindLocalFile(sFile, sPath, TRUE))
		return;
	CStdioFile file;
	if (!file.Open(sPath, CFile::modeWrite|CFile::typeText))
		return;
	file.SeekToEnd();
	CStringArray asAdded;	// to avoid adding copies
	for (int i=0; i<asFrom.GetSize(); i++)
	{
		CString sAdd;
		sAdd = asFrom[i];
		if (bDomains)
		{
			int nAt = sAdd.Find('@');
			if (nAt<0)
				continue;
			sAdd.Format("*%s", asFrom[i].Mid(nAt));
		}
		if (sAdd.IsEmpty())
			continue;
		// may be it's already added
		for (int j=0; j<asAdded.GetSize(); j++)
		{
			if (asAdded[j].CompareNoCase(sAdd) == 0)
			{
				sAdd.Empty();
				break;
			}
		}
		if (sAdd.IsEmpty())
			continue;
		asAdded.Add(sAdd);
		if (asAdded.GetSize()==1)
			file.WriteString("\n");
		file.WriteString(sAdd);
		file.WriteString("\n");
	}
	file.Close();
	ShellExecute(NULL, "Open", sPath, NULL, NULL, SW_SHOW);
}

void CExcerptView::OnAddFriend() 
{
	CStringArray asFrom;
	GetSelAddresses(asFrom);
	AddItemsToList(asFrom, FRIENDS_FILE, FALSE);
}

void CExcerptView::OnDomainAdd() 
{
	CStringArray asFrom;
	GetSelAddresses(asFrom);
	AddItemsToList(asFrom, FRIENDS_FILE, TRUE);
}

void CExcerptView::OnListCommand(UINT nCmd)
{
	int nType = -1;
	int nFile = -1;
	if (nCmd<ID_LIST_MIN + 50)	// To
	{
		nType = IDP_COLUMN_TO;
		nFile = nCmd - ID_LIST_MIN - 1;
	}
	else if (nCmd<ID_LIST_MIN + 100)	// From
	{
		nType = IDP_COLUMN_FROM;
		nFile = nCmd - ID_LIST_MIN - 50;
	}
	else if (nCmd<ID_LIST_MIN + 150)	// Subj
	{
		nType = IDP_COLUMN_SUBJ;
		nFile = nCmd - ID_LIST_MIN - 100;
	}
	if (nType<0 || nFile<0 || nFile >= ((CMagicFrame*)AfxGetMainWnd())->m_asFilterLists.GetSize())
		return;

	AddItemToList(nType, ((CMagicFrame*)AfxGetMainWnd())->m_asFilterLists[nFile]);
}

void CExcerptView::AddItemToList(int nType, CString& sList)
{
	CStringArray asFields;

	GetSelAddresses(asFields, nType);
	AddItemsToList(asFields, sList, FALSE);
}

void CExcerptView::OnKillSpam() 
{
	// delete all spam messages
	CMap<CMailbox*, CMailbox*, int, int> map;
	CListCtrl &list = GetListCtrl();
	for( int i = list.GetItemCount(); i; --i )
	{				   
		CExcerpt &xrpt = *( (CExcerpt*) list.GetItemData( i-1 ) );
		if (xrpt.m_dwFiltered & MFA_SPAM)
		{
			xrpt.m_bitRemoveFromServer = 1;
			xrpt.Change( COLUMN_MBOX );
			map.SetAt(xrpt.m_pMailbox, 1);
		}
	}
	POSITION pos = map.GetStartPosition();
	while( pos != NULL )
	{
		CMailbox* pBox;
		int n;
		map.GetNextAssoc( pos, pBox, n);
		pBox->Check();
	}
}

void CExcerptView::OnUpdateKillSpam(CCmdUI* ) 
{
}

BOOL CExcerptView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	m_TitleTip.Hide();
	return CListViewEx::OnMouseWheel(nFlags, zDelta, pt);
}

void CExcerptView::OnToggleSpam() 
{
	UINT nCmd = ID_MARK_NOSPAM;
	if (!IsSpamSelection())
		nCmd = ID_MARK_SPAM;
	PostMessage(WM_COMMAND, nCmd);
}

BOOL CExcerptView::IsSpamSelection()
{
	CListCtrl &list = GetListCtrl();
	for( int i = list.GetItemCount(); i; --i )
	{
		if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
		{
			if (( (CExcerpt*) list.GetItemData( i-1 ) )->m_dwFiltered & MFA_SPAM)
			{
				return TRUE;
			}
		}
	}
	return FALSE;
}
void CExcerptView::OnUpdateToggleSpam(CCmdUI* pCmdUI) 
{
	CListCtrl &list = GetListCtrl();
	int nMax = list.GetItemCount();
	if (nMax == 0)
	{
		pCmdUI->SetCheck(FALSE);
		pCmdUI->Enable(FALSE);
		return;
	}
	pCmdUI->Enable(TRUE);
	pCmdUI->SetCheck(IsSpamSelection());
}

void CExcerptView::OnSelRevert() 
{
	CListCtrl &list = GetListCtrl();
	for( int i = list.GetItemCount()-1; i>=0; --i )
	{
		if( LVNI_SELECTED == list.GetItemState( i, LVNI_SELECTED ) )
		{
			list.SetItemState(i, 0, LVNI_SELECTED );
		}
		else
			list.SetItemState(i, LVNI_SELECTED , LVNI_SELECTED );
	}
}

void CExcerptView::OnSelNotFriends() 
{
	CListCtrl &list = GetListCtrl();
	for( int i = 0; i < list.GetItemCount(); ++i )
	{
		CExcerpt &xrpt = *(CExcerpt*) list.GetItemData(i);
		if( xrpt.m_dwFiltered == MFA_FRIEND) 
			list.SetItemState(i, 0, LVNI_SELECTED );
		else
			list.SetItemState(i, LVNI_SELECTED, LVNI_SELECTED );
	}
}

⌨️ 快捷键说明

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