|
|
#include "compatadmin.h"
#include "Controls.h"
#ifndef __CAPPHELPWIZARD_H
#include "CAppHelpWizard.h"
#endif
#define NOBLOCK 1
#define BLOCK 2
#define PAGE_GETAPP_INFO 0
#define PAGE_GET_MATCH_FILES 1
#define PAGE_GETMESSAGE_TYPE 2
#define PAGE_GETMESSAGE_INFORMATION 3
#define PAGE_DONE 4
#define NUM_PAGES (PAGE_DONE + 1)
extern CShimWizard* g_pCurrentWizard; UINT g_nMAXHELPID = 0;
BOOL DeleteAppHelp ( UINT nHelpID );
BOOL WipeAppHelp( PDBRECORD pRecord );
BOOL CAppHelpWizard::BeginWizard( HWND hParent )
{ PROPSHEETPAGE Pages[NUM_PAGES];
ZeroMemory(&m_Record,sizeof(m_Record));
//
// BUGBUG: This can overwrite the existing guid.
//
CoCreateGuid(&m_Record.guidID);
// Setup wizard variables
g_pCurrentWizard = this; g_pCurrentWizard->m_uType = TYPE_APPHELP;
// begin the wizard
PROPSHEETHEADER Header;
Header.dwSize = sizeof(PROPSHEETHEADER); Header.dwFlags = PSH_WIZARD97 | PSH_PROPSHEETPAGE | PSH_HEADER; Header.hwndParent = hParent; Header.hInstance = g_hInstance; Header.pszCaption = MAKEINTRESOURCE(IDS_WIZARD); Header.nStartPage = 0; Header.ppsp = Pages; Header.nPages = NUM_PAGES; Header.pszbmHeader = MAKEINTRESOURCE(IDB_WIZBMP); Pages[PAGE_GETAPP_INFO].dwSize = sizeof(PROPSHEETPAGE); Pages[PAGE_GETAPP_INFO].dwFlags = PSP_USEHEADERSUBTITLE; Pages[PAGE_GETAPP_INFO].hInstance = g_hInstance; Pages[PAGE_GETAPP_INFO].pszTemplate = MAKEINTRESOURCE(IDD_APPHELP1); Pages[PAGE_GETAPP_INFO].pfnDlgProc = (DLGPROC)GetAppInfo; Pages[PAGE_GETAPP_INFO].pszHeaderSubTitle = TEXT("Give Application information");
Pages[PAGE_GET_MATCH_FILES].dwSize = sizeof(PROPSHEETPAGE); Pages[PAGE_GET_MATCH_FILES].dwFlags = PSP_USEHEADERSUBTITLE; Pages[PAGE_GET_MATCH_FILES].hInstance = g_hInstance; Pages[PAGE_GET_MATCH_FILES].pszTemplate = MAKEINTRESOURCE(IDD_ADDWIZARD7); Pages[PAGE_GET_MATCH_FILES].pfnDlgProc = (DLGPROC)SelectFiles; Pages[PAGE_GET_MATCH_FILES].pszHeaderSubTitle = TEXT("Select files used for application identification");
Pages[PAGE_GETMESSAGE_TYPE].dwSize = sizeof(PROPSHEETPAGE); Pages[PAGE_GETMESSAGE_TYPE].dwFlags = PSP_USEHEADERSUBTITLE; Pages[PAGE_GETMESSAGE_TYPE].hInstance = g_hInstance; Pages[PAGE_GETMESSAGE_TYPE].pszTemplate = MAKEINTRESOURCE(IDD_APPHELP2); Pages[PAGE_GETMESSAGE_TYPE].pfnDlgProc = (DLGPROC)GetMessageType; Pages[PAGE_GETMESSAGE_TYPE].pszHeaderSubTitle = TEXT("Enter Message Type");
Pages[PAGE_GETMESSAGE_INFORMATION].dwSize = sizeof(PROPSHEETPAGE); Pages[PAGE_GETMESSAGE_INFORMATION].dwFlags = PSP_USEHEADERSUBTITLE; Pages[PAGE_GETMESSAGE_INFORMATION].hInstance = g_hInstance; Pages[PAGE_GETMESSAGE_INFORMATION].pszTemplate = MAKEINTRESOURCE(IDD_APPHELP3); Pages[PAGE_GETMESSAGE_INFORMATION].pfnDlgProc = (DLGPROC)GetMessageInformation; Pages[PAGE_GETMESSAGE_INFORMATION].pszHeaderSubTitle = TEXT("Enter message information");
Pages[PAGE_DONE].dwSize = sizeof(PROPSHEETPAGE); Pages[PAGE_DONE].dwFlags = PSP_USEHEADERSUBTITLE; Pages[PAGE_DONE].hInstance = g_hInstance; Pages[PAGE_DONE].pszTemplate = MAKEINTRESOURCE(IDD_APPHELPDONE); Pages[PAGE_DONE].pfnDlgProc = (DLGPROC)AppWizardDone; Pages[PAGE_DONE].pszHeaderSubTitle = TEXT("Custom AppHelp has been created !");
if ( 0 < PropertySheet(&Header) ) { PDBRECORD pRecord = new DBRECORD;
if ( NULL != pRecord ) { ZeroMemory(pRecord,sizeof(DBRECORD));
pRecord->szEXEName = m_Record.szEXEName; pRecord->szAppName = m_Record.szAppName; pRecord->guidID = m_Record.guidID; pRecord->pEntries = m_Record.pEntries;
g_theApp.GetDBLocal().InsertRecord(pRecord);
return TRUE; } }else{
//
// Cancel pressed, we migth have to delete the new apphelp in the Database.
//
if (nPresentHelpId != -1) { DeleteAppHelp(g_nMAXHELPID); nPresentHelpId = -1; --g_nMAXHELPID; } }
return FALSE; }
//////////////////////////////////////////////////////
// Dilaog Box routines //
//////////////////////////////////////////////////////
BOOL CALLBACK GetAppInfo( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch ( uMsg ) { case WM_INITDIALOG: {
//
// Heading
//
HWND hParent = GetParent(hDlg); SetWindowText(hParent,TEXT("Create a custom AppHelp message"));
//
// Limit the length of the text boxes
//
SendMessage( GetDlgItem(hDlg,IDC_APPNAME), // handle to destination window
EM_LIMITTEXT, // message to send
(WPARAM) LIMIT_APP_NAME, // text length
(LPARAM) 0 );
SendMessage( GetDlgItem(hDlg,IDC_EXEPATH), // handle to destination window
EM_LIMITTEXT, // message to send
(WPARAM) MAX_PATH, // text length
(LPARAM) 0 ); if ( 0 == g_pCurrentWizard->m_Record.szAppName.Length() ) g_pCurrentWizard->m_Record.szAppName = TEXT("No Name");
SetDlgItemText(hDlg,IDC_APPNAME, g_pCurrentWizard->m_Record.szAppName);
if ( g_pCurrentWizard->m_Record.szAppName == TEXT("No Name") ) SendMessage(GetDlgItem(hDlg,IDC_APPNAME),EM_SETSEL,0,-1);
// Force proper Next button state.
SHAutoComplete(GetDlgItem(hDlg,IDC_EXEPATH), AUTOCOMPLETE);
SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_APPNAME,EN_CHANGE),0); } break;
case WM_NOTIFY: { NMHDR * pHdr = (NMHDR *) lParam;
switch ( pHdr->code ) { case PSN_SETACTIVE: { SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_NAME,EN_CHANGE),0); } break;
case PSN_WIZNEXT: { TCHAR szTemp[MAX_STRING_SIZE]; TCHAR szEXEPath[MAX_PATH_BUFFSIZE];
GetDlgItemText(hDlg,IDC_APPNAME,szTemp,MAX_STRING_SIZE);
CSTRING::Trim(szTemp);
g_pCurrentWizard->m_Record.szAppName = szTemp;
GetDlgItemText(hDlg,IDC_EXEPATH,szEXEPath,MAX_PATH_BUFFSIZE);
CSTRING::Trim(szEXEPath);
HANDLE hFile = CreateFile (szEXEPath, 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE == hFile ) { MessageBox(hDlg,TEXT("Unable to locate specified file"),TEXT("Invalid file name"),MB_OK);
SetWindowLongPtr(hDlg,DWLP_MSGRESULT,-1); return -1; } g_pCurrentWizard->m_szLongName = szEXEPath;
CSTRING str = szEXEPath;
g_pCurrentWizard->m_Record.szEXEName = str; g_pCurrentWizard->m_Record.szEXEName.ShortFilename(); } break; } } break;
case WM_COMMAND: switch ( LOWORD(wParam) ) { case IDC_EXEPATH: case IDC_APPNAME: if ( EN_CHANGE == HIWORD(wParam) ) {
TCHAR szTemp[MAX_STRING_SIZE];
GetDlgItemText(hDlg,IDC_APPNAME,szTemp,MAX_STRING_SIZE);
BOOL bEnable = ( CSTRING::Trim(szTemp) > 0) ? TRUE:FALSE;
bEnable &= (GetWindowTextLength(GetDlgItem(hDlg,IDC_EXEPATH)) > 0) ? TRUE:FALSE; DWORD dwFlags = PSWIZB_BACK;
if ( bEnable ) dwFlags |= PSWIZB_NEXT;
SendMessage(GetParent(hDlg),PSM_SETWIZBUTTONS,0, dwFlags); } break;
case IDC_BROWSE: { CSTRING szFilename;
HWND hwndFocus = GetFocus();
if ( g_theApp.GetFilename(TEXT("Find executable"), TEXT("EXE File (*.EXE)\0*.EXE\0All files (*.*)\0*.*\0\0"), TEXT(""), TEXT("EXE"), OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST, TRUE, szFilename)) {
SetDlgItemText(hDlg,IDC_EXEPATH,szFilename);
// Force proper Next button state.
SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_EXEPATH,EN_CHANGE),0); }
SetFocus( hwndFocus ); } break;
}//switch ( LOWORD(wParam) )
}// switch ( uMsg )
return FALSE; }//end of GetAppName(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
BOOL CALLBACK GetMessageType ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch ( uMsg ) { case WM_INITDIALOG: {
SendMessage(GetDlgItem(hDlg,IDC_NOBLOCK), BM_SETCHECK, // message to send
(WPARAM) 1, // check state
(LPARAM) 0 // not used; must be zero
);
return TRUE; } case WM_NOTIFY: { NMHDR * pHdr = (NMHDR *) lParam;
switch ( pHdr->code ) { case PSN_WIZNEXT: { int iReturn = SendMessage(GetDlgItem(hDlg,IDC_NOBLOCK), BM_GETCHECK, // message to send
(WPARAM) 1, // check state
(LPARAM) 0 // not used; must be zero
);
if (iReturn == BST_CHECKED) { ((CAppHelpWizard*)g_pCurrentWizard)->bBlock = FALSE; }else{ ((CAppHelpWizard*)g_pCurrentWizard)->bBlock = TRUE; }
return TRUE; } case PSN_SETACTIVE: { DWORD dwFlags = PSWIZB_NEXT | PSWIZB_BACK;
SendMessage(GetParent(hDlg),PSM_SETWIZBUTTONS,0, dwFlags); return TRUE; } }//switch( pHdr->code )
break; } }//SWITCH
return FALSE; }//end of GetMessageType (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
BOOL CALLBACK GetMessageInformation ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{ switch ( uMsg ) { case WM_INITDIALOG: { //
// Set the maximum length of the text boxes
//
SendMessage( GetDlgItem(hDlg,IDC_URL), // handle to destination window
EM_LIMITTEXT, // message to send
(WPARAM) 1024, // text length
(LPARAM) 0 );
SendMessage( GetDlgItem(hDlg,IDC_MSG_SUMMARY), // handle to destination window
EM_LIMITTEXT, // message to send
(WPARAM) 1024, // text length
(LPARAM) 0 );
// Force proper Next button state.
SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_MSG_SUMMARY,EN_CHANGE),0); } break;
case WM_NOTIFY: { NMHDR * pHdr = (NMHDR *) lParam;
switch ( pHdr->code ) { case PSN_SETACTIVE: { SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_MSG_SUMMARY,EN_CHANGE),0); } break;
case PSN_WIZNEXT: {
PAPPHELP pAppHelp = new APPHELP;
if (pAppHelp == NULL) { MEM_ERR; return FALSE; }
pAppHelp->HTMLHELPID = ++g_nMAXHELPID;
((CAppHelpWizard*)g_pCurrentWizard)->nPresentHelpId = pAppHelp->HTMLHELPID;
TCHAR szTemp[2048];
*szTemp = 0;
GetDlgItemText(hDlg,IDC_MSG_SUMMARY,szTemp,1024); pAppHelp->strMessage = szTemp;
//
// Add the APPHELP message in the Library.
//
pAppHelp->pNext = g_theApp.GetDBLocal().m_pAppHelp; g_theApp.GetDBLocal().m_pAppHelp = pAppHelp;
//
// Add the AppHelp for the entry
//
PHELPENTRY pHelp = new HELPENTRY;
if ( NULL != pHelp ) {
pHelp->Entry.uType = ENTRY_APPHELP;
pHelp->uHelpID = ((CAppHelpWizard*)g_pCurrentWizard)->nPresentHelpId; pHelp->bBlock = ((CAppHelpWizard*)g_pCurrentWizard)->bBlock ;
if (pHelp->bBlock) { pHelp->uSeverity = BLOCK; }else{ pHelp->uSeverity = NOBLOCK; }
*szTemp = 0; GetDlgItemText(hDlg,IDC_URL,szTemp,1024); pHelp->strURL = szTemp;
pHelp->Entry.pNext = ((CAppHelpWizard*)g_pCurrentWizard)->m_Record.pEntries;
((CAppHelpWizard*)g_pCurrentWizard)->m_Record.pEntries = (PDBENTRY)pHelp;
}else{
MEM_ERR;
}
return TRUE; } } } break;
case WM_COMMAND:
switch ( LOWORD(wParam) ) { case IDC_MSG_SUMMARY: if ( EN_CHANGE == HIWORD(wParam) ) { BOOL bEnable = (GetWindowTextLength(GetDlgItem(hDlg,IDC_MSG_SUMMARY)) > 0) ? TRUE:FALSE; DWORD dwFlags = PSWIZB_BACK;
if ( bEnable ) dwFlags |= PSWIZB_NEXT;
SendMessage(GetParent(hDlg),PSM_SETWIZBUTTONS,0, dwFlags); } break;
}//switch ( LOWORD(wParam) )
}// switch ( uMsg )
return FALSE; }//end of GetMessageInformation (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
BOOL CALLBACK AppWizardDone ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ switch ( uMsg ) { case WM_NOTIFY: { NMHDR * pHdr = (NMHDR *) lParam;
switch ( pHdr->code ) { case PSN_SETACTIVE: SendMessage(GetParent(hDlg),PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_FINISH); return TRUE;
case PSN_WIZBACK: { //
// We have to delete the apphelp message that has been added to the library.
//
if (((CAppHelpWizard*)g_pCurrentWizard)->nPresentHelpId != -1) { DeleteAppHelp(g_nMAXHELPID); --g_nMAXHELPID;
((CAppHelpWizard*)g_pCurrentWizard)->nPresentHelpId = -1;
WipeAppHelp(&((CAppHelpWizard*)g_pCurrentWizard)->m_Record); }
break; }
} } break;
case WM_COMMAND: switch ( LOWORD(wParam) ) {
case IDC_TESTRUN: { HWND hndFocus = GetFocus(); g_theApp.TestRun(&g_pCurrentWizard->m_Record,&g_pCurrentWizard->m_szLongName,NULL,hDlg);
SetFocus(hndFocus); return TRUE;
} break; } break; }
return FALSE;
}//end of WizardDone (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
BOOL DeleteAppHelp ( UINT nHelpID ) {
PAPPHELP pAppHelp = g_theApp.GetDBLocal().m_pAppHelp, pPrev = NULL;
while (pAppHelp){
if (pAppHelp->HTMLHELPID == nHelpID) {
if (pPrev == NULL) {
//
// This is the first element
//
g_theApp.GetDBLocal().m_pAppHelp = g_theApp.GetDBLocal().m_pAppHelp->pNext;
}else{
pPrev->pNext = pAppHelp->pNext; }
delete pAppHelp; return TRUE;
}else{
pPrev = pAppHelp; pAppHelp = pAppHelp->pNext; } }
return FALSE; }
BOOL WipeAppHelp( PDBRECORD pRecord ) {
PDBENTRY pEntry = pRecord->pEntries;
PDBENTRY pPrev = NULL;
while (pEntry) {
if ( ENTRY_APPHELP == pEntry->uType) {
if (pPrev == NULL) { pRecord->pEntries = pEntry->pNext;
} else{ pPrev->pNext = pEntry->pNext; }
delete pEntry; return TRUE;
}else{ pEntry = pEntry->pNext; } }
return FALSE; }
|