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

📄 mainfrm.cpp.svn-base

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

⌨️ 快捷键说明

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