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

📄 sitemanagerdlg.cpp.svn-base

📁 wince c++ 下 开发的 rss 阅读器源代码
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
/**
 *  SiteManagerDlg.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 "SiteManagerDlg.h"

#include "Config.h"
#include "Appearance.h"
#include "Errors.h"

#include "AddFeedDlg.h"
#include "SearchDlg.h"
#include "SearchResultsDlg.h"
#include "ImportFeedsDlg.h"

#include "Properties.h"

#include "ctrls/CePropertySheet.h"
#include "ctrls/BrowseDlg.h"

#include "xml/FeedFile.h"
#include "xml/OpmlFile.h"

#include "misc.h"
#include "../share/fs.h"

#include "ProgressDlg.h"
#include "net/Download.h"
#include "net/Connection.h"
#include "sync/NetworkSync.h"
#include "sync/GReaderSync.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

// OPML file name
#define OPML_FILENAME						_T("myChannels.opml")


/////////////////////////////////////////////////////////////////////////////
// CSiteTreeCtrl control

CSiteTreeCtrl::CSiteTreeCtrl(UINT nID) :
	CCeTreeCtrl(nID)
{
}

BEGIN_MESSAGE_MAP(CSiteTreeCtrl, CCeTreeCtrl)
	//{{AFX_MSG_MAP(CSiteTreeCtrl)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CSiteTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) {
	// Select the item that is at the point myPoint.
	UINT uFlags;
	HTREEITEM hItem = HitTest(point, &uFlags);

	if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
		SelectItem(hItem);

	// The code below fixes wrong MFC behaviour on Pocket PC 2002 devices
	// (running circles appears twice while you tap and hold
	Default();
}

/////////////////////////////////////////////////////////////////////////////
// CExportDlg control

class CExportDlg : public CBrowseDlg {
public:
	CExportDlg(CWnd *pParent = NULL);

	// Generated message map functions
	//{{AFX_MSG(CExportDlg)
	afx_msg void OnExport();
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};

CExportDlg::CExportDlg(CWnd *pParent/* = NULL*/) : CBrowseDlg(FALSE, pParent) {
	m_strCaption.LoadString(IDS_EXPORT_OPML_FILE);
	m_strPath = _T("\\");

	m_nMenuID = IDR_EXPORT_OPML;
}

BEGIN_MESSAGE_MAP(CExportDlg, CBrowseDlg)
	//{{AFX_MSG_MAP(CExportDlg)
	ON_COMMAND(ID_EXPORT, OnExport)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CExportDlg::OnExport() {
	if (UpdateData())
		EndDialog(IDOK);
}


/////////////////////////////////////////////////////////////////////////////
// CSyncProgressDlg dialog

class CSyncProgressDlg : public CProgressDlg {
public:
	CSyncProgressDlg(CDownloader *downloader, CDialog *parent);
	virtual ~CSyncProgressDlg();

protected:
	UINT Timer;
	UINT ProgressRefreshTimer;
	EDownloadState State;
	CDownloader *Downloader;
	CDialog *Parent;

	int RangeHi, PosOffset;

    //{{AFX_MSG(CSyncProgressDlg)
	afx_msg void OnTimer(UINT nIDEvent);
	afx_msg void OnDestroy();
	//}}AFX_MSG
	virtual BOOL OnInitDialog();

	virtual void OnCancel();

	DECLARE_MESSAGE_MAP()
};

CSyncProgressDlg::CSyncProgressDlg(CDownloader *downloader, CDialog *parent) {
	Downloader = downloader;
	State = DOWNLOAD_STATE_NONE;
	Timer = 1;
	ProgressRefreshTimer = 2;

	Parent = parent;
	RangeHi = 160000;
	PosOffset = 0;
}

CSyncProgressDlg::~CSyncProgressDlg() {
}

BEGIN_MESSAGE_MAP(CSyncProgressDlg, CProgressDlg)
	//{{AFX_MSG_MAP(CSyncProgressDlg)
	ON_WM_TIMER()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

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

	SetTimer(Timer, 500, NULL);
	SetTimer(ProgressRefreshTimer, 700, NULL);
	CProgressDlg::OnInitDialog();

	SetRange(0, RangeHi);

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

void CSyncProgressDlg::OnDestroy() {
	KillTimer(Timer);
	KillTimer(ProgressRefreshTimer);

	CProgressDlg::OnDestroy();
}

void CSyncProgressDlg::OnTimer(UINT nIDEvent) {
	if (nIDEvent == Timer) {
	}
	else if (nIDEvent == ProgressRefreshTimer) {
		if (Downloader != NULL) {
			int newPos = PosOffset + (int) Downloader->GetDownloadedFileSize();
			if (newPos > RangeHi) {
				RangeHi *= 10;
				SetRange(0, RangeHi);
			}
			SetPos(newPos);
		}
	}

	CWnd::OnTimer(nIDEvent);
}

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

	KillTimer(ProgressRefreshTimer);
	KillTimer(Timer);

	if (Downloader != NULL)
		Downloader->Terminate();

	CProgressDlg::OnCancel();
}

/////////////////////////////////////////////////////////////////////////////
// CSiteManagerDlg dialog

#define ID_MOVE_TO_GROUP_BASE				0xA000

#define SITE_ICON							0
//#define GROUP_ICON							6


CSiteManagerDlg::CSiteManagerDlg(CWnd* pParent /*=NULL*/)
	: CCeDialog(InWideMode() ? CSiteManagerDlg::IDD_WIDE : CSiteManagerDlg::IDD, pParent),
	m_ctlSites(IDS_NO_FEEDS_DEFINED)
{
	//{{AFX_DATA_INIT(CSiteManagerDlg)
	//}}AFX_DATA_INIT
	m_bAddingGroup = FALSE;
	Root = NULL;
	m_nMenuID = IDR_SITE_MANAGER;
//	m_strCaption.LoadString(IDS_SITE_MANAGER);
	ShowNewChannelsOnToday = CONFIG_DEFAULT_SHOWNEWCHANNELS;

	Syncer = NULL;
}

CSiteManagerDlg::~CSiteManagerDlg() {
}

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

	CCeDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSiteManagerDlg)
	DDX_Control(pDX, IDC_SITES, m_ctlSites);
	DDX_Control(pDX, IDC_HRULE1, m_ctlHrule);
	DDX_Control(pDX, IDC_MOVE_UP, m_ctlMoveUp);
	DDX_Control(pDX, IDC_MOVE_DOWN, m_ctlMoveDown);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSiteManagerDlg, CCeDialog)
	//{{AFX_MSG_MAP(CSiteManagerDlg)
	ON_BN_CLICKED(IDOK, OnOk)
	ON_BN_CLICKED(IDC_MOVE_DOWN, OnMoveDown)
	ON_BN_CLICKED(IDC_MOVE_UP, OnMoveUp)
	ON_NOTIFY(TVN_SELCHANGED, IDC_SITES, OnSelchangedSites)
	ON_NOTIFY(TVN_ENDLABELEDIT, IDC_SITES, OnEndlabeleditSites)
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_ADD_FEED, OnAddFeed)
	ON_COMMAND(ID_ADD_GROUP, OnAddGroup)
	ON_COMMAND(ID_REMOVE, OnRemove)
	ON_COMMAND(ID_RENAME, OnRename)
	ON_COMMAND(ID_SITE_EDIT, OnEdit)
	ON_COMMAND(ID_SEARCH_FOR_FEEDS, OnSearch)
	ON_COMMAND(ID_IMPORT_OPML_FILE, OnImportOpml)
	ON_COMMAND(ID_EXPORT_OPML_FILE, OnExportOpml)
	ON_COMMAND(ID_SYNC_SUBSCRIPTIONS, OnSyncSubscriptions)
	ON_UPDATE_COMMAND_UI(ID_SYNC_SUBSCRIPTIONS, OnUpdateSyncSubscriptions)

	ON_COMMAND(IDCANCEL, OnCancel)
	ON_NOTIFY(GN_CONTEXTMENU, IDC_SITES, OnContextMenu)
	ON_COMMAND_RANGE(ID_MOVE_TO_GROUP_BASE, ID_MOVE_TO_GROUP_BASE + 1000, OnMoveToGroup)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSiteManagerDlg message handlers

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

	CCeDialog::OnInitDialog();

	if (InWideMode())
		m_ctlHrule.SetFrame(HR_LEFT);
	else
		m_ctlHrule.SetFrame(HR_TOP);

	// icons
	AfxSetResourceHandle(theApp.GetDPISpecificInstanceHandle());
	m_oImageList.Create(IDB_SITE_ITEMS, SCALEX(16), 0, RGB(192, 192, 192));
	AfxSetResourceHandle(AfxGetInstanceHandle());

	// add folder icon
	SHFILEINFO sfi = { 0 };
	ZeroMemory(&sfi, sizeof(sfi));
	SHGetFileInfo(_T("\\"), 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_SMALLICON);
	m_nGroupIcon = m_oImageList.Add(sfi.hIcon);

	m_ctlSites.SetImageList(&m_oImageList, TVSIL_NORMAL);

	AddItem(TVI_ROOT, Root);

	m_ctlSites.Expand(m_ctlSites.GetRootItem(), TVE_EXPAND);	// root must be always expanded

	SetForegroundWindow();
	UpdateControls();

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

void CSiteManagerDlg::UpdateControls() {
	HTREEITEM selItem = m_ctlSites.GetSelectedItem();

	m_ctlMoveDown.EnableWindow(selItem != NULL && selItem != m_ctlSites.GetRootItem());
	m_ctlMoveUp.EnableWindow(selItem != NULL && selItem != m_ctlSites.GetRootItem());
}

HTREEITEM CSiteManagerDlg::GetGroupItem() {
	HTREEITEM hSelItem = m_ctlSites.GetSelectedItem();
	HTREEITEM hParent;
	if (hSelItem != NULL) {
		CSiteItem *si = (CSiteItem *) m_ctlSites.GetItemData(hSelItem);
		if (si->Type == CSiteItem::Group)
			hParent = hSelItem;
		else
			hParent = m_ctlSites.GetParentItem(hSelItem);
	}
	else {
		hParent = m_ctlSites.GetRootItem();
	}

	return hParent;
}

HTREEITEM CSiteManagerDlg::InsertSite(HTREEITEM hParent, CSiteItem *item, HTREEITEM hInsertAfter/* = TVI_LAST*/) {
	LOG0(5, "CSiteManagerDlg::InsertSite()");

	HTREEITEM hItem = m_ctlSites.InsertItem(item->Name, SITE_ICON, SITE_ICON, hParent, hInsertAfter);
	m_ctlSites.SetItemData(hItem, (DWORD) item);

	MapUrlToTreeItem.SetAt(item->Info->XmlUrl, hItem);

	return hItem;
}

HTREEITEM CSiteManagerDlg::InsertGroup(HTREEITEM hParent, CSiteItem *group, HTREEITEM hInsertAfter/* = TVI_LAST*/) {
	LOG0(5, "CSiteManagerDlg::InsertGroup()");

	CString strName = group->Name;
	if (hParent == TVI_ROOT)
		strName.LoadString(IDS_ROOT_GROUP);

	HTREEITEM hItem = m_ctlSites.InsertItem(strName, m_nGroupIcon, m_nGroupIcon, hParent, hInsertAfter);
	m_ctlSites.SetItemData(hItem, (DWORD) group);

	MapGroupToTreeItem.SetAt(strName, hItem);

	return hItem;

⌨️ 快捷键说明

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