/* dlgprocs.c - Packager-specific dialog routines. */ #include "packager.h" #include #include #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; }