windows-nt/Source/XPSP1/NT/printscan/ui/wiadbgui/dbgmask.h
2020-09-26 16:20:57 +08:00

521 lines
15 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 1998
*
* TITLE: DBGMASK.H
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 9/13/1999
*
* DESCRIPTION: Debug mask dialog
*
*******************************************************************************/
#ifndef __DGBMASK_H_INCLUDED
#define __DGBMASK_H_INCLUDED
#include <windows.h>
#include <uicommon.h>
#include <simstr.h>
#include <simreg.h>
#include <simrect.h>
#include <wiadebug.h>
class CAddModuleDialog
{
public:
struct CData
{
CSimpleString strTitle;
CSimpleString strName;
};
private:
HWND m_hWnd;
CData *m_pData;
private:
// Not implemented
CAddModuleDialog(void);
CAddModuleDialog( const CAddModuleDialog & );
CAddModuleDialog &operator=( const CAddModuleDialog & );
private:
explicit CAddModuleDialog( HWND hWnd )
: m_hWnd(hWnd),
m_pData(NULL)
{
}
~CAddModuleDialog(void)
{
}
void OnOK( WPARAM, LPARAM )
{
m_pData->strName.GetWindowText( GetDlgItem( m_hWnd, IDC_MODULE_NAME ) );
EndDialog( m_hWnd, IDOK );
}
void OnCancel( WPARAM, LPARAM )
{
EndDialog( m_hWnd, IDCANCEL );
}
LRESULT OnInitDialog( WPARAM wParam, LPARAM lParam )
{
m_pData = reinterpret_cast<CData*>(lParam);
if (!m_pData)
{
EndDialog( m_hWnd, -1 );
return -1;
}
m_pData->strName.SetWindowText( GetDlgItem( m_hWnd, IDC_MODULE_NAME ) );
if (m_pData->strTitle.Length())
m_pData->strTitle.SetWindowText( m_hWnd );
WiaUiUtil::CenterWindow( m_hWnd, GetParent(m_hWnd) );
return 0;
}
LRESULT OnCommand( WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_COMMAND_HANDLERS()
{
SC_HANDLE_COMMAND(IDOK,OnOK);
SC_HANDLE_COMMAND(IDCANCEL,OnCancel);
}
SC_END_COMMAND_HANDLERS();
}
public:
static INT_PTR WINAPI DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CAddModuleDialog)
{
SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog );
SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand );
}
SC_END_DIALOG_MESSAGE_HANDLERS();
}
};
template <class T_NUMBERTYPE>
static HRESULT DigitToNumber( WCHAR cDigit, int nRadix, T_NUMBERTYPE *pnValue )
{
if (!pnValue)
return E_POINTER;
if (nRadix > 36)
return E_INVALIDARG;
static const WCHAR *pszUpperDigits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static const WCHAR *pszLowerDigits = L"0123456789abcdefghijklmnopqrstuvwxyz";
for (int i=0;i<nRadix;i++)
{
if (cDigit == pszUpperDigits[i])
{
*pnValue = static_cast<T_NUMBERTYPE>(i);
return S_OK;
}
else if (cDigit == pszLowerDigits[i])
{
*pnValue = static_cast<T_NUMBERTYPE>(i);
return S_OK;
}
}
return E_FAIL;
}
template <class T_NUMBERTYPE>
static HRESULT StringToNumber( LPCWSTR strwNumber, int nRadix, T_NUMBERTYPE *pnNumber )
{
// Assume this is not a base 10 negative number
bool bNegate = false;
// Check all of the arguments
if (!strwNumber)
return E_INVALIDARG;
if (!pnNumber)
return E_POINTER;
if (nRadix > 36)
return E_INVALIDARG;
LPCWSTR pszCurr = strwNumber;
// If this is a negative number, store it
if (nRadix == 10 && lstrlenW(pszCurr) >= 1 && pszCurr[0] == TEXT('-'))
{
pszCurr++;
bNegate = true;
}
// Skip the optional 0x or 0X that can prefix hex numbers
if (nRadix == 16 && lstrlenW(pszCurr) >= 2 && pszCurr[0] == L'0' && (pszCurr[1] == L'x' || pszCurr[1] == L'X'))
{
pszCurr += 2;
}
*pnNumber = 0;
while (*pszCurr)
{
T_NUMBERTYPE nCurrDigit;
if (!SUCCEEDED(DigitToNumber<T_NUMBERTYPE>( *pszCurr, nRadix, &nCurrDigit )))
{
return E_FAIL;
}
*pnNumber *= nRadix;
*pnNumber += nCurrDigit;
pszCurr++;
}
if (bNegate)
*pnNumber = static_cast<T_NUMBERTYPE>(-static_cast<__int64>(*pnNumber));
return S_OK;
}
template <class T_NUMBERTYPE>
static HRESULT StringToNumber( LPCSTR strNumber, int nRadix, T_NUMBERTYPE *pnNumber )
{
return StringToNumber<T_NUMBERTYPE>( CSimpleStringConvert::WideString(CSimpleStringAnsi(strNumber)), nRadix, pnNumber );
}
class CDebugMaskDialog
{
private:
class CDebugModule
{
private:
CSimpleString m_strName;
DWORD m_dwMask;
public:
CDebugModule( LPCTSTR pszName = TEXT(""), DWORD dwMask = 0)
: m_strName(pszName),
m_dwMask(dwMask)
{
}
CDebugModule( const CDebugModule &other )
: m_strName(other.Name()),
m_dwMask(other.Mask())
{
}
CDebugModule &operator=( const CDebugModule &other )
{
if (&other != this)
{
m_strName = other.Name();
m_dwMask = other.Mask();
}
return *this;
}
CSimpleString Name(void) const
{
return m_strName;
}
DWORD Mask(void) const
{
return m_dwMask;
}
void Mask( DWORD dwMask )
{
m_dwMask = dwMask;
}
};
private:
HWND m_hWnd;
private:
// Not implemented
CDebugMaskDialog(void);
CDebugMaskDialog( const CDebugMaskDialog & );
CDebugMaskDialog &operator=( const CDebugMaskDialog & );
private:
explicit CDebugMaskDialog( HWND hWnd )
: m_hWnd(hWnd)
{
}
~CDebugMaskDialog(void)
{
}
CDebugModule *GetDebugModule( int nItem )
{
LVITEM LvItem;
ZeroMemory( &LvItem, sizeof(LvItem) );
LvItem.mask = LVIF_PARAM;
LvItem.iItem = nItem;
if (ListView_GetItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), &LvItem ))
{
return reinterpret_cast<CDebugModule*>(LvItem.lParam);
}
return NULL;
}
int GetCurrentSelectionIndex(void)
{
int nResult = -1;
int nSelectedCount = ListView_GetSelectedCount(GetDlgItem( m_hWnd, IDC_MODULE_LIST ));
if (nSelectedCount == 1)
{
nResult = ListView_GetNextItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), -1, LVNI_SELECTED );
}
return nResult;
}
void SelectItem( int nIndex )
{
for (int i=0;i<ListView_GetItemCount(GetDlgItem( m_hWnd, IDC_MODULE_LIST ));i++)
{
int nFlags = (i == nIndex) ? LVIS_SELECTED|LVIS_FOCUSED : 0;
ListView_SetItemState( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), i, nFlags, LVIS_SELECTED|LVIS_FOCUSED );
}
}
void OnOK( WPARAM, LPARAM )
{
// Update the value for the currently selected item
int nItem = GetCurrentSelectionIndex();
if (nItem >= 0)
{
CDebugModule *pCurrSel = GetDebugModule(nItem);
if (pCurrSel)
{
UpdateCurrentFlagsFromEdit( *pCurrSel, nItem );
}
}
// Delete all of the old values
CSimpleReg reg( HKEY_LOCAL_MACHINE, DEBUG_REGISTRY_PATH_FLAGS, true, KEY_WRITE );
reg.EnumValues( DeleteValuesEnumProc, reinterpret_cast<LPARAM>(this) );
// Save all the new ones
for (int i=0;i<ListView_GetItemCount(GetDlgItem( m_hWnd, IDC_MODULE_LIST ));i++)
{
CDebugModule *pDebugModule = GetDebugModule(i);
if (pDebugModule)
{
reg.Set( pDebugModule->Name(), pDebugModule->Mask() );
}
}
EndDialog( m_hWnd, IDOK );
}
void OnCancel( WPARAM, LPARAM )
{
EndDialog( m_hWnd, IDCANCEL );
}
static bool ReadValuesEnumProc( CSimpleReg::CValueEnumInfo &enumInfo )
{
if (enumInfo.nType == REG_DWORD)
{
CDebugMaskDialog *This = reinterpret_cast<CDebugMaskDialog*>(enumInfo.lParam);
if (This)
{
This->AddNewEntry( enumInfo.strName, enumInfo.reg.Query( enumInfo.strName, 0 ) );
}
}
return true;
}
static bool DeleteValuesEnumProc( CSimpleReg::CValueEnumInfo &enumInfo )
{
bool bRes = enumInfo.reg.Delete( enumInfo.strName );
return true;
}
int AddNewEntry( LPCTSTR pszName, DWORD dwMask )
{
int nIndex = -1;
CDebugModule *pDebugModule = new CDebugModule( pszName, dwMask );
if (pDebugModule)
{
LVITEM LvItem;
ZeroMemory( &LvItem, sizeof(LvItem) );
LvItem.mask = LVIF_TEXT | LVIF_PARAM;
LvItem.pszText = const_cast<LPTSTR>(pszName);
LvItem.lParam = reinterpret_cast<LPARAM>(pDebugModule);
LvItem.iItem = 0;
LvItem.iSubItem = 0;
nIndex = ListView_InsertItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), &LvItem );
CSimpleString strMask;
strMask.Format( TEXT("0x%08X"), dwMask );
LvItem.mask = LVIF_TEXT;
LvItem.pszText = const_cast<LPTSTR>(strMask.String());
LvItem.iItem = nIndex;
LvItem.iSubItem = 1;
ListView_SetItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), &LvItem );
}
return nIndex;
}
LRESULT OnInitDialog( WPARAM wParam, LPARAM lParam )
{
LVCOLUMN LvColumn;
ZeroMemory( &LvColumn, sizeof(LvColumn) );
LvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_TEXT;
LvColumn.fmt = LVCFMT_LEFT;
LvColumn.pszText = TEXT("Module");
LvColumn.iSubItem = 0;
LvColumn.iOrder = 0;
LvColumn.cx = CSimpleRect( GetDlgItem( m_hWnd, IDC_MODULE_LIST ) ).Width() * 3 / 5;
ListView_InsertColumn( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), 0, &LvColumn );
ZeroMemory( &LvColumn, sizeof(LvColumn) );
LvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_TEXT;
LvColumn.fmt = LVCFMT_LEFT;
LvColumn.pszText = TEXT("Mask");
LvColumn.iSubItem = 1;
LvColumn.iOrder = 1;
LvColumn.cx = CSimpleRect( GetDlgItem( m_hWnd, IDC_MODULE_LIST ) ).Width() * 2 / 5;
ListView_InsertColumn( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), 1, &LvColumn );
CSimpleReg reg( HKEY_LOCAL_MACHINE, DEBUG_REGISTRY_PATH_FLAGS, false, KEY_READ );
reg.EnumValues( ReadValuesEnumProc, reinterpret_cast<LPARAM>(this) );
SelectItem(0);
WiaUiUtil::CenterWindow( m_hWnd, GetParent(m_hWnd) );
return 0;
}
LRESULT OnListDeleteItem( WPARAM, LPARAM lParam )
{
NMLISTVIEW *pNmListView = reinterpret_cast<NMLISTVIEW *>(lParam);
if (pNmListView)
{
if (pNmListView->iItem >= 0 && pNmListView->iSubItem == 0)
{
CDebugModule *pDebugModule = reinterpret_cast<CDebugModule *>(pNmListView->lParam);
if (pDebugModule)
{
delete pDebugModule;
}
}
}
return 0;
}
void UpdateCurrentFlagsFromEdit( CDebugModule &DebugModule, int nItem )
{
CSimpleString strMask;
strMask.GetWindowText( GetDlgItem( m_hWnd, IDC_MASK ) );
DWORD dwMask;
if (SUCCEEDED(StringToNumber( strMask, 16, &dwMask )))
{
DebugModule.Mask(dwMask);
}
strMask.Format( TEXT("0x%08X"), DebugModule.Mask() );
ListView_SetItemText( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), nItem, 1, const_cast<LPTSTR>(strMask.String()) );
}
LRESULT OnListItemChanged( WPARAM, LPARAM lParam )
{
NMLISTVIEW *pNmListView = reinterpret_cast<NMLISTVIEW *>(lParam);
if (pNmListView)
{
if (pNmListView->iItem >= 0 && (LVIF_STATE & pNmListView->uChanged) && ((pNmListView->uOldState & LVIS_SELECTED) ^ (pNmListView->uNewState & LVIS_SELECTED)))
{
CDebugModule *pDebugModule = reinterpret_cast<CDebugModule *>(pNmListView->lParam);
if (pDebugModule)
{
if (LVIS_SELECTED & pNmListView->uNewState)
{
CSimpleString strMask;
strMask.Format( TEXT("0x%08X"), pDebugModule->Mask() );
SetDlgItemText( m_hWnd, IDC_MASK, strMask );
}
else
{
UpdateCurrentFlagsFromEdit( *pDebugModule, pNmListView->iItem );
}
}
}
}
return 0;
}
void OnDeleteModule( WPARAM, LPARAM )
{
int nCurSel = GetCurrentSelectionIndex();
if (nCurSel >= 0)
{
ListView_DeleteItem( GetDlgItem( m_hWnd, IDC_MODULE_LIST ), nCurSel );
int nCount = ListView_GetItemCount( GetDlgItem( m_hWnd, IDC_MODULE_LIST ) );
if (nCount)
{
SelectItem(nCurSel >= nCount ? nCount-1 : nCurSel );
}
}
}
void OnAddModule( WPARAM, LPARAM )
{
CAddModuleDialog::CData AddModuleData;
AddModuleData.strName = TEXT("");
AddModuleData.strTitle = TEXT("Add New Module");
extern HINSTANCE g_hInstance;
if (IDOK==DialogBoxParam( g_hInstance, MAKEINTRESOURCE(IDD_MODULENAME), m_hWnd, CAddModuleDialog::DialogProc, reinterpret_cast<LPARAM>(&AddModuleData)))
{
if (AddModuleData.strName.Length())
{
int nIndex = AddNewEntry( AddModuleData.strName, 0xFFFFFFFF );
if (nIndex >= 0)
{
SelectItem( nIndex );
SetFocus( GetDlgItem( m_hWnd, IDC_MASK ) );
SendDlgItemMessage( m_hWnd, IDC_MASK, EM_SETSEL, 0, static_cast<LPARAM>(-1) );
}
}
}
}
LRESULT OnNotify( WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_NOTIFY_MESSAGE_HANDLERS()
{
SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_DELETEITEM,IDC_MODULE_LIST,OnListDeleteItem);
SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_ITEMCHANGED,IDC_MODULE_LIST,OnListItemChanged);
}
SC_END_NOTIFY_MESSAGE_HANDLERS();
}
LRESULT OnCommand( WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_COMMAND_HANDLERS()
{
SC_HANDLE_COMMAND(IDOK,OnOK);
SC_HANDLE_COMMAND(IDCANCEL,OnCancel);
SC_HANDLE_COMMAND(IDC_DELETE_MODULE,OnDeleteModule);
SC_HANDLE_COMMAND(IDC_ADD_MODULE,OnAddModule);
}
SC_END_COMMAND_HANDLERS();
}
public:
static INT_PTR WINAPI DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CDebugMaskDialog)
{
SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog );
SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand );
SC_HANDLE_DIALOG_MESSAGE( WM_NOTIFY, OnNotify );
}
SC_END_DIALOG_MESSAGE_HANDLERS();
}
};
#endif