📄 sitemanagerdlg.cpp.svn-base
字号:
/**
* 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 + -