?? mainfrm.cpp.svn-base
字號(hào):
/**
* 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;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -