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

📄 sitemanagerdlg.cpp.svn-base

📁 wince c++ 下 开发的 rss 阅读器源代码
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
}

void CSiteManagerDlg::OnSelchangedSites(NMHDR* pNMHDR, LRESULT* pResult) {
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	UpdateControls();

	*pResult = 0;
}

HTREEITEM CSiteManagerDlg::AddItem(HTREEITEM hParent, CSiteItem *item, HTREEITEM hInsertAfter/* = TVI_LAST*/) {
	LOG0(5, "CSiteManagerDlg::AddItem()");

	HTREEITEM hItem;
	if (item->Type == CSiteItem::Site) {
		hItem = InsertSite(hParent, item, hInsertAfter);
	}
	else if (item->Type == CSiteItem::Group) {
		hItem = InsertGroup(hParent, item, hInsertAfter);

		POSITION pos = item->SubItems.GetHeadPosition();
		while (pos != NULL) {
			CSiteItem *si = item->SubItems.GetNext(pos);
			AddItem(hItem, si);
		}
	}

	return hItem;
}

HTREEITEM CSiteManagerDlg::MergeItem(HTREEITEM hParent, CSiteItem *item, HTREEITEM hInsertAfter/* = TVI_LAST*/) {
	LOG0(5, "CSiteManagerDlg::MergeItem()");

	CSiteItem *parentGroup = (CSiteItem *) m_ctlSites.GetItemData(hParent);

	HTREEITEM hItem;
	if (item->Type == CSiteItem::Site) {
		void *ptr;
		if (!MapUrlToTreeItem.Lookup(item->Info->XmlUrl, ptr)) {
			hItem = InsertSite(hParent, item, hInsertAfter);
		}
		else {
			item->Destroy();
			delete item;
		}
	}
	else if (item->Type == CSiteItem::Group) {
		void *ptr = NULL;
		if (!MapGroupToTreeItem.Lookup(item->Name, ptr))
			hItem = InsertGroup(hParent, item, hInsertAfter);
		else
			hItem = (HTREEITEM) ptr;

		POSITION pos = item->SubItems.GetHeadPosition();
		while (pos != NULL) {
			CSiteItem *si = item->SubItems.GetNext(pos);
			MergeItem(hItem, si);
		}

		if (hItem == (HTREEITEM) ptr)
			delete item;				// group already in the list, delete the duplicate
	}

	return hItem;
}

void CSiteManagerDlg::OnEndlabeleditSites(NMHDR* pNMHDR, LRESULT* pResult) {
	LOG0(5, "CSiteManagerDlg::OnEndlabeleditSites()");

	TV_DISPINFO *pTVDispInfo = (TV_DISPINFO*) pNMHDR;

	if (m_bAddingGroup) {
		HTREEITEM hItem = pTVDispInfo->item.hItem;
		if (pTVDispInfo->item.pszText != NULL &&
			lstrlen(pTVDispInfo->item.pszText) > 0)
		{
			m_ctlSites.SetItemText(hItem, pTVDispInfo->item.pszText);
			CSiteItem *group = (CSiteItem *) pTVDispInfo->item.lParam;
			// set group name
			MapGroupToTreeItem.RemoveKey(group->Name);
			group->Name = pTVDispInfo->item.pszText;
			MapGroupToTreeItem.SetAt(group->Name, hItem);

			*pResult = 0;
		}
		else {
			// delete temporary group (no childs, ok to delete)
			CSiteItem *group = (CSiteItem *) pTVDispInfo->item.lParam;
			DeleteItem(hItem, TRUE);
			*pResult = FALSE;
		}
	}
	else {
		if (pTVDispInfo->item.pszText != NULL &&
			lstrlen(pTVDispInfo->item.pszText) > 0)
		{
			// editing group name ends
			m_ctlSites.SetItemText(pTVDispInfo->item.hItem, pTVDispInfo->item.pszText);
			CSiteItem *item = (CSiteItem *) pTVDispInfo->item.lParam;
			// set group name
			item->Name = pTVDispInfo->item.pszText;
			*pResult = 0;
		}
		else {
			*pResult = FALSE;
		}
	}

	m_ctlSites.ModifyStyle(TVS_EDITLABELS, 0);

//	*pResult = 0;
}

void CSiteManagerDlg::AppendMoveToMenu(CMenu &mnu, HTREEITEM hParent) {
	HTREEITEM hChild = m_ctlSites.GetChildItem(hParent);
	while (hChild != NULL) {
		CSiteItem *item = (CSiteItem *) m_ctlSites.GetItemData(hChild);
		if (item->Type == CSiteItem::Group) {
			CString sMenuItem = item->Name;

			CMenu mnuChild;
			mnuChild.CreatePopupMenu();
			AppendMoveToMenu(mnuChild, hChild);
			int idx = CtxMenuMoveToIDs.GetSize();
			if (mnuChild.GetMenuItemCount() > 0) {
				CString sHere;
				sHere.LoadString(IDS_HERE);
				mnuChild.InsertMenu(0, MF_STRING | MF_BYPOSITION, ID_MOVE_TO_GROUP_BASE + idx, sHere);
				mnuChild.InsertMenu(1, MF_SEPARATOR | MF_BYPOSITION);

				mnu.AppendMenu(MF_ENABLED | MF_POPUP, (UINT) mnuChild.GetSafeHmenu(), sMenuItem);
				mnuChild.Detach();
			}
			else {
				mnu.AppendMenu(MF_STRING, ID_MOVE_TO_GROUP_BASE + idx, sMenuItem);
			}

			CtxMenuMoveToIDs.Add(hChild);
		}

		hChild = m_ctlSites.GetNextSiblingItem(hChild);
	}
}

void CSiteManagerDlg::CreateMoveToMenu(CMenu &mnuMove) {
	CtxMenuMoveToIDs.RemoveAll();

	// root
	CString sRootGroup;
	sRootGroup.LoadString(IDS_ROOT_GROUP);

	mnuMove.AppendMenu(MF_STRING, ID_MOVE_TO_GROUP_BASE, sRootGroup);
	CtxMenuMoveToIDs.Add(m_ctlSites.GetRootItem());
	mnuMove.AppendMenu(MF_SEPARATOR);
	// add groups
	AppendMoveToMenu(mnuMove, m_ctlSites.GetRootItem());
}

void CSiteManagerDlg::OnMoveToGroup(UINT nID) {
	int idx = nID - ID_MOVE_TO_GROUP_BASE;

	HTREEITEM hSelItem = m_ctlSites.GetSelectedItem();
	CSiteItem *srcItem = (CSiteItem *) m_ctlSites.GetItemData(hSelItem);

	HTREEITEM hDestItem = CtxMenuMoveToIDs[idx];
	if (srcItem->Type == CSiteItem::Group) {
		// do not move the group the the same group
		HTREEITEM hParent = hDestItem;
		while (hParent != NULL) {
			if (hParent == hSelItem)
				return;
			hParent = m_ctlSites.GetParentItem(hParent);
		}
	}
	else if (srcItem->Type == CSiteItem::Site) {
		// do not move the site to the parent group
		HTREEITEM hParent = m_ctlSites.GetParentItem(hSelItem);
		if (hParent == hDestItem)
			return;
	}

	CreateSiteList(hSelItem, NULL);
	DeleteItem(hSelItem, FALSE);
	AddItem(hDestItem, srcItem);

	UpdateControls();
}

void CSiteManagerDlg::OnContextMenu(NMHDR *pNMHDR, LRESULT *pResult) {
	LOG0(1, "CSiteManagerDlg::OnContextMenu()");

	// GN_CONTEXTMENU sends NMRGINFO structure through notify struct parameter
	PNMRGINFO pInfo = (PNMRGINFO) pNMHDR;

	HTREEITEM hSelItem = m_ctlSites.GetSelectedItem();
	if (hSelItem == m_ctlSites.GetRootItem()) {
		CMenu mnu;
		mnu.CreatePopupMenu();
		AppendMenuFromResource(&mnu, IDR_SITE_MAN_CTX_MNU_ADD);
		mnu.TrackPopupMenu(TPM_LEFTALIGN, pInfo->ptAction.x, pInfo->ptAction.y, this);
	}
	else {
		CSiteItem *item = (CSiteItem *) m_ctlSites.GetItemData(hSelItem);

		if (item->Type == CSiteItem::Site) {
			CMenu mnu;
			mnu.CreatePopupMenu();
			// edit part
			AppendMenuFromResource(&mnu, IDR_SITE_MAN_CTX_MNU_EDIT);
			mnu.AppendMenu(MF_SEPARATOR);
			// 'move to' part
			CMenu mnuMove;
			mnuMove.CreatePopupMenu();
			CString sMoveTo;
			sMoveTo.LoadString(IDS_MOVE_TO);
			CreateMoveToMenu(mnuMove);
			mnu.AppendMenu(MF_POPUP | MF_ENABLED | MF_STRING, (UINT) mnuMove.GetSafeHmenu(), sMoveTo);
			mnuMove.Detach();

			mnu.TrackPopupMenu(TPM_LEFTALIGN, pInfo->ptAction.x, pInfo->ptAction.y, this);
		}
		else if (item->Type == CSiteItem::Group) {
			CMenu mnu;
			mnu.CreatePopupMenu();
			// add part
			AppendMenuFromResource(&mnu, IDR_SITE_MAN_CTX_MNU_ADD);
//			mnu.AppendMenu(MF_SEPARATOR);
			// edit part
			AppendMenuFromResource(&mnu, IDR_SITE_MAN_CTX_MNU_EDIT);
			mnu.DeleteMenu(ID_SITE_EDIT, MF_BYCOMMAND);
			mnu.AppendMenu(MF_SEPARATOR);
			// 'move to' part
			CMenu mnuMove;
			mnuMove.CreatePopupMenu();
			CString sMoveTo;
			sMoveTo.LoadString(IDS_MOVE_TO);
			CreateMoveToMenu(mnuMove);
			mnu.AppendMenu(MF_POPUP | MF_ENABLED | MF_STRING, (UINT) mnuMove.GetSafeHmenu(), sMoveTo);
			mnuMove.Detach();

			mnu.TrackPopupMenu(TPM_LEFTALIGN, pInfo->ptAction.x, pInfo->ptAction.y, this);
		}
	}

	*pResult = TRUE; // This is important!
}

void CSiteManagerDlg::DeleteItem(HTREEITEM hItem, BOOL free/* = TRUE*/) {
	LOG0(1, "CSiteManagerDlg::DeleteItem()");

	HTREEITEM hChild = m_ctlSites.GetChildItem(hItem);
	while (hChild != NULL) {
		DeleteItem(hChild, free);
		hChild = m_ctlSites.GetChildItem(hItem);
	}

	CSiteItem *item = (CSiteItem *) m_ctlSites.GetItemData(hItem);
	HTREEITEM hSelItem = m_ctlSites.GetPrevVisibleItem(hItem);
	m_ctlSites.DeleteItem(hItem);

	if (item->Type == CSiteItem::Group)
		MapGroupToTreeItem.RemoveKey(item->Name);
	else if (item->Type == CSiteItem::Site && item->Info != NULL)
		MapUrlToTreeItem.RemoveKey(item->Info->XmlUrl);

	if (free) {
		if (item->Info != NULL) {
			DeleteFile(GetCachePath(FILE_TYPE_FEED, Config.CacheLocation) + _T("\\") + item->Info->FileName);
			DeleteFile(GetCacheFile(FILE_TYPE_FAVICON, Config.CacheLocation, item->Info->FileName));
		}

		item->Destroy();
		delete item;
	}

	m_ctlSites.SelectItem(hSelItem);
	m_ctlSites.EnsureVisible(hSelItem);
}

void CSiteManagerDlg::ResizeControls() {
	LOG0(3, "CSiteManagerDlg::ResizeControls()");

	if (InWideMode())
		m_ctlHrule.SetFrame(HR_LEFT);
	else
		m_ctlHrule.SetFrame(HR_TOP);

	RelayoutDialog(AfxGetInstanceHandle(), GetSafeHwnd(), InWideMode() ?
		MAKEINTRESOURCE(IDD_WIDE) :
		MAKEINTRESOURCE(IDD));

	if (!InWideMode()) {
		CRect rc;
		GetClientRect(rc);

		m_ctlSites.SetWindowPos(NULL, 0, 0, rc.Width(), rc.Height() - SCALEY(56), SWP_NOZORDER | SWP_NOMOVE);
		m_ctlHrule.SetWindowPos(NULL, 0, rc.Height() - SCALEY(32), rc.Width(), SCALEY(1), SWP_NOZORDER);
		m_ctlMoveDown.SetWindowPos(NULL, rc.right - SCALEX(75), rc.Height() - SCALEY(26), SCALEX(70), SCALEY(20), SWP_NOZORDER);
		m_ctlMoveUp.SetWindowPos(NULL, rc.right - SCALEX(75 + 80), rc.Height() - SCALEY(26), SCALEX(70), SCALEY(20), SWP_NOZORDER);
	}
}

void CSiteManagerDlg::CreateSiteList(HTREEITEM hItem, CSiteItem *parent/* = NULL*/) {
	CSiteItem *si = (CSiteItem *) m_ctlSites.GetItemData(hItem);

	si->Parent = parent;
	si->SubItems.RemoveAll();

	HTREEITEM hChild = m_ctlSites.GetChildItem(hItem);
	while (hChild != NULL) {
		CSiteItem *child = (CSiteItem *) m_ctlSites.GetItemData(hChild);
		si->AddItem(child);
		CreateSiteList(hChild, si);

		hChild = m_ctlSites.GetNextSiblingItem(hChild);
	}
}

void CSiteManagerDlg::OnOk() {
	LOG0(1, "CSiteManagerDlg::OnOk()");

	// if we are in editing a group name, end editing
	if (m_ctlSites.GetEditControl() != NULL) {
		m_ctlSites.SendMessage(TVM_ENDEDITLABELNOW, FALSE);
		return;
	}

	HTREEITEM hRoot = m_ctlSites.GetRootItem();
	CreateSiteList(hRoot);
	Root = (CSiteItem *) m_ctlSites.GetItemData(hRoot);

	EndDialog(IDOK);
}

void CSiteManagerDlg::OnCancel() {
	LOG0(1, "CSiteManagerDlg::OnCancel()");

	// if we are editing a group name, end the editing
	if (m_ctlSites.GetEditControl() != NULL) {
		m_ctlSites.SendMessage(TVM_ENDEDITLABELNOW, TRUE);
		return;
	}

	HTREEITEM hRoot = m_ctlSites.GetRootItem();
	CreateSiteList(hRoot);
	Root = (CSiteItem *) m_ctlSites.GetItemData(hRoot);

	EndDialog(IDCANCEL);
}

void CSiteManagerDlg::OnAddFeed() {
	LOG0(1, "CSiteManagerDlg::OnAddFeed()");

	CAddFeedDlg dlgAdd(this);
	if (dlgAdd.DoModal() == IDOK) {
		HTREEITEM hParent = GetGroupItem();

		if (dlgAdd.m_bCheckOnline) {
			POSITION pos = dlgAdd.SiteItemsToAdd.GetHeadPosition();
			while (pos != NULL) {
				CSiteItem *si = dlgAdd.SiteItemsToAdd.GetNext(pos);
				// add site item to the list
				AddItem(hParent, si);

				// update subscription in syncer
				if (Syncer != NULL) {
					CWaitCursor wait;
					Syncer->AddSubscription(si->Info->XmlUrl, si->Name);
				}

			}
			m_ctlSites.Expand(hParent, TVE_EXPAND);
		}
		else {
			// prepare data structures

⌨️ 快捷键说明

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