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

📄 excerptview.cpp

📁 一个邮件客户端源代码,包括收发邮件,安排日程等很多内容
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Copyright (C) 1997-2002 Valeriy Ovechkin
// 
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// ExcerptView.cpp : implementation file
//
/////////////////////////////////////////////////////////////////////
//
//   File : ExcerptView.cpp
//   Description : message list view
//
//   Modification history ( date, name, description ) : 
//		1.	15.12.2002	Igor Green, mmm3@grigsoft.com
//			Icon for loaded message, OnLoad, OnQuickText
//		2.	17.12.2002	Igor Green, mmm3@grigsoft.com
//			Added partial text preview
//
//HISTORY_ENTRY_END:2!17.12.2002
/////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Magic.h"
#include "Excerpt.h"
#include "Mailbox.h"
#include "MagicDoc.h"
#include "HeaderPage.h"
#include "MailboxView.h"
#include "ExcerptView.h"
#include "MagicFrame.h"
#include "RawHead.h"
#include "getwinver.h"
#include "dfilters.h"
#include "tools.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CExcerptView

#include <locale.h>

IMPLEMENT_DYNCREATE(CExcerptView, CListViewEx)

CExcerptView::CExcerptView()
:	m_bitSortEnabled(1),
	m_bitSortRequired(0)
{
	//
	// change the C library locale to user's locale for displaying dates
	//
	CString strLocaleString;
	char szBuffer[1024] = {0};

	VERIFY( GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, szBuffer, sizeof( szBuffer ) ) );
	strLocaleString = szBuffer;

	strLocaleString += "_";

	VERIFY( GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME, szBuffer, sizeof( szBuffer ) ) );
	strLocaleString += szBuffer;

	setlocale( LC_ALL, strLocaleString );
}

CExcerptView::~CExcerptView()
{
}

BEGIN_MESSAGE_MAP(CExcerptView, CListViewEx)
	//{{AFX_MSG_MAP(CExcerptView)
	ON_UPDATE_COMMAND_UI( ID_VIEW_REPORT, OnUpdateViewReport )
	ON_UPDATE_COMMAND_UI( ID_VIEW_SMALLICON, OnUpdateViewDisable )
	ON_COMMAND( ID_VIEW_REPORT, OnViewReport )
	ON_COMMAND( ID_EDIT_SELECT_ALL, OnEditSelectAll )
	ON_UPDATE_COMMAND_UI( ID_EDIT_SELECT_ALL, OnUpdateEditSelectAll )
	ON_NOTIFY_REFLECT( LVN_COLUMNCLICK, OnColumnclick )
	ON_NOTIFY_REFLECT( NM_RCLICK, OnRclick )
	ON_COMMAND( ID_EDIT_PROPERTIES, OnEditProperties )
	ON_UPDATE_COMMAND_UI( ID_QUICK_VIEW, OnUpdateIfSelectedCount )
	ON_COMMAND( ID_VIEW_REFRESH, OnViewRefresh )
	ON_UPDATE_COMMAND_UI( ID_VIEW_REFRESH, OnUpdateViewRefresh )
	ON_COMMAND( ID_QUICK_DELETE, OnQuickDelete )
	ON_COMMAND( ID_QUICK_VIEW, OnQuickView )
	ON_COMMAND( ID_QUICK_REPLY, OnQuickReply )
	ON_NOTIFY_REFLECT( NM_DBLCLK, OnDblclk )
	ON_WM_DESTROY()
	ON_COMMAND(ID_STOP_CHECKING, OnStopChecking)
	ON_UPDATE_COMMAND_UI(ID_STOP_CHECKING, OnUpdateStopChecking)
	ON_NOTIFY_REFLECT(LVN_KEYDOWN, OnKeydown)
	ON_COMMAND(ID_LOAD, OnLoad)
	ON_COMMAND(ID_QUICKTEXT, OnQuicktext)
	ON_COMMAND(ID_TEXT_PREVIEW, OnTextPreview)
	ON_WM_MOUSEMOVE()
	ON_COMMAND(IDC_ALL_READ, OnAllRead)
	ON_COMMAND(ID_FILE_APPLYFILTERS, OnFileApplyfilters)
	ON_COMMAND(ID_ADD_FRIEND, OnAddFriend)
	ON_COMMAND(ID_DOMAIN_ADD, OnDomainAdd)
	ON_COMMAND(ID_KILL_SPAM, OnKillSpam)
	ON_UPDATE_COMMAND_UI(ID_KILL_SPAM, OnUpdateKillSpam)
	ON_WM_MOUSEWHEEL()
	ON_COMMAND(ID_TOGGLE_SPAM, OnToggleSpam)
	ON_UPDATE_COMMAND_UI(ID_TOGGLE_SPAM, OnUpdateToggleSpam)
	ON_COMMAND( ID_EDIT_DELETE, OnQuickDelete )
	ON_UPDATE_COMMAND_UI( ID_VIEW_LIST, OnUpdateViewDisable )
	ON_UPDATE_COMMAND_UI( ID_VIEW_ICON, OnUpdateViewDisable )
	ON_UPDATE_COMMAND_UI( ID_QUICK_REPLY, OnUpdateIfSelectedCount )
	ON_UPDATE_COMMAND_UI( ID_EDIT_PROPERTIES, OnUpdateIfSelectedCount )
	ON_UPDATE_COMMAND_UI( ID_QUICK_DELETE, OnUpdateIfSelectedCount )
	ON_UPDATE_COMMAND_UI( ID_EDIT_DELETE, OnUpdateIfSelectedCount )
	ON_UPDATE_COMMAND_UI( ID_LOAD, OnUpdateIfSelectedCount)
	ON_UPDATE_COMMAND_UI( ID_QUICKTEXT, OnUpdateIfSelectedCount)
	ON_UPDATE_COMMAND_UI( ID_TEXT_PREVIEW, OnUpdateIfSelectedCount)
	ON_COMMAND(ID_SEL_REVERT, OnSelRevert)
	ON_COMMAND(ID_SEL_NOT_FRIENDS, OnSelNotFriends)
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI( ID_INDICATOR_OBJECTS, OnUpdateIndicatorObjects )
	ON_UPDATE_COMMAND_UI( ID_INDICATOR_CONTENTS, OnUpdateIndicatorContents )
	ON_UPDATE_COMMAND_UI( IDC_MAIL_READ, OnUpdateIfSelectedCount)
	ON_UPDATE_COMMAND_UI( IDC_MAIL_UNREAD, OnUpdateIfSelectedCount)
	ON_COMMAND(IDC_MAIL_READ, OnMarkRead)
	ON_COMMAND(IDC_MAIL_UNREAD, OnMarkNew)
	ON_COMMAND(ID_MARK_SPAM, OnMarkSpam)
	ON_COMMAND(ID_MARK_NOSPAM, OnMarkGood)
	ON_MESSAGE(VM_LANGUAGE, OnLanguage)
	ON_NOTIFY(HDN_ENDDRAG, 0, OnHeaderEndDrag)
	ON_COMMAND_RANGE(ID_LIST_MIN, ID_LIST_MAX, OnListCommand)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExcerptView diagnostics

#ifdef _DEBUG
void CExcerptView::AssertValid() const
{
	CListViewEx::AssertValid();
}

void CExcerptView::Dump(CDumpContext& dc) const
{
	CListViewEx::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CExcerptView message handlers

void CExcerptView::OnUpdateViewReport(CCmdUI* pCmdUI) 
{
	pCmdUI->SetRadio( true );
}

void CExcerptView::OnUpdateViewDisable(CCmdUI* pCmdUI) 
{
	pCmdUI->SetRadio( false );
	pCmdUI->Enable( false );
}

void CExcerptView::OnViewReport() 
{
//	ModifyStyle( LVS_TYPEMASK, LVS_REPORT );
//	theApp.intEVMode = LVS_REPORT;
}

enum  MessageImages
{
	MI_NEW_MAIL,	MI_NEW_MAIL_HIGH,
	MI_LOADED,		MI_LOADED2,
	MI_HIGH,	
	MI_DELETED,
	MI_TOLOAD,

	MI_ATTACH,
};

UINT aColTitles[]=
{
	IDP_COLUMN_MBOX, IDP_COLUMN_FROM, IDP_COLUMN_TO, 
	IDP_COLUMN_SUBJ, IDP_COLUMN_DATE, IDP_COLUMN_SIZE,
};
BOOL CExcerptView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	if( !CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext) ) return FALSE;

	VERIFY( ModifyStyle( 
		LVS_ICON | LVS_SMALLICON | LVS_LIST | LVS_REPORT, 
		LVS_REPORT | LVS_ALIGNLEFT | LVS_ALIGNTOP | LVS_SHOWSELALWAYS ) );

	ASSERT( &GetListCtrl() );
	CListCtrl &list = GetListCtrl();

	list.SetExtendedStyle(LVS_EX_HEADERDRAGDROP);

	CString strColumn;
	LOAD_STRING(strColumn, IDP_COLUMN_MBOX ); list.InsertColumn( 0, strColumn, LVCFMT_LEFT, theApp.intECMBoxWidth, 0 );
	LOAD_STRING(strColumn, IDP_COLUMN_FROM ); list.InsertColumn( 1, strColumn, LVCFMT_LEFT, theApp.intECFromWidth, 1 );
	LOAD_STRING(strColumn, IDP_COLUMN_TO ); list.InsertColumn( 2, strColumn, LVCFMT_LEFT, theApp.intECToWidth, 1 );
	LOAD_STRING(strColumn, IDP_COLUMN_SUBJ ); list.InsertColumn( 3, strColumn, LVCFMT_LEFT, theApp.intECSubjWidth, 2 );
	LOAD_STRING(strColumn, IDP_COLUMN_DATE ); list.InsertColumn( 4, strColumn, LVCFMT_LEFT, theApp.intECDateWidth, 3 );
	LOAD_STRING(strColumn, IDP_COLUMN_SIZE ); list.InsertColumn( 5, strColumn, LVCFMT_RIGHT, theApp.intECSizeWidth, 4 );

	int *anColumns = new int[list.GetHeaderCtrl()->GetItemCount()];
	anColumns[theApp.intECMBoxPos] = 0;
	anColumns[theApp.intECFromPos] = 1;
	anColumns[theApp.intECToPos] = 2;
	anColumns[theApp.intECSubjPos] = 3;
	anColumns[theApp.intECDatePos] = 4;
	anColumns[theApp.intECSizePos] = 5;
	list.GetHeaderCtrl()->SetOrderArray(list.GetHeaderCtrl()->GetItemCount(), anColumns);
	delete[] anColumns;

	SetFullRowSel( TRUE );

	VERIFY( m_imageListSmall.Create( 16, 16, ILC_COLOR24 | ILC_MASK, 3, 3 ) );
	CBitmap bmp;
	bmp.LoadBitmap(IDB_MM_ICONS);
	m_imageListSmall.Add(&bmp, RGB(255, 0, 255));

	VERIFY( m_imageListSmall.SetOverlayImage( MI_ATTACH, 1 ) );
	
	list.SetImageList( &m_imageListSmall, LVSIL_SMALL );

	m_ColSortGUI.Init(IDB_UP, IDB_DOWN);
	m_ColSortGUI.SetSortMark(list, theApp.intEVSortColumn, theApp.intEVSortAscend);

	m_TitleTip.Create(this);

	return TRUE;
}

void CExcerptView::GetColumnData()
{
	CListCtrl &list = GetListCtrl();
	LVCOLUMN lvc;
	lvc.mask=LVCF_WIDTH | LVCF_ORDER;
	list.GetColumn(COLUMN_MBOX, &lvc);
	theApp.intECMBoxWidth = lvc.cx;
	theApp.intECMBoxPos = lvc.iOrder;
	list.GetColumn(COLUMN_FROM, &lvc);
	theApp.intECFromWidth = lvc.cx;
	theApp.intECFromPos =  lvc.iOrder;
	list.GetColumn(COLUMN_TO, &lvc);
	theApp.intECToWidth = lvc.cx;
	theApp.intECToPos =  lvc.iOrder;
	list.GetColumn(COLUMN_SUBJ, &lvc);
	theApp.intECSubjWidth = lvc.cx;
	theApp.intECSubjPos =  lvc.iOrder;
	list.GetColumn(COLUMN_DATE, &lvc);
	theApp.intECDateWidth = lvc.cx;
	theApp.intECDatePos =  lvc.iOrder;
	list.GetColumn(COLUMN_SIZE, &lvc);
	theApp.intECSizeWidth = lvc.cx;
	theApp.intECSizePos =  lvc.iOrder;
}

void CExcerptView::OnDestroy() 
{
	GetColumnData();

	CListViewEx::OnDestroy();
}

void CExcerptView::OnEditSelectAll() 
{
	CListCtrl &list = GetListCtrl();
	for( int i = list.GetItemCount(); i; --i ) list.SetItemState( i-1, LVIS_SELECTED, LVIS_SELECTED );
}

void CExcerptView::OnUpdateEditSelectAll(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable( GetListCtrl().GetItemCount() );
}

void CExcerptView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	if( theApp.intEVSortColumn == pNMListView->iSubItem )
	{
		theApp.intEVSortAscend = !theApp.intEVSortAscend;
	}
	theApp.intEVSortColumn = pNMListView->iSubItem; 


	SortItems();

	m_ColSortGUI.SetSortMark(GetListCtrl(), theApp.intEVSortColumn, theApp.intEVSortAscend);

	*pResult = 0;
}

void CExcerptView::EnableSort( BOOL bEnable )
{
	m_bitSortEnabled = bEnable;

	if( m_bitSortEnabled && m_bitSortRequired ) SortItems();

	SendMessage( WM_SETREDRAW, m_bitSortEnabled ? true : false, 0 );
}

void CExcerptView::SortItems()
{
	if( !m_bitSortEnabled ) { m_bitSortRequired = 1; return; }

	theApp.DoWaitCursor(1);
	m_bitSortRequired = 0;
	GetListCtrl().SortItems( &CompareSubItems, 0 );
	theApp.DoWaitCursor(-1);
}

int CALLBACK CExcerptView::CompareSubItems( LPARAM lp0, LPARAM lp1, LPARAM /*lp*/ )
{
	ASSERT( lp0 && lp1 );

	CExcerpt &expt0 = *(CExcerpt*) lp0;
	CExcerpt &expt1 = *(CExcerpt*) lp1;

	int intRes = -1;
	switch( theApp.intEVSortColumn )
	{
		case COLUMN_MBOX:
			intRes = expt0.m_pMailbox->m_strAlias.CompareNoCase( expt1.m_pMailbox->m_strAlias );
			break;

		case COLUMN_FROM:
			intRes = expt0.m_strFromName.CompareNoCase( expt1.m_strFromName );
			break;

		case COLUMN_TO:
			intRes = expt0.m_strToName.CompareNoCase( expt1.m_strToName );
			break;

		case COLUMN_SUBJ:
			intRes = expt0.m_strSubject.CompareNoCase( expt1.m_strSubject );
			break;

		case COLUMN_DATE:
			if( expt0.m_tmDate == expt1.m_tmDate ) intRes = 0;
			else if( expt0.m_tmDate < expt1.m_tmDate ) intRes = -1;
			else intRes = 1;
			break;

		case COLUMN_SIZE:
			if( expt0.m_intSize == expt1.m_intSize ) intRes = 0;
			else if( expt0.m_intSize < expt1.m_intSize ) intRes = -1;
			else intRes = 1;
			break;
	}

	return theApp.intEVSortAscend ? intRes : -intRes;
}  
			
void CExcerptView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	UNUSED_ALWAYS(pSender);
	if( HINT_DISABLE_SORT == lHint ) EnableSort( FALSE );
	else if( HINT_ENABLE_SORT == lHint ) EnableSort();

	if( !pHint ) return;
	CListCtrl &list = GetListCtrl();

	if( pHint->IsKindOf( RUNTIME_CLASS( CExcerpt ) ) )
	{
		CExcerpt &xrpt = *(CExcerpt*) pHint;
		BOOL bInserted = FALSE;

		LV_FINDINFO findInfo = { LVFI_PARAM, 0, (LPARAM) &xrpt };
		int intIndex = list.FindItem( &findInfo );
		if( -1 == intIndex )
		{
			if( xrpt.m_pMailbox->m_bitSelected )
			{
				intIndex = list.InsertItem( 0, xrpt.m_pMailbox->m_strAlias, -1 );
				ASSERT( -1 != intIndex );
				VERIFY( LB_ERR != list.SetItemData( 0, (DWORD) &xrpt ) );
				bInserted = TRUE;
			}
			else return;
		}
		
		if( !xrpt.m_pMailbox->m_bitSelected || xrpt.m_bitDeleted )
		{
			VERIFY( list.DeleteItem( intIndex ) );
			return;
		}

		if( bInserted || xrpt.IsChanged( COLUMN_FROM ) )
		{
			VERIFY( list.SetItemText( intIndex, COLUMN_FROM, xrpt.m_strFromName ) );
		}

		if( bInserted || xrpt.IsChanged( COLUMN_TO ) )
		{
			VERIFY( list.SetItemText( intIndex, COLUMN_TO , xrpt.m_strToName ) );
		}

		/*
		if( bInserted || xrpt.IsChanged( COLUMN_MBOX) )
		{
			if (xrpt.m_pMailbox->UpdateUnreadStatus())
					xrpt.m_pMailbox->Change( COLUMN_ALIAS );	// need redraw
		}
		*/

		if( bInserted || xrpt.IsChanged( COLUMN_SUBJ ) )
		{
			CString sSubj;
			if (xrpt.m_dwFiltered & MFA_SPAM)
				sSubj = "[SPAM] " + xrpt.m_strSubject;
			else
				sSubj = xrpt.m_strSubject;
			VERIFY( list.SetItemText( intIndex, COLUMN_SUBJ, sSubj ) );
		}

		if( bInserted || xrpt.IsChanged( COLUMN_DATE ) )
		{
			CString strTmp = CTime( 1971, 1, 1, 1, 1, 1 ) < xrpt.m_tmDate ?

⌨️ 快捷键说明

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