Pierre Mageau

Murali Pattathe
Francois Boisvert
Francis Baudet
Henning Hoffmann
Many fixes.
This commit is contained in:
Alexandre Julliard 1999-12-04 04:03:01 +00:00
parent bbe263b68b
commit 2bab80dea4
2 changed files with 195 additions and 73 deletions

View File

@ -247,8 +247,7 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType)
fodInfos->ofnInfos.lpstrCustomFilter = (LPSTR)x;
}
fodInfos->ofnInfos.nMaxCustFilter = ofn->nMaxCustFilter;
if(ofn->nFilterIndex)
fodInfos->ofnInfos.nFilterIndex = --ofn->nFilterIndex;
fodInfos->ofnInfos.nFilterIndex = ofn->nFilterIndex;
if (ofn->nMaxFile)
{
fodInfos->ofnInfos.lpstrFile = (LPSTR)MemAlloc(ofn->nMaxFile);
@ -323,7 +322,7 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType)
Transfer the combo index in the OPENFILENAME structure;
No support for custom filters, so nFilterIndex must be one-based.
*/
ofn->nFilterIndex = fodInfos->ofnInfos.nFilterIndex + 1;
ofn->nFilterIndex = fodInfos->ofnInfos.nFilterIndex;
if (fodInfos->ofnInfos.lpstrFilter)
MemFree((LPVOID)(fodInfos->ofnInfos.lpstrFilter));
@ -339,10 +338,16 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType)
MemFree((LPVOID)(fodInfos->ofnInfos.lpstrCustomFilter));
if (fodInfos->ofnInfos.lpstrFile)
{
{
/*
* We have to clear the buffer before we copy the filename since we don't
* support selecting multiple files. We have to make sure that the caller won't
* attempt to read past the first filename.
*/
memset(ofn->lpstrFile, '\0', ofn->nMaxFile);
strcpy(ofn->lpstrFile,fodInfos->ofnInfos.lpstrFile);
MemFree((LPVOID)fodInfos->ofnInfos.lpstrFile);
}
}
if (fodInfos->ofnInfos.lpstrFileTitle)
{
if (ofn->lpstrFileTitle)
@ -482,7 +487,7 @@ BOOL WINAPI GetFileDialog95W(LPOPENFILENAMEW ofn,UINT iDlgType)
Transfer the combo index in the OPENFILENAME structure;
No support for custom filters, so nFilterIndex must be one-based.
*/
ofn->nFilterIndex = fodInfos->ofnInfos.nFilterIndex + 1;
ofn->nFilterIndex = fodInfos->ofnInfos.nFilterIndex;
if (fodInfos->ofnInfos.lpstrFilter)
MemFree((LPVOID)(fodInfos->ofnInfos.lpstrFilter));
@ -497,9 +502,16 @@ BOOL WINAPI GetFileDialog95W(LPOPENFILENAMEW ofn,UINT iDlgType)
if (fodInfos->ofnInfos.lpstrCustomFilter)
MemFree((LPVOID)(fodInfos->ofnInfos.lpstrCustomFilter));
if (fodInfos->ofnInfos.lpstrFile) {
lstrcpyAtoW(ofn->lpstrFile,(fodInfos->ofnInfos.lpstrFile));
MemFree((LPVOID)(fodInfos->ofnInfos.lpstrFile));
if (fodInfos->ofnInfos.lpstrFile)
{
/*
* We have to clear the buffer before we copy the filename since we don't
* support selecting multiple files. We have to make sure that the caller won't
* attempt to read past the first filename.
*/
memset(ofn->lpstrFile, '\0', ofn->nMaxFile * sizeof(WCHAR) );
lstrcpyAtoW(ofn->lpstrFile,(fodInfos->ofnInfos.lpstrFile));
MemFree((LPVOID)(fodInfos->ofnInfos.lpstrFile));
}
if (fodInfos->ofnInfos.lpstrFileTitle) {
@ -519,7 +531,6 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
HWND hwndChild,hwndStc32;
RECT rectParent, rectChild, rectCtrl, rectStc32, rectTemp;
POINT ptMoveCtl;
HDWP handle;
POINT ptParentClient;
ptMoveCtl.x = ptMoveCtl.y = 0;
@ -574,7 +585,6 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
(rectParent.bottom-rectParent.top),SWP_NOMOVE | SWP_NOZORDER);
hwndChild = GetWindow(hwndChildDlg,GW_CHILD);
handle = BeginDeferWindowPos( 1 );
if(hwndStc32)
{
GetWindowRect(hwndStc32,&rectStc32);
@ -583,7 +593,7 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
else
SetRect(&rectStc32,0,0,0,0);
if (hwndChild && handle)
if (hwndChild )
{
do
{
@ -608,16 +618,13 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
else if (rectCtrl.top > rectTemp.bottom)
rectCtrl.top += ptMoveCtl.y;
handle = DeferWindowPos(handle, hwndChild, 0, rectCtrl.left, rectCtrl.top,
SetWindowPos( hwndChild, 0, rectCtrl.left, rectCtrl.top,
rectCtrl.right-rectCtrl.left,rectCtrl.bottom-rectCtrl.top,
SWP_NOSIZE | SWP_NOZORDER );
}
}
while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != (HWND)NULL && handle);
while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != (HWND)NULL);
}
if(handle)
EndDeferWindowPos( handle );
handle = BeginDeferWindowPos( 1 );
hwndChild = GetWindow(hwndParentDlg,GW_CHILD);
if(hwndStc32)
@ -626,7 +633,7 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
MapWindowPoints( 0, hwndChildDlg,(LPPOINT)&rectStc32,2);
ptMoveCtl.x = rectStc32.left - 0;
ptMoveCtl.y = rectStc32.top - 0;
if (hwndChild && handle)
if (hwndChild )
{
do
{
@ -641,15 +648,13 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
rectCtrl.left += ptMoveCtl.x;
rectCtrl.top += ptMoveCtl.y;
handle = DeferWindowPos( handle, hwndChild, 0, rectCtrl.left, rectCtrl.top,
SetWindowPos( hwndChild, 0, rectCtrl.left, rectCtrl.top,
rectCtrl.right-rectCtrl.left,rectCtrl.bottom-rectCtrl.top,
SWP_NOSIZE |SWP_NOZORDER );
}
}
while ((hwndChild=GetWindow( hwndChild, GW_HWNDNEXT )) != (HWND)NULL);
}
if(handle)
EndDeferWindowPos( handle );
}
}
@ -657,23 +662,21 @@ void ArrangeCtrlPositions( HWND hwndChildDlg, HWND hwndParentDlg)
HRESULT WINAPI FileOpenDlgProcUserTemplate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static WNDPROC procUserHook=NULL;
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(GetParent(hwnd),FileOpenDlgInfosStr);
switch(uMsg)
{
case WM_INITDIALOG:
{
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *)lParam;
procUserHook=NULL;
fodInfos = (FileOpenDlgInfos *)lParam;
lParam = (LPARAM) &fodInfos->ofnInfos;
ArrangeCtrlPositions(hwnd,GetParent(hwnd));
if(fodInfos->ofnInfos.Flags & OFN_ENABLEHOOK)
procUserHook = (WNDPROC) fodInfos->ofnInfos.lpfnHook;
if(procUserHook)
return CallWindowProcA(procUserHook,hwnd,uMsg,wParam,lParam);
if(fodInfos && (fodInfos->ofnInfos.Flags & OFN_ENABLEHOOK) && fodInfos->ofnInfos.lpfnHook)
return CallWindowProcA((WNDPROC)fodInfos->ofnInfos.lpfnHook,hwnd,uMsg,wParam,lParam);
return 0;
} }
if(procUserHook)
return CallWindowProcA(procUserHook,hwnd,uMsg,wParam,lParam);
}
}
if(fodInfos && (fodInfos->ofnInfos.Flags & OFN_ENABLEHOOK) && fodInfos->ofnInfos.lpfnHook )
return CallWindowProcA((WNDPROC)fodInfos->ofnInfos.lpfnHook,hwnd,uMsg,wParam,lParam);
return DefWindowProcA(hwnd,uMsg,wParam,lParam);
}
@ -735,7 +738,7 @@ HWND CreateTemplateDialog(FileOpenDlgInfos *fodInfos,HWND hwnd)
}
return (HWND)NULL;
}
/***********************************************************************
* SendCustomDlgNotificationMessage
*
@ -831,14 +834,13 @@ HRESULT WINAPI FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa
switch(uMsg)
{
case WM_INITDIALOG :
/* Adds the FileOpenDlgInfos in the property list of the dialog
so it will be easily accessible through a GetPropA(...) */
SetPropA(hwnd, FileOpenDlgInfosStr, (HANDLE) lParam);
FILEDLG95_OnWMInitDialog(hwnd, wParam, lParam);
((FileOpenDlgInfos *)lParam)->DlgInfos.hwndCustomDlg =
CreateTemplateDialog((FileOpenDlgInfos *)lParam,hwnd);
FILEDLG95_OnWMInitDialog(hwnd, wParam, lParam);
SendCustomDlgNotificationMessage(hwnd,CDN_INITDONE);
return 0;
case WM_COMMAND:
@ -951,7 +953,6 @@ static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
/* Filetype combo box */
case IDC_FILETYPE:
FILEDLG95_FILETYPE_OnCommand(hwnd,wNotifyCode);
SendCustomDlgNotificationMessage(hwnd,CDN_TYPECHANGE);
break;
/* LookIn combo box */
case IDC_LOOKIN:
@ -1131,6 +1132,8 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
/* Get the index of the selected item in the filetype combo box */
fodInfos->ofnInfos.nFilterIndex = (DWORD) CBGetCurSel(fodInfos->DlgInfos.hwndFileTypeCB);
/* nFilterIndex is 1 based while combo GetCurSel return zero based index */
fodInfos->ofnInfos.nFilterIndex++;
/* Get the current directory name */
COMDLG32_SHGetPathFromIDListA(fodInfos->ShellInfos.pidlAbsCurrent,
@ -1254,9 +1257,60 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
}
/* browse if the user specified a directory */
if((browsePidl = GetPidlFromName(fodInfos->Shell.FOIShellFolder,
lpstrFileSpec)))
{
browsePidl = GetPidlFromName(fodInfos->Shell.FOIShellFolder,
lpstrFileSpec);
if (!browsePidl) /* not a directory check the specified file exists */
{
int iExt;
char lpstrFileSpecTemp[MAX_PATH] = "";
LPSTR lpstrExt;
LPSTR lpOrg;
LPSTR lpBuf;
iExt = CBGetCurSel(fodInfos->DlgInfos.hwndFileTypeCB);
lpOrg = (LPSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB, iExt);
lpstrExt = lpOrg;
/*
add user specified extentions to the file one by one and
check if the file exists
*/
while(lpOrg)
{
int i;
if ((lpstrExt = strchr(lpOrg, ';')))
{
i = lpstrExt - lpOrg;
}
else
i = strlen(lpOrg);
lpBuf = MemAlloc(i+1);
strncpy(lpBuf, lpOrg, i);
lpBuf[i] = 0;
strcpy(lpstrFileSpecTemp, lpstrFileSpec);
if (lpstrFileSpecTemp[strlen(lpstrFileSpecTemp)-1] == '.')
{
if (strchr(lpBuf, '.'))
strcat(lpstrFileSpecTemp, (strchr(lpBuf, '.')) + 1);
}
else
strcat(lpstrFileSpecTemp, strchr(lpBuf, '.'));
browsePidl = GetPidlFromName(fodInfos->Shell.FOIShellFolder,
lpstrFileSpecTemp);
MemFree((void *)lpBuf);
if (browsePidl)
{
strcpy(lpstrFileSpec,lpstrFileSpecTemp);
break;
}
if (lpstrExt)
lpOrg = lpstrExt+1;
else
lpOrg = NULL;
}
}
if (browsePidl)
{
ULONG ulAttr = SFGAO_FOLDER | SFGAO_HASSUBFOLDER;
int nMsgBoxRet;
char lpstrFileExist[MAX_PATH + 50];
@ -1266,22 +1320,9 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
&browsePidl,
&ulAttr);
/* The file does exist, so ask the user if we should overwrite it */
if(fodInfos->ofnInfos.Flags & OFN_OVERWRITEPROMPT)
/* Browse to directory if it is a folder */
if (ulAttr & SFGAO_FOLDER)
{
strcpy(lpstrFileExist, lpstrFileSpec);
strcat(lpstrFileExist, " already exists.\nDo you want to replace it?");
nMsgBoxRet = MessageBoxA(hwnd,
lpstrFileExist,
fodInfos->ofnInfos.lpstrTitle,
MB_YESNO | MB_ICONEXCLAMATION);
if(nMsgBoxRet == IDNO) return FALSE;
}
/* Browse to directory */
if(ulAttr)
{
if(FAILED(IShellBrowser_BrowseObject(fodInfos->Shell.FOIShellBrowser,
browsePidl,
SBSP_RELATIVE)))
@ -1299,6 +1340,24 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
COMDLG32_SHFree(browsePidl);
return FALSE;
}
/* The file does exist, so ask the user if we should overwrite it */
if((fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) &&
(fodInfos->ofnInfos.Flags & OFN_OVERWRITEPROMPT))
{
strcpy(lpstrFileExist, lpstrFileSpec);
strcat(lpstrFileExist, " already exists.\nDo you want to replace it?");
nMsgBoxRet = MessageBoxA(hwnd,
lpstrFileExist,
fodInfos->ofnInfos.lpstrTitle,
MB_YESNO | MB_ICONEXCLAMATION);
if (nMsgBoxRet == IDNO)
{
COMDLG32_SHFree(browsePidl);
return FALSE;
}
}
COMDLG32_SHFree(browsePidl);
}
else
@ -1518,24 +1577,69 @@ static BOOL FILEDLG95_SHELL_UpFolder(HWND hwnd)
*/
static BOOL FILEDLG95_SHELL_NewFolder(HWND hwnd)
{
char lpstrDirName[MAX_PATH] = "New folder";
BOOL bRes;
char lpstrDirName[MAX_PATH] = "New Folder";
char lpstrNewDir[MAX_PATH];
BOOL bRes = FALSE;
HANDLE hHandle;
WIN32_FIND_DATAA FindData;
FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(hwnd,FileOpenDlgInfosStr);
TRACE("\n");
if((bRes = CreateDirectoryA(lpstrDirName,NULL)))
/* Create the absolute path for "New Folder" */
COMDLG32_SHGetPathFromIDListA(fodInfos->ShellInfos.pidlAbsCurrent, lpstrNewDir);
COMDLG32_PathAddBackslashA(lpstrNewDir);
strcat(lpstrNewDir, lpstrDirName);
/* Find a Unique directory name */
hHandle = FindFirstFileA(lpstrNewDir,&FindData);
if(hHandle !=INVALID_HANDLE_VALUE)
{
LPITEMIDLIST pidl = GetPidlFromName(fodInfos->Shell.FOIShellFolder,lpstrDirName);
IShellView_Refresh(fodInfos->Shell.FOIShellView);
IShellView_SelectItem(fodInfos->Shell.FOIShellView,
pidl,
(SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE
|SVSI_FOCUSED|SVSI_SELECT));
int i;
char lpstrDupNewDir[MAX_PATH];
char lpstrDirNameExt[8];
strcpy(lpstrDupNewDir, lpstrNewDir);
for(i=0; i < 256 && hHandle != INVALID_HANDLE_VALUE; i++)
{
FindClose(hHandle);
sprintf(lpstrNewDir,"%s (%d)", lpstrDupNewDir, i+1);
hHandle = FindFirstFileA(lpstrNewDir,&FindData);
}
sprintf(lpstrDirNameExt," (%d)", i);
strcat(lpstrDirName, lpstrDirNameExt);
}
/* Is Unique Found */
if(hHandle == INVALID_HANDLE_VALUE)
{
bRes = CreateDirectoryA(lpstrNewDir,NULL);
if(bRes)
{
LPITEMIDLIST pidl;
/* Refresh the list (this will update the pidl, to include the new directory) */
/* Might want to only update the list (so the directory appears at the end */
IShellView_Refresh(fodInfos->Shell.FOIShellView);
pidl = GetPidlFromName(fodInfos->Shell.FOIShellFolder,lpstrDirName);
IShellView_SelectItem(fodInfos->Shell.FOIShellView,
pidl,(SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE
|SVSI_FOCUSED|SVSI_SELECT));
COMDLG32_SHFree(pidl);
}
else
{
char lpstrText[128+MAX_PATH];
char lpstrTempText[128];
char lpstrCaption[32];
/* Cannot Create folder because of permissions */
LoadStringA(COMMDLG_hInstance32, IDS_CREATEFOLDER_DENIED, lpstrTempText, 256);
LoadStringA(COMMDLG_hInstance32, IDS_FILEOPEN_CAPTION, lpstrCaption, 256);
sprintf(lpstrText,lpstrTempText, lpstrDirName);
MessageBoxA(hwnd,lpstrText, lpstrCaption, MB_OK | MB_ICONEXCLAMATION);
}
}
return bRes;
}
@ -1577,11 +1681,13 @@ static HRESULT FILEDLG95_FILETYPE_Init(HWND hwnd)
for(;;)
{
/* filter is a list... title\0ext\0......\0\0 */
/* Set the combo item text to the title and the item data
to the ext */
/* filter is a list... title\0ext\0......\0\0
* Set the combo item text to the title and the item data
* to the ext
*/
char *lpstrExt = NULL;
LPSTR lpstrExtTmp = NULL;
/* Get the title */
lpstrTmp = (&((LPBYTE)fodInfos->ofnInfos.lpstrFilter)[iStrIndex]);
if(!strlen(lpstrTmp))
@ -1604,13 +1710,26 @@ static HRESULT FILEDLG95_FILETYPE_Init(HWND hwnd)
CBAddString(fodInfos->DlgInfos.hwndFileTypeCB,lpstrTmp);
CBSetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB,iPos++,lpstrExt);
}
/* Set the current filter to the one specified
in the initialisation structure */
CBSetCurSel(fodInfos->DlgInfos.hwndFileTypeCB,
fodInfos->ofnInfos.nFilterIndex);
/* Set the current filter to the one specified
* in the initialisation structure
*/
/* set default filter index */
if(fodInfos->ofnInfos.nFilterIndex == 0 && fodInfos->ofnInfos.lpstrCustomFilter == NULL)
fodInfos->ofnInfos.nFilterIndex = 1;
/* First, check to make sure our index isn't out of bounds. */
if ( fodInfos->ofnInfos.nFilterIndex > iPos )
fodInfos->ofnInfos.nFilterIndex = iPos;
/* Get the current index selection. */
CBSetCurSel(fodInfos->DlgInfos.hwndFileTypeCB,
fodInfos->ofnInfos.nFilterIndex-1);
/* Get the corresponding text string from the combo box. */
lpstrFilter = (LPSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB,
fodInfos->ofnInfos.nFilterIndex-1);
lpstrFilter = (LPSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB,
fodInfos->ofnInfos.nFilterIndex);
if(lpstrFilter)
{
fodInfos->ShellInfos.lpstrCurrentFilter = MemAlloc((strlen(lpstrFilter)+1)*2);
@ -1645,10 +1764,11 @@ static BOOL FILEDLG95_FILETYPE_OnCommand(HWND hwnd, WORD wNotifyCode)
lpstrFilter = (LPSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB,
iItem);
if(lpstrFilter)
if((int)lpstrFilter != CB_ERR)
{
fodInfos->ShellInfos.lpstrCurrentFilter = MemAlloc((strlen(lpstrFilter)+1)*2);
lstrcpyAtoW(fodInfos->ShellInfos.lpstrCurrentFilter,(LPSTR)strlwr((LPSTR)lpstrFilter));
SendCustomDlgNotificationMessage(hwnd,CDN_TYPECHANGE);
}
/* Refresh the actual view to display the included items*/

View File

@ -85,6 +85,8 @@ typedef struct
#define IDS_FILENOTFOUND 114
#define IDS_VERIFYFILE 115
#define IDS_CREATEFILE 116
#define IDS_CREATEFOLDER_DENIED 117
#define IDS_FILEOPEN_CAPTION 118
#define IDC_OPENREADONLY chx1