969 lines
25 KiB
C++
969 lines
25 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1999 - 1999
|
|
//
|
|
// File: favui.cpp
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
// favui.cpp - favorites tree configuration UI
|
|
|
|
#include "stdafx.h"
|
|
#include "amcdoc.h"
|
|
#include "favorite.h"
|
|
#include "favui.h"
|
|
#include "amcmsgid.h"
|
|
#include "amcview.h"
|
|
#include "mmcres.h"
|
|
|
|
void EnableButton(HWND hwndDialog, int iCtrlID, BOOL bEnable);
|
|
|
|
BEGIN_MESSAGE_MAP(CAddFavDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CAddFavDialog)
|
|
ON_COMMAND(IDC_ADDFAVFOLDER, OnAddFolder)
|
|
ON_EN_CHANGE(IDC_FAVNAME, OnChangeName)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
//}}AFX_MSG_MAP
|
|
ON_MMC_CONTEXT_HELP()
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
CAddFavDialog::CAddFavDialog(LPCTSTR szName, CFavorites* pFavorites, CWnd* pParent)
|
|
: CDialog(CAddFavDialog::IDD, pParent),
|
|
m_pFavorites(pFavorites), m_lAdviseCookie(NULL)
|
|
{
|
|
m_strName = szName;
|
|
ASSERT(pFavorites != NULL);
|
|
}
|
|
|
|
CAddFavDialog::~CAddFavDialog()
|
|
{
|
|
// disconnect fav view from source
|
|
if (m_lAdviseCookie )
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
HRESULT hr = m_pFavorites->Unadvise(m_lAdviseCookie);
|
|
ASSERT(SUCCEEDED(hr));
|
|
|
|
m_FavTree.SetTreeSource(NULL);
|
|
}
|
|
|
|
// detach classes from windows
|
|
m_FavTree.Detach();
|
|
m_FavName.Detach();
|
|
}
|
|
|
|
|
|
HRESULT CAddFavDialog::CreateFavorite(CFavObject** pfavRet)
|
|
{
|
|
m_pfavItem = NULL;
|
|
|
|
if (DoModal() != IDOK)
|
|
return S_FALSE;
|
|
|
|
if (pfavRet != NULL)
|
|
*pfavRet = m_pfavItem;
|
|
|
|
return m_hr;
|
|
}
|
|
|
|
|
|
BOOL CAddFavDialog::OnInitDialog()
|
|
{
|
|
DECLARE_SC (sc, _T("CAddFavDialog::OnInitDialog"));
|
|
CDialog::OnInitDialog();
|
|
|
|
ModifyStyleEx(0, WS_EX_CONTEXTHELP, SWP_NOSIZE);
|
|
|
|
// Attach tree ctrl to favorites tree object
|
|
BOOL bStat = m_FavTree.SubclassDlgItem(IDC_FAVTREE, this);
|
|
ASSERT(bStat);
|
|
|
|
bStat = m_FavName.Attach(GetDlgItem(IDC_FAVNAME)->GetSafeHwnd());
|
|
ASSERT(bStat);
|
|
|
|
m_FavName.SetWindowText(m_strName);
|
|
m_FavName.SetSel(0,lstrlen(m_strName));
|
|
m_FavName.SetFocus();
|
|
|
|
// Add extra space between items
|
|
TreeView_SetItemHeight(m_FavTree, TreeView_GetItemHeight(m_FavTree) + FAVVIEW_ITEM_SPACING);
|
|
|
|
// Show only folders
|
|
m_FavTree.SetStyle(TOBSRV_FOLDERSONLY);
|
|
|
|
/*
|
|
* validate m_pFavorites
|
|
*/
|
|
sc = ScCheckPointers (m_pFavorites, E_UNEXPECTED);
|
|
if (sc)
|
|
{
|
|
EndDialog (IDCANCEL);
|
|
return (0);
|
|
}
|
|
|
|
// Attach favorites image list to tree control
|
|
m_FavTree.SetImageList(m_pFavorites->GetImageList(), TVSIL_NORMAL);
|
|
|
|
// attach view to source as observer
|
|
HRESULT hr = m_pFavorites->Advise(static_cast<CTreeObserver*>(&m_FavTree), &m_lAdviseCookie);
|
|
ASSERT(SUCCEEDED(hr) && m_lAdviseCookie != 0);
|
|
|
|
// hand tree data source to tree view
|
|
m_FavTree.SetTreeSource(static_cast<CTreeSource*>(m_pFavorites));
|
|
|
|
// Select the root
|
|
m_FavTree.SetSelection(m_pFavorites->GetRootItem());
|
|
|
|
// return 0 so focus isn't changed
|
|
return 0;
|
|
}
|
|
|
|
void CAddFavDialog::OnChangeName()
|
|
{
|
|
EnableButton(m_hWnd, IDOK, (m_FavName.LineLength() != 0));
|
|
}
|
|
|
|
void CAddFavDialog::OnOK( )
|
|
{
|
|
// Get favorite name
|
|
TCHAR strName[MAX_PATH];
|
|
|
|
m_hr = E_FAIL;
|
|
m_pfavItem = NULL;
|
|
|
|
int cChar = m_FavName.GetWindowText(strName, countof(strName));
|
|
ASSERT(cChar != 0);
|
|
if (cChar == 0)
|
|
return;
|
|
|
|
// Get selected folder
|
|
TREEITEMID tid = m_FavTree.GetSelection();
|
|
ASSERT(tid != NULL);
|
|
if (tid == NULL)
|
|
return;
|
|
|
|
// Detach fav tree from source because it doesn't need updating
|
|
ASSERT(m_pFavorites != NULL);
|
|
HRESULT hr = m_pFavorites->Unadvise(m_lAdviseCookie);
|
|
ASSERT(SUCCEEDED(hr));
|
|
m_lAdviseCookie = 0;
|
|
|
|
// Inform source of disconnection
|
|
m_FavTree.SetTreeSource(NULL);
|
|
|
|
// Create a favorite
|
|
ASSERT(m_pFavorites != NULL);
|
|
m_hr = m_pFavorites->AddFavorite(tid, strName, &m_pfavItem);
|
|
ASSERT(SUCCEEDED(hr));
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CAddFavDialog::OnAddFolder()
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
|
|
// Get selected group
|
|
TREEITEMID tidParent = m_FavTree.GetSelection();
|
|
ASSERT(tidParent != NULL);
|
|
|
|
// Put up dialog to get folder name
|
|
CAddFavGroupDialog dlgAdd(this);
|
|
if (dlgAdd.DoModal() != IDOK)
|
|
return;
|
|
|
|
LPCTSTR strName = dlgAdd.GetGroupName();
|
|
ASSERT(strName[0] != 0);
|
|
|
|
CFavObject* pfavGroup = NULL;
|
|
HRESULT hr = m_pFavorites->AddGroup(tidParent, strName, &pfavGroup);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
ASSERT(pfavGroup != NULL);
|
|
m_FavTree.SetSelection(reinterpret_cast<TREEITEMID>(pfavGroup));
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CAddFavGroup dialog
|
|
|
|
BEGIN_MESSAGE_MAP(CAddFavGroupDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CAddFavGroupDialog)
|
|
ON_EN_CHANGE(IDC_FAVFOLDER, OnChangeName)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
//}}AFX_MSG_MAP
|
|
ON_MMC_CONTEXT_HELP()
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
CAddFavGroupDialog::CAddFavGroupDialog(CWnd* pParent)
|
|
: CDialog(CAddFavGroupDialog::IDD, pParent)
|
|
{
|
|
}
|
|
|
|
CAddFavGroupDialog::~CAddFavGroupDialog()
|
|
{
|
|
// detach classes from windows
|
|
m_GrpName.Detach();
|
|
}
|
|
|
|
CAddFavGroupDialog::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
ModifyStyleEx(0, WS_EX_CONTEXTHELP, SWP_NOSIZE);
|
|
|
|
BOOL bStat = m_GrpName.Attach(GetDlgItem(IDC_FAVFOLDER)->GetSafeHwnd());
|
|
ASSERT(bStat);
|
|
|
|
// Set default favorite name and select it
|
|
CString strDefault;
|
|
LoadString(strDefault, IDS_NEWFOLDER);
|
|
|
|
m_GrpName.SetWindowText(strDefault);
|
|
m_GrpName.SetSel(0,lstrlen(strDefault));
|
|
m_GrpName.SetFocus();
|
|
|
|
// return 0 so focus isn't changed
|
|
return 0;
|
|
}
|
|
|
|
void CAddFavGroupDialog::OnChangeName()
|
|
{
|
|
EnableButton(m_hWnd, IDOK, (m_GrpName.LineLength() != 0));
|
|
}
|
|
|
|
void CAddFavGroupDialog::OnOK( )
|
|
{
|
|
// Get group name
|
|
int cChar = GetDlgItemText(IDC_FAVFOLDER, m_strName, sizeof(m_strName)/sizeof(TCHAR));
|
|
ASSERT(cChar != 0);
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
BEGIN_MESSAGE_MAP(COrganizeFavDialog, CDialog)
|
|
//{{AFX_MSG_MAP(COrganizeFavDialog)
|
|
ON_COMMAND(IDC_ADDFAVFOLDER, OnAddFolder)
|
|
ON_COMMAND(IDC_FAVRENAME, OnRename)
|
|
ON_COMMAND(IDC_FAVDELETE, OnDelete)
|
|
ON_COMMAND(IDC_FAVMOVETO, OnMoveTo)
|
|
ON_NOTIFY(TVN_SELCHANGED, IDC_FAVTREE, OnSelChanged)
|
|
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_FAVTREE, OnBeginLabelEdit)
|
|
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_FAVTREE, OnEndLabelEdit)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
//}}AFX_MSG_MAP
|
|
ON_MMC_CONTEXT_HELP()
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
COrganizeFavDialog::COrganizeFavDialog(CFavorites* pFavorites, CWnd* pParent)
|
|
: CDialog(COrganizeFavDialog::IDD, pParent),
|
|
m_pFavorites(pFavorites), m_lAdviseCookie(NULL), m_tidRenameItem(0), m_bRenameMode(FALSE)
|
|
{
|
|
ASSERT(pFavorites != NULL);
|
|
}
|
|
|
|
COrganizeFavDialog::~COrganizeFavDialog()
|
|
{
|
|
// disconnect fav view from source
|
|
if (m_lAdviseCookie)
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
m_pFavorites->Unadvise(m_lAdviseCookie);
|
|
m_FavTree.SetTreeSource(NULL);
|
|
}
|
|
|
|
// detach classes from windows
|
|
m_FavTree.Detach();
|
|
m_FavName.Detach();
|
|
m_FavInfo.Detach();
|
|
}
|
|
|
|
|
|
BOOL COrganizeFavDialog::OnInitDialog()
|
|
{
|
|
DECLARE_SC (sc, _T("COrganizeFavDialog::OnInitDialog"));
|
|
ASSERT(m_pFavorites != NULL);
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
ModifyStyleEx(0, WS_EX_CONTEXTHELP, SWP_NOSIZE);
|
|
|
|
// Attach tree ctrl to favorites tree object
|
|
BOOL bStat = m_FavTree.SubclassDlgItem(IDC_FAVTREE, this);
|
|
ASSERT(bStat);
|
|
|
|
bStat = m_FavName.Attach(GetDlgItem(IDC_FAVNAME)->GetSafeHwnd());
|
|
ASSERT(bStat);
|
|
|
|
bStat = m_FavInfo.Attach(GetDlgItem(IDC_FAVINFO)->GetSafeHwnd());
|
|
ASSERT(bStat);
|
|
|
|
// Add extra space between items
|
|
TreeView_SetItemHeight(m_FavTree, TreeView_GetItemHeight(m_FavTree) + FAVVIEW_ITEM_SPACING);
|
|
|
|
/*
|
|
* validate m_pFavorites
|
|
*/
|
|
sc = ScCheckPointers (m_pFavorites, E_UNEXPECTED);
|
|
if (sc)
|
|
{
|
|
EndDialog (IDCANCEL);
|
|
return (0);
|
|
}
|
|
|
|
// Attach favorites image list to tree control
|
|
m_FavTree.SetImageList(m_pFavorites->GetImageList(), TVSIL_NORMAL);
|
|
|
|
// Attach view to source as observer
|
|
HRESULT hr = m_pFavorites->Advise(static_cast<CTreeObserver*>(&m_FavTree), &m_lAdviseCookie);
|
|
ASSERT(SUCCEEDED(hr) && m_lAdviseCookie != 0);
|
|
|
|
// Hand tree data source to tree view
|
|
m_FavTree.SetTreeSource(static_cast<CTreeSource*>(m_pFavorites));
|
|
|
|
// Select the root item and give it focus
|
|
m_FavTree.SetSelection(m_pFavorites->GetRootItem());
|
|
m_FavTree.SetFocus();
|
|
|
|
// Create bold font for favorite name control
|
|
LOGFONT logfont;
|
|
m_FavName.GetFont()->GetLogFont(&logfont);
|
|
|
|
logfont.lfWeight = FW_BOLD;
|
|
if (m_FontBold.CreateFontIndirect(&logfont))
|
|
m_FavName.SetFont(&m_FontBold);
|
|
|
|
|
|
// return 0 so focus isn't changed
|
|
return 0;
|
|
}
|
|
|
|
void COrganizeFavDialog::OnOK( )
|
|
{
|
|
// if in rename mode, end it with success
|
|
if (m_bRenameMode)
|
|
{
|
|
m_FavTree.SendMessage(TVM_ENDEDITLABELNOW, FALSE);
|
|
return;
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
|
|
void COrganizeFavDialog::OnCancel( )
|
|
{
|
|
// if in rename mode, cancel it
|
|
if (m_bRenameMode)
|
|
{
|
|
m_FavTree.SendMessage(TVM_ENDEDITLABELNOW, FALSE);
|
|
return;
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
|
|
void COrganizeFavDialog::OnSelChanged(NMHDR* pMNHDR, LRESULT* plResult)
|
|
{
|
|
ASSERT(pMNHDR != NULL);
|
|
NM_TREEVIEW* pnmtv = (NM_TREEVIEW*)pMNHDR;
|
|
|
|
TREEITEMID tid = pnmtv->itemNew.lParam;
|
|
|
|
TCHAR name[100];
|
|
m_pFavorites->GetItemName(tid, name, 100);
|
|
m_FavName.SetWindowText(name);
|
|
|
|
if (m_pFavorites->IsFolderItem(tid))
|
|
{
|
|
CString strPath;
|
|
LoadString(strPath, IDS_FAVFOLDER);
|
|
m_FavInfo.SetWindowText(strPath);
|
|
}
|
|
else
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
m_pFavorites->GetItemPath(tid, szPath, MAX_PATH);
|
|
m_FavInfo.SetWindowText(szPath);
|
|
}
|
|
|
|
// Disable some operation for the root item
|
|
BOOL bRoot = (tid == m_pFavorites->GetRootItem());
|
|
|
|
EnableButton(m_hWnd, IDC_FAVRENAME, !bRoot);
|
|
EnableButton(m_hWnd, IDC_FAVDELETE, !bRoot);
|
|
EnableButton(m_hWnd, IDC_FAVMOVETO, !bRoot);
|
|
}
|
|
|
|
|
|
void COrganizeFavDialog::OnBeginLabelEdit(NMHDR* pMNHDR, LRESULT* plResult)
|
|
{
|
|
// Only allow renaming if an item has been selected
|
|
// This is to prevent an edit starting from an item click because
|
|
// that is confusing when used with the single-click expand style.
|
|
// (returning TRUE disables it)
|
|
|
|
if (m_tidRenameItem != 0)
|
|
{
|
|
m_bRenameMode = TRUE;
|
|
*plResult = FALSE;
|
|
}
|
|
else
|
|
{
|
|
*plResult = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
void COrganizeFavDialog::OnEndLabelEdit(NMHDR* pMNHDR, LRESULT* plResult)
|
|
{
|
|
ASSERT(m_bRenameMode && m_tidRenameItem != 0);
|
|
|
|
*plResult = FALSE;
|
|
|
|
if (m_tidRenameItem != 0)
|
|
{
|
|
NMTVDISPINFO* pnmtvd = (NMTVDISPINFO*)pMNHDR;
|
|
|
|
// Is this for the expected item?
|
|
ASSERT(pnmtvd->item.lParam == m_tidRenameItem);
|
|
|
|
if (pnmtvd->item.pszText != NULL && pnmtvd->item.pszText[0] != 0)
|
|
{
|
|
m_pFavorites->SetItemName(m_tidRenameItem, pnmtvd->item.pszText);
|
|
*plResult = TRUE;
|
|
|
|
// update displayed name in info window
|
|
m_FavName.SetWindowText(pnmtvd->item.pszText);
|
|
}
|
|
|
|
m_tidRenameItem = 0;
|
|
}
|
|
|
|
m_bRenameMode = FALSE;
|
|
}
|
|
|
|
|
|
void COrganizeFavDialog::OnAddFolder()
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
|
|
// Get selected group
|
|
TREEITEMID tidParent = m_FavTree.GetSelection();
|
|
ASSERT(tidParent != NULL);
|
|
|
|
// if selected item is not a group then
|
|
// add the new group as a sibling
|
|
if (!m_pFavorites->IsFolderItem(tidParent))
|
|
tidParent = m_pFavorites->GetParentItem(tidParent);
|
|
|
|
// Put up dialog to get folder name
|
|
CAddFavGroupDialog dlgAdd(this);
|
|
if (dlgAdd.DoModal() != IDOK)
|
|
return;
|
|
|
|
LPCTSTR strName = dlgAdd.GetGroupName();
|
|
ASSERT(strName[0] != 0);
|
|
|
|
CFavObject* pfavGroup = NULL;
|
|
HRESULT hr = m_pFavorites->AddGroup(tidParent, strName, &pfavGroup);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
m_FavTree.ExpandItem(tidParent);
|
|
}
|
|
}
|
|
|
|
|
|
void COrganizeFavDialog::OnDelete()
|
|
{
|
|
TREEITEMID tid = m_FavTree.GetSelection();
|
|
|
|
if (tid != 0 && tid != m_pFavorites->GetRootItem())
|
|
m_pFavorites->DeleteItem(tid);
|
|
}
|
|
|
|
void COrganizeFavDialog::OnRename()
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
|
|
// Get selected item
|
|
TREEITEMID tid = m_FavTree.GetSelection();
|
|
|
|
if (tid != 0 && tid != m_pFavorites->GetRootItem())
|
|
{
|
|
HTREEITEM hti = m_FavTree.FindHTI(tid, TRUE);
|
|
ASSERT(hti != NULL);
|
|
|
|
m_tidRenameItem = tid;
|
|
m_FavTree.SetFocus();
|
|
m_FavTree.EditLabel(hti);
|
|
}
|
|
}
|
|
|
|
void COrganizeFavDialog::OnMoveTo()
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
|
|
// Put up dialog to get destination folder ID
|
|
CFavFolderDialog dlgAdd(m_pFavorites, this);
|
|
if (dlgAdd.DoModal() != IDOK)
|
|
return;
|
|
|
|
TREEITEMID tidNewParent = dlgAdd.GetFolderID();
|
|
|
|
// Get selected object
|
|
TREEITEMID tid = m_FavTree.GetSelection();
|
|
ASSERT(tid != NULL);
|
|
|
|
HRESULT hr = m_pFavorites->MoveItem(tid, tidNewParent, TREEID_LAST);
|
|
|
|
// on failure tell user selected destination is invalid
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CFavFolderDialog dialog
|
|
|
|
BEGIN_MESSAGE_MAP(CFavFolderDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CFavFolderDialog)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
//}}AFX_MSG_MAP
|
|
ON_MMC_CONTEXT_HELP()
|
|
END_MESSAGE_MAP()
|
|
|
|
CFavFolderDialog::CFavFolderDialog(CFavorites* pFavorites, CWnd* pParent)
|
|
: CDialog(CFavFolderDialog::IDD, pParent),
|
|
m_pFavorites(pFavorites), m_lAdviseCookie(NULL)
|
|
{
|
|
ASSERT(pFavorites != NULL);
|
|
}
|
|
|
|
CFavFolderDialog::~CFavFolderDialog()
|
|
{
|
|
// disconnect fav view from source
|
|
if (m_lAdviseCookie )
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
m_pFavorites->Unadvise(m_lAdviseCookie);
|
|
m_FavTree.SetTreeSource(NULL);
|
|
}
|
|
|
|
// detach classes from windows
|
|
m_FavTree.Detach();
|
|
}
|
|
|
|
CFavFolderDialog::OnInitDialog()
|
|
{
|
|
DECLARE_SC (sc, _T("CFavFolderDialog::OnInitDialog"));
|
|
ASSERT(m_pFavorites != NULL);
|
|
|
|
CDialog::OnInitDialog();
|
|
|
|
ModifyStyleEx(0, WS_EX_CONTEXTHELP, SWP_NOSIZE);
|
|
|
|
// Attach tree ctrl to favorites tree object
|
|
BOOL bStat = m_FavTree.SubclassDlgItem(IDC_FAVTREE, this);
|
|
ASSERT(bStat);
|
|
|
|
// Add extra space between items
|
|
TreeView_SetItemHeight(m_FavTree, TreeView_GetItemHeight(m_FavTree) + FAVVIEW_ITEM_SPACING);
|
|
|
|
// Show only folders
|
|
m_FavTree.SetStyle(TOBSRV_FOLDERSONLY);
|
|
|
|
/*
|
|
* validate m_pFavorites
|
|
*/
|
|
sc = ScCheckPointers (m_pFavorites, E_UNEXPECTED);
|
|
if (sc)
|
|
{
|
|
EndDialog (IDCANCEL);
|
|
return (0);
|
|
}
|
|
|
|
// Attach favorites image list to tree control
|
|
m_FavTree.SetImageList(m_pFavorites->GetImageList(), TVSIL_NORMAL);
|
|
|
|
// attach view to source as observer
|
|
HRESULT hr = m_pFavorites->Advise(static_cast<CTreeObserver*>(&m_FavTree), &m_lAdviseCookie);
|
|
ASSERT(SUCCEEDED(hr) && m_lAdviseCookie != 0);
|
|
|
|
// hand tree data source to tree view
|
|
m_FavTree.SetTreeSource(static_cast<CTreeSource*>(m_pFavorites));
|
|
|
|
// Select the root and give it focus
|
|
m_FavTree.SetSelection(m_pFavorites->GetRootItem());
|
|
m_FavTree.SetFocus();
|
|
|
|
// return 0 so focus isn't changed
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
void CFavFolderDialog::OnOK()
|
|
{
|
|
// Get group name
|
|
m_tidFolder = m_FavTree.GetSelection();
|
|
|
|
// disconnect fav view from source before window goes away
|
|
if (m_lAdviseCookie)
|
|
{
|
|
ASSERT(m_pFavorites != NULL);
|
|
m_pFavorites->Unadvise(m_lAdviseCookie);
|
|
m_FavTree.SetTreeSource(NULL);
|
|
m_lAdviseCookie = 0;
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CFavTreeCtrl
|
|
|
|
SC CFavTreeCtrl::ScInitialize(CFavorites* pFavorites, DWORD dwStyles)
|
|
{
|
|
DECLARE_SC (sc, _T("CFavTreeCtrl::Initialize"));
|
|
|
|
/*
|
|
* validate pFavorites
|
|
*/
|
|
sc = ScCheckPointers (pFavorites);
|
|
if (sc)
|
|
return (sc);
|
|
|
|
// Attach favorites image list to tree control
|
|
m_FavTree.SetImageList(pFavorites->GetImageList(), TVSIL_NORMAL);
|
|
|
|
m_FavTree.SetStyle(dwStyles);
|
|
|
|
// Attach favorites data source
|
|
m_FavTree.SetTreeSource(static_cast<CTreeSource*>(pFavorites));
|
|
|
|
return (sc);
|
|
}
|
|
|
|
int CFavTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
m_FavTree.Create(WS_VISIBLE | TVS_SINGLEEXPAND | TVS_TRACKSELECT |
|
|
TVS_FULLROWSELECT, rect, this, IDC_FAVTREECTRL);
|
|
|
|
// Add extra space between items
|
|
TreeView_SetItemHeight(m_FavTree, TreeView_GetItemHeight(m_FavTree) + FAVVIEW_ITEM_SPACING);
|
|
|
|
// Dont' show the "Favorites" root item
|
|
m_FavTree.SetStyle(TOBSRV_HIDEROOT);
|
|
return 0;
|
|
}
|
|
|
|
void CFavTreeCtrl::PostNcDestroy()
|
|
{
|
|
/*
|
|
* Commit suicide. See the comment for this class's ctor for reasoning
|
|
* why this is safe.
|
|
*/
|
|
delete this;
|
|
}
|
|
|
|
void CFavTreeCtrl::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
// size tree control to parent
|
|
m_FavTree.MoveWindow(0, 0, cx, cy);
|
|
}
|
|
|
|
void CFavTreeCtrl::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
// pass focus to tree control
|
|
m_FavTree.SetFocus();
|
|
}
|
|
|
|
void CFavTreeCtrl::OnSelChanged(NMHDR* pMNHDR, LRESULT* plResult)
|
|
{
|
|
ASSERT(pMNHDR != NULL);
|
|
NM_TREEVIEW* pnmtv = (NM_TREEVIEW*)pMNHDR;
|
|
|
|
TREEITEMID tid = pnmtv->itemNew.lParam;
|
|
CFavObject* pFav = (CFavObject*)tid;
|
|
|
|
WPARAM wParam = pFav->IsGroup() ?
|
|
NULL : reinterpret_cast<WPARAM>(pFav->GetMemento());
|
|
|
|
GetParent()->SendMessage(MMC_MSG_FAVORITE_SELECTION, wParam, 0);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CFavTreeCtrl, CWnd)
|
|
ON_WM_CREATE()
|
|
ON_WM_SIZE()
|
|
ON_WM_SETFOCUS()
|
|
ON_NOTIFY(TVN_SELCHANGED, IDC_FAVTREECTRL, OnSelChanged)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// EnableButton
|
|
//
|
|
// Enables or disables a dialog control. If the control has the focus when
|
|
// it is disabled, the focus is moved to the next control
|
|
//--------------------------------------------------------------------------
|
|
void EnableButton(HWND hwndDialog, int iCtrlID, BOOL bEnable)
|
|
{
|
|
HWND hWndCtrl = ::GetDlgItem(hwndDialog, iCtrlID);
|
|
ASSERT(::IsWindow(hWndCtrl));
|
|
|
|
if (!bEnable && ::GetFocus() == hWndCtrl)
|
|
{
|
|
HWND hWndNextCtrl = ::GetNextDlgTabItem(hwndDialog, hWndCtrl, FALSE);
|
|
if (hWndNextCtrl != NULL && hWndNextCtrl != hWndCtrl)
|
|
{
|
|
::SetFocus(hWndNextCtrl);
|
|
}
|
|
}
|
|
|
|
::EnableWindow(hWndCtrl, bEnable);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member : OnFavoritesMenu
|
|
//
|
|
// Synopsis : Display the favorites menu.
|
|
//
|
|
// Arguments : [point] - x,y co-ordinates for menu.
|
|
//
|
|
// Returns : None.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
void CAMCView::OnFavoritesMenu(CPoint point, LPCRECT prcExclude)
|
|
{
|
|
DECLARE_SC (sc, _T("CAMCView::OnFavoritesMenu"));
|
|
TRACE_METHOD(CAMCView, OnFavoritesMenu);
|
|
|
|
CMenu menu;
|
|
VERIFY( menu.CreatePopupMenu() );
|
|
|
|
// Default items available only in Author mode.
|
|
if (AMCGetApp()->GetMode() == eMode_Author)
|
|
{
|
|
CString strItem;
|
|
|
|
// Menu Command Ids for below items are string resource
|
|
// IDs. The real favorites use the TREEITEMID as ID,
|
|
// which are pointers and wont clash with below resource
|
|
// IDs which are less than 0xFFFF
|
|
LoadString(strItem, IDS_ADD_TO_FAVORITES);
|
|
int iSeparator = strItem.Find(_T('\n'));
|
|
if (iSeparator > 0)
|
|
strItem = strItem.Left(iSeparator);
|
|
|
|
VERIFY(menu.AppendMenu(MF_DEFAULT, IDS_ADD_TO_FAVORITES, (LPCTSTR)strItem));
|
|
|
|
LoadString(strItem, IDS_ORGANIZEFAVORITES);
|
|
iSeparator = strItem.Find(_T('\n'));
|
|
if (iSeparator > 0)
|
|
strItem = strItem.Left(iSeparator);
|
|
|
|
VERIFY(menu.AppendMenu(MF_DEFAULT, IDS_ORGANIZEFAVORITES, (LPCTSTR)strItem));
|
|
}
|
|
|
|
CAMCDoc* pDoc = GetDocument();
|
|
ASSERT(pDoc);
|
|
CFavorites* pFavorites = pDoc->GetFavorites();
|
|
|
|
/*
|
|
* Index 0 of the vector is unused (a 0 return from TrackPopupMenu
|
|
* means nothing was selected). Put a placeholder there.
|
|
*/
|
|
TIDVector vItemIDs;
|
|
vItemIDs.push_back (NULL);
|
|
|
|
/*
|
|
* make sure IDS_ADD_TO_FAVORITES and IDS_ORGANIZEFAVORITES
|
|
* won't conflict with any indices in the TID vector, given a
|
|
* reasonable upper bound on the number of favorites
|
|
*/
|
|
const int cMaxReasonableFavorites = 1024;
|
|
ASSERT (vItemIDs.size () <= cMaxReasonableFavorites);
|
|
COMPILETIME_ASSERT (IDS_ADD_TO_FAVORITES > cMaxReasonableFavorites);
|
|
COMPILETIME_ASSERT (IDS_ORGANIZEFAVORITES > cMaxReasonableFavorites);
|
|
|
|
// Add existing favorites.
|
|
if ( (NULL != pFavorites) && (pFavorites->IsEmpty() == false))
|
|
{
|
|
TREEITEMID tid = pFavorites->GetRootItem();
|
|
if (NULL != tid)
|
|
{
|
|
tid = pFavorites->GetChildItem(tid);
|
|
if (NULL != tid)
|
|
{
|
|
// Add separator.
|
|
if (AMCGetApp()->GetMode() == eMode_Author)
|
|
VERIFY(menu.AppendMenu(MF_SEPARATOR, 0, _T("")));
|
|
|
|
// Add child items.
|
|
AddFavItemsToCMenu(menu, pFavorites, tid, vItemIDs);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Display the context menu.
|
|
TPMPARAMS* ptpm = NULL;
|
|
TPMPARAMS tpm;
|
|
|
|
/*
|
|
* if given, initialize the rectangle not to obscure
|
|
*/
|
|
if (prcExclude != NULL)
|
|
{
|
|
tpm.cbSize = sizeof(tpm);
|
|
tpm.rcExclude = *prcExclude;
|
|
ptpm = &tpm;
|
|
}
|
|
|
|
LONG lSelected = TrackPopupMenuEx (
|
|
menu.GetSafeHmenu(),
|
|
TPM_RETURNCMD | TPM_NONOTIFY | TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_VERTICAL,
|
|
point.x,
|
|
point.y,
|
|
GetSafeHwnd(),
|
|
ptpm );
|
|
|
|
// Handle the selection.
|
|
|
|
switch (lSelected)
|
|
{
|
|
case 0: // Nothing is selected
|
|
break;
|
|
|
|
case IDS_ADD_TO_FAVORITES: // Bring the Add To Favorites dialog.
|
|
OnAddToFavorites();
|
|
break;
|
|
|
|
case IDS_ORGANIZEFAVORITES: // Bring the organize favorites dialog.
|
|
{
|
|
CAMCDoc* pDoc = GetDocument();
|
|
ASSERT(pDoc != NULL && pDoc->GetFavorites() != NULL);
|
|
|
|
pDoc->GetFavorites()->OrganizeFavorites(this);
|
|
}
|
|
break;
|
|
|
|
default: // This is a favorite item. Select it.
|
|
{
|
|
CFavorites* pFavs = GetDocument()->GetFavorites();
|
|
sc = ScCheckPointers (pFavs, E_UNEXPECTED);
|
|
if (sc)
|
|
break;
|
|
|
|
sc = (lSelected < vItemIDs.size()) ? S_OK : E_UNEXPECTED;
|
|
if (sc)
|
|
break;
|
|
|
|
TREEITEMID tid = vItemIDs[lSelected];
|
|
CFavObject* pFavObj = pFavs->FavObjFromTID(tid);
|
|
|
|
sc = ScCheckPointers (pFavObj, E_UNEXPECTED);
|
|
if (sc)
|
|
break;
|
|
|
|
sc = ScViewMemento(pFavObj->GetMemento());
|
|
if (sc == ScFromMMC(IDS_NODE_NOT_FOUND) )
|
|
{
|
|
MMCMessageBox(sc, MB_ICONEXCLAMATION | MB_OK);
|
|
sc.Clear();
|
|
return;
|
|
}
|
|
|
|
if (sc)
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member : AddFavItemsToCMenu.
|
|
//
|
|
// Synopsis : Enumerate the favorites tree and add them as menu items.
|
|
//
|
|
// Arguments : [menu] - Parent menu item.
|
|
// [pFavs] - Favorites object.
|
|
// [tid] - Tree Item ID.
|
|
//
|
|
// Returns : None.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
void CAMCView::AddFavItemsToCMenu(CMenu& menu, CFavorites* pFavs, TREEITEMID tid, TIDVector& vItemIDs)
|
|
{
|
|
TCHAR szName[MAX_PATH];
|
|
|
|
while (NULL != tid)
|
|
{
|
|
UINT nFlags = MF_DEFAULT;
|
|
UINT_PTR nCommandID;
|
|
|
|
// If this is folder item then
|
|
// create a popup menu.
|
|
if (pFavs->IsFolderItem(tid))
|
|
{
|
|
TREEITEMID tidChild = pFavs->GetChildItem(tid);
|
|
|
|
CMenu submenu;
|
|
VERIFY(submenu.CreatePopupMenu());
|
|
|
|
// Add the children.
|
|
if (NULL != tidChild)
|
|
{
|
|
AddFavItemsToCMenu(submenu, pFavs, tidChild, vItemIDs);
|
|
}
|
|
else
|
|
{
|
|
// Add an empty item.
|
|
CString strItem;
|
|
LoadString(strItem, IDS_Empty);
|
|
VERIFY(submenu.AppendMenu(MF_GRAYED, 0, (LPCTSTR)strItem));
|
|
}
|
|
|
|
HMENU hSubmenu = submenu.Detach();
|
|
ASSERT( NULL != hSubmenu );
|
|
|
|
nFlags = MF_POPUP;
|
|
nCommandID = (UINT_PTR)hSubmenu;
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* The command ID will be used as an index into vItemIDs,
|
|
* so the ID for this item is the size of the vector *before*
|
|
* the item is added to the vector.
|
|
*/
|
|
nCommandID = vItemIDs.size();
|
|
vItemIDs.push_back (tid);
|
|
}
|
|
|
|
pFavs->GetItemName(tid, szName, countof(szName));
|
|
VERIFY(menu.AppendMenu(nFlags, nCommandID, szName));
|
|
|
|
// Get the next sibling.
|
|
tid = pFavs->GetNextSiblingItem(tid);
|
|
}
|
|
|
|
return;
|
|
}
|