?? 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_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)
ON_COMMAND(ID_MAILBOX_COPY, OnMailboxCopy)
ON_UPDATE_COMMAND_UI(ID_MAILBOX_COPY, OnUpdateMailboxCopy)
ON_COMMAND(ID_MAILBOX_PASTE, OnMailboxPaste)
ON_UPDATE_COMMAND_UI(ID_MAILBOX_PASTE, OnUpdateMailboxPaste)
//}}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);
theApp.SetDefFont(GetFont());
if (theApp.GetFont())
SetFont(theApp.GetFont());
}
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* , LPARAM lHint, CObject* pHint)
{
switch (lHint)
{
case HINT_OPTIONS:
if (theApp.GetFont())
{
SetFont(theApp.GetFont());
m_fntBold.DeleteObject();
Invalidate();
}
return;
case HINT_DISABLE_SORT:
EnableSort( FALSE );
return;
case HINT_ENABLE_SORT:
EnableSort();
return;
case HINT_UPDATE_ITEM: // handled below
break;
default:
return;
}
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() ? II_FULL : II_EMPTY ), 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:
case MBOX_WF_USER_RESPONSE_SSL: 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.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( 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 );
OnOptionsChange(FALSE);
list.SetImageList( &theApp.m_imgMailbox, LVSIL_SMALL );
m_ColSortGUI.Init(IDB_UP, IDB_DOWN);
m_ColSortGUI.SetSortMark(list, theApp.intMVSortColumn, theApp.intMVSortAscend);
return TRUE;
}
#define ASSIGN(a, i) if (a>=0 && a<nCount) anColumns[a] = i; else bFail = TRUE;
void CMailboxView::OnOptionsChange(BOOL bWidth)
{
CListCtrl &list = GetListCtrl();
int nCount = list.GetHeaderCtrl()->GetItemCount();
int *anColumns = new int[nCount];
ZeroMemory(anColumns, sizeof(int)*nCount);
BOOL bFail = FALSE;
ASSIGN(theApp.intMCAliasPos, 0)
ASSIGN(theApp.intMCUserPos, 1)
ASSIGN(theApp.intMCHostPos, 2)
ASSIGN(theApp.intMCMailPos, 3)
ASSIGN(theApp.intMCStatPos, 4)
ASSIGN(theApp.intMCElapsedPos, 5)
ASSIGN(theApp.intMCPortPos, 6)
ASSIGN(theApp.intMCPollPos, 7)
if (bFail) // default settings
{
for (int i=0; i<nCount; i++)
{
anColumns[i] = i;
}
}
list.GetHeaderCtrl()->SetOrderArray(nCount, anColumns);
delete[] anColumns;
if (bWidth)
{
list.SetColumnWidth(0, theApp.intMCAliasWidth);
list.SetColumnWidth(1, theApp.intMCUserWidth);
list.SetColumnWidth(2, theApp.intMCHostWidth);
list.SetColumnWidth(3, theApp.intMCMailWidth);
list.SetColumnWidth(4, theApp.intMCStatWidth);
list.SetColumnWidth(5, theApp.intMCElapsedWidth);
list.SetColumnWidth(6, theApp.intMCPortWidth);
list.SetColumnWidth(7, theApp.intMCPollWidth);
}
}
void CMailboxView::OnDestroy()
{
if( LVS_REPORT == theApp.intMVMode )
{
GetListSettings();
}
CListViewEx::OnDestroy();
}
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)
{
GetListSettings();
}
ModifyStyle( LVS_TYPEMASK, LVS_SMALLICON );
theApp.intMVMode = LVS_SMALLICON;
}
void CMailboxView::OnUpdateViewIcon(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio( LVS_ICON == theApp.intMVMode );
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -