📄 mailboxview.cpp
字号:
// 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 + -