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

📄 keywordmanagerdlg.cpp.svn-base

📁 wince c++ 下 开发的 rss 阅读器源代码
💻 SVN-BASE
字号:
/**
 *  KeywordManagerDlg.cpp
 *
 *  Copyright (C) 2008  David Andrs <pda@jasnapaka.com>
 *
 *  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, see <http://www.gnu.org/licenses/>.
 *
 */

#include "StdAfx.h"
#include "prssr.h"
#include "KeywordManagerDlg.h"
#include "../share/helpers.h"
#include "ProgressDlg.h"
#include "Site.h"
#include "Errors.h"

#ifdef MYDEBUG
#undef THIS_FILE
static TCHAR THIS_FILE[] = _T(__FILE__);
#include "debug/crtdbg.h"
#define new MYDEBUG_NEW
#endif

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

/////////////////////////////////////////////////////////////////////////////
// CKeywordScanProgressDlg dialog

class CKeywordScanProgressDlg : public CProgressDlg {
public:
	CKeywordScanProgressDlg(CWnd *parent);
	virtual ~CKeywordScanProgressDlg();

	CStringArray Keywords;

protected:
	BOOL Terminate;

    //{{AFX_MSG(CKeywordScanProgressDlg)
	//}}AFX_MSG
	virtual BOOL OnInitDialog();

	virtual void OnCancel();
//	virtual void PostNcDestroy();

	DWORD Thread();

	DECLARE_MESSAGE_MAP()

	friend DWORD WINAPI KeywordScanThreadProc(LPVOID lpParameter);
};

CKeywordScanProgressDlg::CKeywordScanProgressDlg(CWnd *parent) :
	CProgressDlg(parent)
{
	m_bFullScreen = FALSE;
}

CKeywordScanProgressDlg::~CKeywordScanProgressDlg() {
}

BEGIN_MESSAGE_MAP(CKeywordScanProgressDlg, CProgressDlg)
	//{{AFX_MSG_MAP(CKeywordScanProgressDlg)
	//}}AFX_MSG_MAP
	ON_MESSAGE(UWM_DIALOG_CLOSE, OnClose)
END_MESSAGE_MAP()

BOOL CKeywordScanProgressDlg::OnInitDialog() {
	LOG0(3, "CKeywordScanProgressDlg::OnInitDialog()");

	CProgressDlg::OnInitDialog();

	CloseHandle(CreateThread(NULL, 0, KeywordScanThreadProc, this, 0, NULL));

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CKeywordScanProgressDlg::OnCancel() {
	LOG0(3, "CKeywordScanProgressDlg::OnCancel()");

	Terminate = TRUE;
	EndDialog(IDCANCEL);
}

/*void CKeywordScanProgressDlg::PostNcDestroy() {
	LOG0(1, "CKeywordScanProgressDlg::PostNcDestroy()");
	// EMPTY: to replace functionality of CProgressDlg
}
*/

DWORD CKeywordScanProgressDlg::Thread() {
	LOG0(1, "CKeywordScanProgressDlg::Thread() - start");

	Terminate = FALSE;

	// update keyword flags in feed items
	for (int i = 0; !Terminate && i < SiteList.GetCount(); i++) {
		SetPos(0);

		CSiteItem *si = SiteList.GetAt(i);

		CString sText;
		sText.Format(IDS_SCANNING_FOR_KEYWORDS, si->Name);
		m_ctlLabel.SetWindowText(sText);

		si->EnsureSiteLoaded();

		CFeed *feed = si->Feed;
		if (feed != NULL) {
			SetTotalSize(0, feed->GetItemCount() + 1);

			if (feed != NULL) {
				for (int j = 0; !Terminate && j < feed->GetItemCount(); j++) {
					CFeedItem *fi = feed->GetItem(j);
					fi->SearchKeywords(Keywords);
					AddSize(1);
				}
			}
		}

		AddSize(1);
	}

	if (!Terminate)
		EndDialog(IDOK);

	LOG0(1, "CKeywordScanProgressDlg::Thread() - end");

	return 0;
}

//

DWORD WINAPI KeywordScanThreadProc(LPVOID lpParameter) {
	CKeywordScanProgressDlg *dlg = (CKeywordScanProgressDlg *) lpParameter;
	return dlg->Thread();
}


/////////////////////////////////////////////////////////////////////////////
// CKeywordManagerDlg dialog


CKeywordManagerDlg::CKeywordManagerDlg(CWnd* pParent /*=NULL*/)
	: CCeDialog(InWideMode() ? CKeywordManagerDlg::IDD_WIDE : CKeywordManagerDlg::IDD, pParent),
	m_ctlKeywords(IDS_NO_KEYWORDS_DEFINED)
{
	//{{AFX_DATA_INIT(CKeywordManagerDlg)
	//}}AFX_DATA_INIT
	SetMenu(IDR_KEYWORD_MANAGER);
	Mode = -1;
}

CKeywordManagerDlg::~CKeywordManagerDlg() {
}

void CKeywordManagerDlg::DoDataExchange(CDataExchange* pDX) {
	LOG0(5, "CKeywordManagerDlg::DoDataExchange()");

	CCeDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CKeywordManagerDlg)
	DDX_Control(pDX, IDC_KEYWORDS, m_ctlKeywords);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CKeywordManagerDlg, CCeDialog)
	//{{AFX_MSG_MAP(CKeywordManagerDlg)
	ON_WM_DESTROY()
	ON_NOTIFY(LVN_KEYDOWN, IDC_KEYWORDS, OnKeydownKeywords)
	ON_NOTIFY(NM_CLICK, IDC_KEYWORDS, OnClickKeywords)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_KEYWORDS, OnItemchangedKeywords)
	ON_NOTIFY(LVN_ENDLABELEDIT, IDC_KEYWORDS, OnEndlabeleditKeywords)
	//}}AFX_MSG_MAP
	ON_NOTIFY(GN_CONTEXTMENU, IDC_KEYWORDS, OnContextMenu)
	ON_COMMAND(ID_REMOVE, OnRemove)
	ON_UPDATE_COMMAND_UI(ID_REMOVE, OnUpdateRemove)
	ON_COMMAND(ID_EDIT, OnEdit)
	ON_UPDATE_COMMAND_UI(ID_EDIT, OnUpdateEdit)
	ON_COMMAND(ID_NEW, OnNew)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKeywordManagerDlg message handlers

BOOL CKeywordManagerDlg::OnInitDialog() {
	LOG0(3, "CKeywordManagerDlg::OnInitDialog()");

	CCeDialog::OnInitDialog();

	m_ctlKeywords.SetExtendedStyle(LVS_EX_FULLROWSELECT);

	// fill list control
	CRect rc;
	m_ctlKeywords.GetClientRect(&rc);

	CString sHeading;
	sHeading.LoadString(IDS_KEYWORD);
	m_ctlKeywords.InsertColumn(0, sHeading, LVCFMT_LEFT, rc.Width());

	// new keyword
	CString sText;
	sText.LoadString(IDS_NEW_KEYWORD);
	int item = m_ctlKeywords.InsertItem(0, sText);
	m_ctlKeywords.SetItemData(item, FALSE);

	// keywords
	for (int i = 0; i < Keywords.GetSize(); i++) {
		CString keyword = Keywords.GetAt(i);
		item = m_ctlKeywords.InsertItem(m_ctlKeywords.GetItemCount(), keyword);
		m_ctlKeywords.SetItemData(item, TRUE);
	}

	return TRUE;
}

void CKeywordManagerDlg::UpdateControls() {
}

void CKeywordManagerDlg::OnDestroy() {
	LOG0(3, "CKeywordManagerDlg::OnDestroy()");

	Keywords.RemoveAll();
	for (int i = 1; i < m_ctlKeywords.GetItemCount(); i++) {	// start with 1 to skip ("New Keyword")
		Keywords.Add(m_ctlKeywords.GetItemText(i, 0));
	}

	CCeDialog::OnDestroy();
}

void CKeywordManagerDlg::OnItemchangedKeywords(NMHDR *pNMHDR, LRESULT *pResult) {
	LOG0(5, "CKeywordManagerDlg::OnItemchangedKeywords()");

	NM_LISTVIEW *pNMListView = (NM_LISTVIEW *) pNMHDR;

	UpdateControls();

	*pResult = 0;
}

void CKeywordManagerDlg::OnRemove() {
	LOG0(3, "CKeywordManagerDlg::OnRemove()");

	int nSelItem = m_ctlKeywords.GetNextItem(0, LVNI_SELECTED);
	if (nSelItem != -1 && m_ctlKeywords.GetItemData(nSelItem) == TRUE &&
		PrssrMessageBox(IDS_CONFIRM_OPERATION, IDS_DELETE_KEYWORDS, MB_YESNO | MB_ICONSTOP, IDS_DELETE) == IDYES)
	{
		m_ctlKeywords.SetRedraw(FALSE);
		int nSelItem = m_ctlKeywords.GetNextItem(0, LVNI_SELECTED);
		while (nSelItem != -1) {
			m_ctlKeywords.DeleteItem(nSelItem);
			nSelItem = m_ctlKeywords.GetNextItem(nSelItem - 1, LVNI_SELECTED);
		}
		m_ctlKeywords.SetRedraw(TRUE);
	}
}

void CKeywordManagerDlg::OnUpdateRemove(CCmdUI *pCmdUI) {
	LOG0(5, "CKeywordManagerDlg::OnUpdateRemove()");

	int item = m_ctlKeywords.GetNextItem(-1, LVNI_SELECTED);
	if (item != -1)
		pCmdUI->Enable(m_ctlKeywords.GetItemData(item) == TRUE);
	else
		pCmdUI->Enable(FALSE);
}

void CKeywordManagerDlg::OnEndlabeleditKeywords(NMHDR *pNMHDR, LRESULT *pResult) {
	LOG0(5, "CKeywordManagerDlg::OnEndlabeleditKeywords()");

	LV_DISPINFO *pDispInfo = (LV_DISPINFO *) pNMHDR;

	BOOL keyword = m_ctlKeywords.GetItemData(pDispInfo->item.iItem);
	if (keyword) {
		if (pDispInfo->item.pszText != NULL) {
			if (lstrlen(pDispInfo->item.pszText) > 0)
				m_ctlKeywords.SetItemText(pDispInfo->item.iItem, 0, pDispInfo->item.pszText);
			else
				m_ctlKeywords.DeleteItem(pDispInfo->item.iItem);
		}
	}
	else {
		if (pDispInfo->item.pszText != NULL && lstrlen(pDispInfo->item.pszText) > 0) {
			// add new
			int item = m_ctlKeywords.InsertItem(m_ctlKeywords.GetItemCount(), pDispInfo->item.pszText);
			m_ctlKeywords.SetItemData(item, 1);
		}

		CString sText;
		sText.LoadString(IDS_NEW_KEYWORD);
		m_ctlKeywords.SetItemText(pDispInfo->item.iItem, 0, sText);
	}

	*pResult = FALSE;
}

void CKeywordManagerDlg::EditKeyword(int item) {
	LOG0(3, "CKeywordManagerDlg::EditKeyword()");

	m_ctlKeywords.SetFocus();
	CEdit *edit = m_ctlKeywords.EditLabel(item);
	if (edit != NULL && m_ctlKeywords.GetItemData(item) == FALSE)	// "new keyword" tapped
		edit->Clear();
}

void CKeywordManagerDlg::OnKeydownKeywords(NMHDR *pNMHDR, LRESULT *pResult) {
	LOG0(5, "CKeywordManagerDlg::OnKeydownKeywords()");

	LV_KEYDOWN *plvkd = (LV_KEYDOWN *) pNMHDR;

	if (plvkd->wVKey == VK_RETURN) {
		int item = m_ctlKeywords.GetNextItem(-1, LVNI_SELECTED);
		if (item != -1)
			EditKeyword(item);
	}

	*pResult = 0;
}

void CKeywordManagerDlg::OnClickKeywords(NMHDR *pNMHDR, LRESULT *pResult) {
	LOG0(5, "CKeywordManagerDlg::OnClickKeywords()");

	NMLISTVIEW *pnmlv = (NMLISTVIEW *) (pNMHDR);

	int item = m_ctlKeywords.GetNextItem(-1, LVNI_SELECTED);
	if (item != -1)
		EditKeyword(item);

	*pResult = 0;
}

void CKeywordManagerDlg::OnContextMenu(NMHDR *pNMHDR, LRESULT *pResult) {
	LOG0(1, "CKeywordManagerDlg::OnContextMenu()");

	// GN_CONTEXTMENU sends NMRGINFO structure through notify struct parameter
	PNMRGINFO pInfo = (PNMRGINFO) pNMHDR;

	CMenu popup;
	popup.LoadMenu(IDR_KEYWORD_MANAGER_CTX);
	CMenu *submenu = popup.GetSubMenu(0);
	submenu->TrackPopupMenu(TPM_LEFTALIGN, pInfo->ptAction.x, pInfo->ptAction.y, this);

	*pResult = TRUE; // This is important!
}

void CKeywordManagerDlg::OnEdit() {
	LOG0(1, "CKeywordManagerDlg::OnEdit()");

	int item = m_ctlKeywords.GetNextItem(-1, LVNI_SELECTED);
	if (item != -1)
		EditKeyword(item);
}

void CKeywordManagerDlg::OnUpdateEdit(CCmdUI *pCmdUI) {
	LOG0(5, "CKeywordManagerDlg::OnUpdateEdit()");

	int item = m_ctlKeywords.GetNextItem(-1, LVNI_SELECTED);
	if (item != -1)
		pCmdUI->Enable(m_ctlKeywords.GetItemData(item) == TRUE);
	else
		pCmdUI->Enable(FALSE);
}

void CKeywordManagerDlg::OnNew() {
	LOG0(1, "CKeywordManagerDlg::OnNew()");

	EditKeyword(0);
}

void CKeywordManagerDlg::OnOK() {
	LOG0(3, "CKeywordManagerDlg::OnOK()");

	BOOL dirty = FALSE;
	if (Keywords.GetSize() == m_ctlKeywords.GetItemCount() - 1) {
		for (int i = 0; i < Keywords.GetSize(); i++) {
			CString oldKeyword = Keywords.GetAt(i);
			CString newKeyword = m_ctlKeywords.GetItemText(i + 1, 0);
			if (oldKeyword.CompareNoCase(newKeyword) != 0) {
				dirty = TRUE;
				break;
			}
		}
	}
	else
		dirty = TRUE;

	if (dirty) {
		CKeywordScanProgressDlg *dlg = new CKeywordScanProgressDlg(this);
		for (int i = 1; i < m_ctlKeywords.GetItemCount(); i++)	// start with 1 to skip ("New Keyword")
			dlg->Keywords.Add(m_ctlKeywords.GetItemText(i, 0));

		if (dlg->DoModal() == IDOK) {
			CCeDialog::OnOK();
		}
	}
	else
		EndDialog(IDCANCEL);
}

void CKeywordManagerDlg::ResizeControls() {
	LOG0(1, "CKeywordManagerDlg::ResizeControls()");

	RelayoutDialog(AfxGetInstanceHandle(), GetSafeHwnd(), InWideMode() ?
		MAKEINTRESOURCE(IDD_WIDE) :
		MAKEINTRESOURCE(IDD));

	if (!InWideMode()) {
		CRect rc;
		GetWindowRect(&rc);
		CRect rcKey;
		m_ctlKeywords.GetWindowRect(&rcKey);
		m_ctlKeywords.SetWindowPos(NULL, 0, 0, rc.Width() - SCALEX(13), rc.bottom - rcKey.top - SCALEY(5), SWP_NOZORDER | SWP_NOMOVE);

		m_ctlKeywords.GetClientRect(&rcKey);
		m_ctlKeywords.SetColumnWidth(0, rcKey.Width());
	}
}

⌨️ 快捷键说明

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