510 lines
14 KiB
C
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;
|
|
}
|