Add back win16 style dialogs for win32 apps.
This commit is contained in:
parent
4e6fca0efc
commit
01fbcfb2f1
|
@ -13,6 +13,7 @@ C_SRCS = \
|
|||
cdlg32.c \
|
||||
colordlg.c \
|
||||
filedlg.c \
|
||||
filedlg16.c \
|
||||
filedlgbrowser.c \
|
||||
finddlg32.c \
|
||||
filetitle.c \
|
||||
|
@ -21,7 +22,6 @@ C_SRCS = \
|
|||
|
||||
C_SRCS16 = \
|
||||
colordlg16.c \
|
||||
filedlg16.c \
|
||||
finddlg.c \
|
||||
fontdlg16.c \
|
||||
generic.c \
|
||||
|
|
|
@ -228,6 +228,10 @@ HRESULT FILEDLG95_HandleCustomDialogMessages(HWND hwnd, UINT uMsg, WPARAM wParam
|
|||
BOOL FILEDLG95_OnOpenMultipleFiles(HWND hwnd, LPWSTR lpstrFileList, UINT nFileCount, UINT sizeUsed);
|
||||
static BOOL BrowseSelectedFolder(HWND hwnd);
|
||||
|
||||
/* old style dialogs */
|
||||
extern BOOL GetFileName31A(LPOPENFILENAMEA lpofn, UINT dlgType);
|
||||
extern BOOL GetFileName31W(LPOPENFILENAMEW lpofn, UINT dlgType);
|
||||
|
||||
/***********************************************************************
|
||||
* GetFileName95
|
||||
*
|
||||
|
@ -3227,6 +3231,14 @@ static void MemFree(void *mem)
|
|||
BOOL WINAPI GetOpenFileNameA(
|
||||
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 (win16look)
|
||||
return GetFileName31A(ofn, OPEN_DIALOG);
|
||||
else
|
||||
return GetFileDialog95A(ofn, OPEN_DIALOG);
|
||||
}
|
||||
|
||||
|
@ -3243,9 +3255,18 @@ BOOL WINAPI GetOpenFileNameA(
|
|||
BOOL WINAPI GetOpenFileNameW(
|
||||
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 (win16look)
|
||||
return GetFileName31W(ofn, OPEN_DIALOG);
|
||||
else
|
||||
return GetFileDialog95W(ofn, OPEN_DIALOG);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* GetSaveFileNameA (COMDLG32.@)
|
||||
*
|
||||
|
@ -3259,6 +3280,14 @@ BOOL WINAPI GetOpenFileNameW(
|
|||
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 (win16look)
|
||||
return GetFileName31A(ofn, SAVE_DIALOG);
|
||||
else
|
||||
return GetFileDialog95A(ofn, SAVE_DIALOG);
|
||||
}
|
||||
|
||||
|
@ -3275,5 +3304,13 @@ BOOL WINAPI GetSaveFileNameA(
|
|||
BOOL WINAPI GetSaveFileNameW(
|
||||
LPOPENFILENAMEW ofn) /* [in/out] address of init structure */
|
||||
{
|
||||
return GetFileDialog95W(ofn, SAVE_DIALOG);
|
||||
BOOL win16look = FALSE;
|
||||
|
||||
if (ofn->Flags & (OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLETEMPLATE))
|
||||
win16look = (ofn->Flags & OFN_EXPLORER) ? FALSE : TRUE;
|
||||
|
||||
if (win16look)
|
||||
return GetFileName31W(ofn, SAVE_DIALOG);
|
||||
else
|
||||
return GetFileDialog95W(ofn, SAVE_DIALOG);
|
||||
}
|
||||
|
|
|
@ -1148,6 +1148,122 @@ static BOOL FILEDLG_CallWindowProc16(LFSPRIVATE lfs, UINT wMsg, WPARAM wParam,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG_WMInitDialog [internal]
|
||||
*/
|
||||
|
||||
static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int i, n;
|
||||
WCHAR tmpstr[BUFFILE];
|
||||
LPWSTR pstr, old_pstr;
|
||||
LPOPENFILENAMEW ofn;
|
||||
LFSPRIVATE lfs = (LFSPRIVATE) lParam;
|
||||
|
||||
if (!lfs) return FALSE;
|
||||
SetPropA(hWnd, OFN_PROP, (HANDLE)lfs);
|
||||
lfs->hwnd = hWnd;
|
||||
ofn = lfs->ofnW;
|
||||
|
||||
TRACE("flags=%lx initialdir=%s\n", ofn->Flags, debugstr_w(ofn->lpstrInitialDir));
|
||||
|
||||
SetWindowTextW( hWnd, ofn->lpstrTitle );
|
||||
/* read custom filter information */
|
||||
if (ofn->lpstrCustomFilter)
|
||||
{
|
||||
pstr = ofn->lpstrCustomFilter;
|
||||
n = 0;
|
||||
TRACE("lpstrCustomFilter = %p\n", pstr);
|
||||
while(*pstr)
|
||||
{
|
||||
old_pstr = pstr;
|
||||
i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0,
|
||||
(LPARAM)(ofn->lpstrCustomFilter) + n );
|
||||
n += lstrlenW(pstr) + 1;
|
||||
pstr += lstrlenW(pstr) + 1;
|
||||
TRACE("add str=%s associated to %s\n",
|
||||
debugstr_w(old_pstr), debugstr_w(pstr));
|
||||
SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
|
||||
n += lstrlenW(pstr) + 1;
|
||||
pstr += lstrlenW(pstr) + 1;
|
||||
}
|
||||
}
|
||||
/* read filter information */
|
||||
if (ofn->lpstrFilter) {
|
||||
pstr = (LPWSTR) ofn->lpstrFilter;
|
||||
n = 0;
|
||||
while(*pstr) {
|
||||
old_pstr = pstr;
|
||||
i = SendDlgItemMessageW(hWnd, cmb1, CB_ADDSTRING, 0,
|
||||
(LPARAM)(ofn->lpstrFilter + n) );
|
||||
n += lstrlenW(pstr) + 1;
|
||||
pstr += lstrlenW(pstr) + 1;
|
||||
TRACE("add str=%s associated to %s\n",
|
||||
debugstr_w(old_pstr), debugstr_w(pstr));
|
||||
SendDlgItemMessageW(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
|
||||
n += lstrlenW(pstr) + 1;
|
||||
pstr += lstrlenW(pstr) + 1;
|
||||
}
|
||||
}
|
||||
/* set default filter */
|
||||
if (ofn->nFilterIndex == 0 && ofn->lpstrCustomFilter == NULL)
|
||||
ofn->nFilterIndex = 1;
|
||||
SendDlgItemMessageW(hWnd, cmb1, CB_SETCURSEL, ofn->nFilterIndex - 1, 0);
|
||||
lstrcpynW(tmpstr, FILEDLG_GetFileType(ofn->lpstrCustomFilter,
|
||||
(LPWSTR)ofn->lpstrFilter, ofn->nFilterIndex - 1),BUFFILE);
|
||||
TRACE("nFilterIndex = %ld, SetText of edt1 to %s\n",
|
||||
ofn->nFilterIndex, debugstr_w(tmpstr));
|
||||
SetDlgItemTextW( hWnd, edt1, tmpstr );
|
||||
/* get drive list */
|
||||
*tmpstr = 0;
|
||||
DlgDirListComboBoxW(hWnd, tmpstr, cmb2, 0, DDL_DRIVES | DDL_EXCLUSIVE);
|
||||
/* read initial directory */
|
||||
/* FIXME: Note that this is now very version-specific (See MSDN description of
|
||||
* the OPENFILENAME structure). For example under 2000/XP any path in the
|
||||
* lpstrFile overrides the lpstrInitialDir, but not under 95/98/ME
|
||||
*/
|
||||
if (ofn->lpstrInitialDir != NULL)
|
||||
{
|
||||
int len;
|
||||
lstrcpynW(tmpstr, ofn->lpstrInitialDir, 511);
|
||||
len = lstrlenW(tmpstr);
|
||||
if (len > 0 && tmpstr[len-1] != '\\' && tmpstr[len-1] != ':') {
|
||||
tmpstr[len]='\\';
|
||||
tmpstr[len+1]='\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
*tmpstr = 0;
|
||||
if (!FILEDLG_ScanDir(hWnd, tmpstr)) {
|
||||
*tmpstr = 0;
|
||||
if (!FILEDLG_ScanDir(hWnd, tmpstr))
|
||||
WARN("Couldn't read initial directory %s!\n", debugstr_w(tmpstr));
|
||||
}
|
||||
/* select current drive in combo 2, omit missing drives */
|
||||
{
|
||||
char dir[MAX_PATH];
|
||||
char str[4] = "a:\\";
|
||||
GetCurrentDirectoryA( sizeof(dir), dir );
|
||||
for(i = 0, n = -1; i < 26; i++)
|
||||
{
|
||||
str[0] = 'a' + i;
|
||||
if (GetDriveTypeA(str) > DRIVE_NO_ROOT_DIR) n++;
|
||||
if (toupper(str[0]) == toupper(dir[0])) break;
|
||||
}
|
||||
}
|
||||
SendDlgItemMessageW(hWnd, cmb2, CB_SETCURSEL, n, 0);
|
||||
if (!(ofn->Flags & OFN_SHOWHELP))
|
||||
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
|
||||
if (ofn->Flags & OFN_HIDEREADONLY)
|
||||
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
|
||||
if (lfs->hook)
|
||||
return (BOOL) FILEDLG_CallWindowProc(lfs, WM_INITDIALOG, wParam, lfs->lParam);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG_WMInitDialog16 [internal]
|
||||
* The is a duplicate of the 32bit FILEDLG_WMInitDialog function
|
||||
|
@ -1264,6 +1380,19 @@ static LONG FILEDLG_WMInitDialog16(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG_WMMeasureItem [internal]
|
||||
*/
|
||||
static LONG FILEDLG_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LPMEASUREITEMSTRUCT lpmeasure;
|
||||
|
||||
lpmeasure = (LPMEASUREITEMSTRUCT)lParam;
|
||||
lpmeasure->itemHeight = fldrHeight;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* FILEDLG_WMMeasureItem16 [internal]
|
||||
*/
|
||||
|
@ -1278,6 +1407,54 @@ static LONG FILEDLG_WMMeasureItem16(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
|
|||
|
||||
/* ------------------ Dialog procedures ---------------------- */
|
||||
|
||||
/***********************************************************************
|
||||
* FileOpenDlgProc [internal]
|
||||
* Used for open and save, in fact.
|
||||
*/
|
||||
static INT_PTR CALLBACK FileOpenDlgProc(HWND hWnd, UINT wMsg,
|
||||
WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LFSPRIVATE lfs = (LFSPRIVATE)GetPropA(hWnd,OFN_PROP);
|
||||
|
||||
TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam);
|
||||
if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook)
|
||||
{
|
||||
INT_PTR lRet;
|
||||
lRet = (INT_PTR)FILEDLG_CallWindowProc(lfs, wMsg, wParam, lParam);
|
||||
if (lRet)
|
||||
return lRet; /* else continue message processing */
|
||||
}
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
|
||||
|
||||
case WM_MEASUREITEM:
|
||||
return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
|
||||
|
||||
case WM_DRAWITEM:
|
||||
return FILEDLG_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam);
|
||||
|
||||
case WM_COMMAND:
|
||||
return FILEDLG_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;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* FileOpenDlgProc (COMMDLG.6)
|
||||
*/
|
||||
|
@ -1378,6 +1555,73 @@ BOOL16 CALLBACK FileSaveDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* GetFileName31A [internal]
|
||||
*
|
||||
* Creates a win31 style dialog box for the user to select a file to open/save.
|
||||
*/
|
||||
BOOL GetFileName31A(
|
||||
LPOPENFILENAMEA lpofn, /* addess of structure with data*/
|
||||
UINT dlgType /* type dialogue : open/save */
|
||||
)
|
||||
{
|
||||
HINSTANCE hInst;
|
||||
BOOL bRet = FALSE;
|
||||
LFSPRIVATE lfs;
|
||||
|
||||
if (!lpofn || !FileDlg_Init()) return FALSE;
|
||||
|
||||
TRACE("ofn flags %08lx\n", lpofn->Flags);
|
||||
lfs = FILEDLG_AllocPrivate((LPARAM) lpofn, LFS32A, dlgType);
|
||||
if (lfs)
|
||||
{
|
||||
hInst = (HINSTANCE)GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE );
|
||||
bRet = DialogBoxIndirectParamA( hInst, lfs->template, lpofn->hwndOwner,
|
||||
FileOpenDlgProc, (LPARAM)lfs);
|
||||
FILEDLG_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
|
||||
*/
|
||||
BOOL GetFileName31W(
|
||||
LPOPENFILENAMEW lpofn, /* addess of structure with data*/
|
||||
UINT dlgType /* type dialogue : open/save */
|
||||
)
|
||||
{
|
||||
HINSTANCE hInst;
|
||||
BOOL bRet = FALSE;
|
||||
LFSPRIVATE lfs;
|
||||
|
||||
if (!lpofn || !FileDlg_Init()) return FALSE;
|
||||
|
||||
lfs = FILEDLG_AllocPrivate((LPARAM) lpofn, LFS32W, dlgType);
|
||||
if (lfs)
|
||||
{
|
||||
hInst = (HINSTANCE)GetWindowLongA( lpofn->hwndOwner, GWL_HINSTANCE );
|
||||
bRet = DialogBoxIndirectParamW( hInst, lfs->template, lpofn->hwndOwner,
|
||||
FileOpenDlgProc, (LPARAM)lfs);
|
||||
FILEDLG_DestroyPrivate(lfs);
|
||||
}
|
||||
|
||||
TRACE("return lpstrFile=%s !\n", debugstr_w(lpofn->lpstrFile));
|
||||
return bRet;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ------------------ APIs ---------------------- */
|
||||
|
||||
/***********************************************************************
|
||||
|
|
Loading…
Reference in New Issue