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