#define _WIN32_WINNT 0x0600
#define WIN32_NO_STATUS
-#define _INC_WINDOWS
-#define COM_NO_WINDOWS_H
#include <config.h>
//#include "wine/port.h"
#define NONAMELESSSTRUCT
#include <windef.h>
-//#include "winbase.h"
+#include <winbase.h>
#include <winternl.h>
//#include "winnls.h"
-#include <wingdi.h>
#include <winreg.h>
+#include <wingdi.h>
#include <winuser.h>
#include <commdlg.h>
-//#include "dlgs.h"
+#include <dlgs.h>
#include "cdlg.h"
-#include "filedlg31.h"
#include <cderr.h>
//#include "shellapi.h"
//#include "shlobj.h"
*/
/* Draw item constant */
-#define ICONWIDTH 18
#define XTEXTOFFSET 3
/* AddItem flags*/
{
LRESULT lRes;
- LPVOID template;
+ LPCVOID origTemplate;
+ DWORD dwSize;
+ LPDLGTEMPLATEW template;
HRSRC hRes;
HANDLE hDlgTmpl = 0;
HRESULT hr;
- DWORD dwSize;
- LPDLGTEMPLATE hDialogTemplate;
/* test for missing functionality */
if (fodInfos->ofnInfos->Flags & UNIMPLEMENTED_FLAGS)
COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
return FALSE;
}
- if (!(hDlgTmpl = LoadResource(COMDLG32_hInstance, hRes )) ||
- !(dwSize = SizeofResource(COMDLG32_hInstance, hRes )) ||
- !(hDialogTemplate = malloc(dwSize)) ||
- !(template = LockResource( hDlgTmpl )))
+ if (!(dwSize = SizeofResource(COMDLG32_hInstance, hRes)) ||
+ !(hDlgTmpl = LoadResource(COMDLG32_hInstance, hRes)) ||
+ !(origTemplate = LockResource(hDlgTmpl)))
{
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
return FALSE;
}
-
- /* Copy the read only resource */
- memcpy(hDialogTemplate, template, dwSize);
+ if (!(template = HeapAlloc(GetProcessHeap(), 0, dwSize)))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
+ return FALSE;
+ }
+ memcpy(template, origTemplate, dwSize);
/* msdn: explorer style dialogs permit sizing by default.
* The OFN_ENABLESIZING flag is only needed when a hook or
if (fodInfos->ofnInfos->Flags & OFN_ENABLESIZING)
{
- hDialogTemplate->style |= WS_SIZEBOX;
+ template->style |= WS_SIZEBOX;
fodInfos->sizedlg.cx = fodInfos->sizedlg.cy = 0;
fodInfos->initial_size.x = fodInfos->initial_size.y = 0;
}
else
- hDialogTemplate->style &= ~WS_SIZEBOX;
+ template->style &= ~WS_SIZEBOX;
/* old style hook messages */
if (fodInfos->unicode)
lRes = DialogBoxIndirectParamW(COMDLG32_hInstance,
- hDialogTemplate,
+ template,
fodInfos->ofnInfos->hwndOwner,
FileOpenDlgProc95,
(LPARAM) fodInfos);
else
lRes = DialogBoxIndirectParamA(COMDLG32_hInstance,
- hDialogTemplate,
+ template,
fodInfos->ofnInfos->hwndOwner,
FileOpenDlgProc95,
(LPARAM) fodInfos);
- if (SUCCEEDED(hr))
+ if (SUCCEEDED(hr))
OleUninitialize();
- free(hDialogTemplate);
+ HeapFree(GetProcessHeap(), 0, template);
/* Unable to create the dialog */
if( lRes == -1)
LPWSTR defext = NULL;
LPWSTR filter = NULL;
LPWSTR customfilter = NULL;
+ INITCOMMONCONTROLSEX icc;
+
+ /* Initialize ComboBoxEx32 */
+ icc.dwSize = sizeof(icc);
+ icc.dwICC = ICC_USEREX_CLASSES;
+ InitCommonControlsEx(&icc);
/* Initialize CommDlgExtendedError() */
COMDLG32_SetCommDlgExtendedError(0);
BOOL ret;
FileOpenDlgInfos fodInfos;
LPWSTR lpstrSavDir = NULL;
+ INITCOMMONCONTROLSEX icc;
+
+ /* Initialize ComboBoxEx32 */
+ icc.dwSize = sizeof(icc);
+ icc.dwICC = ICC_USEREX_CLASSES;
+ InitCommonControlsEx(&icc);
/* Initialize CommDlgExtendedError() */
COMDLG32_SetCommDlgExtendedError(0);
* move to bottom */
switch( ctrlid)
{
- /* file name box and file types combo change also width */
+ /* file name (edit or comboboxex) and file types combo change also width */
case edt1:
+ case cmb13:
case cmb1:
DeferWindowPos( hdwp, ctrl, NULL, rc.left, rc.top + chgy,
rc.right - rc.left + chgx, rc.bottom - rc.top,
}
}
+static inline BOOL filename_is_edit( const FileOpenDlgInfos *info )
+{
+ return (info->ofnInfos->lStructSize == OPENFILENAME_SIZE_VERSION_400W) &&
+ (info->ofnInfos->Flags & (OFN_ENABLEHOOK | OFN_ENABLETEMPLATE | OFN_ENABLETEMPLATEHANDLE));
+}
+
/***********************************************************************
* FILEDLG95_InitControls
*
}
TRACE("Running on 2000+ %d, 98+ %d\n", win2000plus, win98plus);
+
+ /* Use either the edit or the comboboxex for the filename control */
+ if (filename_is_edit( fodInfos ))
+ {
+ DestroyWindow( GetDlgItem( hwnd, cmb13 ) );
+ fodInfos->DlgInfos.hwndFileName = GetDlgItem( hwnd, edt1 );
+ }
+ else
+ {
+ DestroyWindow( GetDlgItem( hwnd, edt1 ) );
+ fodInfos->DlgInfos.hwndFileName = GetDlgItem( hwnd, cmb13 );
+ }
+
/* Get the hwnd of the controls */
- fodInfos->DlgInfos.hwndFileName = GetDlgItem(hwnd,IDC_FILENAME);
fodInfos->DlgInfos.hwndFileTypeCB = GetDlgItem(hwnd,IDC_FILETYPE);
fodInfos->DlgInfos.hwndLookInCB = GetDlgItem(hwnd,IDC_LOOKIN);
TRACE("Value in Filename includes path, overriding InitialDir: %s, %s\n",
debugstr_w(fodInfos->filename), debugstr_w(fodInfos->initdir));
}
- SetDlgItemTextW(hwnd, IDC_FILENAME, fodInfos->filename);
+ SetWindowTextW( fodInfos->DlgInfos.hwndFileName, fodInfos->filename );
} else {
- SetDlgItemTextW(hwnd, IDC_FILENAME, fodInfos->filename);
+ SetWindowTextW( fodInfos->DlgInfos.hwndFileName, fodInfos->filename );
}
}
TRACE("Value in Filename includes path, overriding initdir: %s, %s\n",
debugstr_w(fodInfos->filename), debugstr_w(fodInfos->initdir));
}
- SetDlgItemTextW(hwnd, IDC_FILENAME, fodInfos->filename);
+ SetWindowTextW( fodInfos->DlgInfos.hwndFileName, fodInfos->filename );
}
/* 4. Win2000+: Recently used */
TRACE("No initial dir specified, using current dir of %s\n", debugstr_w(fodInfos->initdir));
}
}
- SetFocus(GetDlgItem(hwnd, IDC_FILENAME));
+ SetFocus( fodInfos->DlgInfos.hwndFileName );
TRACE("After manipulation, file = %s, dir = %s\n", debugstr_w(fodInfos->filename), debugstr_w(fodInfos->initdir));
/* Must the open as read only check box be checked ?*/
flags |= SWP_NOSIZE;
SetRectEmpty(&rc);
}
- SetWindowPos(fodInfos->DlgInfos.hwndCustomDlg, HWND_BOTTOM,
- 0, 0, rc.right, rc.bottom, flags);
+ SetWindowPos(fodInfos->DlgInfos.hwndCustomDlg, HWND_BOTTOM,
+ 0, 0, rc.right, rc.bottom, flags);
}
else
{
FILEDLG95_SHELL_BrowseToDesktop(hwnd);
break;
- case IDC_FILENAME:
+ case edt1:
+ case cmb13:
break;
}
IShellView_Refresh(fodInfos->Shell.FOIShellView);
}
COMDLG32_SHFree(pidlCurrent);
- SendMessageW(fodInfos->DlgInfos.hwndFileName, EM_SETSEL, 0, -1);
+ if (filename_is_edit( fodInfos ))
+ SendMessageW(fodInfos->DlgInfos.hwndFileName, EM_SETSEL, 0, -1);
}
}
ret = FALSE;
/* Attach the file extension with file name*/
ext = PathFindExtensionW(lpstrPathAndFile);
- if (! *ext)
+ if (! *ext && fodInfos->defext)
{
/* if no extension is specified with file name, then */
/* attach the extension from file filter or default one */
- const WCHAR *filterExt = NULL;
+ WCHAR *filterExt = NULL;
LPWSTR lpstrFilter = NULL;
static const WCHAR szwDot[] = {'.',0};
int PathLength = lstrlenW(lpstrPathAndFile);
fodInfos->ofnInfos->nFilterIndex-1);
if (lpstrFilter != (LPWSTR)CB_ERR) /* control is not empty */
- filterExt = PathFindExtensionW(lpstrFilter);
+ {
+ WCHAR* filterSearchIndex;
+ filterExt = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(lpstrFilter) + 1) * sizeof(WCHAR));
+ strcpyW(filterExt, lpstrFilter);
+
+ /* if a semicolon-separated list of file extensions was given, do not include the
+ semicolon or anything after it in the extension.
+ example: if filterExt was "*.abc;*.def", it will become "*.abc" */
+ filterSearchIndex = strchrW(filterExt, ';');
+ if (filterSearchIndex)
+ {
+ filterSearchIndex[0] = '\0';
+ }
+
+ /* strip the * or anything else from the extension, "*.abc" becomes "abc" */
+ /* if the extension is invalid or contains a glob, ignore it */
+ filterSearchIndex = PathFindExtensionW(filterExt);
+ if (*filterSearchIndex++ && !strchrW(filterSearchIndex, '*') && !strchrW(filterSearchIndex, '?'))
+ {
+ strcpyW(filterExt, filterSearchIndex);
+ }
+ else
+ {
+ HeapFree(GetProcessHeap(), 0, filterExt);
+ filterExt = NULL;
+ }
+ }
- if ( filterExt && *filterExt ) /* attach the file extension from file type filter*/
- filterExt = filterExt + 1;
- else if ( fodInfos->defext ) /* attach the default file extension*/
- filterExt = fodInfos->defext;
+ if (!filterExt)
+ {
+ /* use the default file extension */
+ filterExt = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(fodInfos->defext) + 1) * sizeof(WCHAR));
+ strcpyW(filterExt, fodInfos->defext);
+ }
- /* If extension contains a glob, ignore it */
- if ( filterExt && !strchrW(filterExt, '*') && !strchrW(filterExt, '?') )
+ if (*filterExt) /* ignore filterExt="" */
{
/* Attach the dot*/
lstrcatW(lpstrPathAndFile, szwDot);
/* Attach the extension */
- lstrcatW(lpstrPathAndFile, filterExt );
+ lstrcatW(lpstrPathAndFile, filterExt);
}
+ HeapFree(GetProcessHeap(), 0, filterExt);
+
/* In Open dialog: if file does not exist try without extension */
if (!(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) && !PathFileExistsW(lpstrPathAndFile))
lpstrPathAndFile[PathLength] = '\0';
- }
- if (fodInfos->defext) /* add default extension */
- {
- /* Set/clear the output OFN_EXTENSIONDIFFERENT flag */
- if (*ext)
- ext++;
- if (!lstrcmpiW(fodInfos->defext, ext))
- fodInfos->ofnInfos->Flags &= ~OFN_EXTENSIONDIFFERENT;
- else
- fodInfos->ofnInfos->Flags |= OFN_EXTENSIONDIFFERENT;
+ /* Set/clear the output OFN_EXTENSIONDIFFERENT flag */
+ if (*ext)
+ ext++;
+ if (!lstrcmpiW(fodInfos->defext, ext))
+ fodInfos->ofnInfos->Flags &= ~OFN_EXTENSIONDIFFERENT;
+ else
+ fodInfos->ofnInfos->Flags |= OFN_EXTENSIONDIFFERENT;
}
/* In Save dialog: check if the file already exists */
}
else
{
- LPSTR lpszTemp;
- LPOPENFILENAMEA ofn = (LPOPENFILENAMEA)fodInfos->ofnInfos;
+ LPSTR lpszTemp;
+ CHAR tempFileA[MAX_PATH];
+
+ /* avoid using fodInfos->ofnInfos->lpstrFile since it can be NULL */
+ WideCharToMultiByte(CP_ACP, 0, lpstrPathAndFile, -1,
+ tempFileA, sizeof(tempFileA), NULL, NULL);
/* set filename offset */
- lpszTemp = PathFindFileNameA(ofn->lpstrFile);
- fodInfos->ofnInfos->nFileOffset = (lpszTemp - ofn->lpstrFile);
+ lpszTemp = PathFindFileNameA(tempFileA);
+ fodInfos->ofnInfos->nFileOffset = (lpszTemp - tempFileA);
/* set extension offset */
- lpszTemp = PathFindExtensionA(ofn->lpstrFile);
- fodInfos->ofnInfos->nFileExtension = (*lpszTemp) ? (lpszTemp - ofn->lpstrFile) + 1 : 0;
+ lpszTemp = PathFindExtensionA(tempFileA);
+ fodInfos->ofnInfos->nFileExtension = (*lpszTemp) ? (lpszTemp - tempFileA) + 1 : 0;
}
/* set the lpstrFileTitle */
if (fodInfos->ofnInfos->Flags & OFN_ALLOWMULTISELECT)
size += 1;
/* return needed size in first two bytes of lpstrFile */
- *(WORD *)fodInfos->ofnInfos->lpstrFile = size;
+ if(fodInfos->ofnInfos->lpstrFile)
+ *(WORD *)fodInfos->ofnInfos->lpstrFile = size;
FILEDLG95_Clean(hwnd);
ret = EndDialog(hwnd, FALSE);
COMDLG32_SetCommDlgExtendedError(FNERR_BUFFERTOOSMALL);
IShellFolder *psfRoot, *psfDrives;
IEnumIDList *lpeRoot, *lpeDrives;
LPITEMIDLIST pidlDrives, pidlTmp, pidlTmp1, pidlAbsTmp;
-
+ HDC hdc;
+ TEXTMETRICW tm;
LookInInfos *liInfos = MemAlloc(sizeof(LookInInfos));
TRACE("\n");
SetPropA(hwndCombo, LookInInfosStr, liInfos);
+ hdc = GetDC( hwndCombo );
+ SelectObject( hdc, (HFONT)SendMessageW( hwndCombo, WM_GETFONT, 0, 0 ));
+ GetTextMetricsW( hdc, &tm );
+ ReleaseDC( hwndCombo, hdc );
+
/* set item height for both text field and listbox */
- CBSetItemHeight(hwndCombo,-1,GetSystemMetrics(SM_CYSMICON));
- CBSetItemHeight(hwndCombo,0,GetSystemMetrics(SM_CYSMICON));
-
+ CBSetItemHeight( hwndCombo, -1, max( tm.tmHeight, GetSystemMetrics(SM_CYSMICON) ));
+ CBSetItemHeight( hwndCombo, 0, max( tm.tmHeight, GetSystemMetrics(SM_CYSMICON) ));
+
/* Turn on the extended UI for the combo box like Windows does */
CBSetExtendedUI(hwndCombo, TRUE);
TEXTMETRICW tm;
LPSFOLDER tmpFolder;
LookInInfos *liInfos = GetPropA(pDIStruct->hwndItem,LookInInfosStr);
+ UINT shgfi_flags = SHGFI_PIDL | SHGFI_OPENICON | SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME;
+ UINT icon_width, icon_height;
TRACE("\n");
return 0;
+ icon_width = GetSystemMetrics(SM_CXICON);
+ icon_height = GetSystemMetrics(SM_CYICON);
+ if (pDIStruct->rcItem.bottom - pDIStruct->rcItem.top < icon_height)
+ {
+ icon_width = GetSystemMetrics(SM_CXSMICON);
+ icon_height = GetSystemMetrics(SM_CYSMICON);
+ shgfi_flags |= SHGFI_SMALLICON;
+ }
+
if(pDIStruct->itemID == liInfos->uSelectedItem)
{
ilItemImage = (HIMAGELIST) SHGetFileInfoW ((LPCWSTR) tmpFolder->pidlItem,
- 0,
- &sfi,
- sizeof (sfi),
- SHGFI_PIDL | SHGFI_SMALLICON |
- SHGFI_OPENICON | SHGFI_SYSICONINDEX |
- SHGFI_DISPLAYNAME );
+ 0, &sfi, sizeof (sfi), shgfi_flags );
}
else
{
ilItemImage = (HIMAGELIST) SHGetFileInfoW ((LPCWSTR) tmpFolder->pidlItem,
- 0,
- &sfi,
- sizeof (sfi),
- SHGFI_PIDL | SHGFI_SMALLICON |
- SHGFI_SYSICONINDEX |
- SHGFI_DISPLAYNAME);
+ 0, &sfi, sizeof (sfi), shgfi_flags );
}
/* Is this item selected ? */
{
iIndentation = 0;
ilItemImage = (HIMAGELIST) SHGetFileInfoW ((LPCWSTR) tmpFolder->pidlItem,
- 0,
- &sfi,
- sizeof (sfi),
- SHGFI_PIDL | SHGFI_SMALLICON | SHGFI_OPENICON
- | SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME );
+ 0, &sfi, sizeof (sfi), shgfi_flags );
}
else
/* Draw text and icon */
/* Initialise the icon display area */
- rectIcon.left = pDIStruct->rcItem.left + ICONWIDTH/2 * iIndentation;
- rectIcon.top = pDIStruct->rcItem.top;
- rectIcon.right = rectIcon.left + ICONWIDTH;
- rectIcon.bottom = pDIStruct->rcItem.bottom;
+ rectIcon.left = pDIStruct->rcItem.left + 1 + icon_width/2 * iIndentation;
+ rectIcon.top = (pDIStruct->rcItem.top + pDIStruct->rcItem.bottom - icon_height) / 2;
+ rectIcon.right = rectIcon.left + icon_width + XTEXTOFFSET;
+ rectIcon.bottom = (pDIStruct->rcItem.top + pDIStruct->rcItem.bottom + icon_height) / 2;
/* Initialise the text display area */
GetTextMetricsW(pDIStruct->hDC, &tm);
rectText.left = rectIcon.right;
rectText.top =
(pDIStruct->rcItem.top + pDIStruct->rcItem.bottom - tm.tmHeight) / 2;
- rectText.right = pDIStruct->rcItem.right + XTEXTOFFSET;
+ rectText.right = pDIStruct->rcItem.right;
rectText.bottom =
(pDIStruct->rcItem.top + pDIStruct->rcItem.bottom + tm.tmHeight) / 2;
}
SetWindowTextW( fodInfos->DlgInfos.hwndFileName, lpstrAllFile );
- /* Select the file name like Windows does */
- SendMessageW(fodInfos->DlgInfos.hwndFileName, EM_SETSEL, 0, -1);
+ /* Select the file name like Windows does */
+ if (filename_is_edit( fodInfos ))
+ SendMessageW(fodInfos->DlgInfos.hwndFileName, EM_SETSEL, 0, -1);
}
HeapFree(GetProcessHeap(),0, lpstrAllFile );
}
TRACE("\n");
- /* get the filenames from the edit control */
- nStrLen = SendMessageW(fodInfos->DlgInfos.hwndFileName, WM_GETTEXTLENGTH, 0, 0);
+ /* get the filenames from the filename control */
+ nStrLen = GetWindowTextLengthW( fodInfos->DlgInfos.hwndFileName );
lpstrEdit = MemAlloc( (nStrLen+1)*sizeof(WCHAR) );
- GetDlgItemTextW(hwnd, IDC_FILENAME, lpstrEdit, nStrLen+1);
+ GetWindowTextW( fodInfos->DlgInfos.hwndFileName, lpstrEdit, nStrLen+1);
TRACE("nStrLen=%u str=%s\n", nStrLen, debugstr_w(lpstrEdit));
HeapFree(GetProcessHeap(),0,mem);
}
-/*
- * Old-style (win3.1) dialogs */
-
-/***********************************************************************
- * FD32_GetTemplate [internal]
- *
- * Get a template (or FALSE if failure) when 16 bits dialogs are used
- * by a 32 bits application
- *
- */
-BOOL FD32_GetTemplate(PFD31_DATA lfs)
-{
- LPOPENFILENAMEW ofnW = lfs->ofnW;
- LPOPENFILENAMEA ofnA = lfs->ofnA;
- HANDLE hDlgTmpl;
-
- if (ofnW->Flags & OFN_ENABLETEMPLATEHANDLE)
- {
- if (!(lfs->template = LockResource( ofnW->hInstance )))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return FALSE;
- }
- }
- else if (ofnW->Flags & OFN_ENABLETEMPLATE)
- {
- HRSRC hResInfo;
- if (ofnA)
- hResInfo = FindResourceA(ofnA->hInstance,
- ofnA->lpTemplateName,
- (LPSTR)RT_DIALOG);
- else
- hResInfo = FindResourceW(ofnW->hInstance,
- ofnW->lpTemplateName,
- (LPWSTR)RT_DIALOG);
- if (!hResInfo)
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource(ofnW->hInstance,
- hResInfo)) ||
- !(lfs->template = LockResource(hDlgTmpl)))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return FALSE;
- }
- } else { /* get it from internal Wine resource */
- HRSRC hResInfo;
- if (!(hResInfo = FindResourceA(COMDLG32_hInstance,
- lfs->open? "OPEN_FILE":"SAVE_FILE", (LPSTR)RT_DIALOG)))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
- return FALSE;
- }
- if (!(hDlgTmpl = LoadResource(COMDLG32_hInstance, hResInfo )) ||
- !(lfs->template = LockResource( hDlgTmpl )))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return FALSE;
- }
- }
- return TRUE;
-}
-
-
-/***********************************************************************
- * FD32_WMMeasureItem [internal]
- */
-static LONG FD32_WMMeasureItem(LPARAM lParam)
+static inline BOOL valid_struct_size( DWORD size )
{
- LPMEASUREITEMSTRUCT lpmeasure;
-
- lpmeasure = (LPMEASUREITEMSTRUCT)lParam;
- lpmeasure->itemHeight = FD31_GetFldrHeight();
- return TRUE;
+ return (size == OPENFILENAME_SIZE_VERSION_400W) ||
+ (size == sizeof( OPENFILENAMEW ));
}
-
-/***********************************************************************
- * FileOpenDlgProc [internal]
- * Used for open and save, in fact.
- */
-static INT_PTR CALLBACK FD32_FileOpenDlgProc(HWND hWnd, UINT wMsg,
- WPARAM wParam, LPARAM lParam)
+static inline BOOL is_win16_looks(DWORD flags)
{
- PFD31_DATA lfs = (PFD31_DATA)GetPropA(hWnd,FD31_OFN_PROP);
-
- TRACE("msg=%x wparam=%lx lParam=%lx\n", wMsg, wParam, lParam);
- if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook)
- {
- INT_PTR lRet;
- lRet = (INT_PTR)FD31_CallWindowProc(lfs, wMsg, wParam, lParam);
- if (lRet)
- return lRet; /* else continue message processing */
- }
- switch (wMsg)
- {
- case WM_INITDIALOG:
- return FD31_WMInitDialog(hWnd, wParam, lParam);
-
- case WM_MEASUREITEM:
- return FD32_WMMeasureItem(lParam);
-
- case WM_DRAWITEM:
- return FD31_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam);
-
- case WM_COMMAND:
- return FD31_WMCommand(hWnd, lParam, HIWORD(wParam), LOWORD(wParam), lfs);
-#if 0
- case WM_CTLCOLOR:
- SetBkColor((HDC16)wParam, 0x00C0C0C0);
- switch (HIWORD(lParam))
- {
- case CTLCOLOR_BTN:
- SetTextColor((HDC16)wParam, 0x00000000);
- return hGRAYBrush;
- case CTLCOLOR_STATIC:
- SetTextColor((HDC16)wParam, 0x00000000);
- return hGRAYBrush;
- }
- break;
-#endif
- }
- return FALSE;
-}
-
-
-/***********************************************************************
- * GetFileName31A [internal]
- *
- * Creates a win31 style dialog box for the user to select a file to open/save.
- */
-static BOOL GetFileName31A(LPOPENFILENAMEA lpofn, /* address of structure with data*/
- UINT dlgType /* type dialogue : open/save */
- )
-{
- BOOL bRet = FALSE;
- PFD31_DATA lfs;
-
- if (!lpofn || !FD31_Init()) return FALSE;
-
- TRACE("ofn flags %08x\n", lpofn->Flags);
- lfs = FD31_AllocPrivate((LPARAM) lpofn, dlgType, FALSE);
- if (lfs)
- {
- bRet = DialogBoxIndirectParamA( COMDLG32_hInstance, lfs->template, lpofn->hwndOwner,
- FD32_FileOpenDlgProc, (LPARAM)lfs);
- FD31_DestroyPrivate(lfs);
- }
-
- TRACE("return lpstrFile='%s' !\n", lpofn->lpstrFile);
- return bRet;
-}
-
-/***********************************************************************
- * GetFileName31W [internal]
- *
- * Creates a win31 style dialog box for the user to select a file to open/save
- */
-static BOOL GetFileName31W(LPOPENFILENAMEW lpofn, /* address of structure with data*/
- UINT dlgType /* type dialogue : open/save */
- )
-{
- BOOL bRet = FALSE;
- PFD31_DATA lfs;
-
- if (!lpofn || !FD31_Init()) return FALSE;
-
- lfs = FD31_AllocPrivate((LPARAM) lpofn, dlgType, TRUE);
- if (lfs)
- {
- bRet = DialogBoxIndirectParamW( COMDLG32_hInstance, lfs->template, lpofn->hwndOwner,
- FD32_FileOpenDlgProc, (LPARAM)lfs);
- FD31_DestroyPrivate(lfs);
- }
-
- TRACE("file %s, file offset %d, ext offset %d\n",
- debugstr_w(lpofn->lpstrFile), lpofn->nFileOffset, lpofn->nFileExtension);
- return bRet;
+ return (flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE) &&
+ !(flags & OFN_EXPLORER));
}
/* ------------------ APIs ---------------------- */
BOOL WINAPI GetOpenFileNameA(
LPOPENFILENAMEA ofn) /* [in/out] address of init structure */
{
- BOOL win16look = FALSE;
-
TRACE("flags %08x\n", ofn->Flags);
+ if (!valid_struct_size( ofn->lStructSize ))
+ {
+ COMDLG32_SetCommDlgExtendedError( CDERR_STRUCTSIZE );
+ return FALSE;
+ }
+
/* OFN_FILEMUSTEXIST implies OFN_PATHMUSTEXIST */
if (ofn->Flags & OFN_FILEMUSTEXIST)
ofn->Flags |= OFN_PATHMUSTEXIST;
- if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE))
- win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE;
-
- if (win16look)
+ if (is_win16_looks(ofn->Flags))
return GetFileName31A(ofn, OPEN_DIALOG);
else
return GetFileDialog95A(ofn, OPEN_DIALOG);
BOOL WINAPI GetOpenFileNameW(
LPOPENFILENAMEW ofn) /* [in/out] address of init structure */
{
- BOOL win16look = FALSE;
-
TRACE("flags %08x\n", ofn->Flags);
+ if (!valid_struct_size( ofn->lStructSize ))
+ {
+ COMDLG32_SetCommDlgExtendedError( CDERR_STRUCTSIZE );
+ return FALSE;
+ }
+
/* OFN_FILEMUSTEXIST implies OFN_PATHMUSTEXIST */
if (ofn->Flags & OFN_FILEMUSTEXIST)
ofn->Flags |= OFN_PATHMUSTEXIST;
- if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE))
- win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE;
-
- if (win16look)
+ if (is_win16_looks(ofn->Flags))
return GetFileName31W(ofn, OPEN_DIALOG);
else
return GetFileDialog95W(ofn, OPEN_DIALOG);
BOOL WINAPI GetSaveFileNameA(
LPOPENFILENAMEA ofn) /* [in/out] address of init structure */
{
- BOOL win16look = FALSE;
-
- if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE))
- win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE;
+ if (!valid_struct_size( ofn->lStructSize ))
+ {
+ COMDLG32_SetCommDlgExtendedError( CDERR_STRUCTSIZE );
+ return FALSE;
+ }
- if (win16look)
+ if (is_win16_looks(ofn->Flags))
return GetFileName31A(ofn, SAVE_DIALOG);
else
return GetFileDialog95A(ofn, SAVE_DIALOG);
BOOL WINAPI GetSaveFileNameW(
LPOPENFILENAMEW ofn) /* [in/out] address of init structure */
{
- BOOL win16look = FALSE;
-
- if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE))
- win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE;
+ if (!valid_struct_size( ofn->lStructSize ))
+ {
+ COMDLG32_SetCommDlgExtendedError( CDERR_STRUCTSIZE );
+ return FALSE;
+ }
- if (win16look)
+ if (is_win16_looks(ofn->Flags))
return GetFileName31W(ofn, SAVE_DIALOG);
else
return GetFileDialog95W(ofn, SAVE_DIALOG);