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

📄 mainfrm.cpp.svn-base

📁 wince c++ 下 开发的 rss 阅读器源代码
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
/**
 *  MainFrm.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 "../share/UIHelper.h"
#include "../share/reg.h"
#include "../share/fs.h"

#include "MainFrm.h"
#include "FeedView.h"
#include "SummaryView.h"
#include "misc/icon.h"

#include "SiteManagerDlg.h"
#include "KeywordManagerDlg.h"
#include "ErrorsDlg.h"
#include "UpdateSitesDlg.h"

#include "ctrls/CePropertySheet.h"

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

#include "Site.h"
#include "misc/shnotif.h"

// info
#include "InfoGeneralPg.h"
#include "InfoChannelPg.h"
#include "InfoDescriptionPg.h"

#include "Properties.h"

// options
#include "OptGeneralPg.h"
#include "OptCachePg.h"
#include "OptRetrievalPg.h"
#include "OptSyncPg.h"
#include "OptConnectionPg.h"
#include "OptAppearancePg.h"
#include "../share/notif.h"

#include "RewritingDlg.h"
// cache manager
#include "CacheMan.h"

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

#define ID_MENU_MY_CHANNELS				0x1FFF
#define ID_MENU_SITE_BASE				0x1000


// width of icon in the topbar + width of drop-down button + margin + width of sort indicator
#define CX_ICON							SCALEX(22 + 17)

// top bar icon indexes
#define TOPBAR_IMAGE_COUNT				6

#define TOPBAR_IMAGE_OK					0
#define TOPBAR_IMAGE_FOLDER				1
#define TOPBAR_IMAGE_ERROR				2
#define TOPBAR_IMAGE_LOADING			3

#define TOPBAR_IMAGE_ASC				4
#define TOPBAR_IMAGE_DESC				5

// icons for enclosures
#define ICON_SITE						0
#define ICON_AUDIO						4
#define ICON_VIDEO						6
#define ICON_IMAGE						8
#define ICON_OTHER						10

//


DWORD WINAPI LoadSitesStubProc(LPVOID lpParameter) {
	CMainFrame *frame = (CMainFrame *) lpParameter;
	frame->LoadSites();
	return 0;
}

DWORD WINAPI SaveSitesStubProc(LPVOID lpParameter) {
	CMainFrame *frame = (CMainFrame *) lpParameter;
	frame->SaveSitesThread();
	return 0;
}

DWORD WINAPI PreloadSitesStubProc(LPVOID lpParameter) {
	CMainFrame *frame = (CMainFrame *) lpParameter;
	frame->PreloadThread();
	return 0;
}

DWORD WINAPI SyncItemsStubProc(LPVOID lpParameter) {
	CMainFrame *frame = (CMainFrame *) lpParameter;
	frame->SyncItemsThread();
	return 0;
}

//// forward declaration
//DWORD WINAPI PeriodicUpdateThreadStub(LPVOID lpParameter);

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_SETFOCUS()
	ON_WM_SIZE()
//	ON_WM_INITMENUPOPUP()
	ON_WM_TIMER()
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
	ON_WM_ENTERMENULOOP()

	ON_COMMAND(ID_FILE_INFORMATION, OnFileInformation)
	ON_UPDATE_COMMAND_UI(ID_FILE_INFORMATION, OnUpdateFileInformation)

	ON_COMMAND(ID_FILE_PROPERTIES, OnFileProperties)
	ON_UPDATE_COMMAND_UI(ID_FILE_PROPERTIES, OnUpdateFileProperties)

	ON_COMMAND(ID_WORK_OFFLINE, OnFileWorkOffline)
	ON_COMMAND(ID_CACHE_FLAGGED, OnFileCacheFlagged)
	ON_COMMAND(ID_CACHE_UNREAD, OnFileCacheUnread)

	ON_COMMAND(ID_TOOLS_UPDATEALLCHANNELS, OnToolsUpdateAllChannels)
	ON_UPDATE_COMMAND_UI(ID_TOOLS_UPDATEALLCHANNELS, OnUpdateToolsUpdateAllChannels)
	ON_COMMAND(ID_TOOLS_UPDATECHANNELS, OnToolsUpdateChannels)
	ON_UPDATE_COMMAND_UI(ID_TOOLS_UPDATECHANNELS, OnUpdateToolsUpdateChannels)

	ON_COMMAND(ID_TOOLS_SUMMARYVIEW, OnToolsSummaryview)
	ON_UPDATE_COMMAND_UI(ID_TOOLS_SUMMARYVIEW, OnUpdateToolsSummaryview)

	ON_COMMAND(ID_TOOLS_SITEMANAGER, OnToolsSiteManager)
	ON_UPDATE_COMMAND_UI(ID_TOOLS_SITEMANAGER, OnUpdateToolsSiteManager)

	ON_COMMAND(ID_TOOLS_KEYWORDMANAGER, OnToolsKeywordManager)
	ON_UPDATE_COMMAND_UI(ID_TOOLS_KEYWORDMANAGER, OnUpdateToolsKeywordManager)

	ON_COMMAND(ID_TOOLS_ERRORS, OnToolsErrors)
	ON_COMMAND(ID_TOOLS_CACHEMANAGER, OnToolsCacheManager)
	ON_COMMAND(ID_TOOLS_OPTIONS, OnToolsOptions)

	ON_COMMAND(ID_TOOLS_MARKALLITEMSREAD, OnToolsMarkAllRead)
	ON_UPDATE_COMMAND_UI(ID_TOOLS_MARKALLITEMSREAD, OnUpdateToolsMarkAllRead)
	ON_COMMAND(ID_TOOLS_MARKALLITEMSUNREAD, OnToolsMarkAllUnread)
	ON_UPDATE_COMMAND_UI(ID_TOOLS_MARKALLITEMSUNREAD, OnUpdateToolsMarkAllUnread)
	ON_COMMAND(ID_TOOLS_MAKRASUNFLAGGED, OnToolsMarkAllUnflagged)

	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR + 1, OnTopBarClick)
//	ON_COMMAND(IDC_ACT_SITE, OnOpenSiteList)
	ON_COMMAND_RANGE(ID_MENU_SITE_BASE - 2, ID_MENU_SITE_BASE + 1000, OnSiteSelected)
	ON_COMMAND(ID_OPEN_SITE_LIST, OnOpenSiteList)
	ON_COMMAND(ID_MENU_MY_CHANNELS, OnToolsSummaryview)

	ON_COMMAND(ID_CACHE_GET_ONLINECONTENT, OnCacheGetOnlineContent)
	ON_COMMAND(ID_CACHE_GET_IMAGES, OnCacheGetImages)
	ON_COMMAND(ID_ENCLOSURE_OPEN, OnEnclosuresOpen)
	ON_COMMAND(ID_ENCLOSURE_GET, OnEnclosuresGet)
	ON_COMMAND(ID_ENCLOSURE_DELETE, OnEnclosuresDelete)

	ON_COMMAND(ID_VIEW_SORTBY_DATE, OnViewSortbyDate)
	ON_COMMAND(ID_VIEW_SORTBY_READ, OnViewSortbyRead)
	ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_SORTBY_DATE, ID_VIEW_SORTBY_READ, OnUpdateSortby)

	ON_COMMAND(ID_OPEN, OnOpenPRSSreader)
	ON_COMMAND(ID_HIDE, OnHide)

	ON_COMMAND(ID_REWRITE_RULES, OnRewriteRules)

	ON_COMMAND(ID_TOOLS_FEEDVIEW, OnFeedListView)

	ON_MESSAGE(WM_HIBERNATE, OnHibernate)
	ON_MESSAGE(UWM_SHOW_UPDATEBAR, OnShowUpdateBar)
	ON_MESSAGE(UWM_UPDATE_FEED, OnUpdateFeed)
	ON_MESSAGE(UWM_UPDATE_FAVICON, OnUpdateFavicon)
	ON_MESSAGE(UWM_UPDATE_ALL, OnUpdateAll)
	ON_MESSAGE(UWM_UPDATE_FINISHED, OnUpdateFinished)

	ON_MESSAGE(UWM_OPEN_SITE, OnOpenSite)
	ON_MESSAGE(UWM_OPEN_FEEDITEM, OnOpenFeedItem)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame() {
	View = SummaryView;

	SiteMenuOpened = FALSE;

	HTerminate = CreateEvent(NULL, TRUE, FALSE, NULL);

//	HSaveSiteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	HPreloadSiteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	HSaveSitesThread = NULL;
	HSyncItemsThread = NULL;
	Syncer = NULL;
	HSyncItemEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	CtxMenuTimer = 1;
	m_bOpenCtxMenu = FALSE;
	m_bMenuOpened = FALSE;
}

CMainFrame::~CMainFrame() {
	CloseHandle(HTerminate);
//	CloseHandle(HSaveSiteEvent);
	CloseHandle(HPreloadSiteEvent);
	CloseHandle(HSyncItemEvent);

	delete Syncer;
}

void CMainFrame::CreateSyncer() {
	switch (Config.SyncSite) {
		case SYNC_SITE_GOOGLE_READER: Syncer = new CGReaderSync(&Downloader, Config.SyncUserName, Config.SyncPassword);  break;
		default: Syncer = new CNetworkSync(&Downloader); break;
	}
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
	LOG0(3, "CMainFrame::OnCreate()");

	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	// view
	switch (Config.MainView) {
		case MAIN_VIEW_FEED_LIST:
			m_wndFeedView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL);
			m_wndSummaryView.Create(NULL, NULL, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST + 1, NULL);
			m_wndArticleView.Create(NULL, NULL, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST + 2, NULL);
			break;

		case MAIN_VIEW_ARTICLE:
			m_wndArticleView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW | WS_VISIBLE | WS_CLIPSIBLINGS, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL);
			m_wndSummaryView.Create(NULL, NULL, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST + 1, NULL);
			m_wndFeedView.Create(NULL, NULL, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST + 2, NULL);
			break;

		default:
		case MAIN_VIEW_SUMMARY_VIEW:
			m_wndSummaryView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL);
			m_wndFeedView.Create(NULL, NULL, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST + 1, NULL);
			m_wndArticleView.Create(NULL, NULL, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST + 2, NULL);
			break;
	}
	m_wndArticleView.View = &m_wndFeedView;
	m_wndFeedView.m_bWrapTitles = Config.WrapTitles;

	// top bar
	DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_BORDER_BOTTOM;
	CRect rcBorder(0, 0, 0, 0);
	if (!m_wndTopBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_DROPDOWN | TBSTYLE_LIST, dwStyle,
		rcBorder, AFX_IDW_TOOLBAR + 1)) {
	   	TRACE0("Failed to create Top Bar\n");
		return -1;      // fail to create
	}
	m_wndTopBar.SetHeight(SCALEY(21));

	// top bar
	CToolBarCtrl &ctlToolBar = m_wndTopBar.GetToolBarCtrl();
	AfxSetResourceHandle(theApp.GetDPISpecificInstanceHandle());
	m_ilIcons.Create(IDB_SITE_ITEMS, SCALEX(16), 100, RGB(192, 192, 192));
	AfxSetResourceHandle(AfxGetInstanceHandle());
	ctlToolBar.SetImageList(&m_ilIcons);
	ctlToolBar.SetBitmapSize(CSize(SCALEX(16), SCALEY(16)));
	ctlToolBar.AddStrings(_T("\0"));

	ctlToolBar.SetFont(&Appearance.BaseFont);

	// separator
	TBBUTTON btn = { 0 };
	btn.iBitmap		= I_IMAGENONE;
	btn.idCommand	= ID_TOOLBAR_SEPARATOR;
	btn.fsState		= TBSTATE_ENABLED;
	btn.iString     = -1;
	ctlToolBar.InsertButton(0, &btn);


	EnableDocking(CBRS_ALIGN_ANY);

	// update bar
	if (!m_wndUpdateBar.Create(this)) {
	   	TRACE0("Failed to create Update Bar\n");
		return -1;      // fail to create
	}

	// banner
	if (!m_wndBanner.Create(this)) {
	   	TRACE0("Failed to create Banner\n");
		return -1;      // fail to create
	}

	// enclosure bar
	m_wndEnclosureBar.Create(this);

	// info bar
	m_wndInfoBar.Create(this);

//	m_wndTopBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndTopBar.EnableDocking(CBRS_ALIGN_TOP);

	// banner
	m_wndBanner.SetImageList(&m_ilIcons);
	m_wndBanner.SetSmbImageList(&m_wndFeedView.m_oIcons);
//	m_wndBanner.EnableDocking(CBRS_ALIGN_ANY);
	m_wndBanner.EnableDocking(CBRS_ALIGN_TOP);

	m_wndEnclosureBar.EnableDocking(CBRS_ALIGN_BOTTOM);
	m_wndInfoBar.EnableDocking(CBRS_ALIGN_BOTTOM);

	DockControlBar(&m_wndTopBar);
//	DockControlBar(&m_wndUpdateBar);
	DockControlBar(&m_wndBanner);
	DockControlBar(&m_wndEnclosureBar);
	DockControlBar(&m_wndInfoBar);

	///
	switch (Config.MainView) {
		case MAIN_VIEW_FEED_LIST:
			SetupFeedView();
			m_wndFeedView.SetFocus();
			break;

		case MAIN_VIEW_ARTICLE:
			// to display the HTML ctrl in proper dimensions
			m_wndArticleView.SetDlgCtrlID(AFX_IDW_PANE_FIRST);
			m_wndArticleView.ShowWindow(SW_SHOW);

			SetupArticleView();
			m_wndArticleView.SetFocus();
			break;

		default:
		case MAIN_VIEW_SUMMARY_VIEW:
			SetupSummaryView();
			m_wndSummaryView.SetFocus();
			break;
	}


	//
	CString strLabel;
	UnreadItems.FlagMask = MESSAGE_UNREAD | MESSAGE_NEW;
	UnreadItems.Name.LoadString(IDS_UNREAD);
	UnreadItems.ImageIdx = 1;

	FlaggedItems.FlagMask = MESSAGE_FLAG;
	FlaggedItems.Name.LoadString(IDS_FLAGGED);
	FlaggedItems.ImageIdx = 1;

	LoadSites();


	int height = GetSystemMetrics(SM_CYSCREEN);
	CRect rc;
	GetClientRect(&rc);
	SetWindowPos(NULL, 0, SCALEY(26), rc.Width(), height - SCALEY(52), SWP_NOZORDER);

	//

//	HSaveSitesThread = CreateThread(NULL, 0, SaveSitesStubProc, this, 0, NULL);
//	SetThreadPriority(HSaveSitesThread, THREAD_PRIORITY_LOWEST);
	HSaveSitesThread = NULL;

	HPreloadThread = CreateThread(NULL, 0, PreloadSitesStubProc, this, 0, NULL);
//	SetThreadPriority(HPreloadThread, THREAD_PRIORITY_LOWEST);

	CreateSyncer();
	HSyncItemsThread = CreateThread(NULL, 0, SyncItemsStubProc, this, 0, NULL);

	UpdateSort();
	UpdateMenu();
	UpdateWorkOfflineMenu();

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs) {
	LOG0(5, "CMainFrame::PreCreateWindow()");

	cs.lpszClass = PRSSR_CLASS_NAME;
	if (!CFrameWnd::PreCreateWindow(cs))
		return FALSE;

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const {
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const {
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSetFocus(CWnd* pOldWnd) {
	LOG0(5, "CMainFrame::OnSetFocus()");

	// forward focus to the view window
	if (View == FeedView) m_wndFeedView.SetFocus();
	else if (View == SummaryView) m_wndSummaryView.SetFocus();
	else if (View == ArticleView) m_wndArticleView.SetFocus();
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) {
	LOG0(5, "CMainFrame::OnCmdMsg()");

	// let the view have first crack at the command
	switch (View) {
		case FeedView:
			if (m_wndFeedView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE;
			break;

		case SummaryView:
			if (m_wndSummaryView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE;
			break;

⌨️ 快捷键说明

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