|
|
#include <windows.h>
#include <uicommon.h>
#include <commctrl.h>
#include <shellext.h>
#include <simcrack.h>
#include <shlwapi.h>
#include "errdlg.h"
#include "rawerror.h"
#include "resource.h"
extern HINSTANCE g_hInstance;
//
// String constants
//
#define INI_FILE_NAME TEXT("forceerr.ini")
#define GENERAL_SECTION TEXT("ForceError")
#define PROGRAMS_SECTION TEXT("Programs")
#define LAST_PROGRAM TEXT("LastProgram")
CErrorMessageDialog::CErrorMessageDialog( HWND hWnd ) : m_hWnd(hWnd), m_strIniFileName(INI_FILE_NAME) { //
// Create an absolute pathname for the default INI file,
// so it points to the same directory as the EXE
//
TCHAR szCurrFile[MAX_PATH]; if (GetModuleFileName( NULL, szCurrFile, ARRAYSIZE(szCurrFile))) { if (PathRemoveFileSpec( szCurrFile )) { m_strIniFileName = CSimpleString(szCurrFile); if (!m_strIniFileName.MatchLastCharacter(TEXT('\\'))) { m_strIniFileName += TEXT("\\"); } m_strIniFileName += CSimpleString(INI_FILE_NAME); } }
//
// If the default INI file location has been overridden in the registry, use it instead
//
CSimpleString strIniFile = CSimpleReg( HKEY_FORCEERROR, REGSTR_FORCEERR_KEY ).Query( INI_FILE_NAME, TEXT("") ); if (strIniFile.Length()) { m_strIniFileName = strIniFile; } }
CErrorMessageDialog::~CErrorMessageDialog() { }
void CErrorMessageDialog::SelectError( HRESULT hrSelect ) { LRESULT nSel = 0; for (LRESULT i=0;i<SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_GETCOUNT, 0, 0 );i++) { HRESULT hr = static_cast<HRESULT>(SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_GETITEMDATA, i, 0 )); if (hrSelect == hr) { nSel = i; break; } } SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_SETCURSEL, nSel, 0 ); }
void CErrorMessageDialog::SelectErrorPoint( int nErrorPoint ) { for (LRESULT i=0;i<SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_GETCOUNT, 0, 0 );i++) { int nCurrErrorPoint = GetComboBoxItemData( GetDlgItem( m_hWnd, IDC_ERROR_POINT ), i ); if (nErrorPoint == nCurrErrorPoint) { SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_SETCURSEL, i, 0 ); break; } } }
LRESULT CErrorMessageDialog::GetComboBoxItemData( HWND hWnd, LRESULT nIndex, LRESULT nDefault ) { LRESULT lResult = SendMessage( hWnd, CB_GETITEMDATA, nIndex, 0 ); if (CB_ERR == lResult) { lResult = nDefault; } return lResult; }
CSimpleString CErrorMessageDialog::GetComboBoxString( HWND hWnd, LRESULT nIndex ) { CSimpleString strResult; LRESULT nTextLen = SendMessage( hWnd, CB_GETLBTEXTLEN, nIndex, 0 ); if (nTextLen) { LPTSTR pszText = new TCHAR[nTextLen+1]; if (pszText) { if (SendMessage( hWnd, CB_GETLBTEXT, nIndex, reinterpret_cast<LPARAM>(pszText))) { strResult = pszText; } delete[] pszText; } } return strResult; }
CSimpleString CErrorMessageDialog::GetCurrentlySelectedComboBoxString( HWND hWnd ) { CSimpleString strResult; LRESULT nIndex = SendMessage( hWnd, CB_GETCURSEL, 0, 0 ); if (CB_ERR != nIndex) { strResult = GetComboBoxString( hWnd, nIndex ); } return strResult; }
LRESULT CErrorMessageDialog::GetCurrentComboBoxSelection( HWND hWnd ) { return SendMessage( hWnd, CB_GETCURSEL, 0, 0 ); }
LRESULT CErrorMessageDialog::GetCurrentComboBoxSelectionData( HWND hWnd, LRESULT nDefault ) { LRESULT lResult = nDefault;
LRESULT nCurIndex = GetCurrentComboBoxSelection( hWnd ); if (CB_ERR != nCurIndex) { lResult = GetComboBoxItemData( hWnd, nCurIndex, nDefault ); } return lResult; }
CSimpleString CErrorMessageDialog::GetIniString( LPCTSTR pszSection, LPCTSTR pszKey, LPCTSTR pszDefault ) { CSimpleString strResult(pszDefault);
TCHAR szString[1024];
if (GetPrivateProfileString( pszSection, pszKey, pszDefault, szString, ARRAYSIZE(szString), m_strIniFileName )) { strResult = szString; }
return strResult; }
UINT CErrorMessageDialog::GetIniInt( LPCTSTR pszSection, LPCTSTR pszKey, UINT nDefault ) { return GetPrivateProfileInt( pszSection, pszKey, nDefault, m_strIniFileName ); }
void CErrorMessageDialog::PopulateProgramComboBox() { WIA_PUSH_FUNCTION((TEXT("PopulateProgramComboBox"))); SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_RESETCONTENT, 0, 0 );
const int c_nSize = 24000; LPTSTR pszSections = new TCHAR[c_nSize]; if (pszSections) { if (GetPrivateProfileString( PROGRAMS_SECTION, NULL, TEXT(""), pszSections, c_nSize, m_strIniFileName )) { for (LPTSTR pszCurr=pszSections;pszCurr && *pszCurr;pszCurr += lstrlen(pszCurr)+1 ) { TCHAR szAppName[MAX_PATH] = {0}; if (GetPrivateProfileString( PROGRAMS_SECTION, pszCurr, TEXT(""), szAppName, ARRAYSIZE(szAppName), m_strIniFileName )) { if (lstrlen(szAppName)) { SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(szAppName) ); } } } } delete[] pszSections; } LRESULT nSelectedItem = 0; CSimpleString strLastSelectedProgram = GetIniString( GENERAL_SECTION, LAST_PROGRAM ); if (strLastSelectedProgram.Length()) { nSelectedItem = SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_FINDSTRINGEXACT, -1, reinterpret_cast<LPARAM>(strLastSelectedProgram.String())); if (nSelectedItem < 0) { nSelectedItem = 0; } } WiaUiUtil::ModifyComboBoxDropWidth( GetDlgItem( m_hWnd, IDC_ERROR_PROGRAMS ) ); SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_SETCURSEL, nSelectedItem, 0 ); }
CSimpleString CErrorMessageDialog::GetCurrentlySelectedProgram() { return GetCurrentlySelectedComboBoxString( GetDlgItem( m_hWnd, IDC_ERROR_PROGRAMS ) ); }
void CErrorMessageDialog::PopulateErrorPointComboBox() { WIA_PUSH_FUNCTION((TEXT("PopulateProgramComboBox"))); SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_RESETCONTENT, 0, 0 ); if (CB_ERR != SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(CSimpleString( IDS_NO_ERROR, g_hInstance ).String() ) ) ) { CSimpleString strCurrentProgram = GetCurrentlySelectedProgram(); if (strCurrentProgram.Length()) { const int c_nSize = 24000; LPTSTR pszErrors = new TCHAR[c_nSize]; if (pszErrors) { if (GetPrivateProfileString( strCurrentProgram, NULL, TEXT(""), pszErrors, c_nSize, m_strIniFileName )) { for (LPTSTR pszCurr=pszErrors;pszCurr && *pszCurr;pszCurr += lstrlen(pszCurr)+1 ) { if (lstrlen(pszCurr)) { UINT nFlag = GetIniInt( strCurrentProgram, pszCurr); if (nFlag) { LRESULT nIndex = SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(pszCurr) ); if (CB_ERR != nIndex) { SendDlgItemMessage( m_hWnd, IDC_ERROR_POINT, CB_SETITEMDATA, nIndex, nFlag ); } } } } } delete[] pszErrors; } } SelectErrorPoint( CWiaDebugClient::GetForceFailurePoint(strCurrentProgram) ); } WiaUiUtil::ModifyComboBoxDropWidth( GetDlgItem( m_hWnd, IDC_ERROR_POINT ) ); }
void CErrorMessageDialog::PopulateErrorsComboBox() { SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_RESETCONTENT, 0, 0 ); for (int i=0;i<g_ErrorMessageCount;i++) { LRESULT nIndex = SendMessage( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ), CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(g_ErrorMessages[i].pszName)); if (nIndex != CB_ERR) { SendMessage( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ), CB_SETITEMDATA, nIndex, g_ErrorMessages[i].hr ); } } WiaUiUtil::ModifyComboBoxDropWidth( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ) ); }
void CErrorMessageDialog::InitializeAllFields() { PopulateErrorsComboBox(); HandleErrorSelectionChange(); PopulateProgramComboBox(); HandleProgramsSelectionChange(); }
void CErrorMessageDialog::HandleErrorSelectionChange() { CSimpleString strErrorDescription; LRESULT nCurIndex = SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_GETCURSEL, 0, 0 ); if (CB_ERR != nCurIndex) { HRESULT hr = static_cast<HRESULT>(SendDlgItemMessage( m_hWnd, IDC_ERROR_VALUE, CB_GETITEMDATA, nCurIndex, 0 )); strErrorDescription = WiaUiUtil::GetErrorTextFromHResult( hr ); } if (!strErrorDescription.Length()) { m_bErrorStringProvided = false; strErrorDescription.LoadString( IDS_NO_SYSTEM_ERROR_MESSAGE, g_hInstance ); } else { m_bErrorStringProvided = true; } strErrorDescription.SetWindowText( GetDlgItem( m_hWnd, IDC_ERROR_DESCRIPTION ) ); }
void CErrorMessageDialog::HandleProgramsSelectionChange() { PopulateErrorPointComboBox(); HandlePointSelectionChange(); SelectError( CWiaDebugClient::GetForceFailureValue(GetCurrentlySelectedProgram() ) ); HandleErrorSelectionChange(); }
void CErrorMessageDialog::HandlePointSelectionChange() { BOOL bEnable = (0 != GetCurrentComboBoxSelectionData( GetDlgItem( m_hWnd, IDC_ERROR_POINT ) ) ); EnableWindow( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ), bEnable ); EnableWindow( GetDlgItem( m_hWnd, IDC_ERROR_VALUE_PROMPT ), bEnable ); }
void CErrorMessageDialog::OnSetError( WPARAM, LPARAM ) { CSimpleString strCurrentProgram = GetCurrentlySelectedProgram(); if (strCurrentProgram.Length()) { LRESULT nErrorPoint = GetCurrentComboBoxSelectionData( GetDlgItem( m_hWnd, IDC_ERROR_POINT ) );
CWiaDebugClient::SetForceFailurePoint(strCurrentProgram,nErrorPoint); if (nErrorPoint) { LRESULT nErrorValue = GetCurrentComboBoxSelectionData( GetDlgItem( m_hWnd, IDC_ERROR_VALUE ) ); CWiaDebugClient::SetForceFailureValue(strCurrentProgram,nErrorValue); } } }
void CErrorMessageDialog::OnCancel( WPARAM, LPARAM ) { CSimpleString strCurrentProgram = GetCurrentlySelectedProgram(); WritePrivateProfileString( GENERAL_SECTION, LAST_PROGRAM, strCurrentProgram, m_strIniFileName ); EndDialog( m_hWnd, IDCANCEL ); }
void CErrorMessageDialog::OnErrorsSelChange( WPARAM, LPARAM ) { HandleErrorSelectionChange(); }
void CErrorMessageDialog::OnPointSelChange( WPARAM, LPARAM ) { HandlePointSelectionChange(); }
void CErrorMessageDialog::OnProgramsSelChange( WPARAM, LPARAM ) { HandleProgramsSelectionChange();
}
void CErrorMessageDialog::OnClearAll( WPARAM, LPARAM ) { for (LRESULT i=0;i<SendDlgItemMessage( m_hWnd, IDC_ERROR_PROGRAMS, CB_GETCOUNT, 0, 0 );i++) { CSimpleString strCurrProgram = GetComboBoxString( GetDlgItem( m_hWnd, IDC_ERROR_PROGRAMS ), i ); if (strCurrProgram.Length()) { CWiaDebugClient::SetForceFailurePoint(strCurrProgram,0); CWiaDebugClient::SetForceFailureValue(strCurrProgram,0); } } InitializeAllFields(); }
void CErrorMessageDialog::OnRefresh( WPARAM, LPARAM ) { InitializeAllFields(); }
LRESULT CErrorMessageDialog::OnInitDialog( WPARAM, LPARAM ) { SendMessage( m_hWnd, WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(LoadImage(g_hInstance,MAKEINTRESOURCE(IDI_FORCEERR), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR) )); SendMessage( m_hWnd, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(LoadImage(g_hInstance,MAKEINTRESOURCE(IDI_FORCEERR), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR) )); InitializeAllFields(); return TRUE; }
LRESULT CErrorMessageDialog::OnDestroy( WPARAM, LPARAM ) { return 0; }
LRESULT CErrorMessageDialog::OnCtlColorStatic( WPARAM wParam, LPARAM lParam ) { LRESULT lRes = DefWindowProc( m_hWnd, WM_CTLCOLORSTATIC, wParam, lParam ); if (reinterpret_cast<HWND>(lParam) == GetDlgItem( m_hWnd, IDC_ERROR_DESCRIPTION )) { if (!m_bErrorStringProvided) { SetTextColor( reinterpret_cast<HDC>(wParam), RGB(255,0,0) ); } } return lRes; }
LRESULT CErrorMessageDialog::OnCommand( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_COMMAND_HANDLERS() { SC_HANDLE_COMMAND(IDCANCEL,OnCancel); SC_HANDLE_COMMAND(IDC_SET_ERROR,OnSetError); SC_HANDLE_COMMAND(IDC_REFRESH,OnRefresh); SC_HANDLE_COMMAND(IDC_CLEAR_ALL,OnClearAll); SC_HANDLE_COMMAND_NOTIFY(CBN_SELCHANGE,IDC_ERROR_POINT,OnPointSelChange); SC_HANDLE_COMMAND_NOTIFY(CBN_SELCHANGE,IDC_ERROR_VALUE,OnErrorsSelChange); SC_HANDLE_COMMAND_NOTIFY(CBN_SELCHANGE,IDC_ERROR_PROGRAMS,OnProgramsSelChange); } SC_END_COMMAND_HANDLERS(); }
INT_PTR __stdcall CErrorMessageDialog::DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CErrorMessageDialog) { SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog ); SC_HANDLE_DIALOG_MESSAGE( WM_CTLCOLORSTATIC, OnCtlColorStatic ); SC_HANDLE_DIALOG_MESSAGE( WM_DESTROY, OnDestroy ); SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand ); } SC_END_DIALOG_MESSAGE_HANDLERS(); }
|