📄 excerptview.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.
//
// 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 + -