?? mainfrm.cpp.svn-base
字號:
// virtual folder (unread)
CFeed *newFeed = si->Feed;
CFeed *curFeed = UnreadItems.Feed;
// we need to preserve new items for later caching
CArray<CFeedItem *, CFeedItem *> newItems;
FeedDiff(newFeed, curFeed, &newItems);
m_wndFeedView.SetRedraw(FALSE);
for (int j = 0; j < newItems.GetSize(); j++) {
CFeedItem *fi = newItems.GetAt(j);
if (!fi->IsDeleted() && (fi->IsNew() || fi->IsUnread())) {
curFeed->Add(fi);
m_wndFeedView.InsertItem(m_wndFeedView.GetItemCount(), fi);
}
}
m_wndFeedView.SortItems();
m_wndFeedView.SetRedraw(TRUE);
m_wndFeedView.UpdateScrollBars();
m_wndFeedView.Invalidate();
UpdateSort();
}
else if (si == SiteList.GetAt(Config.ActSiteIdx)) {
// just a site
SelectSite(Config.ActSiteIdx);
}
}
}
else if (View == ArticleView) {
if (Config.ActSiteIdx == SITE_UNREAD) {
// TODO
}
else if (si == SiteList.GetAt(Config.ActSiteIdx)) {
SelectSite(Config.ActSiteIdx);
int selectedItem = -1;
for (int i = 0; i < m_wndFeedView.GetItemCount(); i++) {
if (m_wndFeedView.GetItem(i)->Hash.CompareNoCase(m_wndArticleView.m_pArticle->Hash) == 0) {
selectedItem = i;
break;
}
}
m_wndFeedView.SelectItem(selectedItem);
if (selectedItem != -1) m_wndFeedView.EnsureVisible(selectedItem);
SetupBanner(m_wndArticleView.m_pArticle, selectedItem + 1, m_wndFeedView.GetItemCount());
}
}
if (si != NULL) {
// update item in summary view
m_wndSummaryView.Invalidate(FALSE);
UpdateTopBar();
}
return 0;
}
void CMainFrame::SaveSite(CSiteItem *si) {
LOG0(5, "CMainFrame::SaveSite()");
if (si != NULL && si->Info != NULL && si->Status == CSiteItem::Ok) {
CString feedPathName = GetCacheFile(FILE_TYPE_FEED, Config.CacheLocation, si->Info->FileName);
if (si->Feed != NULL) {
si->Feed->Save(feedPathName);
SaveSiteItemUnreadCount(si, SiteList.GetIndexOf(si));
SaveSiteItemFlaggedCount(si, SiteList.GetIndexOf(si));
si->SetModified(FALSE);
NotifyTodayPlugin(UpdateFeedFlagsMessage, SiteList.GetIndexOf(si));
}
}
}
void CMainFrame::SaveSitesThread() {
LOG0(1, "CMainFrame::SaveSitesThread() - start");
// save everything in the list
while (!SitesToSave.IsEmpty()) {
CSiteItem *si = SitesToSave.GetHead();
SaveSite(si);
SitesToSave.RemoveHead();
}
CloseHandle(HSaveSitesThread);
HSaveSitesThread = NULL;
LOG0(1, "CMainFrame::SaveSitesThread() - end");
}
void CMainFrame::AddSiteToSave(int siteIdx) {
if (siteIdx >= 0 && siteIdx < SiteList.GetCount())
AddSiteToSave(SiteList.GetAt(siteIdx));
else if (siteIdx == SITE_UNREAD)
AddSiteToSave(&UnreadItems);
else if (siteIdx == SITE_FLAGGED)
AddSiteToSave(&FlaggedItems);
}
void CMainFrame::AddSiteToSave(CSiteItem *si) {
LOG1(5, "CMainFrame::AddSiteToSave(%p)", si);
if (si == NULL)
return;
if (si->Type == CSiteItem::VFolder) {
CFeed *feed = si->Feed;
if (feed != NULL) {
for (int i = 0; i < feed->GetItemCount(); i++) {
CFeedItem *fi = feed->GetItem(i);
if (fi->SiteItem->IsModified() && SitesToSave.Find(fi->SiteItem) == NULL)
SitesToSave.AddTail(fi->SiteItem);
}
}
}
else if (si->IsModified() && SitesToSave.Find(si) == NULL) {
SitesToSave.AddTail(si);
}
// start the thread
if (HSaveSitesThread == NULL && SitesToSave.GetCount() > 0) {
HSaveSitesThread = CreateThread(NULL, 0, SaveSitesStubProc, this, 0, NULL);
}
}
void CMainFrame::OnFileInformation() {
LOG0(1, "CMainFrame::OnFileInformation()");
HGROUPITEM hItem = m_wndSummaryView.GetSelectedItem();
if (hItem == NULL)
return;
CSiteItem *si = (CSiteItem *) m_wndSummaryView.GetItemData(hItem);
si->EnsureSiteLoaded();
CInfoGeneralPg pgGeneral;
CInfoChannelPg pgChannel;
CInfoDescriptionPg pgDescription;
CCePropertySheet sheet(_T(""));
sheet.SetMenu(IDR_CANCEL);
sheet.AddPage(&pgGeneral);
// general
if (si->Feed != NULL) {
pgGeneral.m_nTotalItems = si->Feed->GetItemCount();
pgGeneral.m_nNewItems = si->Feed->GetNewCount();
pgGeneral.m_nUnreadItems = si->Feed->GetUnreadCount();
}
else {
pgGeneral.m_nTotalItems = 0;
pgGeneral.m_nNewItems = 0;
pgGeneral.m_nUnreadItems = 0;
}
if (si->Type == CSiteItem::Site) {
pgGeneral.m_strSiteName = si->Name;
CString fileName = GetCacheFile(FILE_TYPE_FEED, Config.CacheLocation, si->Info->FileName);
HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile != INVALID_HANDLE_VALUE) {
// file size
DWORD size = GetFileSize(hFile, NULL);
if (size == 0xffffffff) size = 0;
pgGeneral.m_nFileSize = size;
// last update
SYSTEMTIME stLastWrite;
FILETIME lastWrite = { 0 };
GetFileTime(hFile, NULL, NULL, &lastWrite);
FILETIME lastWriteLocal = { 0 };
// FileTimeToLocalFileTime(&lastWrite, &lastWriteLocal);
FileTimeToSystemTime(&lastWrite, &stLastWrite);
CloseHandle(hFile);
pgGeneral.m_stLastUpdated = stLastWrite;
}
if (si->Feed != NULL)
pgGeneral.m_stPublished = si->Feed->Published;
// channel
if (si->Status == CSiteItem::Ok && si->Feed != NULL)
pgChannel.m_strFormat = si->Feed->Format;
else
pgChannel.m_strFormat.LoadString(IDS_UNKNOWN);
if (si->Feed != NULL)
pgChannel.m_strWWW = si->Feed->HtmlUrl;
pgChannel.m_strRSS = si->Info->XmlUrl;
// description
if (si->Feed != NULL) {
pgDescription.m_strDescription = si->Feed->Description;
pgDescription.m_strCopyright = si->Feed->Copyright;
pgDescription.m_strLanguage = si->Feed->Language;
}
sheet.AddPage(&pgChannel);
sheet.AddPage(&pgDescription);
}
else if (si->Type == CSiteItem::VFolder) {
pgGeneral.m_strSiteName = si->Name;
pgGeneral.m_nFileSize = 0;
memset(&pgGeneral.m_stLastUpdated, 0, sizeof(pgGeneral.m_stLastUpdated));
}
sheet.DoModal();
}
void CMainFrame::OnUpdateFileInformation(CCmdUI *pCmdUI) {
HGROUPITEM hItem = m_wndSummaryView.GetSelectedItem();
if (hItem != NULL) {
CSiteItem *si = (CSiteItem *) m_wndSummaryView.GetItemData(hItem);
pCmdUI->Enable(!Loading && (si->Type == CSiteItem::Site || si->Type == CSiteItem::VFolder));
}
else
pCmdUI->Enable(FALSE);
}
void CMainFrame::OnFileProperties() {
LOG0(1, "CMainFrame::OnFileProperties()");
HGROUPITEM hItem = m_wndSummaryView.GetSelectedItem();
if (hItem != NULL) {
CSiteItem *si = (CSiteItem *) m_wndSummaryView.GetItemData(hItem);
if (si->Type == CSiteItem::Site) {
if (SiteProperties(si, this)) {
int idx = SiteList.GetIndexOf(si);
SaveSiteItem(si, idx); // save changes
NotifyTodayPlugin(ReloadSubscriptionsMessage, idx); // notify today plugin
}
}
}
}
void CMainFrame::OnUpdateFileProperties(CCmdUI *pCmdUI) {
HGROUPITEM hItem = m_wndSummaryView.GetSelectedItem();
if (hItem != NULL) {
CSiteItem *si = (CSiteItem *) m_wndSummaryView.GetItemData(hItem);
pCmdUI->Enable(!Loading && si->Type == CSiteItem::Site);
}
else
pCmdUI->Enable(FALSE);
}
void CMainFrame::UpdateWorkOfflineMenu() {
// mnu
TBBUTTON tb;
::SendMessage(m_hwndCmdBar, TB_GETBUTTON, 1, (LPARAM) &tb);
CMenu mnu;
mnu.Attach((HMENU) tb.dwData);
CMenu *pOfflineMnu = mnu.GetSubMenu(2); // offline menu
if (pOfflineMnu != NULL) {
UINT state = Config.WorkOffline ? MF_CHECKED : MF_UNCHECKED;
pOfflineMnu->CheckMenuItem(ID_WORK_OFFLINE, state | MF_BYCOMMAND);
}
mnu.Detach();
}
void CMainFrame::OnFileWorkOffline() {
LOG0(1, "CMainFrame::OnFileWorkOffline()");
Config.WorkOffline = !Config.WorkOffline;
Config.SaveUI();
UpdateWorkOfflineMenu();
}
BOOL CMainFrame::CheckOnlineMode() {
LOG0(3, "CMainFrame::CheckOnlineMode()");
WorkOffline = Config.WorkOffline;
if (Config.WorkOffline) {
CString txt;
txt.LoadString(IDS_GO_ONLINE);
int res = AfxMessageBox(txt, MB_YESNO);
if (res == IDNO)
return FALSE;
Config.WorkOffline = FALSE;
UpdateWorkOfflineMenu();
}
return TRUE;
}
LRESULT CMainFrame::OnUpdateFinished(WPARAM wParam, LPARAM lParam) {
Config.WorkOffline = WorkOffline;
PostMessage(WM_CANCELMODE);
UpdateMenu();
UpdateWorkOfflineMenu();
return 0;
}
void CMainFrame::OnFileCacheFlagged() {
LOG0(1, "CMainFrame::OnFileCacheFlagged()");
if (!CheckOnlineMode())
return;
CWaitCursor wait;
for (int i = 0; i < SiteList.GetCount(); i++) {
CSiteItem *si = SiteList.GetAt(i);
si->EnsureSiteLoaded();
if (si->Feed != NULL && si->Info != NULL) {
BOOL cacheHtml, cacheImages, cacheEnclosures;
if (si->Info->UseGlobalCacheOptions) {
cacheHtml = Config.CacheHtml;
cacheImages = Config.CacheImages;
}
else {
cacheHtml = si->Info->CacheHtml;
cacheImages = si->Info->CacheItemImages;
}
cacheEnclosures = si->Info->CacheEnclosures;
CArray<CFeedItem *, CFeedItem *> items;
// get flagged items in the feed
for (int j = 0; j < si->Feed->GetItemCount(); j++) {
CFeedItem *fi = si->Feed->GetItem(j);
if (fi->IsFlagged())
items.Add(fi);
}
if (cacheImages) m_wndUpdateBar.EnqueueImages(items);
if (cacheHtml) m_wndUpdateBar.EnqueueHtmls(items);
if (cacheEnclosures) m_wndUpdateBar.EnqueueEnclosures(items, si->Info->EnclosureLimit);
}
}
m_wndUpdateBar.Redraw();
m_wndUpdateBar.Start();
}
void CMainFrame::OnFileCacheUnread() {
LOG0(1, "CMainFrame::OnFileCacheUnread()");
if (!CheckOnlineMode())
return;
CWaitCursor wait;
for (int i = 0; i < SiteList.GetCount(); i++) {
CSiteItem *si = SiteList.GetAt(i);
si->EnsureSiteLoaded();
if (si->Feed != NULL && si->Info != NULL) {
//
BOOL cacheHtml, cacheImages, cacheEnclosures;
if (si->Info->UseGlobalCacheOptions) {
cacheHtml = Config.CacheHtml;
cacheImages = Config.CacheImages;
}
else {
cacheHtml = si->Info->CacheHtml;
cacheImages = si->Info->CacheItemImages;
}
cacheEnclosures = si->Info->CacheEnclosures;
CArray<CFeedItem *, CFeedItem *> items;
// get flagged items in the feed
for (int j = 0; j < si->Feed->GetItemCount(); j++) {
CFeedItem *fi = si->Feed->GetItem(j);
if (fi->IsNew() || fi->IsUnread())
items.Add(fi);
}
if (cacheImages) m_wndUpdateBar.EnqueueImages(items);
if (cacheHtml) m_wndUpdateBar.EnqueueHtmls(items);
if (cacheEnclosures) m_wndUpdateBar.EnqueueEnclosures(items, si->Info->EnclosureLimit);
}
}
m_wndUpdateBar.Redraw();
m_wndUpdateBar.Start();
}
void CMainFrame::CollectSelectedFeedItems(CArray<CFeedItem *, CFeedItem *> &items) {
LOG0(1, "CMainFrame::CollectSelectedFeedItems()");
int start, end;
m_wndFeedView.GetSelectedRange(start, end);
items.SetSize(end - start + 1);
for (int i = start; i <= end; i++) {
CFeedItem *fi = m_wndFeedView.GetItem(i);
items.SetAt(i - start, fi);
}
}
void CMainFrame::OnCacheGetOnlineContent() {
LOG0(1, "CMainFrame::OnCacheGetOnlineContent()");
CArray<CFeedItem *, CFeedItem *> items;
if (View == FeedView) {
CollectSelectedFeedItems(items);
m_wndFeedView.DeselectAllItems();
}
if (items.GetSize() > 0) {
m_wndUpdateBar.EnqueueHtmls(items);
m_wndUpdateBar.Redraw();
m_wndUpdateBar.Start();
}
}
void CMainFrame::OnCacheGetImages() {
LOG0(1, "CMainFrame::OnCacheGetImages()");
CArray<CFeedItem *, CFeedItem *> items;
if (View == FeedView) {
CollectSelectedFeedItems(items);
m_wndFeedView.DeselectAllItems();
}
if (items.GetSize() > 0) {
m_wndUpdateBar.EnqueueImages(items);
m_wndUpdateBar.Redraw();
m_wndUpdateBar.Start();
}
}
void CMainFrame::OnEnclosuresOpen() {
LOG0(1, "CMainFrame::OnEnclosuresOpen()");
if (View == FeedView) {
int sel = m_wndFeedView.GetSelectedItem();
CFeedItem *fi = m_wndFeedView.GetItem(sel);
if (fi->HasEnclosure()) {
CEnclosureItem *ei = fi->Enclosures.GetHead();
OpenEnclosure(ei->URL);
}
}
}
void CMainFrame::OnEnclosuresGet() {
LOG0(1, "CMainFrame::OnEnclosuresGet()");
CArray<CFeedItem *, CFeedItem *> items;
if (View == FeedView) {
CollectSelectedFeedItems(items);
m_wndFeedView.DeselectAllItems();
}
if (items.GetSize() > 0) {
m_wndUpdateBar.EnqueueEnclosures(items);
m_wndUpdateBar.Redraw();
m_wndUpdateBar.Start();
}
}
void CMainFrame::OnEnclosuresDelete() {
LOG0(1, "CMainFrame::OnEnclosuresDelete()");
CArray<CFeedItem *, CFeedItem *> items;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -