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

📄 mailboxview.cpp

📁 一个邮件客户端源代码,包括收发邮件,安排日程等很多内容
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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.
//
// MailboxView.cpp : implementation of the CMailboxView class
//

#include "stdafx.h"
#include "Magic.h"
#include "Mailbox.h"
#include "Excerpt.h"
#include "MagicDoc.h"
#include "MailboxView.h"
#include "MagicFrame.h"
#include "dfilters.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMailboxView

IMPLEMENT_DYNCREATE(CMailboxView, CListViewEx)

BEGIN_MESSAGE_MAP(CMailboxView, CListViewEx)
	//{{AFX_MSG_MAP(CMailboxView)
	ON_COMMAND(ID_VIEW_ICON, OnViewIcon)
	ON_COMMAND(ID_VIEW_LIST, OnViewList)
	ON_COMMAND(ID_VIEW_REPORT, OnViewReport)
	ON_COMMAND(ID_VIEW_SMALLICON, OnViewSmallicon)
	ON_UPDATE_COMMAND_UI(ID_VIEW_ICON, OnUpdateViewIcon)
	ON_UPDATE_COMMAND_UI(ID_VIEW_LIST, OnUpdateViewList)
	ON_UPDATE_COMMAND_UI(ID_VIEW_REPORT, OnUpdateViewReport)
	ON_UPDATE_COMMAND_UI(ID_VIEW_SMALLICON, OnUpdateViewSmallicon)
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll)
	ON_UPDATE_COMMAND_UI(ID_EDIT_SELECT_ALL, OnUpdateEditSelectAll)
	ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemChanged)
	ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PROPERTIES, OnUpdateIfSelectedCount)
	ON_COMMAND(ID_EDIT_PROPERTIES, OnEditProperties)
	ON_COMMAND(ID_EDIT_NEW, OnEditNew)
	ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh)
	ON_UPDATE_COMMAND_UI(ID_STOP_CHECKING, OnUpdateIfItemCount)
	ON_UPDATE_COMMAND_UI(ID_COMMAND, OnUpdateIfFocusedCount)
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_COMMAND(ID_COMMAND, OnCommand)
	ON_WM_DESTROY()
	ON_COMMAND(ID_STOP_CHECKING, OnStopChecking)
	ON_NOTIFY_REFLECT(LVN_KEYDOWN, OnKeydown)
	ON_UPDATE_COMMAND_UI(ID_VIEW_REFRESH, OnUpdateIfItemCount)
	ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateIfSelectedCount)
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI( ID_INDICATOR_OBJECTS, OnUpdateIndicatorObjects )
	ON_UPDATE_COMMAND_UI( ID_INDICATOR_CONTENTS, OnUpdateIndicatorContents )
	ON_MESSAGE(VM_LANGUAGE, OnLanguage)
	ON_NOTIFY(HDN_ENDDRAG, 0, OnHeaderEndDrag)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMailboxView construction/destruction

CMailboxView::CMailboxView()
:	m_bitSortEnabled(1),
	m_bitSortRequired(0)
{
}

CMailboxView::~CMailboxView()
{
}	 

/////////////////////////////////////////////////////////////////////////////
// CMailboxView diagnostics

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

void CMailboxView::Dump(CDumpContext& dc) const
{
    	CListViewEx::Dump(dc);
}

CMagicDoc* CMailboxView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMagicDoc)));
	return (CMagicDoc*)m_pDocument;
}
#endif //_DEBUG

void CMailboxView::EnableSort( BOOL bEnable )
{
	m_bitSortEnabled = bEnable;
	if( bEnable && m_bitSortRequired ) 
		SortItems();
}

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

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

void CMailboxView::OnInitialUpdate() 
{
	CListViewEx::OnInitialUpdate();
	
	ASSERT( GetDocument() );
	CMagicDoc &doc = *(CMagicDoc*) GetDocument();
	CListCtrl &list = GetListCtrl();

	list.SetItemCountEx( doc.m_listMailbox.GetCount(), 0 );

	if( theApp.intCheckImmediately ) doc.OnTimerCheck();
	SetFullRowSel(TRUE);
}

static 
CString FormatHoursMinutes( int minutes )
{
	int hours = minutes / 60;
	minutes = minutes % 60;

	CString strTmp;

	if( hours )
	{
		if( minutes )
		{
			strTmp.Format( _T("%d hrs %d min"), hours, minutes );
		}
		else
		{
			strTmp.Format( _T("%d hrs"), hours );
		}
	}
	else
	{
		strTmp.Format( _T("%d min"), minutes ); 
	}

	return strTmp;
}

void CMailboxView::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* pHint)
{
	if( HINT_DISABLE_SORT == lHint ) EnableSort( FALSE );
	else if( HINT_ENABLE_SORT == lHint ) EnableSort();

	if( !pHint ) return;

	if( !pHint->IsKindOf( RUNTIME_CLASS( CMailbox ) ) ) return;
	CMailbox &mbox = *(CMailbox*) pHint;
	CListCtrl &list = GetListCtrl();

	if( mbox.m_bitCreated )
	{
		VERIFY( -1 != list.InsertItem( 0, _T("...") ) );
		VERIFY( LB_ERR != list.SetItemData( 0, (DWORD) &mbox ) );
	}

	LV_FINDINFO findInfo = { LVFI_PARAM, 0, (LPARAM) &mbox };
	int intIndex = list.FindItem( &findInfo );
	if( -1 == intIndex ) return;

	if( mbox.m_bitDeleted )
	{
		VERIFY( list.DeleteItem( intIndex ) );
		return;
	}

	CString strTmp;

	if( mbox.IsChanged( COLUMN_MAIL ) )
	{
		if (mbox.UpdateUnreadStatus())
			mbox.Change( COLUMN_ALIAS );	// need redraw

		int nNew = 0;
		for (int m=0; m<mbox.m_arrayExcerpt.GetSize(); m++)
		{
			if (mbox.m_arrayExcerpt[m] && 
				!mbox.m_arrayExcerpt[m]->WasRead())
				nNew++;
		}
		if (nNew>0)
			strTmp.Format( _T("%d/%d"), mbox.m_arrayExcerpt.GetSize(), nNew );
		else
			strTmp.Format( _T("%d"), mbox.m_arrayExcerpt.GetSize() );
		VERIFY( list.SetItemText( intIndex, COLUMN_MAIL, strTmp ) );

		VERIFY( list.SetItem( intIndex, 0, LVIF_IMAGE, 0, ( mbox.m_arrayExcerpt.GetSize() ? 1 : 0 ), 0, 0, 0 ) );
	}

	if( mbox.IsChanged( COLUMN_ALIAS ) )
	{
		VERIFY( list.SetItemText( intIndex, COLUMN_ALIAS, mbox.m_strAlias ) );
	}
	
	if( mbox.IsChanged( COLUMN_USER ) )
	{
		VERIFY( list.SetItemText( intIndex, COLUMN_USER, mbox.m_strUser ) );
	}
	
	if( mbox.IsChanged( COLUMN_HOST ) )
	{
		VERIFY( list.SetItemText( intIndex, COLUMN_HOST, mbox.m_strHost ) );
	}

	if( mbox.IsChanged( COLUMN_STATE ) )
	{
		int intState = IDP_MBOX_ERROR;

		if( mbox.GetLastErrorDescription().GetLength() > 0 )
		{
			VERIFY( list.SetItemText( intIndex, COLUMN_STATE, mbox.GetLastErrorDescription() ) );
		}
		else
		{
			switch( mbox.m_intState )
			{
				case MBOX_NOT_CHECKED:			intState = IDP_MBOX_NOT_CHECKED; break;
				case MBOX_RESOLVING:			intState = IDP_MBOX_RESOLVING; break;
				case MBOX_CONNECTING:			intState = IDP_MBOX_CONNECTING; break;
				case MBOX_WF_USER_RESPONSE:		intState = IDP_MBOX_WF_USER_RESPONSE; break;
				case MBOX_WF_PASS_RESPONSE:		intState = IDP_MBOX_WF_PASS_RESPONSE; break;
				case MBOX_WF_APOP_RESPONSE:		intState = IDP_MBOX_WF_APOP_RESPONSE; break;
				case MBOX_WF_FIRST_NOOP:		intState = IDP_MBOX_WF_NOOP_RESPONSE; break;
				case MBOX_WF_SECOND_NOOP:		intState = IDP_MBOX_WF_NOOP_RESPONSE; break;
				case MBOX_WF_UIDL_RESPONSE:		intState = IDP_MBOX_WF_UIDL_RESPONSE; break;
				case MBOX_WF_LIST_RESPONSE:		intState = IDP_MBOX_WF_LIST_RESPONSE; break;
				case MBOX_WF_TOPEX_RESPONSE:	intState = IDP_MBOX_WF_TOPEX_RESPONSE; break;
				case MBOX_WF_TOPF_RESPONSE:		intState = IDP_MBOX_WF_TOPEX_RESPONSE; break;
				case MBOX_WF_TOP_RESPONSE:		intState = IDP_MBOX_WF_TOP_RESPONSE; break;
				case MBOX_DOWNLOADING_DATA:		intState = IDP_MBOX_DOWNLOADING_DATA; break;
				case MBOX_WF_RETR_RESPONSE:		intState = IDP_MBOX_WF_RETR_RESPONSE; break;
				case MBOX_WF_DELE_RESPONSE:		intState = IDP_MBOX_WF_DELE_RESPONSE; break;
				case MBOX_CHECKED:				intState = IDP_MBOX_CHECKED; break;
				case MBOX_INTERRUPTED_BY_USER:	intState = IDP_MBOX_INTERRUPTED_BY_USER; break;
				case MBOX_CANNOT_CONNECT:		intState = IDP_MBOX_CANNOT_CONNECT; break;
				case MBOX_CANNOT_CHECK:			intState = IDP_MBOX_CANNOT_CHECK; break;
				case MBOX_CANNOT_SEND:			intState = IDP_MBOX_CANNOT_SEND; break;
				case MBOX_NETWORK_FAILED:		intState = IDP_MBOX_NETWORK_FAILED; break;
				case MBOX_SERVER_FAILED:		intState = IDP_MBOX_SERVER_FAILED; break;
				case MBOX_CONNECTION_WAS_LOST:	intState = IDP_MBOX_CONNECTION_WAS_LOST; break;
				case MBOX_SOCKET_ERROR:			intState = IDP_MBOX_SOCKET_ERROR; break;
				case MBOX_INVALID_USER:			intState = IDP_MBOX_INVALID_USER; break;
				case MBOX_INVALID_HOST:			intState = IDP_MBOX_INVALID_HOST; break;
				case MBOX_INVALID_PASS:			intState = IDP_MBOX_INVALID_PASS; break;
			}

			VERIFY( strTmp.LoadString( intState ) );
			StrTranslate(strTmp);
			VERIFY( list.SetItemText( intIndex, COLUMN_STATE, strTmp ) );
		}

		int item_state = list.GetItemState( intIndex, LVIS_OVERLAYMASK );
		item_state &= ~LVIS_OVERLAYMASK;

		int intOverlay = 0;

		if( STATE_ERROR( mbox.m_intState ) )
			intOverlay = 1;
		else if( mbox.IsSecure() )
			intOverlay = 3;

		item_state |= INDEXTOOVERLAYMASK( intOverlay );
		VERIFY( list.SetItemState( intIndex, item_state, LVIS_OVERLAYMASK ) );
	}

	if( mbox.IsChanged( COLUMN_ELAPSED ) )
	{
		if( -1 == mbox.m_intElapsed ) strTmp = _T("...");
		else 
		{
			strTmp = FormatHoursMinutes( mbox.m_intElapsed );
		}
		VERIFY( list.SetItemText( intIndex, COLUMN_ELAPSED, strTmp ) );
	}

	if( mbox.IsChanged( COLUMN_PORT ) )
	{
		strTmp.Format( _T("%d"), mbox.m_intPort );
		VERIFY( list.SetItemText( intIndex, COLUMN_PORT, strTmp ) );
	}

	if( mbox.IsChanged( COLUMN_POLL ) )
	{
		if( mbox.m_intPoll )
		{
			strTmp = FormatHoursMinutes( mbox.m_intPoll );
		}
		else 
		{
			strTmp.LoadString( IDP_DISABLED );
			StrTranslate(strTmp);
		}
		
		VERIFY( list.SetItemText( intIndex, COLUMN_POLL, strTmp ) );

		int item_state = list.GetItemState( intIndex, LVIS_OVERLAYMASK );
		item_state &= ~LVIS_OVERLAYMASK;
		
		int intOverlay = 0;
		if( mbox.m_intPoll == 0 || mbox.IsDisabled())
		{
			intOverlay = 2;
		}
		else if( mbox.IsSecure() )
		{
			intOverlay = 3;
		}

		item_state |= INDEXTOOVERLAYMASK( intOverlay );
		VERIFY( list.SetItemState( intIndex, item_state, LVIS_OVERLAYMASK ) );
	}

	if( mbox.IsChanged( theApp.intMVSortColumn ) ) SortItems(); 
}

UINT anMBCols[]=
{
	IDP_COLUMN_ALIAS, IDP_COLUMN_USER, IDP_COLUMN_HOST,
	IDP_COLUMN_MAIL, IDP_COLUMN_STAT , IDP_COLUMN_ELAPSED,
	IDP_COLUMN_PORT, IDP_COLUMN_POLL,
};
BOOL CMailboxView::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_TYPEMASK, 
		theApp.intMVMode | LVS_ALIGNLEFT | LVS_ALIGNTOP | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS ) );

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

	list.SetExtendedStyle(LVS_EX_HEADERDRAGDROP);

	CString strColumn;
	LOAD_STRING(strColumn, IDP_COLUMN_ALIAS ); list.InsertColumn( 0, strColumn, LVCFMT_LEFT, theApp.intMCAliasWidth, 0 );
	LOAD_STRING(strColumn, IDP_COLUMN_USER ); list.InsertColumn( 1, strColumn, LVCFMT_RIGHT, theApp.intMCUserWidth, 1 );
	LOAD_STRING(strColumn, IDP_COLUMN_HOST ); list.InsertColumn( 2, strColumn, LVCFMT_LEFT, theApp.intMCHostWidth, 2 );
	LOAD_STRING(strColumn, IDP_COLUMN_MAIL ); list.InsertColumn( 3, strColumn, LVCFMT_LEFT, theApp.intMCMailWidth, 3 );
	LOAD_STRING(strColumn, IDP_COLUMN_STAT ); list.InsertColumn( 4, strColumn, LVCFMT_LEFT, theApp.intMCStatWidth, 4 );
	LOAD_STRING(strColumn, IDP_COLUMN_ELAPSED ); list.InsertColumn( 5, strColumn, LVCFMT_RIGHT, theApp.intMCElapsedWidth, 5 );
	LOAD_STRING(strColumn, IDP_COLUMN_PORT ); list.InsertColumn( 6, strColumn, LVCFMT_RIGHT, theApp.intMCPortWidth, 6 );
	LOAD_STRING(strColumn, IDP_COLUMN_POLL ); list.InsertColumn( 7, strColumn, LVCFMT_RIGHT, theApp.intMCPollWidth, 7 );

	int *anColumns = new int[list.GetHeaderCtrl()->GetItemCount()];
	anColumns[theApp.intMCAliasPos] =0;
	anColumns[theApp.intMCUserPos] =1;
	anColumns[theApp.intMCHostPos] = 2;
	anColumns[theApp.intMCMailPos] = 3;
	anColumns[theApp.intMCStatPos] = 4;
	anColumns[theApp.intMCElapsedPos] = 5;
	anColumns[theApp.intMCPortPos] = 6;
	anColumns[theApp.intMCPollPos] = 7;
	list.GetHeaderCtrl()->SetOrderArray(list.GetHeaderCtrl()->GetItemCount(), anColumns);
	delete[] anColumns;

	// prepare Small image list
	VERIFY( m_imageListSmall.Create( 16, 16, ILC_COLOR24 | ILC_MASK, 6, 2 ) );
	VERIFY( -1 != m_imageListSmall.Add( theApp.LoadIcon( IDI_MAILBOX_EMPTY ) ) );
	VERIFY( -1 != m_imageListSmall.Add( theApp.LoadIcon( IDI_MAILBOX_FULL ) ) );
	VERIFY( -1 != m_imageListSmall.Add( theApp.LoadIcon( IDR_OVERLAYERROR ) ) );
	VERIFY( -1 != m_imageListSmall.Add( theApp.LoadIcon( IDR_OVERLAYDISABLED ) ) );
	VERIFY( -1 != m_imageListSmall.Add( theApp.LoadIcon( IDR_OVERLAYSECURE ) ) );
	VERIFY( m_imageListSmall.SetOverlayImage( 2, 1 ) );
	VERIFY( m_imageListSmall.SetOverlayImage( 3, 2 ) );
	VERIFY( m_imageListSmall.SetOverlayImage( 4, 3 ) );
	list.SetImageList( &m_imageListSmall, LVSIL_SMALL );
	
	// prepare Normal image list
	VERIFY( m_imageListNormal.Create( 32, 32, ILC_COLOR24 | ILC_MASK, 6, 2 ) );
	VERIFY( -1 != m_imageListNormal.Add( theApp.LoadIcon( IDI_MAILBOX_EMPTY, true ) ) );
	VERIFY( -1 != m_imageListNormal.Add( theApp.LoadIcon( IDI_MAILBOX_FULL, true ) ) );
	VERIFY( -1 != m_imageListNormal.Add( theApp.LoadIcon( IDR_OVERLAYERROR, true ) ) );
	VERIFY( -1 != m_imageListNormal.Add( theApp.LoadIcon( IDR_OVERLAYDISABLED, true ) ) );
	VERIFY( -1 != m_imageListNormal.Add( theApp.LoadIcon( IDR_OVERLAYSECURE, true ) ) );
	VERIFY( m_imageListNormal.SetOverlayImage( 2, 1 ) );
	VERIFY( m_imageListNormal.SetOverlayImage( 3, 2 ) );
	VERIFY( m_imageListNormal.SetOverlayImage( 4, 3 ) );
	list.SetImageList( &m_imageListNormal, LVSIL_NORMAL );

	m_ColSortGUI.Init(IDB_UP, IDB_DOWN);
	m_ColSortGUI.SetSortMark(list, theApp.intMVSortColumn, theApp.intMVSortAscend);
	
	return TRUE;
}

void CMailboxView::OnDestroy() 
{
	if( LVS_REPORT == theApp.intMVMode )
	{
		GetListSettings();
	}
	CListViewEx::OnDestroy();
}

void CMailboxView::OnViewIcon() 
{
	if (theApp.intMVMode == LVS_REPORT)
	{
		GetListSettings();
	}
	ModifyStyle( LVS_TYPEMASK, LVS_ICON );
	theApp.intMVMode = LVS_ICON;
}

void CMailboxView::OnViewList() 
{
	if (theApp.intMVMode == LVS_REPORT)
	{
		GetListSettings();
	}
	ModifyStyle( LVS_TYPEMASK, LVS_LIST );
	theApp.intMVMode = LVS_LIST;
}

void CMailboxView::OnViewReport() 
{
	ModifyStyle( LVS_TYPEMASK, LVS_REPORT );
	theApp.intMVMode = LVS_REPORT;
}

void CMailboxView::OnViewSmallicon() 
{
	if (theApp.intMVMode == LVS_REPORT)

⌨️ 快捷键说明

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