windows-nt/Source/XPSP1/NT/shell/osshell/accesory/packager/dlgprocs.c
2020-09-26 16:20:57 +08:00

510 lines
14 KiB
C

/* dlgprocs.c - Packager-specific dialog routines.
*/
#include "packager.h"
#include <shellapi.h>
#include <commdlg.h>
#include "dialogs.h"
// #include "..\..\library\shell.h"
// HACK: Copied from shsemip.h
#ifdef WINNT
WINSHELLAPI int WINAPI PickIconDlg(HWND hwnd, LPWSTR pwszIconPath, UINT cchIconPath, int *piIconIndex);
int PkgPickIconDlg(HWND hwnd, LPSTR pszIconPath, UINT cbIconPath, int *piIconIndex);
#else
WINSHELLAPI int WINAPI PickIconDlg(HWND hwnd, LPSTR pwszIconPath, UINT cchIconPath, int *piIconIndex);
# define PkgPickIconDlg(h, s, c, p) PickIconDlg(h, s, c, p)
#endif
#define CBCUSTFILTER 40
static CHAR szPathField[CBPATHMAX];
static CHAR szDirField[CBPATHMAX];
static CHAR szStarDotEXE[] = "*.EXE";
static CHAR szShellDll[] = "shell32.dll";
static CHAR szCommand[CBCMDLINKMAX];
static CHAR szIconText[CBPATHMAX];
/*--------------------------------------------------------------------------*/
/* */
/* MyDialogBox() - */
/* */
/*--------------------------------------------------------------------------*/
INT_PTR MyDialogBox(
UINT idd,
HWND hwndParent,
DLGPROC lpfnDlgProc
)
{
return DialogBoxAfterBlock(MAKEINTRESOURCE(idd), hwndParent, lpfnDlgProc);
}
#ifdef WINNT
/*
* NT's PickIconDlg is UNICODE only, so thunk it here
*/
/* PkgPickIconDlg() -
*
* hwnd - window
* pszIconPath - ANSI path for icon suggested icon file (also output buffer that holds real icon file)
* cchIconPath - size of the buffer in chars pointed to pszIconPath. NOT the string length!
* piIconIndex - receives the index of the icon
*
*/
int PkgPickIconDlg(HWND hwnd, LPSTR pszIconPath, UINT cchIconPath, int *piIconIndex) {
WCHAR wszPath[MAX_PATH+1];
int iRet;
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszIconPath, -1, wszPath, ARRAYSIZE(wszPath));
iRet = PickIconDlg(hwnd, wszPath, cchIconPath, piIconIndex);
wszPath[MAX_PATH] = L'\0'; // Make sure text is zero terminated, even if it is garbage
WideCharToMultiByte( CP_ACP, 0, wszPath, -1, pszIconPath, cchIconPath, NULL, NULL );
return iRet;
}
#endif
/* IconDialog() -
*
*/
BOOL
IconDialog(
LPIC lpic
)
{
char szIconPath[MAX_PATH];
int iDlgIcon = lpic->iDlgIcon;
StringCchCopy(szIconPath, ARRAYSIZE(szIconPath), (*lpic->szIconPath) ? lpic->szIconPath : szShellDll);
if (PkgPickIconDlg(ghwndPane[APPEARANCE],
szIconPath, sizeof(szIconPath)/sizeof(char), &iDlgIcon))
{
StringCchCopy(lpic->szIconPath, ARRAYSIZE(lpic->szIconPath), szIconPath);
lpic->iDlgIcon = iDlgIcon;
GetCurrentIcon(lpic);
return TRUE;
}
return FALSE;
}
/* ChangeCmdLine() - Summons the Command Line... dialog.
*
*/
BOOL
ChangeCmdLine(
LPCML lpcml
)
{
StringCchCopy(szCommand, ARRAYSIZE(szCommand), lpcml->szCommand);
if (DialogBoxAfterBlock(MAKEINTRESOURCE(DTCHANGECMDTEXT),
ghwndPane[CONTENT], fnChangeCmdText) != IDOK)
return FALSE;
StringCchCopy(lpcml->szCommand, ARRAYSIZE(lpcml->szCommand), szCommand);
CmlFixBounds(lpcml);
return TRUE;
}
/* ChangeLabel() - Summons the Label... dialog.
*
*/
VOID
ChangeLabel(
LPIC lpic
)
{
INT iPane = APPEARANCE;
StringCchCopy(szIconText, ARRAYSIZE(szIconText), lpic->szIconText);
if (DialogBoxAfterBlock(MAKEINTRESOURCE(DTCHANGETEXT),
ghwndPane[iPane], fnChangeText)
&& lstrcmp(lpic->szIconText, szIconText))
{
// label has changed, set the undo object.
if (glpobjUndo[iPane])
DeletePaneObject(glpobjUndo[iPane], gptyUndo[iPane]);
gptyUndo[iPane] = ICON;
glpobjUndo[iPane] = IconClone (lpic);
StringCchCopy(lpic->szIconText, ARRAYSIZE(lpic->szIconText), szIconText);
}
}
/**************************** Dialog Functions ****************************/
/* fnChangeCmdText() - Command Line... dialog procedure.
*/
INT_PTR CALLBACK
fnChangeCmdText(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
LPSTR psz;
switch (msg)
{
case WM_INITDIALOG:
SetDlgItemText(hDlg, IDD_COMMAND, szCommand);
SendDlgItemMessage(hDlg, IDD_COMMAND, EM_LIMITTEXT, CBCMDLINKMAX - 1, 0L);
PostMessage(hDlg, WM_NEXTDLGCTL,
(WPARAM)GetDlgItem(hDlg, IDD_COMMAND), 1L);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDD_LABEL:
PostMessage(hDlg, WM_NEXTDLGCTL,
(WPARAM)GetDlgItem(hDlg, IDD_COMMAND), 1L);
break;
case IDOK:
GetDlgItemText(hDlg, IDD_COMMAND, szCommand, CBCMDLINKMAX);
/*
* Eat leading spaces to make Afrikaners in high places
* happy.
*/
psz = szCommand;
while(*psz == CHAR_SPACE)
psz++;
if( psz != szCommand ) {
LPSTR pszDst = szCommand;
while(*psz) {
*pszDst++ = *psz++;
}
/* copy null across */
*pszDst = *psz;
}
// FALL THROUGH TO IDCANCEL
case IDCANCEL:
EndDialog(hDlg, LOWORD(wParam));
}
}
return FALSE;
}
/* fnProperties() - Link Properties... dialog
*/
INT_PTR CALLBACK
fnProperties(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndLB = GetDlgItem(hDlg, IDD_LISTBOX);
switch (msg)
{
case WM_REDRAW:
SendMessage(hwndLB, WM_SETREDRAW, 0, 0L);
case WM_INITDIALOG:
{
BOOL fChangeLink = TRUE;
HANDLE hData = NULL;
LONG otFocus;
LPSTR lpstrData = NULL;
LPSTR lpstrTemp;
LPOLEOBJECT lpObject;
LPVOID lpobjFocus;
LPVOID lpobjFocusUndo;
OLEOPT_UPDATE update;
CHAR szType[CBMESSAGEMAX];
CHAR szFull[CBMESSAGEMAX * 4];
INT idButton;
INT iPane;
iPane = (GetTopWindow(ghwndFrame) == ghwndPane[CONTENT]);
lpobjFocus = glpobj[iPane];
lpobjFocusUndo = glpobjUndo[iPane];
lpObject = ((LPPICT)lpobjFocus)->lpObject;
// Reset the list box
SendMessage(hwndLB, LB_RESETCONTENT, 0, 0L);
if (msg == WM_INITDIALOG)
{
// If it wasn't a link it doesn't belong
OleQueryType(lpObject, &otFocus);
if (otFocus != OT_LINK)
{
ghwndError = ghwndFrame;
EndDialog(hDlg, TRUE);
break;
}
PicSaveUndo(lpobjFocus);
ghwndError = hDlg;
}
//
// Redrawing the string, get the update options and
// the button state for IDD_AUTO/IDD_MANUAL.
//
Error(OleGetLinkUpdateOptions(lpObject, &update));
switch (update)
{
case oleupdate_always:
LoadString(ghInst, IDS_AUTO, szType, CBMESSAGEMAX);
idButton = IDD_AUTO;
break;
case oleupdate_oncall:
LoadString(ghInst, IDS_MANUAL, szType, CBMESSAGEMAX);
idButton = IDD_MANUAL;
break;
default:
LoadString(ghInst, IDS_CANCELED, szType, CBMESSAGEMAX);
idButton = -1;
// Disable the change link button
fChangeLink = FALSE;
}
//
// Retrieve the server name (try it from Undo
// if the object has been frozen)
//
if (Error(OleGetData(lpObject, gcfLink, &hData)) || !hData)
{
OleQueryType(lpObject, &otFocus);
if (otFocus != OT_STATIC)
{
ErrorMessage(E_GET_FROM_CLIPBOARD_FAILED);
return TRUE;
}
if (gptyUndo[iPane] == PICTURE &&
(Error(OleGetData(((LPPICT)lpobjFocusUndo)->lpObject,
gcfLink, &hData)) || !hData))
{
ErrorMessage(E_GET_FROM_CLIPBOARD_FAILED);
return TRUE;
}
}
// The link format is: "szClass0szDocument0szItem00"
if (hData && (lpstrData = GlobalLock(hData)))
{
// Retrieve the server's class ID
RegGetClassId(szFull, ARRAYSIZE(szFull), lpstrData);
StringCchCat(szFull, ARRAYSIZE(szFull), "\t");
// Display the Document and Item names
while (*lpstrData++)
;
// Strip off the path name and drive letter
lpstrTemp = lpstrData;
while (*lpstrTemp)
{
if (*lpstrTemp == '\\' || *lpstrTemp == ':')
lpstrData = lpstrTemp + 1;
if (gbDBCS)
{
lpstrTemp = CharNext(lpstrTemp);
}
else
{
lpstrTemp++;
}
}
// Append the file name
StringCchCat(szFull, ARRAYSIZE(szFull), lpstrData);
StringCchCat(szFull, ARRAYSIZE(szFull), "\t");
// Append the item name
while (*lpstrData++)
;
StringCchCat(szFull, ARRAYSIZE(szFull), lpstrData);
StringCchCat(szFull, ARRAYSIZE(szFull), "\t");
GlobalUnlock(hData);
}
else
{
StringCchCopy(szFull, ARRAYSIZE(szFull), "\t\t\t");
}
// Append the type of link
StringCchCat(szFull, ARRAYSIZE(szFull), szType);
// Draw the link in the list box
SendMessage(hwndLB, LB_INSERTSTRING, (WPARAM) - 1, (LPARAM)szFull);
if (msg == WM_REDRAW)
{
SendMessage(hwndLB, WM_SETREDRAW, 1, 0L);
InvalidateRect(hwndLB, NULL, TRUE);
Dirty();
}
// Uncheck those buttons that shouldn't be checked
if (IsDlgButtonChecked(hDlg, IDD_AUTO) && (idButton != IDD_AUTO))
CheckDlgButton(hDlg, IDD_AUTO, FALSE);
if (IsDlgButtonChecked(hDlg, IDD_MANUAL) && (idButton != IDD_MANUAL))
CheckDlgButton(hDlg, IDD_MANUAL, FALSE);
// Check the dialog button, as appropriate
if ((idButton == IDD_AUTO) || (idButton == IDD_MANUAL))
CheckDlgButton(hDlg, idButton, TRUE);
// Enable the other buttons appropriately
EnableWindow(GetDlgItem(hDlg, IDD_CHANGE),
((otFocus != OT_STATIC) && fChangeLink));
EnableWindow(GetDlgItem(hDlg, IDD_EDIT), (otFocus != OT_STATIC));
EnableWindow(GetDlgItem(hDlg, IDD_PLAY), (otFocus != OT_STATIC));
EnableWindow(GetDlgItem(hDlg, IDD_UPDATE), (otFocus != OT_STATIC));
EnableWindow(GetDlgItem(hDlg, IDD_CHANGE), (otFocus != OT_STATIC));
EnableWindow(GetDlgItem(hDlg, IDD_MANUAL), (otFocus != OT_STATIC));
EnableWindow(GetDlgItem(hDlg, IDD_AUTO), (otFocus != OT_STATIC));
EnableWindow(GetDlgItem(hDlg, IDD_FREEZE), (otFocus != OT_STATIC));
return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
PostMessage(ghwndFrame, WM_COMMAND, IDM_UNDO, 0L);
case IDOK:
ghwndError = ghwndFrame;
EndDialog(hDlg, TRUE);
return TRUE;
default:
break;
}
SendMessage(ghwndPane[GetTopWindow(ghwndFrame) == ghwndPane[CONTENT]],
WM_COMMAND, wParam, 0L);
switch (LOWORD(wParam))
{
// Dismiss the dialog on Edit/Activate
case IDD_EDIT:
case IDD_PLAY:
ghwndError = ghwndFrame;
EndDialog(hDlg, TRUE);
return TRUE;
default:
break;
}
break;
}
return FALSE;
}
/* fnChangeText() - Label... dialog
*/
INT_PTR CALLBACK
fnChangeText(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
switch (msg)
{
case WM_INITDIALOG:
SetDlgItemText(hDlg, IDD_ICONTEXT, szIconText);
SendDlgItemMessage(hDlg, IDD_ICONTEXT, EM_LIMITTEXT, 39, 0L);
PostMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDD_ICONTEXT),
1L);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDD_LABEL:
PostMessage(hDlg, WM_NEXTDLGCTL,
(WPARAM)GetDlgItem(hDlg, IDD_ICONTEXT), 1L);
break;
case IDOK:
GetDlgItemText(hDlg, IDD_ICONTEXT, szIconText, CBMESSAGEMAX);
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
}
return FALSE;
}
/* fnInvalidLink() - Invalid Link dialog
*
* This is the two button "Link unavailable" dialog box.
*/
INT_PTR CALLBACK
fnInvalidLink(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
)
{
switch (msg)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
case IDD_CHANGE:
EndDialog(hDlg, LOWORD(wParam));
}
}
return FALSE;
}