Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1948 lines
51 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1999
//
// File: Util.cpp
//
// Contents: Utility functions
//
// History: 08-Nov-99 JeffJon Created
//
//
//--------------------------------------------------------------------------
#include "stdafx.h"
#include "util.h"
#include "uiutil.h"
#include "dsutil.h"
#include "dsdlgs.h"
#include "helpids.h"
/////////////////////////////////////////////////////////////////////
// Combo box Utilities
//
int ComboBox_AddString(HWND hwndCombobox, UINT uStringId)
{
ASSERT(IsWindow(hwndCombobox));
CString str;
VERIFY( str.LoadString(uStringId) );
LRESULT i = SendMessage(hwndCombobox, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)str);
Report(i >= 0);
SendMessage(hwndCombobox, CB_SETITEMDATA, (WPARAM)i, uStringId);
return (int)i;
}
void ComboBox_AddStrings(HWND hwndCombobox, const UINT rgzuStringId[])
{
ASSERT(IsWindow(hwndCombobox));
ASSERT(rgzuStringId != NULL);
CString str;
for (const UINT * puStringId = rgzuStringId; *puStringId != 0; puStringId++)
{
VERIFY( str.LoadString(*puStringId) );
LRESULT i = SendMessage(hwndCombobox, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)str);
Report(i >= 0);
SendMessage(hwndCombobox, CB_SETITEMDATA, (WPARAM)i, *puStringId);
}
}
int ComboBox_FindItemByLParam(HWND hwndCombobox, LPARAM lParam)
{
ASSERT(IsWindow(hwndCombobox));
Report(lParam != CB_ERR && "Ambiguous parameter.");
LRESULT iItem = SendMessage(hwndCombobox, CB_GETCOUNT, 0, 0);
ASSERT(iItem >= 0);
while (iItem-- > 0)
{
LRESULT l = SendMessage(hwndCombobox, CB_GETITEMDATA, (WPARAM)iItem, 0);
Report(l != CB_ERR);
if (l == lParam)
{
return ((int)iItem);
}
}
return -1;
}
int ComboBox_SelectItemByLParam(HWND hwndCombobox, LPARAM lParam)
{
ASSERT(IsWindow(hwndCombobox));
int iItem = ComboBox_FindItemByLParam(hwndCombobox, lParam);
if (iItem >= 0)
{
SendMessage(hwndCombobox, CB_SETCURSEL, iItem, 0);
}
return iItem;
}
LPARAM ComboBox_GetSelectedItemLParam(HWND hwndCombobox)
{
LRESULT iItem = SendMessage(hwndCombobox, CB_GETCURSEL, 0, 0);
if (iItem < 0)
{
// No item selected
return NULL;
}
LRESULT lParam = SendMessage(hwndCombobox, CB_GETITEMDATA, (WPARAM)iItem, 0);
if (lParam == CB_ERR)
{
Report(FALSE && "Ambiguous return value.");
return NULL;
}
return (LPARAM)lParam;
}
/////////////////////////////////////////////////////////////////////
// Dialog Utilities
//
HWND HGetDlgItem(HWND hdlg, INT nIdDlgItem)
{
ASSERT(IsWindow(hdlg));
ASSERT(IsWindow(GetDlgItem(hdlg, nIdDlgItem)));
return GetDlgItem(hdlg, nIdDlgItem);
} // HGetDlgItem()
void SetDlgItemFocus(HWND hdlg, INT nIdDlgItem)
{
SetFocus(HGetDlgItem(hdlg, nIdDlgItem));
}
void EnableDlgItem(HWND hdlg, INT nIdDlgItem, BOOL fEnable)
{
EnableWindow(HGetDlgItem(hdlg, nIdDlgItem), fEnable);
}
void HideDlgItem(HWND hdlg, INT nIdDlgItem, BOOL fHideItem)
{
HWND hwndCtl = HGetDlgItem(hdlg, nIdDlgItem);
ShowWindow(hwndCtl, fHideItem ? SW_HIDE : SW_SHOW);
EnableWindow(hwndCtl, !fHideItem);
}
void EnableDlgItemGroup(HWND hdlg, // IN: Parent dialog of the controls
const UINT rgzidCtl[], // IN: Group (array) of control Ids to be enabled (or disabled)
BOOL fEnableAll) // IN: TRUE => We want to enable the controls; FALSE => We want to disable the controls
{
ASSERT(IsWindow(hdlg));
ASSERT(rgzidCtl != NULL);
for (const UINT * pidCtl = rgzidCtl; *pidCtl != 0; pidCtl++)
{
EnableWindow(HGetDlgItem(hdlg, *pidCtl), fEnableAll);
}
} // EnableDlgItemGroup()
void HideDlgItemGroup(HWND hdlg, // IN: Parent dialog of the controls
const UINT rgzidCtl[], // IN: Group (array) of control Ids to be shown (or hidden)
BOOL fHideAll) // IN: TRUE => We want to hide all the controls; FALSE => We want to show all the controls
{
ASSERT(IsWindow(hdlg));
ASSERT(rgzidCtl != NULL);
for (const UINT * pidCtl = rgzidCtl; *pidCtl != 0; pidCtl++)
{
HideDlgItem(hdlg, *pidCtl, fHideAll);
}
} // HideDlgItemGroup()
/////////////////////////////////////////////////////////////////////
// List View Utilities
//
void ListView_AddColumnHeaders(HWND hwndListview, // IN: Handle of the listview we want to add columns
const TColumnHeaderItem rgzColumnHeader[]) // IN: Array of column header items
{
RECT rcClient;
INT cxTotalWidth; // Total width of the listview control
LV_COLUMN lvColumn;
INT cxColumn; // Width of the individual column
CString str;
ASSERT(IsWindow(hwndListview));
ASSERT(rgzColumnHeader != NULL);
GetClientRect(hwndListview, OUT &rcClient);
cxTotalWidth = rcClient.right;
for (INT i = 0; rgzColumnHeader[i].uStringId != 0; i++)
{
if (!str.LoadString(rgzColumnHeader[i].uStringId))
{
TRACE(L"Unable to load string Id=%d\n", rgzColumnHeader[i].uStringId);
ASSERT(FALSE && "String not found");
continue;
}
lvColumn.mask = LVCF_TEXT;
lvColumn.pszText = (LPTSTR)(LPCTSTR)str;
cxColumn = rgzColumnHeader[i].nColWidth;
if (cxColumn > 0)
{
ASSERT(cxColumn <= 100);
cxColumn = (cxTotalWidth * cxColumn) / 100;
lvColumn.mask |= LVCF_WIDTH;
lvColumn.cx = cxColumn;
}
int iColRet = ListView_InsertColumn(hwndListview, i, IN &lvColumn);
Report(iColRet == i);
} // for
} // ListView_AddColumnHeaders()
int ListView_AddString(HWND hwndListview,
const LPCTSTR psz, // IN: String to insert
LPARAM lParam) // IN: User-defined parameter
{
ASSERT(IsWindow(hwndListview));
ASSERT(psz != NULL);
LV_ITEM lvItem;
int iItem;
GarbageInit(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.lParam = lParam;
lvItem.iSubItem = 0;
lvItem.pszText = const_cast<LPTSTR>(psz);
iItem = ListView_InsertItem(hwndListview, IN &lvItem);
Report(iItem >= 0);
return iItem;
} // ListView_AddString()
int ListView_AddStrings(HWND hwndListview,
const LPCTSTR rgzpsz[], // IN: Array of strings
LPARAM lParam) // IN: User-defined parameter
{
ASSERT(IsWindow(hwndListview));
ASSERT(rgzpsz != NULL);
LV_ITEM lvItem;
int iItem;
GarbageInit(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.lParam = lParam;
lvItem.iSubItem = 0;
lvItem.pszText = const_cast<LPTSTR>(rgzpsz[0]);
iItem = ListView_InsertItem(hwndListview, IN &lvItem);
Report(iItem >= 0);
if (rgzpsz[0] == NULL)
{
return iItem;
}
lvItem.iItem = iItem;
lvItem.mask = LVIF_TEXT;
for (lvItem.iSubItem = 1 ; rgzpsz[lvItem.iSubItem] != NULL; lvItem.iSubItem++)
{
lvItem.pszText = const_cast<LPTSTR>(rgzpsz[lvItem.iSubItem]);
VERIFY( ListView_SetItem(hwndListview, IN &lvItem) );
}
return iItem;
} // ListView_AddStrings()
void ListView_SelectItem(HWND hwndListview,
int iItem)
{
ASSERT(IsWindow(hwndListview));
ASSERT(iItem >= 0);
ListView_SetItemState(hwndListview, iItem, LVIS_SELECTED, LVIS_SELECTED);
} // ListView_SelectItem()
int ListView_GetSelectedItem(HWND hwndListview)
{
ASSERT(IsWindow(hwndListview));
return ListView_GetNextItem(hwndListview, -1, LVNI_SELECTED);
}
void ListView_SetItemString(HWND hwndListview,
int iItem,
int iSubItem,
IN const CString& rstrText)
{
ASSERT(IsWindow(hwndListview));
ASSERT(iItem >= 0);
ASSERT(iSubItem >= 0);
ListView_SetItemText(hwndListview, iItem, iSubItem,
const_cast<LPTSTR>((LPCTSTR)rstrText));
} // ListView_SetItemString()
int ListView_GetItemString(HWND hwndListview,
int iItem,
int iSubItem,
OUT CString& rstrText)
{
ASSERT(IsWindow(hwndListview));
if (iItem == -1)
{
// Find out the selected item
iItem = ListView_GetSelectedItem(hwndListview);
if (iItem == -1)
{
// No item selected
rstrText.Empty();
return -1;
}
}
ASSERT(iItem >= 0);
const int cchBuffer = 1024; // Initial buffer
TCHAR * psz = rstrText.GetBuffer(cchBuffer);
ASSERT(psz != NULL);
*psz = '\0';
ListView_GetItemText(hwndListview, iItem, iSubItem, OUT psz, cchBuffer-1);
rstrText.ReleaseBuffer();
Report((rstrText.GetLength() < cchBuffer - 16) && "Buffer too small to hold entire string");
rstrText.FreeExtra();
return iItem;
} // ListView_GetItemString()
LPARAM ListView_GetItemLParam(HWND hwndListview,
int iItem,
int * piItem) // OUT: OPTIONAL: Pointer to the index of the listview item
{
ASSERT(IsWindow(hwndListview));
Endorse(piItem == NULL); // TRUE => Don't care about the index
if (iItem == -1)
{
// Find out the selected item
iItem = ListView_GetSelectedItem(hwndListview);
if (iItem == -1)
{
// No item selected
if (piItem != NULL)
{
*piItem = -1;
}
return NULL;
}
}
ASSERT(iItem >= 0);
if (piItem != NULL)
{
*piItem = iItem;
}
LV_ITEM lvItem;
GarbageInit(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_PARAM;
lvItem.iItem = iItem;
lvItem.iSubItem = 0;
lvItem.lParam = 0; // Just in case
VERIFY(ListView_GetItem(hwndListview, OUT &lvItem));
return lvItem.lParam;
} // ListView_GetItemLParam()
int ListView_FindString(HWND hwndListview,
LPCTSTR pszTextSearch)
{
ASSERT(IsWindow(hwndListview));
ASSERT(pszTextSearch != NULL);
LV_FINDINFO lvFindInfo;
GarbageInit(&lvFindInfo, sizeof(lvFindInfo));
lvFindInfo.flags = LVFI_STRING;
lvFindInfo.psz = pszTextSearch;
return ListView_FindItem(hwndListview, -1, &lvFindInfo);
} // ListView_FindString()
int ListView_FindLParam(HWND hwndListview,
LPARAM lParam)
{
ASSERT(IsWindow(hwndListview));
LV_FINDINFO lvFindInfo;
GarbageInit(&lvFindInfo, sizeof(lvFindInfo));
lvFindInfo.flags = LVFI_PARAM;
lvFindInfo.lParam = lParam;
return ListView_FindItem(hwndListview, -1, &lvFindInfo);
} // ListView_FindLParam()
int ListView_SelectLParam(HWND hwndListview,
LPARAM lParam)
{
int iItem = ListView_FindLParam(hwndListview, lParam);
if (iItem >= 0)
{
ListView_SelectItem(hwndListview, iItem);
}
else
{
TRACE2("ListView_SelectLParam() - Unable to find lParam=%x (%d).\n",
lParam, lParam);
}
return iItem;
} // ListView_SelectLParam()
////////////////////////////////////////////////////////////////////////////
// CMultiselectErrorDialog
BEGIN_MESSAGE_MAP(CMultiselectErrorDialog, CDialog)
END_MESSAGE_MAP()
HRESULT CMultiselectErrorDialog::Initialize(CUINode** ppNodeArray,
PWSTR* pErrorArray,
UINT nErrorCount,
PCWSTR pszTitle,
PCWSTR pszCaption,
PCWSTR pszColumnHeader)
{
ASSERT(ppNodeArray != NULL);
ASSERT(pErrorArray != NULL);
ASSERT(pszTitle != NULL);
ASSERT(pszCaption != NULL);
ASSERT(pszColumnHeader != NULL);
if (ppNodeArray == NULL ||
pErrorArray == NULL ||
pszTitle == NULL ||
pszCaption == NULL ||
pszColumnHeader == NULL)
{
return E_POINTER;
}
m_ppNodeList = ppNodeArray;
m_pErrorArray = pErrorArray;
m_nErrorCount = nErrorCount;
m_szTitle = pszTitle;
m_szCaption = pszCaption;
m_szColumnHeader = pszColumnHeader;
return S_OK;
}
HRESULT CMultiselectErrorDialog::Initialize(PWSTR* pPathArray,
PWSTR* pClassArray,
PWSTR* pErrorArray,
UINT nErrorCount,
PCWSTR pszTitle,
PCWSTR pszCaption,
PCWSTR pszColumnHeader)
{
ASSERT(pPathArray != NULL);
ASSERT(pClassArray != NULL);
ASSERT(pErrorArray != NULL);
ASSERT(pszTitle != NULL);
ASSERT(pszCaption != NULL);
ASSERT(pszColumnHeader != NULL);
if (pPathArray == NULL ||
pClassArray == NULL ||
pErrorArray == NULL ||
pszTitle == NULL ||
pszCaption == NULL ||
pszColumnHeader == NULL)
{
return E_POINTER;
}
m_pPathArray = pPathArray;
m_pClassArray = pClassArray;
m_pErrorArray = pErrorArray;
m_nErrorCount = nErrorCount;
m_szTitle = pszTitle;
m_szCaption = pszCaption;
m_szColumnHeader = pszColumnHeader;
return S_OK;
}
const int OBJ_LIST_NAME_COL_WIDTH = 100;
const int IDX_NAME_COL = 0;
const int IDX_ERR_COL = 1;
BOOL CMultiselectErrorDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetWindowText(m_szTitle);
SetDlgItemText(IDC_STATIC_MESSAGE, m_szCaption);
HWND hList = GetDlgItem(IDC_ERROR_LIST)->GetSafeHwnd();
ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT);
//
// Create the image list
//
m_hImageList = ImageList_Create(16, 16, ILC_COLOR | ILC_MASK, 1, 1);
ASSERT(m_hImageList != NULL);
if (m_hImageList != NULL)
{
ListView_SetImageList(hList, m_hImageList, LVSIL_SMALL);
}
//
// Set the column headings.
//
RECT rect;
::GetClientRect(hList, &rect);
LV_COLUMN lvc = {0};
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = OBJ_LIST_NAME_COL_WIDTH;
lvc.pszText = (PWSTR)(PCWSTR)m_szColumnHeader;
lvc.iSubItem = IDX_NAME_COL;
ListView_InsertColumn(hList, IDX_NAME_COL, &lvc);
CString szError;
VERIFY(szError.LoadString(IDS_ERROR));
lvc.cx = rect.right - OBJ_LIST_NAME_COL_WIDTH;
lvc.pszText = (PWSTR)(PCWSTR)szError;
lvc.iSubItem = IDX_ERR_COL;
ListView_InsertColumn(hList, IDX_ERR_COL, &lvc);
//
// Insert the errors
//
//
// Use the node list if its not NULL
//
if (m_ppNodeList != NULL)
{
ASSERT(m_pErrorArray != NULL && m_ppNodeList != NULL);
for (UINT nIdx = 0; nIdx < m_nErrorCount; nIdx++)
{
CUINode* pNode = m_ppNodeList[nIdx];
if (pNode != NULL)
{
if (nIdx < m_nErrorCount && m_pErrorArray[nIdx])
{
//
// Create the list view item
//
LV_ITEM lvi = {0};
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iSubItem = IDX_NAME_COL;
lvi.lParam = (LPARAM)pNode->GetName();
lvi.pszText = (PWSTR)pNode->GetName();
lvi.iItem = nIdx;
if (m_hImageList != NULL)
{
//
// REVIEW_JEFFJON : this will add multiple icons of the same class
// need to provide a better means for managing the icons
//
CDSCookie* pCookie = GetDSCookieFromUINode(pNode);
if (pCookie != NULL)
{
HICON icon = m_pComponentData->GetBasePathsInfo()->GetIcon(
// someone really blew it with const correctness...
const_cast<LPTSTR>(pCookie->GetClass()),
DSGIF_ISNORMAL | DSGIF_GETDEFAULTICON,
16,
16);
int i = ::ImageList_AddIcon(m_hImageList, icon);
ASSERT(i != -1);
if (i != -1)
{
lvi.mask |= LVIF_IMAGE;
lvi.iImage = i;
}
}
}
//
// Insert the new item
//
int NewIndex = ListView_InsertItem(hList, &lvi);
ASSERT(NewIndex != -1);
if (NewIndex == -1)
{
continue;
}
// Add the error message
ListView_SetItemText(hList, NewIndex, IDX_ERR_COL, m_pErrorArray[nIdx]);
}
}
}
}
else if (m_pPathArray != NULL) // if the node list is NULL then use the string list
{
ASSERT(m_pErrorArray != NULL && m_pPathArray != NULL);
for (UINT nIdx = 0; nIdx < m_nErrorCount; nIdx++)
{
if (nIdx < m_nErrorCount && m_pErrorArray[nIdx])
{
//
// Use the path cracker to retrieve the name of the object
//
PCWSTR pszPath = m_pPathArray[nIdx];
CPathCracker pathCracker;
VERIFY(SUCCEEDED(pathCracker.Set(CComBSTR(pszPath), ADS_SETTYPE_DN)));
VERIFY(SUCCEEDED(pathCracker.put_EscapedMode(ADS_ESCAPEDMODE_OFF_EX)));
VERIFY(SUCCEEDED(pathCracker.SetDisplayType(ADS_DISPLAY_VALUE_ONLY)));
CComBSTR bstrName;
VERIFY(SUCCEEDED(pathCracker.GetElement(0, &bstrName)));
//
// Create the list view item
//
LV_ITEM lvi = {0};
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iSubItem = IDX_NAME_COL;
//
// Make the LPARAM be the path to the object
// Not used at this time but may be useful in
// the future for bringing up property pages or
// other special features.
//
lvi.lParam = (LPARAM)m_pPathArray[nIdx];
lvi.pszText = (PWSTR)bstrName;
lvi.iItem = nIdx;
if (m_hImageList != NULL)
{
//
// REVIEW_JEFFJON : this will add multiple icons of the same class
// need to provide a better means for managing the icons
//
ASSERT(m_pClassArray[nIdx] != NULL);
HICON icon = m_pComponentData->GetBasePathsInfo()->GetIcon(
// someone really blew it with const correctness...
const_cast<LPTSTR>(m_pClassArray[nIdx]),
DSGIF_ISNORMAL | DSGIF_GETDEFAULTICON,
16,
16);
int i = ::ImageList_AddIcon(m_hImageList, icon);
ASSERT(i != -1);
if (i != -1)
{
lvi.mask |= LVIF_IMAGE;
lvi.iImage = i;
}
}
//
// Insert the new item
//
int NewIndex = ListView_InsertItem(hList, &lvi);
ASSERT(NewIndex != -1);
if (NewIndex == -1)
{
continue;
}
//
// Set the error message
//
ListView_SetItemText(hList, NewIndex, IDX_ERR_COL, m_pErrorArray[nIdx]);
}
}
}
UpdateListboxHorizontalExtent();
return TRUE;
}
void CMultiselectErrorDialog::UpdateListboxHorizontalExtent()
{
CListCtrl* pListView = reinterpret_cast<CListCtrl*>(GetDlgItem(IDC_ERROR_LIST));
pListView->SetColumnWidth(IDX_ERR_COL, LVSCW_AUTOSIZE);
}
/////////////////////////////////////////////////////////////////////
// MFC Utilities
//
// CDialogEx
//
CDialogEx::CDialogEx(UINT nIDTemplate, CWnd * pParentWnd) : CDialog(nIDTemplate, pParentWnd)
{
}
HWND CDialogEx::HGetDlgItem(INT nIdDlgItem)
{
return ::HGetDlgItem(m_hWnd, nIdDlgItem);
}
void CDialogEx::SetDlgItemFocus(INT nIdDlgItem)
{
::SetDlgItemFocus(m_hWnd, nIdDlgItem);
}
void CDialogEx::EnableDlgItem(INT nIdDlgItem, BOOL fEnable)
{
::EnableDlgItem(m_hWnd, nIdDlgItem, fEnable);
}
void CDialogEx::HideDlgItem(INT nIdDlgItem, BOOL fHideItem)
{
::HideDlgItem(m_hWnd, nIdDlgItem, fHideItem);
}
/////////////////////////////////////////////////////////////////////////////////////
// CPropertyPageEx_Mine
//
CPropertyPageEx_Mine::CPropertyPageEx_Mine(UINT nIDTemplate) : CPropertyPage(nIDTemplate)
{
}
HWND CPropertyPageEx_Mine::HGetDlgItem(INT nIdDlgItem)
{
return ::HGetDlgItem(m_hWnd, nIdDlgItem);
}
void CPropertyPageEx_Mine::SetDlgItemFocus(INT nIdDlgItem)
{
::SetDlgItemFocus(m_hWnd, nIdDlgItem);
}
void CPropertyPageEx_Mine::EnableDlgItem(INT nIdDlgItem, BOOL fEnable)
{
::EnableDlgItem(m_hWnd, nIdDlgItem, fEnable);
}
void CPropertyPageEx_Mine::HideDlgItem(INT nIdDlgItem, BOOL fHideItem)
{
::HideDlgItem(m_hWnd, nIdDlgItem, fHideItem);
}
/////////////////////////////////////////////////////////////////////////////
// CProgressDialogBase
UINT CProgressDialogBase::s_nNextStepMessage = WM_USER + 100;
CProgressDialogBase::CProgressDialogBase(HWND hParentWnd)
: CDialog(IDD_PROGRESS, CWnd::FromHandle(hParentWnd))
{
m_nSteps = 0;
m_nCurrStep = 0;
m_nTitleStringID = 0;
}
BEGIN_MESSAGE_MAP(CProgressDialogBase, CDialog)
ON_WM_SHOWWINDOW()
ON_WM_CLOSE()
ON_MESSAGE(CProgressDialogBase::s_nNextStepMessage, OnNextStepMessage )
END_MESSAGE_MAP()
BOOL CProgressDialogBase::OnInitDialog()
{
CDialog::OnInitDialog();
m_progressCtrl.SubclassDlgItem(IDC_PROG_BAR, this);
if (m_nTitleStringID >0)
{
CString szTitle;
if (szTitle.LoadString(m_nTitleStringID))
SetWindowText(szTitle);
}
GetDlgItemText(IDC_PROG_STATIC, m_szProgressFormat);
SetDlgItemText(IDC_PROG_STATIC, NULL);
OnStart();
ASSERT(m_nSteps > 0);
if (m_nSteps == 0)
PostMessage(WM_CLOSE);
#if _MFC_VER >= 0x0600
m_progressCtrl.SetRange32(0, m_nSteps);
#else
m_progressCtrl.SetRange(0, m_nSteps);
#endif
//
// We want to walk backwards through the list for UI performance reasons
//
m_nCurrStep = m_nSteps - 1;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CProgressDialogBase::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialog::OnShowWindow(bShow, nStatus);
// kick the process
if (bShow && (m_nSteps > 0) && (m_nCurrStep == m_nSteps - 1))
{
m_bDone = FALSE;
PostMessage(s_nNextStepMessage);
}
}
void CProgressDialogBase::OnClose()
{
OnEnd();
CDialog::OnClose();
}
afx_msg LONG CProgressDialogBase::OnNextStepMessage( WPARAM, LPARAM)
{
ASSERT(!m_bDone);
BOOL bExit = FALSE;
if (m_nCurrStep > 0)
{
m_progressCtrl.OffsetPos(1);
_SetProgressText();
if (!OnStep(m_nCurrStep--))
bExit = TRUE; // aborted by user
}
else if (m_nCurrStep == 0)
{
m_progressCtrl.OffsetPos(1);
_SetProgressText();
OnStep(m_nCurrStep--);
bExit = TRUE;
m_bDone = TRUE;
}
else
{
bExit = TRUE;
m_bDone = TRUE;
}
if (bExit)
{
PostMessage(WM_CLOSE);
}
else
{
MSG tempMSG;
while(::PeekMessage(&tempMSG,NULL, 0, 0, PM_REMOVE))
{
DispatchMessage(&tempMSG);
}
PostMessage(s_nNextStepMessage);
}
return 0;
}
void CProgressDialogBase::_SetProgressText()
{
CString szMessage;
WCHAR szCurrStep[128], szMaxSteps[128];
wsprintf(szCurrStep, L"%d",(m_nSteps - m_nCurrStep));
wsprintf(szMaxSteps, L"%d",m_nSteps);
//NTRAID#NTBUG9-571997-2002/03/10-jmessec szMessage.FormatString may throw an exception, which isn't being caught...
// might be appropriate behavior if caller is aware; possible memory leak with szMessage?
szMessage.FormatMessage(m_szProgressFormat, szCurrStep, szMaxSteps);
SetDlgItemText(IDC_PROG_STATIC, szMessage);
}
////////////////////////////////////////////////////////////////////////////
// CMultipleProgressDialogBase
//
CMultipleProgressDialogBase::~CMultipleProgressDialogBase()
{
//
// Delete the error reporting structures
//
if (m_pErrorArray != NULL)
{
for (UINT nIdx = 0; nIdx < m_nErrorCount; ++nIdx)
{
if (m_pErrorArray[nIdx])
{
delete[] m_pErrorArray[nIdx];
}
}
delete[] m_pErrorArray;
m_pErrorArray = 0;
}
if (m_pPathArray != NULL)
{
for (UINT nIdx = 0; nIdx < m_nErrorCount; nIdx++)
{
if (m_pPathArray[nIdx] != NULL)
{
delete[] m_pPathArray[nIdx];
}
}
delete[] m_pPathArray;
m_pPathArray = NULL;
}
if (m_pClassArray != NULL)
{
for (UINT nIdx = 0; nIdx < m_nErrorCount; nIdx++)
{
if (m_pClassArray[nIdx] != NULL)
{
delete[] m_pClassArray[nIdx];
}
}
delete[] m_pClassArray;
m_pClassArray = NULL;
}
}
HRESULT CMultipleProgressDialogBase::AddError(PCWSTR pszError,
PCWSTR pszPath,
PCWSTR pszClass)
{
//
// Prepare the multiselect error handling structures if necessary
//
if (m_pErrorArray == NULL)
{
m_pErrorArray = new PWSTR[GetStepCount()];
if (m_pErrorArray)
{
ZeroMemory(m_pErrorArray, sizeof(PWSTR) * GetStepCount());
}
}
if (m_pPathArray == NULL)
{
m_pPathArray = new PWSTR[GetStepCount()];
if (m_pPathArray)
{
ZeroMemory(m_pPathArray, sizeof(PWSTR) * GetStepCount());
}
}
if (m_pClassArray == NULL)
{
m_pClassArray = new PWSTR[GetStepCount()];
if (m_pClassArray)
{
ZeroMemory(m_pClassArray, sizeof(PWSTR) * GetStepCount());
}
}
if (m_pErrorArray == NULL ||
m_pPathArray == NULL ||
m_pClassArray == NULL)
{
return E_OUTOFMEMORY;
}
m_pErrorArray[m_nErrorCount] = new WCHAR[wcslen(pszError) + 1];
if (m_pErrorArray[m_nErrorCount] == NULL)
{
return E_OUTOFMEMORY;
}
wcscpy(m_pErrorArray[m_nErrorCount], pszError);
m_pPathArray[m_nErrorCount] = new WCHAR[wcslen(pszPath) + 1];
if (m_pPathArray[m_nErrorCount] == NULL)
{
return E_OUTOFMEMORY;
}
wcscpy(m_pPathArray[m_nErrorCount], pszPath);
m_pClassArray[m_nErrorCount] = new WCHAR[wcslen(pszClass) + 1];
if (m_pClassArray[m_nErrorCount] == NULL)
{
return E_OUTOFMEMORY;
}
wcscpy(m_pClassArray[m_nErrorCount], pszClass);
m_nErrorCount++;
return S_OK;
}
void CMultipleProgressDialogBase::OnEnd()
{
if (m_nErrorCount > 0)
{
if (m_pComponentData != NULL)
{
ASSERT(m_pPathArray != NULL);
ASSERT(m_pClassArray != NULL);
ASSERT(m_pErrorArray != NULL);
CString szTitle;
if (m_pComponentData->QuerySnapinType() == SNAPINTYPE_SITE)
{
VERIFY(szTitle.LoadString(IDS_SITESNAPINNAME));
}
else
{
VERIFY(szTitle.LoadString(IDS_DSSNAPINNAME));
}
CString szHeader;
VERIFY(szHeader.LoadString(IDS_COLUMN_NAME));
CString szCaption;
GetCaptionString(szCaption);
//
// Initialize and show the multiselect error dialog
//
CThemeContextActivator activator;
CMultiselectErrorDialog errorDlg(m_pComponentData);
HRESULT hr = errorDlg.Initialize(m_pPathArray,
m_pClassArray,
m_pErrorArray,
m_nErrorCount,
szTitle,
szCaption,
szHeader);
ASSERT(SUCCEEDED(hr));
errorDlg.DoModal();
}
else
{
ASSERT(m_pComponentData != NULL);
}
}
else
{
m_pComponentData->InvalidateSavedQueriesContainingObjects(m_szObjPathList);
}
}
////////////////////////////////////////////////////////////////////////////
// CMultipleDeleteProgressDialog
//
void CMultipleDeleteProgressDialog::OnStart()
{
SetStepCount(m_pDeleteHandler->GetItemCount());
m_hWndOld = m_pDeleteHandler->GetParentHwnd();
m_pDeleteHandler->SetParentHwnd(GetSafeHwnd());
m_pDeleteHandler->m_confirmationUI.SetWindow(GetSafeHwnd());
}
BOOL CMultipleDeleteProgressDialog::OnStep(UINT i)
{
BOOL bContinue = TRUE;
CString szPath;
CString szClass;
HRESULT hr = m_pDeleteHandler->OnDeleteStep(i,
&bContinue,
szPath,
szClass,
TRUE /*silent*/);
if (FAILED(hr) && hr != E_FAIL)
{
PWSTR pszErrMessage = 0;
int iChar = cchLoadHrMsg(hr, &pszErrMessage, TRUE);
if (pszErrMessage != NULL && iChar > 0)
{
//
// this is a hack to get rid of two extra characters
// at the end of the error message
//
size_t iLen = wcslen(pszErrMessage);
pszErrMessage[iLen - 2] = L'\0';
AddError(pszErrMessage, szPath, szClass);
LocalFree(pszErrMessage);
}
}
m_szObjPathList.AddTail(szPath);
return bContinue;
}
void CMultipleDeleteProgressDialog::OnEnd()
{
CMultipleProgressDialogBase::OnEnd();
m_pDeleteHandler->GetTransaction()->End();
m_pDeleteHandler->SetParentHwnd(m_hWndOld);
m_pDeleteHandler->m_confirmationUI.SetWindow(m_hWndOld);
}
/////////////////////////////////////////////////////////////////////////////
// CMultipleMoveProgressDialog
//
void CMultipleMoveProgressDialog::OnStart()
{
SetStepCount(m_pMoveHandler->GetItemCount());
m_hWndOld = m_pMoveHandler->GetParentHwnd();
m_pMoveHandler->SetParentHwnd(GetSafeHwnd());
}
BOOL CMultipleMoveProgressDialog::OnStep(UINT i)
{
BOOL bContinue = TRUE;
CString szPath;
CString szClass;
HRESULT hr = m_pMoveHandler->_OnMoveStep(i,
&bContinue,
szPath,
szClass);
if (FAILED(hr) && hr != E_FAIL && hr != E_POINTER)
{
PWSTR pszErrMessage = 0;
int iChar = cchLoadHrMsg(hr, &pszErrMessage, TRUE);
if (pszErrMessage != NULL && iChar > 0)
{
//
// this is a hack to get rid of two extra characters
// at the end of the error message
//
size_t iLen = wcslen(pszErrMessage);
pszErrMessage[iLen - 2] = L'\0';
AddError(pszErrMessage, szPath, szClass);
LocalFree(pszErrMessage);
}
}
m_szObjPathList.AddTail(szPath);
return bContinue;
}
void CMultipleMoveProgressDialog::OnEnd()
{
CMultipleProgressDialogBase::OnEnd();
m_pMoveHandler->GetTransaction()->End();
m_pMoveHandler->SetParentHwnd(m_hWndOld);
}
/////////////////////////////////////////////////////////////////////////////
// CConfirmOperationDialog
//
void CConfirmOperationDialog::OnYes()
{
m_pTransaction->ReadFromCheckListBox(&m_extensionsList);
EndDialog(IDYES);
}
/////////////////////////////////////////////////////////////////////////////
// CConfirmOperationDialog
//
CConfirmOperationDialog::CConfirmOperationDialog(HWND hParentWnd,
CDSNotifyHandlerTransaction* pTransaction)
: CDialog(IDD_CONFIRM_OPERATION_EXT, CWnd::FromHandle(hParentWnd))
{
ASSERT(pTransaction != NULL);
m_pTransaction = pTransaction;
m_nTitleStringID = IDS_ERRMSG_TITLE;
}
BEGIN_MESSAGE_MAP(CConfirmOperationDialog, CDialog)
ON_BN_CLICKED(IDYES, OnYes)
ON_BN_CLICKED(IDNO, OnNo)
END_MESSAGE_MAP()
BOOL CConfirmOperationDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_extensionsList.SubclassDlgItem(IDC_EXTENS_LIST, this);
m_extensionsList.SetCheckStyle(BS_AUTOCHECKBOX);
m_pTransaction->SetCheckListBox(&m_extensionsList);
UpdateListBoxHorizontalExtent();
if (m_nTitleStringID > 0)
{
CString szTitle;
if (szTitle.LoadString(m_nTitleStringID))
SetWindowText(szTitle);
}
SetDlgItemText(IDC_STATIC_OPERATION, m_lpszOperation);
SetDlgItemText(IDC_STATIC_ASSOC_DATA, m_lpszAssocData);
GetDlgItem(IDNO)->SetFocus();
return FALSE; // we set focus
}
void CConfirmOperationDialog::UpdateListBoxHorizontalExtent()
{
int nHorzExtent = 0;
CClientDC dc(&m_extensionsList);
int nItems = m_extensionsList.GetCount();
for (int i=0; i < nItems; i++)
{
TEXTMETRIC tm;
VERIFY(dc.GetTextMetrics(&tm));
CString szBuffer;
m_extensionsList.GetText(i, szBuffer);
CSize ext = dc.GetTextExtent(szBuffer,szBuffer.GetLength());
nHorzExtent = max(ext.cx ,nHorzExtent);
}
m_extensionsList.SetHorizontalExtent(nHorzExtent);
}
////////////////////////////////////////////////////////////////////////////////
// Message reporting and message boxes
//
//+----------------------------------------------------------------------------
//
// Function: ReportError
//
// Sysnopsis: Attempts to get a user-friendly error message from the system.
//
// CODEWORK: If called with hr == 0 (hrFallback case), this will generate
// ptzSysMsg unnecessarily.
//
//-----------------------------------------------------------------------------
void ReportError(HRESULT hr, int nStr, HWND hWnd)
{
CThemeContextActivator activator;
TCHAR tzSysMsgBuf[255];
TRACE (_T("*+*+* ReportError called with hr = %lx, nStr = %lx"), hr, nStr);
if (S_OK == hr && 0 == nStr)
{
nStr = IDS_ERRMSG_DEFAULT_TEXT;
}
PTSTR ptzSysMsg = NULL;
BOOL fDelSysMsg = TRUE;
int cch = cchLoadHrMsg( hr, &ptzSysMsg, FALSE );
if (!cch)
{
PTSTR ptzFallbackSysMsgFormat = NULL;
BOOL fDelFallbackSysMsgFormat = TRUE;
LoadStringToTchar(IDS_ERRMSG_FALLBACK_TEXT, &ptzFallbackSysMsgFormat);
if (NULL == ptzFallbackSysMsgFormat)
{
ptzFallbackSysMsgFormat = TEXT("Active Directory failure with code '0x%08x'!");
fDelFallbackSysMsgFormat = FALSE;
}
//#_#BUGBUG: this should be commented on why there is a magic 10...highly dependent on format message,
// cause of potential buffer overrun (just from resources, though)
ptzSysMsg = (PTSTR)LocalAlloc(LPTR, (lstrlen(ptzFallbackSysMsgFormat)+10)*sizeof(TCHAR));
if (NULL == ptzSysMsg)
{
ptzSysMsg = tzSysMsgBuf;
fDelSysMsg = FALSE;
}
//#_#BUGBUG: coming from resource, so probably not a security bug, but potential AV:
// if LocalAlloc above fails, falls back to stack buffer of length 255
wsprintf(ptzSysMsg, ptzFallbackSysMsgFormat, hr);
if (fDelFallbackSysMsgFormat)
{
delete ptzFallbackSysMsgFormat;
}
}
PTSTR ptzMsg = ptzSysMsg;
BOOL fDelMsg = FALSE;
PTSTR ptzFormat = NULL;
if (nStr)
{
LoadStringToTchar(nStr, &ptzFormat);
}
if (ptzFormat)
{
//NTRAID#NTBUG9-571996-2002/03/10-jmessec the following length calculation can't determine buffer length;
// for instance format string %s%s would cause an overrun
ptzMsg = new TCHAR[lstrlen(ptzFormat) + lstrlen(ptzSysMsg) + 1];
if (ptzMsg)
{
wsprintf(ptzMsg, ptzFormat, ptzSysMsg);
fDelMsg = TRUE;
}
}
PTSTR ptzTitle = NULL;
BOOL fDelTitle = TRUE;
if (!LoadStringToTchar(IDS_ERRMSG_TITLE, &ptzTitle))
{
ptzTitle = TEXT("Active Directory");
fDelTitle = FALSE;
}
if (ptzMsg)
{
MessageBox((hWnd)?hWnd:GetDesktopWindow(), ptzMsg, ptzTitle, MB_OK | MB_ICONINFORMATION);
}
if (fDelSysMsg && ptzSysMsg != NULL)
{
LocalFree(ptzSysMsg);
}
if (fDelTitle && ptzTitle != NULL)
{
delete ptzTitle;
}
if (fDelMsg && ptzMsg != NULL)
{
delete[] ptzMsg;
}
if (ptzFormat != NULL)
{
delete ptzFormat;
}
}
int ReportMessageWorker(HWND hWnd,
DWORD dwMessageId,
UINT fuStyle,
PVOID* lpArguments,
int nArguments,
DWORD dwTitleId,
HRESULT hrFallback,
LPCTSTR pszHelpTopic = NULL,
MSGBOXCALLBACK lpfnMsgBoxCallback = NULL );
// Don't bother with LoadLibrary, MMC is hardlinked with HtmlHelp anyway
VOID CALLBACK MsgBoxStdCallback(LPHELPINFO pHelpInfo)
{
ASSERT( NULL != pHelpInfo && NULL != pHelpInfo->dwContextId );
TRACE(_T("MsgBoxStdCallback: CtrlId = %d, ContextId = \"%s\"\n"),
pHelpInfo->iCtrlId, pHelpInfo->dwContextId);
HtmlHelp( (HWND)pHelpInfo->hItemHandle,
DSADMIN_LINKED_HELP_FILE,
HH_DISPLAY_TOPIC,
pHelpInfo->dwContextId );
}
int ReportMessageWorker(HWND hWnd,
DWORD dwMessageId,
UINT fuStyle,
PVOID* lpArguments,
int,
DWORD dwTitleId,
HRESULT hrFallback,
LPCTSTR pszHelpTopic,
MSGBOXCALLBACK lpfnMsgBoxCallback )
{
CThemeContextActivator activator;
ASSERT( !pszHelpTopic || !lpfnMsgBoxCallback );
LPTSTR ptzFormat = NULL;
LPTSTR ptzMessage = NULL;
LPTSTR ptzTitle = NULL;
int retval = MB_OK;
do
{
// load message format
if (!LoadStringToTchar(dwMessageId, &ptzFormat))
{
ASSERT(FALSE);
break;
}
// generate actual message
int cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_STRING
| FORMAT_MESSAGE_ARGUMENT_ARRAY,
ptzFormat,
NULL,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(PTSTR)&ptzMessage, 0, (va_list*)lpArguments);
if (!cch)
{
ASSERT(FALSE);
ReportError( hrFallback, 0, hWnd );
break;
}
// load title string
if (0 == dwTitleId)
{
dwTitleId = IDS_ERRMSG_TITLE;
}
if (!LoadStringToTchar(dwTitleId, &ptzTitle))
{
ptzTitle = NULL;
}
// display actual message
if ((fuStyle & S_MB_YES_TO_ALL) == S_MB_YES_TO_ALL) //use special message box
{
if (fuStyle & MB_HELP)
{
ASSERT(FALSE); // not supported
fuStyle &= ~MB_HELP;
}
retval = SpecialMessageBox(hWnd,
ptzMessage,
(NULL != ptzTitle) ? ptzTitle : TEXT("Active Directory"),
fuStyle );
}
else
{
MSGBOXPARAMS mbp;
::ZeroMemory( &mbp, sizeof(mbp) );
mbp.cbSize = sizeof(mbp);
mbp.hwndOwner = hWnd;
mbp.lpszText = ptzMessage;
mbp.lpszCaption = (NULL != ptzTitle) ? ptzTitle : TEXT("Active Directory");
mbp.dwStyle = fuStyle;
mbp.dwContextHelpId = (DWORD_PTR)pszHelpTopic;
mbp.lpfnMsgBoxCallback = (NULL == pszHelpTopic)
? lpfnMsgBoxCallback
: MsgBoxStdCallback;
//
// Display the actual message box
//
retval = MessageBoxIndirect( &mbp );
}
} while (FALSE); // false loop
//
// cleanup
//
if (NULL != ptzFormat)
{
delete ptzFormat;
}
if (NULL != ptzMessage)
{
LocalFree(ptzMessage);
}
if (NULL != ptzTitle)
{
delete ptzTitle;
}
return retval;
}
int ReportMessageEx(HWND hWnd,
DWORD dwMessageId,
UINT fuStyle,
PVOID* lpArguments,
int nArguments,
DWORD dwTitleId,
LPCTSTR pszHelpTopic,
MSGBOXCALLBACK lpfnMsgBoxCallback )
{
return ReportMessageWorker(
hWnd,
dwMessageId,
fuStyle,
lpArguments,
nArguments,
dwTitleId,
0,
pszHelpTopic,
lpfnMsgBoxCallback );
}
int ReportErrorEx(HWND hWnd,
DWORD dwMessageId,
HRESULT hr,
UINT fuStyle,
PVOID* lpArguments,
int nArguments,
DWORD dwTitleId,
BOOL TryADsIErrors)
{
LPTSTR ptzSysMsg = NULL;
int retval = MB_OK;
do
{ // false loop
// load message for this HRESULT
int cch = cchLoadHrMsg( hr, &ptzSysMsg, TryADsIErrors );
if (!cch)
{
//
// JonN 5/10/01 375461 fallback message cleanup
//
// load message format
LPTSTR ptzFormat = NULL;
if (!LoadStringToTchar(IDS_ERRMSG_UNKNOWN_HR, &ptzFormat) || !ptzFormat)
{
ASSERT(FALSE);
ReportError( hr, 0, hWnd );
break;
}
// format in HRESULT
cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_STRING
| FORMAT_MESSAGE_ARGUMENT_ARRAY,
ptzFormat,
NULL,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(PTSTR)&ptzSysMsg,
1, (va_list*)&hr);
delete ptzFormat;
if (!cch)
{
ReportError( hr, 0, hWnd );
break;
}
}
// prepare argument array
PVOID* ppvArguments = (PVOID*)new BYTE[(nArguments+1)*sizeof(PVOID)];
if (!ppvArguments)
{
ASSERT(ppvArguments );
ReportError( hr, 0, hWnd);
break;
}
ppvArguments[0] = ptzSysMsg;
if (0 != nArguments)
{
::CopyMemory( ppvArguments+1, lpArguments, nArguments*sizeof(PVOID) );
}
retval = ReportMessageWorker(hWnd,
dwMessageId,
fuStyle,
ppvArguments,
nArguments+1,
dwTitleId,
hr );
delete[] ppvArguments;
ppvArguments = 0;
} while (FALSE); // false loop
//
// cleanup
//
if (NULL != ptzSysMsg)
{
LocalFree(ptzSysMsg);
}
return retval;
}
int SpecialMessageBox (HWND,
LPWSTR pwszMessage,
LPWSTR pwszTitle,
DWORD)
{
CThemeContextActivator activator;
CSpecialMessageBox MBDlg;
MBDlg.m_title = pwszTitle;
MBDlg.m_message = pwszMessage;
int answer = (int)MBDlg.DoModal();
return answer;
}
///////////////////////////////////////////////////////////////////////////
// CNameFormatterBase
HRESULT CNameFormatterBase::Initialize(IN MyBasePathsInfo* pBasePathInfo,
IN LPCWSTR lpszClassName, IN UINT nStringID)
{
CString szFormatString;
HRESULT hr = _ReadFromDS(pBasePathInfo, lpszClassName, szFormatString);
if (FAILED(hr))
{
// nothing in the display specifiers, load from resource
if (!szFormatString.LoadString(nStringID))
{
// if failed for some reason, use this default
szFormatString = L"%<givenName> %<initials>. %<sn>";
}
}
Initialize(szFormatString);
return S_OK;
}
HRESULT CNameFormatterBase::_ReadFromDS(IN MyBasePathsInfo* pBasePathInfo,
IN LPCWSTR lpszClassName,
OUT CString& szFormatString)
{
static LPCWSTR lpszObjectClass = L"displaySpecifier";
static LPCWSTR lpszSettingsObjectFmt = L"cn=%s-Display";
static LPCWSTR lpszFormatProperty = L"createDialog";
szFormatString.Empty();
if ( (pBasePathInfo == NULL) ||
(lpszClassName == NULL) || (lpszClassName[0] == NULL) )
{
return E_INVALIDARG;
}
// get the display specifiers locale container (e.g. 409)
CComPtr<IADsContainer> spLocaleContainer;
HRESULT hr = pBasePathInfo->GetDisplaySpecifier(NULL, IID_IADsContainer, (void**)&spLocaleContainer);
if (FAILED(hr))
return hr;
// bind to the settings object
CString szSettingsObject;
szSettingsObject.Format(lpszSettingsObjectFmt, lpszClassName);
CComPtr<IDispatch> spIDispatchObject;
hr = spLocaleContainer->GetObject(CComBSTR(lpszObjectClass),
CComBSTR(szSettingsObject),
&spIDispatchObject);
if (FAILED(hr))
return hr;
CComPtr<IADs> spSettingsObject;
hr = spIDispatchObject->QueryInterface(IID_IADs, (void**)&spSettingsObject);
if (FAILED(hr))
return hr;
// get single valued property in string list form
CComVariant var;
hr = spSettingsObject->Get(CComBSTR(lpszFormatProperty), &var);
if (FAILED(hr))
return hr;
if (var.vt != VT_BSTR)
return E_UNEXPECTED;
szFormatString = var.bstrVal;
return S_OK;
}
BOOL CNameFormatterBase::Initialize(IN LPCWSTR lpszFormattingString)
{
TRACE(L"CNameFormatterBase::Initialize(%s)\n", lpszFormattingString);
_Clear();
if (lpszFormattingString == NULL)
{
return FALSE;
}
// copy the formatting string (it will be modified)
m_lpszFormattingString = new WCHAR[lstrlen(lpszFormattingString)+1];
wcscpy(m_lpszFormattingString, lpszFormattingString);
// allocate memory for the arrays
_AllocateMemory(lpszFormattingString);
// loop thugh the string and extract tokens
// Establish string and get the first token
WCHAR szSeparators[] = L"%>";
WCHAR* lpszToken = wcstok(m_lpszFormattingString, szSeparators);
while (lpszToken != NULL)
{
// While there are tokens in "string"
//TRACE( L" %s\n", token );
if ( (lpszToken[0] == L'<') &&
!((lpszFormattingString[0] == L'<') && (m_tokenArrCount == 0)) )
{
// parameter
m_tokenArray[m_tokenArrCount].m_bIsParam = TRUE;
m_tokenArray[m_tokenArrCount].m_nIndex = m_paramArrCount;
m_lpszParamArr[m_paramArrCount++] = (lpszToken+1);
}
else
{
// constant
m_tokenArray[m_tokenArrCount].m_bIsParam = FALSE;
m_tokenArray[m_tokenArrCount].m_nIndex = m_constArrCount;
m_lpszConstArr[m_constArrCount++] = lpszToken;
}
m_tokenArrCount++;
/* Get next token: */
lpszToken = wcstok(NULL, szSeparators);
} // while
return TRUE;
}
void CNameFormatterBase::SetMapping(IN LPCWSTR* lpszArgMapping, IN int nArgCount)
{
if (m_mapArr != NULL)
{
delete[] m_mapArr;
}
// do the mapping
m_mapArr = new int[m_paramArrCount];
for (int kk=0; kk<m_paramArrCount;kk++)
{
m_mapArr[kk] = -1; // clear
for (int jj=0; jj<nArgCount;jj++)
{
if (wcscmp(m_lpszParamArr[kk], lpszArgMapping[jj]) == 0)
{
m_mapArr[kk] = jj;
}
}
}
}
void CNameFormatterBase::Format(OUT CString& szBuffer, IN LPCWSTR* lpszArgArr)
{
szBuffer.Empty();
//TRACE(L"\nResult:#");
BOOL bLastParamNull = FALSE;
for (int k=0; k<m_tokenArrCount; k++)
{
if (m_tokenArray[k].m_bIsParam)
{
if (m_mapArr[m_tokenArray[k].m_nIndex] >= 0)
{
LPCWSTR lpszVal = lpszArgArr[m_mapArr[m_tokenArray[k].m_nIndex]];
if (lpszVal != NULL)
{
//TRACE(L"%s", lpszVal);
szBuffer += lpszVal;
bLastParamNull = FALSE;
}
else
{
bLastParamNull = TRUE;
}
}
}
else
{
if (!bLastParamNull)
{
//TRACE(L"%s", m_lpszConstArr[m_tokenArray[k].m_nIndex]);
szBuffer += m_lpszConstArr[m_tokenArray[k].m_nIndex];
}
}
}
szBuffer.TrimRight(); // in case we got a trailing space.
//TRACE(L"#\n");
}
void CNameFormatterBase::_AllocateMemory(LPCWSTR lpszFormattingString)
{
int nFieldCount = 1; // conservative, have at least one
for (WCHAR* pChar = (WCHAR*)lpszFormattingString; *pChar != NULL; pChar++)
{
if (*pChar == L'%')
{
nFieldCount++;
}
}
// conservative estimates on array sizes
m_tokenArray = new CToken[2*nFieldCount];
m_lpszConstArr = new LPCWSTR[nFieldCount];
m_lpszParamArr = new LPCWSTR[nFieldCount];
}
/////////////////////////////////////////////////////////////////////////////
// CHelpDialog
CHelpDialog::CHelpDialog(UINT uIDD, CWnd* pParentWnd) :
CDialog(uIDD, pParentWnd),
m_hWndWhatsThis (0)
{
}
CHelpDialog::CHelpDialog(UINT uIDD) :
CDialog(uIDD),
m_hWndWhatsThis (0)
{
}
CHelpDialog::~CHelpDialog()
{
}
BEGIN_MESSAGE_MAP(CHelpDialog, CDialog)
ON_WM_CONTEXTMENU()
ON_MESSAGE(WM_HELP, OnHelp)
ON_COMMAND(IDM_WHATS_THIS, OnWhatsThis)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHelpDialog message handlers
void CHelpDialog::OnWhatsThis()
{
//
// Display context help for a control
//
if ( m_hWndWhatsThis )
{
DoContextHelp (m_hWndWhatsThis);
}
}
BOOL CHelpDialog::OnHelp(WPARAM /*wParam*/, LPARAM lParam)
{
const LPHELPINFO pHelpInfo = (LPHELPINFO)lParam;
if (pHelpInfo && pHelpInfo->iContextType == HELPINFO_WINDOW)
{
//
// Display context help for a control
//
DoContextHelp ((HWND) pHelpInfo->hItemHandle);
}
return TRUE;
}
void CHelpDialog::DoContextHelp (HWND /*hWndControl*/)
{
}
void CHelpDialog::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
//
// point is in screen coordinates
//
CMenu bar;
if ( bar.LoadMenu(IDR_WHATS_THIS_CONTEXT_MENU1) )
{
CMenu& popup = *bar.GetSubMenu (0);
ASSERT(popup.m_hMenu);
if ( popup.TrackPopupMenu (TPM_RIGHTBUTTON | TPM_LEFTBUTTON,
point.x, // in screen coordinates
point.y, // in screen coordinates
this) ) // route commands through main window
{
m_hWndWhatsThis = 0;
ScreenToClient (&point);
CWnd* pChild = ChildWindowFromPoint (point, // in client coordinates
CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
if ( pChild )
{
m_hWndWhatsThis = pChild->m_hWnd;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CHelpPropertyPage
CHelpPropertyPage::CHelpPropertyPage(UINT uIDD) :
CPropertyPage(uIDD),
m_hWndWhatsThis (0)
{
}
CHelpPropertyPage::~CHelpPropertyPage()
{
}
BEGIN_MESSAGE_MAP(CHelpPropertyPage, CPropertyPage)
ON_WM_CONTEXTMENU()
ON_MESSAGE(WM_HELP, OnHelp)
ON_COMMAND(IDM_WHATS_THIS, OnWhatsThis)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHelpPropertyPage message handlers
void CHelpPropertyPage::OnWhatsThis()
{
//
// Display context help for a control
//
if ( m_hWndWhatsThis )
{
DoContextHelp (m_hWndWhatsThis);
}
}
BOOL CHelpPropertyPage::OnHelp(WPARAM /*wParam*/, LPARAM lParam)
{
const LPHELPINFO pHelpInfo = (LPHELPINFO)lParam;
if (pHelpInfo && pHelpInfo->iContextType == HELPINFO_WINDOW)
{
//
// Display context help for a control
//
DoContextHelp ((HWND) pHelpInfo->hItemHandle);
}
return TRUE;
}
void CHelpPropertyPage::DoContextHelp (HWND /*hWndControl*/)
{
}
void CHelpPropertyPage::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
//
// point is in screen coordinates
//
CMenu bar;
if ( bar.LoadMenu(IDR_WHATS_THIS_CONTEXT_MENU1) )
{
CMenu& popup = *bar.GetSubMenu (0);
ASSERT(popup.m_hMenu);
if ( popup.TrackPopupMenu (TPM_RIGHTBUTTON | TPM_LEFTBUTTON,
point.x, // in screen coordinates
point.y, // in screen coordinates
this) ) // route commands through main window
{
m_hWndWhatsThis = 0;
ScreenToClient (&point);
CWnd* pChild = ChildWindowFromPoint (point, // in client coordinates
CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
if ( pChild )
{
m_hWndWhatsThis = pChild->m_hWnd;
}
}
}
}
//////////////////////////////////////////////////////////////////
// CMoreInfoMessageBox
//
BEGIN_MESSAGE_MAP(CMoreInfoMessageBox, CDialog)
ON_BN_CLICKED(ID_BUTTON_MORE_INFO, OnMoreInfo)
ON_BN_CLICKED(IDYES, OnOK)
ON_BN_CLICKED(IDNO, OnCancel)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////
// Theming support
HPROPSHEETPAGE MyCreatePropertySheetPage(AFX_OLDPROPSHEETPAGE* psp)
{
PROPSHEETPAGE_V3 sp_v3 = {0};
CopyMemory (&sp_v3, psp, psp->dwSize);
sp_v3.dwSize = sizeof(sp_v3);
return (::CreatePropertySheetPage(&sp_v3));
}