404 lines
12 KiB
C
404 lines
12 KiB
C
|
/*-----------------------------------------------------------------------------+
|
||
|
| OPEN.C |
|
||
|
| |
|
||
|
| This file contains the code that controls the 'Open Device or File' dialog. |
|
||
|
| |
|
||
|
| (C) Copyright Microsoft Corporation 1991. All rights reserved. |
|
||
|
| |
|
||
|
| Revision History |
|
||
|
| Oct-1992 MikeTri Ported to WIN32 / WIN16 common code |
|
||
|
| |
|
||
|
+-----------------------------------------------------------------------------*/
|
||
|
|
||
|
/* include files */
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <windowsx.h>
|
||
|
#include <commdlg.h>
|
||
|
#include <mmsystem.h>
|
||
|
#include "mpole.h"
|
||
|
#include "mplayer.h"
|
||
|
#include "registry.h"
|
||
|
#include "regstr.h"
|
||
|
|
||
|
extern HMENU ghMenu; /* handle to main menu */
|
||
|
extern HMENU ghDeviceMenu; /* handle to the Device menu */
|
||
|
extern UINT gwNumDevices; /* number of available devices */
|
||
|
extern UINT gwCurDevice;
|
||
|
extern PTSTR gpchFilter;
|
||
|
LPTSTR gpInitialDir = NULL;
|
||
|
|
||
|
extern SZCODE aszOptionsSection[];
|
||
|
|
||
|
static SZCODE aszNULL[] = TEXT("");
|
||
|
static SZCODE aszDirName[] = TEXT("%s Directory");
|
||
|
|
||
|
BOOL GetDefaultMediaDirectory(LPTSTR pDirectory, DWORD cbDirectory);
|
||
|
|
||
|
/*
|
||
|
* fOK = DoOpen()
|
||
|
*
|
||
|
* Invoke the standard "File Open" dialog
|
||
|
*
|
||
|
* Return TRUE if and only if a new file is successfully opened.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
INT_PTR FAR PASCAL DoOpen(UINT wCurDevice, LPTSTR szFileName)
|
||
|
{
|
||
|
OPENFILENAME ofn;
|
||
|
TCHAR achFile[MAX_PATH + 1]; /* file or device name buffer */
|
||
|
TCHAR achTitle[80]; /* string holding the title bar name */
|
||
|
INT_PTR f;
|
||
|
TCHAR DirectoryValue[80];
|
||
|
|
||
|
ZeroMemory(&ofn, sizeof ofn);
|
||
|
|
||
|
if (!LOADSTRING(IDS_OPENTITLE, achTitle)) {
|
||
|
Error(ghwndApp, IDS_OUTOFMEMORY);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (wCurDevice != 0)
|
||
|
{
|
||
|
/* Saving and restoring the current directory for the device:
|
||
|
*
|
||
|
* We remember the directory that the user just selected.
|
||
|
* It is saved as the "<device> Directory" value under
|
||
|
* \Software\Microsoft\Media Player\Options for the current user.
|
||
|
* The next time the user goes to open another file via the same
|
||
|
* Device menu, we present the same initial directory.
|
||
|
* This directory is also presented in the case where the user
|
||
|
* selects File.Open.
|
||
|
*/
|
||
|
wsprintf(DirectoryValue, aszDirName, garMciDevices[wCurDevice].szDevice);
|
||
|
} else {
|
||
|
//
|
||
|
// If you choose Open from File menu instead of Device menu,
|
||
|
// we should use "<No Name>" value instead of "<device> Directory".
|
||
|
//
|
||
|
DirectoryValue[0] = '\0';
|
||
|
}
|
||
|
if (ReadRegistryData(aszOptionsSection, DirectoryValue, NULL, (LPBYTE)achFile,
|
||
|
BYTE_COUNT(achFile)) == NO_ERROR)
|
||
|
{
|
||
|
DWORD FileAttrs = GetFileAttributes(achFile);
|
||
|
|
||
|
if ((FileAttrs != (DWORD)-1) && (FileAttrs & FILE_ATTRIBUTE_DIRECTORY))
|
||
|
{
|
||
|
if (gpInitialDir)
|
||
|
FreeStr(gpInitialDir);
|
||
|
|
||
|
gpInitialDir = AllocStr(achFile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/* Win95 and NT have a Media directory. Use that by default.
|
||
|
*/
|
||
|
if (!gpInitialDir)
|
||
|
{
|
||
|
if (GetDefaultMediaDirectory(achFile, BYTE_COUNT(achFile)))
|
||
|
{
|
||
|
if (gpInitialDir)
|
||
|
FreeStr(gpInitialDir);
|
||
|
|
||
|
gpInitialDir = AllocStr(achFile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*achFile = TEXT('\0');
|
||
|
/* Display the dialog box */
|
||
|
|
||
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
||
|
ofn.hwndOwner = ghwndApp;
|
||
|
ofn.hInstance = ghInst;
|
||
|
ofn.lpstrFilter = gpchFilter; // in init.c
|
||
|
|
||
|
if (wCurDevice == 0)
|
||
|
ofn.nFilterIndex = gwNumDevices+1; // select "All Files"
|
||
|
else
|
||
|
ofn.nFilterIndex = wCurDevice;
|
||
|
|
||
|
ofn.lpstrFile = achFile;
|
||
|
ofn.nMaxFile = sizeof(achFile);
|
||
|
ofn.lpstrInitialDir = gpInitialDir;
|
||
|
ofn.lpstrTitle = achTitle;
|
||
|
ofn.Flags = OFN_HIDEREADONLY |
|
||
|
OFN_FILEMUSTEXIST |
|
||
|
OFN_SHAREAWARE |
|
||
|
OFN_PATHMUSTEXIST;
|
||
|
|
||
|
f = GetOpenFileName(&ofn);
|
||
|
lstrcpy(szFileName, achFile);
|
||
|
|
||
|
if (f) {
|
||
|
|
||
|
LPTSTR pLastBackslash;
|
||
|
|
||
|
//
|
||
|
// get the device selected in the dialog...
|
||
|
//
|
||
|
if (ofn.nFilterIndex == gwNumDevices+1)
|
||
|
wCurDevice = 0; // all files
|
||
|
else
|
||
|
wCurDevice = (UINT)ofn.nFilterIndex;
|
||
|
|
||
|
f = OpenMciDevice(achFile, garMciDevices[wCurDevice].szDevice);
|
||
|
|
||
|
/* Save the directory that the user selected the file in.
|
||
|
* achFile contains the full path of the file, which must include
|
||
|
* at least one backslash.
|
||
|
*/
|
||
|
pLastBackslash = STRRCHR(achFile, TEXT('\\'));
|
||
|
|
||
|
if (pLastBackslash)
|
||
|
{
|
||
|
*(pLastBackslash) = TEXT('\0'); /* Make character following last
|
||
|
backslash null terminator */
|
||
|
if (gpInitialDir)
|
||
|
FreeStr(gpInitialDir);
|
||
|
|
||
|
gpInitialDir = AllocStr(achFile);
|
||
|
|
||
|
if (wCurDevice != 0 && gpInitialDir)
|
||
|
{
|
||
|
/* Save the initial directory for this device:
|
||
|
*/
|
||
|
WriteRegistryData(aszOptionsSection, DirectoryValue, REG_SZ,
|
||
|
(LPBYTE)gpInitialDir, STRING_BYTE_COUNT(gpInitialDir));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return f;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* GetDefaultMediaDirectory
|
||
|
*
|
||
|
* Returns C:\WINNT\Media, or whatever it's called.
|
||
|
*
|
||
|
*/
|
||
|
BOOL GetDefaultMediaDirectory(LPTSTR pDirectory, DWORD cbDirectory)
|
||
|
{
|
||
|
static SZCODE szSetup[] = REGSTR_PATH_SETUP;
|
||
|
static SZCODE szMedia[] = REGSTR_VAL_MEDIA;
|
||
|
HKEY hkeySetup;
|
||
|
LONG Result;
|
||
|
|
||
|
Result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSetup,
|
||
|
REG_OPTION_RESERVED,
|
||
|
KEY_QUERY_VALUE, &hkeySetup);
|
||
|
|
||
|
if (Result == ERROR_SUCCESS)
|
||
|
{
|
||
|
Result = RegQueryValueEx(hkeySetup, szMedia, NULL, REG_NONE,
|
||
|
(LPBYTE)pDirectory, &cbDirectory);
|
||
|
|
||
|
RegCloseKey(hkeySetup);
|
||
|
}
|
||
|
|
||
|
return (Result == ERROR_SUCCESS);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL FAR PASCAL OpenMciDevice(LPCTSTR szFile, LPCTSTR szDevice)
|
||
|
{
|
||
|
HCURSOR hcurPrev; /* handle to the pre-hourglass cursor */
|
||
|
BOOL f;
|
||
|
BOOL fWeWereActive;
|
||
|
UINT wDevice;
|
||
|
|
||
|
if (szDevice == NULL && ((wDevice = IsMCIDevice(szFile)) != 0))
|
||
|
return DoChooseDevice(wDevice);
|
||
|
|
||
|
hcurPrev = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
||
|
|
||
|
/* Avoid the appearance of a half-painted window - update it now */
|
||
|
UpdateWindow(ghwndApp);
|
||
|
|
||
|
fWeWereActive = gfAppActive;
|
||
|
|
||
|
if (gwCurDevice)
|
||
|
WriteOutOptions(); // save current options as default for the old device
|
||
|
// that is being closed before we open the new one.
|
||
|
|
||
|
gwCurDevice = IsMCIDevice(szDevice);
|
||
|
|
||
|
//
|
||
|
// open the device/file
|
||
|
//
|
||
|
f = OpenMCI(szFile, szDevice);
|
||
|
|
||
|
/* Give us activation back so UpdateDisplay can set focus to toolbar */
|
||
|
if (f && fWeWereActive)
|
||
|
SetActiveWindow(ghwndApp);
|
||
|
|
||
|
//
|
||
|
// only get the new options if:
|
||
|
//
|
||
|
// we actually opened the device and we did not get the options
|
||
|
// from a OLE SetData!
|
||
|
//
|
||
|
if (f && (!gfRunWithEmbeddingFlag || gwOptions == 0))
|
||
|
ReadOptions(); // Get the default options for this new device
|
||
|
|
||
|
UpdateDisplay();
|
||
|
|
||
|
SetCursor(hcurPrev);
|
||
|
|
||
|
return f;
|
||
|
}
|
||
|
|
||
|
BOOL FAR PASCAL DoChooseDevice(UINT wID)
|
||
|
{
|
||
|
BOOL f;
|
||
|
TCHAR szFile[256];
|
||
|
UINT wOldDevice;
|
||
|
UINT wOldScale;
|
||
|
|
||
|
//
|
||
|
// is this a valid device id?
|
||
|
//
|
||
|
if (wID < 1 || wID > gwNumDevices)
|
||
|
return FALSE;
|
||
|
|
||
|
wOldDevice = gwCurDevice;
|
||
|
wOldScale = gwCurScale;
|
||
|
|
||
|
//
|
||
|
// if this device does files, bring up the open dialog else just open it!
|
||
|
//
|
||
|
if (garMciDevices[wID].wDeviceType & DTMCI_FILEDEV)
|
||
|
f = OpenDoc(wID, szFile);
|
||
|
else
|
||
|
f = OpenMciDevice(aszNULL, garMciDevices[wID].szDevice);
|
||
|
|
||
|
/* NOTE: This needs to be above the UpdateDisplay() so that if no */
|
||
|
/* device was properly opened everything will be reset properly. */
|
||
|
/* If nothing was opened, reset the current device back to what it was */
|
||
|
/* and uncheck everything in the scale menu. */
|
||
|
/* Yes, but this surely won't work unless we reopen the old device!! */
|
||
|
/* Let's not bother with the previous device. */
|
||
|
if (!f) {
|
||
|
// gwCurDevice = wOldDevice;
|
||
|
// gwCurScale = wOldScale;
|
||
|
InvalidateRect(ghwndMap, NULL, TRUE); // wipe out track area??
|
||
|
}
|
||
|
|
||
|
return f;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// find the device, given a MCI device name.
|
||
|
//
|
||
|
UINT FAR PASCAL IsMCIDevice(LPCTSTR szDevice)
|
||
|
{
|
||
|
UINT w;
|
||
|
|
||
|
if (szDevice == NULL || *szDevice == 0)
|
||
|
return 0;
|
||
|
|
||
|
for (w=1; w<=gwNumDevices; w++)
|
||
|
{
|
||
|
if (lstrcmpi(szDevice, garMciDevices[w].szDevice) == 0 ||
|
||
|
lstrcmpi(szDevice, garMciDevices[w].szDeviceName) == 0)
|
||
|
|
||
|
return w;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
INT_PTR FAR PASCAL FixLinkDialog(LPTSTR szFile, LPTSTR szDevice, int iLen)
|
||
|
{
|
||
|
UINT wDevice;
|
||
|
TCHAR achFile[_MAX_PATH + 1]; /* file or device name buffer */
|
||
|
TCHAR achTitle[80]; /* string holding the title bar name */
|
||
|
HWND hwndFocus;
|
||
|
OPENFILENAME ofn;
|
||
|
INT_PTR f;
|
||
|
|
||
|
static SZCODE aszDialog[] = TEXT("MciOpenDialog"); // in open.c too.
|
||
|
|
||
|
//
|
||
|
// I GIVE UP!!! Put up an open dlg box and let them find it themselves!
|
||
|
//
|
||
|
|
||
|
/* Ensure the device menu's built:
|
||
|
*/
|
||
|
InitDeviceMenu();
|
||
|
WaitForDeviceMenu();
|
||
|
|
||
|
// find out the device number for the specifed device
|
||
|
wDevice = IsMCIDevice(szDevice);
|
||
|
|
||
|
LOADSTRING(IDS_FINDFILE, achFile);
|
||
|
wsprintf(achTitle, achFile, gachClassRoot, FileName(szFile)); // title bar for locate dlg
|
||
|
|
||
|
/* Start with the bogus file name */
|
||
|
if (szFile)
|
||
|
{
|
||
|
LPTSTR szFileName = FileName(szFile);
|
||
|
if (szFileName)
|
||
|
lstrcpy(achFile, szFileName);
|
||
|
}
|
||
|
|
||
|
/* Set up the ofn struct */
|
||
|
ofn.lStructSize = sizeof(OPENFILENAME);
|
||
|
|
||
|
/* MUST use ActiveWindow to make user deal with us NOW in case of multiple*/
|
||
|
/* broken links */
|
||
|
ofn.hwndOwner = GetActiveWindow();
|
||
|
|
||
|
ofn.hInstance = ghInst;
|
||
|
ofn.lpstrFilter = gpchFilter;
|
||
|
ofn.lpstrCustomFilter = NULL;
|
||
|
ofn.nMaxCustFilter = 0;
|
||
|
|
||
|
if (wDevice == 0)
|
||
|
ofn.nFilterIndex = gwNumDevices+1; // select "All Files"
|
||
|
else
|
||
|
ofn.nFilterIndex = wDevice;
|
||
|
|
||
|
ofn.lpstrFile = achFile;
|
||
|
ofn.nMaxFile = CHAR_COUNT(achFile);
|
||
|
ofn.lpstrFileTitle = NULL;
|
||
|
ofn.nMaxFileTitle = 0;
|
||
|
ofn.lpstrInitialDir = NULL;
|
||
|
ofn.lpstrTitle = achTitle;
|
||
|
|
||
|
ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST |
|
||
|
OFN_SHAREAWARE | OFN_PATHMUSTEXIST;
|
||
|
|
||
|
ofn.nFileOffset = 0;
|
||
|
ofn.nFileExtension = 0;
|
||
|
ofn.lpstrDefExt = NULL;
|
||
|
ofn.lCustData = 0;
|
||
|
ofn.lpfnHook = NULL;
|
||
|
ofn.lpTemplateName = NULL;
|
||
|
|
||
|
// Show the cursor in case PowerPig is hiding it
|
||
|
ShowCursor(TRUE);
|
||
|
|
||
|
hwndFocus = GetFocus();
|
||
|
|
||
|
/* Let the user pick a filename */
|
||
|
f = GetOpenFileName(&ofn);
|
||
|
if (f) {
|
||
|
lstrcpyn(szFile, achFile, iLen);
|
||
|
gfDirty = TRUE; // make sure the object is dirty now
|
||
|
}
|
||
|
|
||
|
SetFocus(hwndFocus);
|
||
|
|
||
|
// Put cursor back how it used to be
|
||
|
ShowCursor(FALSE);
|
||
|
|
||
|
return f;
|
||
|
}
|
||
|
|
||
|
|