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

📄 dfilters.cpp

📁 一个邮件客户端源代码,包括收发邮件,安排日程等很多内容
💻 CPP
字号:
// DFilters.cpp: Implementierungsdatei
//

#include "stdafx.h"
#include "magic.h"
#include "magicdoc.h"
#include "mailbox.h"
#include "DFilters.h"
#include "tools.h"

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

/////////////////////////////////////////////////////////////////////////////
// DFilterEditor dialog

class DFilterEditor : public CDialog
{
public:
	DFilterEditor(CFilterCnd* pCnd);

	//{{AFX_DATA(DFilterEditor)
	enum { IDD = IDD_EDIT_FILTER };
	CComboBox	m_cbField;
	CComboBox	m_cbCondition;
	CString		m_sFilterText;
	int		m_nField;
	int		m_nCnd;
	//}}AFX_DATA

	//{{AFX_VIRTUAL(DFilterEditor)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL
protected:
	void UpdateSampleString();
	CFilterCnd* m_pCnd;


	//{{AFX_MSG(DFilterEditor)
	afx_msg void OnChangeFltText();
	afx_msg void OnEditFile();
	virtual BOOL OnInitDialog();
	virtual void OnOK();
	afx_msg void OnUpdateString();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////
// Dialogfeld DFilters 


DFilters::DFilters(CMagicDoc* pDoc)
	: CDialog(DFilters::IDD, NULL)
{
	//{{AFX_DATA_INIT(DFilters)
	m_sName = _T("");
	m_bOthers = FALSE;
	m_bColor = FALSE;
	m_bDelete = FALSE;
	m_bMark = FALSE;
	m_bRead = FALSE;
	m_bAllow = FALSE;
	m_sFilter1 = _T("");
	m_sFilter2 = _T("");
	m_nCombine = 0;
	//}}AFX_DATA_INIT
	m_pDoc = pDoc;
	m_nCurSel = -1;
}


void DFilters::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	if (!pDX->m_bSaveAndValidate && 
		m_nCurSel >=0 &&
		m_nCurSel < m_Filters.GetSize() )	// get data from cur mailbox
	{
		CMailFilter& mf = m_Filters.ElementAt(m_nCurSel);
		m_sName = mf.m_sName;
		m_nCombine = mf.m_nCombination;
		m_bOthers = (mf.m_dwAction & MFA_OTHER)!=0;
		m_bColor = (mf.m_dwAction & MFA_COLOR)!=0;
		m_bMark = (mf.m_dwAction & MFA_SPAM)!=0;
		m_bDelete = (mf.m_dwAction & MFA_DELETE)!=0;
		m_bRead = (mf.m_dwAction & MFA_READ)!=0;
		mf.m_aCnd[0].ToText(m_sFilter1);
		mf.m_aCnd[1].ToText(m_sFilter2);
		
		int idx = m_cbMailbox.FindStringExact(0, mf.m_sMailBox);
		m_cbMailbox.SetCurSel(idx);
	}
	//{{AFX_DATA_MAP(DFilters)
	DDX_Control(pDX, IDC_FLT_CLR_SAMPLE, m_Sample);
	DDX_Control(pDX, IDC_LIST, m_lbList);
	DDX_Control(pDX, IDC_FLT_MBOX, m_cbMailbox);
	DDX_Text(pDX, IDC_FILTER_NAME, m_sName);
	DDX_Check(pDX, IDC_FLT_OTHERS, m_bOthers);
	DDX_Check(pDX, IDC_FLT_COLOR, m_bColor);
	DDX_Check(pDX, IDC_FLT_DELETE, m_bDelete);
	DDX_Check(pDX, IDC_FLT_MARK1, m_bMark);
	DDX_Check(pDX, IDC_FLT_READ, m_bRead);
	DDX_Check(pDX, IDC_ALLOW_FILTERS, m_bAllow);
	DDX_Text(pDX, IDC_FLT1, m_sFilter1);
	DDX_Text(pDX, IDC_FLT2, m_sFilter2);
	DDX_CBIndex(pDX, IDC_COMBINE, m_nCombine);
	//}}AFX_DATA_MAP
	if (pDX->m_bSaveAndValidate)
	{
		if ( m_nCurSel >=0 &&
			m_nCurSel < m_Filters.GetSize() )	// get data from cur mailbox
		{
			CMailFilter& mf = m_Filters.ElementAt(m_nCurSel);
			mf.m_sName = m_sName;
			mf.m_nCombination = (BYTE)m_nCombine ;
			mf.m_dwAction = 0;
			if (m_bOthers)
				mf.m_dwAction |= MFA_OTHER;
			if (m_bColor)
				mf.m_dwAction |= MFA_COLOR;
			if (m_bMark)
				mf.m_dwAction |= MFA_SPAM;
			if (m_bDelete)
				mf.m_dwAction |= MFA_DELETE;
			if (m_bRead)
				mf.m_dwAction |= MFA_READ;
			if (m_lbList.GetCheck(m_nCurSel))
				mf.m_dwAction |= MFA_ENABLED;
			int nCur = m_cbMailbox.GetCurSel();
			if (nCur == 0 || nCur == CB_ERR)
				mf.m_sMailBox = "*";
			else
				mf.m_sMailBox = (LPCTSTR)m_cbMailbox.GetItemData(nCur);
		}
	}
}


BEGIN_MESSAGE_MAP(DFilters, CDialog)
	//{{AFX_MSG_MAP(DFilters)
	ON_LBN_SELCHANGE(IDC_LIST, OnSelchangeList)
	ON_BN_CLICKED(IDC_FLT_ADD, OnFltAdd)
	ON_BN_CLICKED(IDC_FLT_DEL, OnFltDel)
	ON_BN_CLICKED(IDC_FLT_DOWN, OnFltDown)
	ON_BN_CLICKED(IDC_FLT_UP, OnFltUp)
	ON_EN_CHANGE(IDC_FILTER_NAME, OnChangeFilterName)
	ON_BN_CLICKED(IDC_FLT_COLOR_SEL, OnFltColorSel)
	ON_BN_CLICKED(IDC_FLT_COLOR, OnFltColor)
	ON_BN_CLICKED(IDC_FLT1_BRS, OnFlt1Brs)
	ON_BN_CLICKED(IDC_FLT2_BRS, OnFlt2Brs)
	ON_CBN_SELENDOK(IDC_COMBINE, OnSelendokCombine)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen f黵 Nachrichten DFilters 

LPCTSTR asFields[]=
{
	"${Subject}", "${From}", "${To}",
	"${CC}",		"${Header}", "${Size}",
	"${Date}",
};

LPCTSTR asOps[]=
{
	"${Equals}", "${Includes}", ">",
		"${NOT Includes}", "${Includes RegExp}",
};

BOOL DFilters::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	Prepare();

	DlgTranslate(this);

	GetData();

	return TRUE;
}

CMailFilter::CMailFilter()
{
	for (int i=0; i<nConditions; i++)
	{
		m_aCnd[i].m_nField = MFF_FROM;
		m_aCnd[i].m_nOperation = MFO_EQUAL;
	}
	m_nCombination = MFC_NONE;
	m_dwAction = MFA_NONE;
	m_Color = 0;	// black
	m_sMailBox = "*";
}

CMailFilter::CMailFilter(const CMailFilter& a)
{
	*this = a;
}


CMailFilter& CMailFilter::operator=(const CMailFilter& src)
{
	m_sMailBox = src.m_sMailBox;
	m_Color = src.m_Color;
	m_dwAction = src.m_dwAction;
	m_sName = src.m_sName;
	
	m_nCombination = src.m_nCombination;
	for (int i=0; i<nConditions; i++)
	{
		m_aCnd[i].m_nField = src.m_aCnd[i].m_nField;
		m_aCnd[i].m_nOperation = src.m_aCnd[i].m_nOperation;
		m_aCnd[i].m_sText = src.m_aCnd[i].m_sText;
	}

	return *this;
}
/* version history
  2. added array of conditions
  1. start
*/
static BYTE nLastVer = 2;
void CMailFilter::Serialize(CArchive& ar)
{
	if (ar.IsLoading())
	{
		BYTE bVersion = 0;
		ar >> bVersion;
		if (bVersion > nLastVer)
			AfxThrowArchiveException( CArchiveException::badIndex, _T("") );
		if (bVersion<2)
		{
			ar >> m_aCnd[0].m_nField;
			ar >> m_aCnd[0].m_nOperation;
			ar >> m_aCnd[0].m_sText;
			m_nCombination = MFC_NONE;
			m_aCnd[1].Reset();
		}
		else
		{
			ar >> m_nCombination;
			BYTE bCnds = 0;
			ar >> bCnds;
			for (int i=0; i<bCnds; i++)
			{
				int nIdx = min(i, nConditions-1);
				ar >> m_aCnd[nIdx].m_nField;
				ar >> m_aCnd[nIdx].m_nOperation;
				ar >> m_aCnd[nIdx].m_sText;
			}
		}
		ar >> m_sMailBox;
		ar >> m_Color;
		ar >> m_dwAction;
		ar >> m_sName;
	}
	else	// writing
	{
		ar << nLastVer;
		ar << m_nCombination;
		ar << (BYTE)nConditions;
		for (int i=0; i<nConditions; i++)
		{
			ar << m_aCnd[i].m_nField;
			ar << m_aCnd[i].m_nOperation;
			ar << m_aCnd[i].m_sText;
		}
		ar << m_sMailBox;
		ar << m_Color;
		ar << m_dwAction;
		ar << m_sName;
	}
}

void DFilters::OnOK() 
{
	UpdateData();
	theApp.m_Filters.Copy(m_Filters);
	
	theApp.intEnableFilters = m_bAllow;

	if (m_pDoc)
		m_pDoc->SetModifiedFlag();

	CDialog::OnOK();
}

void DFilters::GetData()
{
	m_bAllow = theApp.intEnableFilters;

	m_Filters.Copy(theApp.m_Filters);
	m_lbList.ResetContent();
	for (int i=0; i<m_Filters.GetSize(); i++)
	{
		CMailFilter& mf = m_Filters.ElementAt(i);
		int idx = m_lbList.AddString(mf.m_sName);
		m_lbList.SetCheck(idx, (mf.m_dwAction & MFA_ENABLED)!=0 );
	}
	m_lbList.SetCurSel(0);
	UpdateData(FALSE);
	OnSelchangeList();
}

void DFilters::OnSelchangeList() 
{
	UpdateData();
	m_nCurSel = m_lbList.GetCurSel();
	UpdateData(FALSE);
	UpdateColor();
	OnSelendokCombine();
}

void DFilters::OnFltAdd() 
{
	CMailFilter mf;
	m_Filters.Add(mf);
	int i = m_lbList.AddString("?");
	m_lbList.SetCurSel(i);
	OnSelchangeList();
	if (GetDlgItem(IDC_FILTER_NAME))
		GetDlgItem(IDC_FILTER_NAME)->SetFocus();
}

void DFilters::OnFltDel() 
{
	if (m_nCurSel<0 || m_nCurSel>=m_Filters.GetSize())
		return;
	m_Filters.RemoveAt(m_nCurSel);
	m_lbList.DeleteString(m_nCurSel);
	m_lbList.SetCurSel(max(0, m_nCurSel-1));
	m_nCurSel = -1;
	OnSelchangeList();
}

void DFilters::OnFltDown() 
{
	if (m_nCurSel<0 || m_nCurSel>=m_Filters.GetSize()-1)
		return;
	CMailFilter mf = m_Filters[m_nCurSel];
	m_Filters[m_nCurSel] = m_Filters[m_nCurSel+1];
	m_Filters[m_nCurSel+1] = mf;
	m_lbList.DeleteString(m_nCurSel);
	m_lbList.InsertString(m_nCurSel+1, mf.m_sName);
	m_lbList.SetCurSel(m_nCurSel+1);
	m_lbList.SetCheck(m_nCurSel+1, (mf.m_dwAction & MFA_ENABLED)!=0 );
	m_nCurSel = m_nCurSel+1;
	OnSelchangeList();
}

void DFilters::OnFltUp() 
{
	if (m_nCurSel<=0 || m_nCurSel>=m_Filters.GetSize())
		return;
	CMailFilter mf = m_Filters[m_nCurSel];
	m_Filters[m_nCurSel] = m_Filters[m_nCurSel-1];
	m_Filters[m_nCurSel-1] = mf;
	m_lbList.DeleteString(m_nCurSel);
	m_lbList.InsertString(m_nCurSel-1, mf.m_sName);
	m_lbList.SetCurSel(m_nCurSel-1);
	m_lbList.SetCheck(m_nCurSel-1, (mf.m_dwAction & MFA_ENABLED)!=0 );
	m_nCurSel = m_nCurSel-1;
	OnSelchangeList();
}

void DFilters::OnChangeFilterName() 
{
	if (m_nCurSel<0 || m_nCurSel>=m_Filters.GetSize())
		return;
	UpdateData();
	m_lbList.DeleteString(m_nCurSel);
	m_lbList.InsertString(m_nCurSel, m_Filters[m_nCurSel].m_sName);
	m_lbList.SetCurSel(m_nCurSel);
}
void AFXAPI SerializeElements(CArchive& ar, CMailFilter* pElements, int nCount)
{
	ASSERT(nCount == 0 ||
		AfxIsValidAddress(pElements, nCount * sizeof(CMailFilter)));

	for (int i=0; i<nCount; i++)
		pElements[i].Serialize(ar);
}

void DFilters::Prepare()
{
	// mailbox list
	m_cbMailbox.ResetContent();
	m_cbMailbox.AddString("*");	// for all boxes
	if (m_pDoc)
	{
		POSITION pos = m_pDoc->m_listMailbox.GetHeadPosition();

		while( pos )
		{
			CMailbox &mbox = *m_pDoc->m_listMailbox.GetNext( pos );
			int idx = m_cbMailbox.AddString(mbox.m_strAlias);
			// we can store string pointer, since no one can change strings,
			//  while dlg is active
			m_cbMailbox.SetItemData(idx, (DWORD)(LPCTSTR)mbox.m_strAlias);
		}
	}
	SendDlgItemMessage(IDC_FLT_UP, BM_SETIMAGE, IMAGE_ICON, 
		(LPARAM)AfxGetApp()->LoadIcon(IDI_UP));
	SendDlgItemMessage(IDC_FLT_DOWN, BM_SETIMAGE, IMAGE_ICON, 
		(LPARAM)AfxGetApp()->LoadIcon(IDI_DOWN));
}

void DFilters::OnFltColorSel() 
{
	if (m_nCurSel<0 || m_nCurSel>=m_Filters.GetSize())
		return;
	CColorDialog dlg(m_Filters[m_nCurSel].m_Color);
	if (dlg.DoModal()!=IDOK)
		return;
	m_Filters[m_nCurSel].m_Color = dlg.GetColor();
	UpdateColor();
}

void DFilters::OnFltColor() 
{
	UpdateData();
	UpdateColor();
}

void DFilters::UpdateColor()
{
	BOOL bStd = (!m_bColor || m_nCurSel<0 || m_nCurSel >= m_Filters.GetSize());
	if (bStd)
		m_Sample.SetColor(TRUE);
	else
		m_Sample.SetColor(FALSE, m_Filters[m_nCurSel].m_Color);
}


void DFilters::OnFlt1Brs() 
{
	if (m_nCurSel<0 || m_nCurSel>=m_Filters.GetSize())
		return;
	DFilterEditor dlg(&m_Filters[m_nCurSel].m_aCnd[0]);
	dlg.DoModal();
	CString s;
	m_Filters[m_nCurSel].m_aCnd[0].ToText(s);
	SetDlgItemText(IDC_FLT1, s);
}

void DFilters::OnFlt2Brs() 
{
	if (m_nCurSel<0 || m_nCurSel>=m_Filters.GetSize())
		return;
	DFilterEditor dlg(&m_Filters[m_nCurSel].m_aCnd[1]);
	dlg.DoModal();
	CString s;
	m_Filters[m_nCurSel].m_aCnd[1].ToText(s);
	SetDlgItemText(IDC_FLT2, s);
}

BOOL FieldToText(int nF, CString& s)
{
	int nMax = sizeof(asFields)/sizeof(asFields[0]);
	if (nF>=0 && nF<nMax)
	{
		s = asFields[nF];
		StrTranslate(s);
		return TRUE;
	}
	return FALSE;
}
BOOL OpToText(int nOp, CString& s)
{
	int nMax = sizeof(asOps)/sizeof(asOps[0]);
	if (nOp>=0 && nOp<nMax)
	{
		s = asOps[nOp];
		StrTranslate(s);
		return TRUE;
	}
	return FALSE;
}

void CFilterCnd::ToText(CString& s)
{
	s.Empty();
	if (m_sText.IsEmpty())
		return;
	CString sField;
	if (!FieldToText(m_nField, sField))
		return;
	CString sOp;
	if (!OpToText(m_nOperation, sOp))
		return;
	s.Format("<%s> %s \'%s\'", sField, sOp, m_sText);
}
/////////////////////////////////////////////////////////////////////////////
// DFilterEditor dialog


DFilterEditor::DFilterEditor(CFilterCnd* pCnd)
	: CDialog(DFilterEditor::IDD, NULL)
{
	//{{AFX_DATA_INIT(DFilterEditor)
	m_sFilterText = _T("");
	m_nField = -1;
	m_nCnd = -1;
	//}}AFX_DATA_INIT
	m_pCnd = pCnd;
}


void DFilterEditor::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DFilterEditor)
	DDX_Control(pDX, IDC_FLT_FIELD, m_cbField);
	DDX_Control(pDX, IDC_FLT_CND, m_cbCondition);
	DDX_Text(pDX, IDC_FLT_TEXT, m_sFilterText);
	DDX_CBIndex(pDX, IDC_FLT_FIELD, m_nField);
	DDX_CBIndex(pDX, IDC_FLT_CND, m_nCnd);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DFilterEditor, CDialog)
	//{{AFX_MSG_MAP(DFilterEditor)
	ON_EN_CHANGE(IDC_FLT_TEXT, OnChangeFltText)
	ON_BN_CLICKED(IDC_EDIT_FILE, OnEditFile)
	ON_CBN_SELENDOK(IDC_FLT_CND, OnUpdateString)
	ON_CBN_SELENDOK(IDC_FLT_FIELD, OnUpdateString)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DFilterEditor message handlers

BOOL DFilterEditor::OnInitDialog() 
{
	CDialog::OnInitDialog();
	DlgTranslate(this);
	// possible fields
	m_cbField.ResetContent();
	int nMax = sizeof(asFields)/sizeof(asFields[0]);
	for (int i=0; i<nMax; i++)
	{
		CString s(asFields[i]);
		StrTranslate(s);
		m_cbField.AddString(s);
	}

	// possible operations
	m_cbCondition.ResetContent();
	nMax = sizeof(asOps)/sizeof(asOps[0]);
	for (i=0; i<nMax; i++)
	{
		CString s(asOps[i]);
		StrTranslate(s);
		m_cbCondition.AddString(s);
	}
	m_sFilterText = m_pCnd->m_sText;
	m_nField = m_pCnd->m_nField;
	m_nCnd = m_pCnd->m_nOperation;
	UpdateData(FALSE);

	OnChangeFltText();

	return TRUE;
}

void DFilterEditor::OnOK() 
{
	UpdateData();

	m_pCnd->m_sText = m_sFilterText;
	m_pCnd->m_nField = (BYTE)m_nField;
	m_pCnd->m_nOperation = (BYTE)m_nCnd;
	
	CDialog::OnOK();
}
void DFilterEditor::OnChangeFltText() 
{
	UpdateData();
	GetDlgItem(IDC_EDIT_FILE)->ShowWindow(m_sFilterText.Find("$")==0);
	UpdateSampleString();
}

void DFilterEditor::UpdateSampleString()
{
	UpdateData();
	CFilterCnd cnd;
	cnd.m_sText = m_sFilterText;
	cnd.m_nField = (BYTE)m_nField;
	cnd.m_nOperation = (BYTE)m_nCnd;
	CString s;
	cnd.ToText(s);
	SetDlgItemText(IDC_SAMPLE, s);
} 

void DFilterEditor::OnEditFile() 
{
	UpdateData();
	CString s;
	if (!FindLocalFile( ((LPCTSTR)m_sFilterText)+1 , s, TRUE) )
	{
		return;
	}
	ShellExecute(NULL, "Open", s, NULL, NULL, SW_SHOW);
}

void DFilterEditor::OnUpdateString() 
{
	UpdateSampleString();
}

void DFilters::OnSelendokCombine() 
{
	UpdateData();
	GetDlgItem(IDC_FLT2)->EnableWindow(m_nCombine>0);
	GetDlgItem(IDC_FLT2_BRS)->EnableWindow(m_nCombine>0);
}

⌨️ 快捷键说明

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