📄 excerptview.cpp
字号:
}
void CExcerptView::OnTextPreview()
{
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount(); i; --i )
{
if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
{
( (CExcerpt*) list.GetItemData( i-1 ) )->QuickPreviewText();
}
}
}
void CExcerptView::OnMouseMove(UINT nFlags, CPoint point)
{
BOOL bTipShown = FALSE;
if( nFlags == 0 )
{
CRect rcItem;
int nCol = -1;
int nItem = GetItemFromPoint(point, nCol, &rcItem);
if (nItem>=0)
{
CString s = GetListCtrl().GetItemText(nItem, nCol);
CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
LOGFONT* pFont = NULL;
if (pEx && !pEx->WasRead())
pFont = &m_lfBold;
m_TitleTip.Show(rcItem, s, 0, 0, pFont);
bTipShown = TRUE;
}
}
if (!bTipShown)
m_TitleTip.Hide();
CListViewEx::OnMouseMove(nFlags, point);
}
void CExcerptView::GetItemColors(int nItem, COLORREF& clrText,
COLORREF& clrBk, BOOL bSelected)
{
CListViewEx::GetItemColors(nItem, clrText, clrBk, bSelected);
CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
// set color for filtered message
if (pEx->m_dwFiltered & MFA_COLOR)
{
if (!bSelected)
clrText = pEx->m_Color;
}
else if (pEx->m_dwFiltered == MFA_FRIEND &&
(theApp.m_dwFlags & MMF_COLOR_FRIEND))
{
if (!bSelected)
clrText = theApp.m_clrFriends;
}
}
void CExcerptView::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (!lpDrawItemStruct)
return;
int nItem = lpDrawItemStruct->itemID;
CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
// select bold font for unread messages
if (!m_fntBold.m_hObject)
{
CFont* pF = GetFont();
if (pF)
{
pF->GetObject(sizeof(LOGFONT), &m_lfBold);
m_lfBold.lfWeight = 800;
m_fntBold.CreateFontIndirect(&m_lfBold);
}
}
CFont* pOldF = NULL;
if (m_fntBold.m_hObject && pEx && !pEx->WasRead())
{
pOldF = pDC->SelectObject(&m_fntBold);
}
CListViewEx::DrawItem(lpDrawItemStruct);
if (pOldF)
pDC->SelectObject(pOldF);
}
void CExcerptView::DrawSubItem(CDC* pDC, int nItem, int nColumn, CRect& rcLabel, int nJustify, BOOL bSelected)
{
CListViewEx::DrawSubItem(pDC, nItem, nColumn, rcLabel, nJustify, bSelected);
if (nColumn != COLUMN_SIZE)
return;
CExcerpt* pEx = ( (CExcerpt*) GetListCtrl().GetItemData( nItem ) );
if (!pEx || pEx->m_nLoadedSize==0 || rcLabel.Width()<16)
return;
if (pEx->m_nLoadedSize<(pEx->m_intSize-2)) // sometimes 2 bytes are not downloaded?
{
int nPrc = (pEx->m_nLoadedSize*100)/pEx->m_intSize;
CRect rcInvert(rcLabel);
rcInvert.right = rcInvert.left + (rcLabel.Width()*nPrc)/100;
pDC->InvertRect(rcInvert);
}
else
{
int nImage = 2;
if (bSelected)
{
if (GetFocus()==this)
m_imageListSmall.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
else
m_imageListSmall.SetBkColor(::GetSysColor(COLOR_INACTIVECAPTIONTEXT));
nImage = 3;
}
else
m_imageListSmall.SetBkColor(m_clrTextBk);
m_imageListSmall.Draw(pDC, nImage, rcLabel.TopLeft(), ILD_NORMAL);
}
}
LRESULT CExcerptView::OnLanguage(WPARAM, LPARAM)
{
CString strColumn;
int nCols = sizeof(aColTitles)/sizeof(aColTitles[0]);
for (int i=0; i<nCols; i++)
{
LOAD_STRING(strColumn, aColTitles[i]);
SetColTitle(i, strColumn);
}
return 0;
}
void CExcerptView::OnAllRead()
{
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount(); i; --i )
{
( (CExcerpt*) list.GetItemData( i-1 ) )->MarkAsRead(TRUE);
}
}
void CExcerptView::OnMarkRead()
{
DoMarkRead(TRUE);
}
void CExcerptView::OnMarkNew()
{
DoMarkRead(FALSE);
}
void CExcerptView::OnMarkSpam()
{
DoMarkRead(TRUE, FALSE);
}
void CExcerptView::OnMarkGood()
{
DoMarkRead(FALSE, FALSE);
}
void CExcerptView::DoMarkRead(BOOL bRead, BOOL bWhat)
{
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount(); i; --i )
{
if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
{
if (bWhat)
( (CExcerpt*) list.GetItemData( i-1 ) )->MarkAsRead(bRead);
else
( (CExcerpt*) list.GetItemData( i-1 ) )->MarkAsSpam(bRead);
}
}
}
void CExcerptView::OnFilters()
{
DFilters dlg((CMagicDoc*)GetDocument());
dlg.DoModal();
}
void CExcerptView::OnFileApplyfilters()
{
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount(); i; --i )
{
( (CExcerpt*) list.GetItemData( i-1 ) )->RecheckByFilters();
}
}
void CExcerptView::OnHeaderEndDrag(LPNMHEADER /*pHeader*/, LRESULT* pResult)
{
RedrawWindow(NULL, NULL, RDW_INTERNALPAINT | RDW_INVALIDATE);
*pResult = 0;
}
void CExcerptView::GetSelAddresses(CStringArray& asFrom, int nType)
{
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount(); i; --i )
{
if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
{
CString sFull;
if (nType == IDP_COLUMN_FROM)
{
sFull = ( (CExcerpt*) list.GetItemData( i-1 ) )->m_strFrom;
GetAddressesFrom(sFull, asFrom);
}
else if (nType == IDP_COLUMN_TO)
{
sFull = ( (CExcerpt*) list.GetItemData( i-1 ) )->m_strToName;
GetAddressesFrom(sFull, asFrom);
}
else if (nType == IDP_COLUMN_SUBJ)
{
sFull = ( (CExcerpt*) list.GetItemData( i-1 ) )->m_strSubject;
asFrom.Add(sFull);
}
}
}
}
void AddItemsToList(CStringArray& asFrom, LPCTSTR sFile, BOOL bDomains)
{
if (asFrom.GetSize()<=0)
return;
CString sPath;
if (!FindLocalFile(sFile, sPath, TRUE))
return;
CStdioFile file;
if (!file.Open(sPath, CFile::modeWrite|CFile::typeText))
return;
file.SeekToEnd();
CStringArray asAdded; // to avoid adding copies
for (int i=0; i<asFrom.GetSize(); i++)
{
CString sAdd;
sAdd = asFrom[i];
if (bDomains)
{
int nAt = sAdd.Find('@');
if (nAt<0)
continue;
sAdd.Format("*%s", asFrom[i].Mid(nAt));
}
if (sAdd.IsEmpty())
continue;
// may be it's already added
for (int j=0; j<asAdded.GetSize(); j++)
{
if (asAdded[j].CompareNoCase(sAdd) == 0)
{
sAdd.Empty();
break;
}
}
if (sAdd.IsEmpty())
continue;
asAdded.Add(sAdd);
if (asAdded.GetSize()==1)
file.WriteString("\n");
file.WriteString(sAdd);
file.WriteString("\n");
}
file.Close();
ShellExecute(NULL, "Open", sPath, NULL, NULL, SW_SHOW);
}
void CExcerptView::OnAddFriend()
{
CStringArray asFrom;
GetSelAddresses(asFrom);
AddItemsToList(asFrom, FRIENDS_FILE, FALSE);
}
void CExcerptView::OnDomainAdd()
{
CStringArray asFrom;
GetSelAddresses(asFrom);
AddItemsToList(asFrom, FRIENDS_FILE, TRUE);
}
void CExcerptView::OnListCommand(UINT nCmd)
{
int nType = -1;
int nFile = -1;
if (nCmd<ID_LIST_MIN + 50) // To
{
nType = IDP_COLUMN_TO;
nFile = nCmd - ID_LIST_MIN - 1;
}
else if (nCmd<ID_LIST_MIN + 100) // From
{
nType = IDP_COLUMN_FROM;
nFile = nCmd - ID_LIST_MIN - 50;
}
else if (nCmd<ID_LIST_MIN + 150) // Subj
{
nType = IDP_COLUMN_SUBJ;
nFile = nCmd - ID_LIST_MIN - 100;
}
if (nType<0 || nFile<0 || nFile >= ((CMagicFrame*)AfxGetMainWnd())->m_asFilterLists.GetSize())
return;
AddItemToList(nType, ((CMagicFrame*)AfxGetMainWnd())->m_asFilterLists[nFile]);
}
void CExcerptView::AddItemToList(int nType, CString& sList)
{
CStringArray asFields;
GetSelAddresses(asFields, nType);
AddItemsToList(asFields, sList, FALSE);
}
void CExcerptView::OnKillSpam()
{
// delete all spam messages
CMap<CMailbox*, CMailbox*, int, int> map;
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount(); i; --i )
{
CExcerpt &xrpt = *( (CExcerpt*) list.GetItemData( i-1 ) );
if (xrpt.m_dwFiltered & MFA_SPAM)
{
xrpt.m_bitRemoveFromServer = 1;
xrpt.Change( COLUMN_MBOX );
map.SetAt(xrpt.m_pMailbox, 1);
}
}
POSITION pos = map.GetStartPosition();
while( pos != NULL )
{
CMailbox* pBox;
int n;
map.GetNextAssoc( pos, pBox, n);
pBox->Check();
}
}
void CExcerptView::OnUpdateKillSpam(CCmdUI* )
{
}
BOOL CExcerptView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
m_TitleTip.Hide();
return CListViewEx::OnMouseWheel(nFlags, zDelta, pt);
}
void CExcerptView::OnToggleSpam()
{
UINT nCmd = ID_MARK_NOSPAM;
if (!IsSpamSelection())
nCmd = ID_MARK_SPAM;
PostMessage(WM_COMMAND, nCmd);
}
BOOL CExcerptView::IsSpamSelection()
{
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount(); i; --i )
{
if( LVNI_SELECTED == list.GetItemState( i-1, LVNI_SELECTED ) )
{
if (( (CExcerpt*) list.GetItemData( i-1 ) )->m_dwFiltered & MFA_SPAM)
{
return TRUE;
}
}
}
return FALSE;
}
void CExcerptView::OnUpdateToggleSpam(CCmdUI* pCmdUI)
{
CListCtrl &list = GetListCtrl();
int nMax = list.GetItemCount();
if (nMax == 0)
{
pCmdUI->SetCheck(FALSE);
pCmdUI->Enable(FALSE);
return;
}
pCmdUI->Enable(TRUE);
pCmdUI->SetCheck(IsSpamSelection());
}
void CExcerptView::OnSelRevert()
{
CListCtrl &list = GetListCtrl();
for( int i = list.GetItemCount()-1; i>=0; --i )
{
if( LVNI_SELECTED == list.GetItemState( i, LVNI_SELECTED ) )
{
list.SetItemState(i, 0, LVNI_SELECTED );
}
else
list.SetItemState(i, LVNI_SELECTED , LVNI_SELECTED );
}
}
void CExcerptView::OnSelNotFriends()
{
CListCtrl &list = GetListCtrl();
for( int i = 0; i < list.GetItemCount(); ++i )
{
CExcerpt &xrpt = *(CExcerpt*) list.GetItemData(i);
if( xrpt.m_dwFiltered == MFA_FRIEND)
list.SetItemState(i, 0, LVNI_SELECTED );
else
list.SetItemState(i, LVNI_SELECTED, LVNI_SELECTED );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -