windows-nt/Source/XPSP1/NT/shell/ext/pack/packwiz.cpp

510 lines
16 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include <privcpp.h>
#include <windows.h>
#include <prsht.h>
#include <shlwapi.h>
#include <shsemip.h>
#include "ids.h"
//
// FUNCTION: PackWiz_SelectFileDlgProc(HWND,UINT,WPARAM,LPARAM)
//
// PURPOSE: Dialog procedure for FIRST page of Create New Package Wizard
//
//
INT_PTR CALLBACK PackWiz_SelectFileDlgProc(HWND hDlg, UINT uMsg , WPARAM wParam, LPARAM lParam)
{
LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
lppi = (LPPACKAGER_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lppi);
Edit_LimitText(GetDlgItem(hDlg, IDC_COMMAND), ARRAYSIZE(lppi->szFilename) - 1);
if (*lppi->szFilename)
SetDlgItemText(hDlg, IDC_COMMAND, lppi->szFilename);
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDHELP:
break;
case IDC_COMMAND:
// Check to see if we have a change in the edit control
switch (GET_WM_COMMAND_CMD(wParam, lParam))
{
case EN_CHANGE:
if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
else
PropSheet_SetWizButtons(GetParent(hDlg), 0);
break;
}
break;
case IDC_BROWSE:
{
TCHAR szExt[80];
TCHAR szFilter[80];
TCHAR szTitle[80];
TCHAR szFilename[MAX_PATH];
int ret;
LPTSTR lpsz = szFilter;
// load the filter and then replace all the @ characters
// with NULL. The end of the string will be doubly
// null-terminated
LoadString(g_hinst, IDS_BROWSEFILTER, szFilter, ARRAYSIZE(szFilter)-1);
while (*lpsz) {
if (*lpsz == TEXT('@')) {
*lpsz = 0;
lpsz++;
}
else {
lpsz = CharNext(lpsz);
}
}
*(lpsz+1) = 0;
LoadString(g_hinst, IDS_BROWSEEXT, szExt, ARRAYSIZE(szExt));
LoadString(g_hinst, IDS_BROWSETITLE, szTitle, ARRAYSIZE(szTitle));
GetDlgItemText(hDlg, IDC_COMMAND, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
// Danger - this is a TCHAR API!
ret = GetFileNameFromBrowse(hDlg,szFilename, ARRAYSIZE(lppi->szFilename), NULL, szExt, szFilter, szTitle);
if (ret > 0)
{
lstrcpy(lppi->szFilename, szFilename);
}
SetDlgItemText(hDlg, IDC_COMMAND, lppi->szFilename);
break;
}
}
break;
case WM_NOTIFY:
switch (((NMHDR *)lParam)->code)
{
case PSN_KILLACTIVE:
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
return TRUE;
case PSN_RESET:
// reset to original values
*lppi->szFilename = TEXT('\0');
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
break;
case PSN_SETACTIVE:
Edit_SetText(GetDlgItem(hDlg, IDC_COMMAND), lppi->szFilename);
if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
else
PropSheet_SetWizButtons(GetParent(hDlg), 0);
break;
case PSN_WIZNEXT:
GetDlgItemText(hDlg, IDC_COMMAND, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
break;
case PSN_QUERYCANCEL:
*lppi->szFilename = TEXT('\0');
return FALSE;
default:
return FALSE;
}
break;
case WM_DESTROY:
case WM_HELP:
case WM_CONTEXTMENU:
break;
default:
return FALSE;
} // end of switch on uMsg
return TRUE;
}
//
// FUNCTION: PackWiz_SelectIconDlgProc(HWNDd, UINT, WPARAM, LPARAM)
//
// PURPOSE: Dialog procedure for SECOND page of Create New Package Wizard
//
//
INT_PTR CALLBACK PackWiz_SelectIconDlgProc(HWND hDlg, UINT uMsg , WPARAM wParam, LPARAM lParam)
{
LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
lppi = (LPPACKAGER_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lppi);
*lppi->szIconPath = TEXT('\0');
lppi->iIcon = 0;
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDHELP:
break;
case IDC_CHANGEICON:
if (S_OK == PickIconDlg(hDlg, lppi->szIconPath, ARRAYSIZE(lppi->szIconPath), &(lppi->iIcon)))
{
HICON hicon = ExtractAssociatedIcon(g_hinst, lppi->szIconPath, (LPWORD)&(lppi->iIcon));
if (hicon)
{
HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
}
}
break;
}
break;
case WM_NOTIFY:
switch (((NMHDR *)lParam)->code)
{
case PSN_KILLACTIVE:
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
return TRUE;
case PSN_RESET:
// reset to original values
*lppi->szIconPath = TEXT('\0');
lppi->iIcon = 0;
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
break;
case PSN_SETACTIVE: {
HICON hicon = NULL;
if (PathFileExists(lppi->szFilename))
hicon = ExtractAssociatedIcon(g_hinst, *lppi->szIconPath? lppi->szIconPath : lppi->szFilename, (LPWORD)&(lppi->iIcon));
if (!hicon)
hicon = LoadIcon(g_hinst,MAKEINTRESOURCE(IDI_PACKAGER));
HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_NEXT);
}
break;
case PSN_WIZBACK:
break;
case PSN_WIZNEXT:
break;
case PSN_QUERYCANCEL:
*lppi->szFilename = TEXT('\0');
return FALSE;
break;
default:
return FALSE;
}
break;
case WM_DESTROY:
case WM_HELP:
case WM_CONTEXTMENU:
break;
default:
return FALSE;
} // end of switch on uMsg
return TRUE;
}
//
// FUNCTION: PackWiz_SelectLabelDlgProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Dialog procedure for THIRD page of Create New Package Wizard
//
//
INT_PTR CALLBACK PackWiz_SelectLabelDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg) {
case WM_INITDIALOG:
lppi = (LPPACKAGER_INFO)((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lppi);
Edit_LimitText(GetDlgItem(hDlg, IDC_COMMAND), ARRAYSIZE(lppi->szLabel) - 1);
GetDisplayName(lppi->szLabel,lppi->szFilename);
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDHELP:
break;
case IDC_COMMAND:
// Check to see if we have a change in the edit control
switch (GET_WM_COMMAND_CMD(wParam, lParam))
{
case EN_CHANGE:
if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH);
else
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
break;
}
break;
}
break;
case WM_NOTIFY:
switch (((NMHDR *)lParam)->code)
{
case PSN_KILLACTIVE:
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
return TRUE;
case PSN_RESET:
// reset to original values
*lppi->szLabel = TEXT('\0');
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
break;
case PSN_SETACTIVE:
Edit_SetText(GetDlgItem(hDlg, IDC_COMMAND), lppi->szLabel);
if (GetWindowTextLength(GetDlgItem(hDlg, IDC_COMMAND)) > 0)
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK|PSWIZB_FINISH);
else
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK);
break;
case PSN_WIZBACK:
GetDlgItemText(hDlg, IDC_COMMAND, lppi->szLabel, ARRAYSIZE(lppi->szLabel));
break;
case PSN_WIZFINISH:
GetDlgItemText(hDlg, IDC_COMMAND, lppi->szLabel, ARRAYSIZE(lppi->szLabel));
break;
case PSN_QUERYCANCEL:
*lppi->szFilename = TEXT('\0');
return FALSE;
default:
return FALSE;
}
break;
case WM_DESTROY:
case WM_HELP:
case WM_CONTEXTMENU:
break;
default:
return FALSE;
} // end of switch on uMsg
return TRUE;
}
//
// FUNCTION: PackWiz_EditPackageDlgProc(HWND,UINT,WPARAM,LPARAM)
//
// PURPOSE: Dialog procedure for Edit Package
//
// NOTE: We have two different types of packages we could edit, but they
// both have exactly the same dialog layout, except for some static text, which
// doesn't affect the dialog procedure
//
//
INT_PTR CALLBACK PackWiz_EditPackageDlgProc(HWND hDlg, UINT uMsg , WPARAM wParam, LPARAM lParam)
{
LPPACKAGER_INFO lppi = (LPPACKAGER_INFO)GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg) {
case WM_INITDIALOG:
{
HICON hicon;
lppi = (LPPACKAGER_INFO)lParam;
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
Edit_LimitText(GetDlgItem(hDlg, IDC_EDIT1), ARRAYSIZE(lppi->szFilename) - 1);
Edit_LimitText(GetDlgItem(hDlg, IDC_EDIT2), ARRAYSIZE(lppi->szLabel) - 1);
SetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename);
SetDlgItemText(hDlg, IDC_EDIT2, lppi->szLabel);
if (*lppi->szIconPath != TEXT('\0'))
hicon = ExtractAssociatedIcon(g_hinst, lppi->szIconPath, (LPWORD)&(lppi->iIcon));
else
hicon = LoadIcon(g_hinst,MAKEINTRESOURCE(IDI_PACKAGER));
HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
break;
}
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam))
{
case IDHELP:
break;
case IDOK:
GetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
GetDlgItemText(hDlg, IDC_EDIT2, lppi->szLabel, ARRAYSIZE(lppi->szLabel));
EndDialog(hDlg, 1);
break;
case IDCANCEL:
EndDialog(hDlg, -1);
break;
case IDC_CHANGEICON:
{
PickIconDlg(hDlg, lppi->szIconPath, ARRAYSIZE(lppi->szIconPath), &(lppi->iIcon));
HICON hicon = ExtractAssociatedIcon(g_hinst, lppi->szIconPath, (LPWORD)&(lppi->iIcon));
if (hicon)
{
HWND hPackIcon = GetDlgItem(hDlg, IDC_PACKICON);
SendMessage(hPackIcon, STM_SETICON, (WPARAM)hicon, (LPARAM)0);
}
}
break;
case IDC_BROWSE:
{
TCHAR szExt[80];
TCHAR szFilter[80];
TCHAR szTitle[80];
LPTSTR lpsz = szFilter;
// load the filter and then replace all the @ characters
// with NULL. The end of the string will be doubly
// null-terminated
LoadString(g_hinst, IDS_BROWSEFILTER, szFilter, ARRAYSIZE(szFilter)-1);
while (*lpsz) {
if (*lpsz == TEXT('@')) {
*lpsz = 0;
lpsz++;
}
else {
lpsz = CharNext(lpsz);
}
}
*(lpsz+1) = 0;
LoadString(g_hinst, IDS_BROWSEEXT, szExt, ARRAYSIZE(szExt));
LoadString(g_hinst, IDS_BROWSETITLE, szTitle, ARRAYSIZE(szTitle));
GetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename, ARRAYSIZE(lppi->szFilename));
GetFileNameFromBrowse(hDlg,lppi->szFilename,
ARRAYSIZE(lppi->szFilename), NULL, szExt, szFilter, szTitle);
SetDlgItemText(hDlg, IDC_EDIT1, lppi->szFilename);
}
break;
}
break;
case WM_DESTROY:
case WM_HELP:
case WM_CONTEXTMENU:
break;
default:
return FALSE;
} // end of switch on uMsg
return TRUE;
}
//
//
// FUNCTION: PackWiz_FillInPropertyPage(PROPSHEETPAGE *, int, LPFN)
//
// PURPOSE: Fills in the given PROPSHEETPAGE structure
//
// COMMENTS:
//
// This function fills in a PROPSHEETPAGE structure with the
// information the system needs to create the page.
//
void PackWiz_FillInPropertyPage(PROPSHEETPAGE* psp, int idDlg, DLGPROC pfnDlgProc, LPPACKAGER_INFO lppi)
{
psp->dwSize = sizeof(PROPSHEETPAGE);
psp->dwFlags = 0;
psp->hInstance = g_hinst;
psp->pszTemplate = MAKEINTRESOURCE(idDlg);
psp->pszIcon = NULL;
psp->pfnDlgProc = pfnDlgProc;
psp->pszTitle = NULL;
psp->lParam = (LPARAM)lppi;
}
//
//
// FUNCTION: PackWiz_CreateWizard(HWND)
//
// PURPOSE: Create the Wizard control.
//
// COMMENTS:
//
// This function creates the wizard property sheet.
//
int PackWiz_CreateWizard(HWND hwndOwner, LPPACKAGER_INFO lppi)
{
PROPSHEETPAGE psp[PACKWIZ_NUM_PAGES];
PROPSHEETHEADER psh;
PackWiz_FillInPropertyPage(&psp[0], IDD_SELECTFILE, PackWiz_SelectFileDlgProc,lppi);
PackWiz_FillInPropertyPage(&psp[1], IDD_SELECTICON, PackWiz_SelectIconDlgProc,lppi);
PackWiz_FillInPropertyPage(&psp[2], IDD_SELECTLABEL, PackWiz_SelectLabelDlgProc,lppi);
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_WIZARD;
psh.hwndParent = hwndOwner;
psh.nPages = ARRAYSIZE(psp);
psh.nStartPage = 0;
psh.pszIcon = NULL;
psh.ppsp = (LPCPROPSHEETPAGE) &psp;
return (int)(PropertySheet(&psh));
}
//
// FUNCTION: PackWiz_EditPackage(HWND, WORD, LPPACKAGER_INFO)
//
// PURPOSE: To Run the Edit Package Dialog Procedure
//
//
int PackWiz_EditPackage(HWND hwnd, int idDlg, LPPACKAGER_INFO lppi)
{
return (int)DialogBoxParam(g_hinst, MAKEINTRESOURCE(idDlg), hwnd, PackWiz_EditPackageDlgProc, (LPARAM)lppi);
}