comdlg32: Implement GetFileName and SetFileName for the item dialog.

This commit is contained in:
David Hedberg 2011-04-01 05:52:24 +02:00 committed by Alexandre Julliard
parent 0a524a0c76
commit 36bf6e1afe
2 changed files with 74 additions and 10 deletions

View File

@ -80,8 +80,51 @@ typedef struct FileDialogImpl {
HWND dlg_hwnd; HWND dlg_hwnd;
IExplorerBrowser *peb; IExplorerBrowser *peb;
DWORD ebevents_cookie; DWORD ebevents_cookie;
LPWSTR set_filename;
} FileDialogImpl; } FileDialogImpl;
/**************************************************************************
* Helper functions.
*/
static UINT get_file_name(FileDialogImpl *This, LPWSTR *str)
{
HWND hwnd_edit = GetDlgItem(This->dlg_hwnd, IDC_FILENAME);
UINT len;
if(!hwnd_edit)
{
if(This->set_filename)
{
len = lstrlenW(This->set_filename);
*str = CoTaskMemAlloc(sizeof(WCHAR)*(len+1));
lstrcpyW(*str, This->set_filename);
return len;
}
return FALSE;
}
len = SendMessageW(hwnd_edit, WM_GETTEXTLENGTH, 0, 0);
*str = CoTaskMemAlloc(sizeof(WCHAR)*(len+1));
if(!*str)
return FALSE;
SendMessageW(hwnd_edit, WM_GETTEXT, len+1, (LPARAM)*str);
return len;
}
static BOOL set_file_name(FileDialogImpl *This, LPCWSTR str)
{
HWND hwnd_edit = GetDlgItem(This->dlg_hwnd, IDC_FILENAME);
if(This->set_filename)
LocalFree(This->set_filename);
This->set_filename = StrDupW(str);
return SendMessageW(hwnd_edit, WM_SETTEXT, 0, (LPARAM)str);
}
/************************************************************************** /**************************************************************************
* Window related functions. * Window related functions.
*/ */
@ -320,6 +363,10 @@ static LRESULT on_wm_initdialog(HWND hwnd, LPARAM lParam)
else else
ShowWindow(hitem, SW_HIDE); ShowWindow(hitem, SW_HIDE);
if(This->set_filename &&
(hitem = GetDlgItem(This->dlg_hwnd, IDC_FILENAME)) )
SendMessageW(hitem, WM_SETTEXT, 0, (LPARAM)This->set_filename);
init_explorerbrowser(This); init_explorerbrowser(This);
update_layout(This); update_layout(This);
@ -533,6 +580,8 @@ static ULONG WINAPI IFileDialog2_fnRelease(IFileDialog2 *iface)
if(This->psia_selection) IShellItemArray_Release(This->psia_selection); if(This->psia_selection) IShellItemArray_Release(This->psia_selection);
if(This->psia_results) IShellItemArray_Release(This->psia_results); if(This->psia_results) IShellItemArray_Release(This->psia_results);
LocalFree(This->set_filename);
HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, This);
} }
@ -752,15 +801,26 @@ static HRESULT WINAPI IFileDialog2_fnGetCurrentSelection(IFileDialog2 *iface, IS
static HRESULT WINAPI IFileDialog2_fnSetFileName(IFileDialog2 *iface, LPCWSTR pszName) static HRESULT WINAPI IFileDialog2_fnSetFileName(IFileDialog2 *iface, LPCWSTR pszName)
{ {
FileDialogImpl *This = impl_from_IFileDialog2(iface); FileDialogImpl *This = impl_from_IFileDialog2(iface);
FIXME("stub - %p (%p)\n", This, pszName); TRACE("%p (%p)\n", iface, pszName);
return E_NOTIMPL;
set_file_name(This, pszName);
return S_OK;
} }
static HRESULT WINAPI IFileDialog2_fnGetFileName(IFileDialog2 *iface, LPWSTR *pszName) static HRESULT WINAPI IFileDialog2_fnGetFileName(IFileDialog2 *iface, LPWSTR *pszName)
{ {
FileDialogImpl *This = impl_from_IFileDialog2(iface); FileDialogImpl *This = impl_from_IFileDialog2(iface);
FIXME("stub - %p (%p)\n", This, pszName); TRACE("%p (%p)\n", iface, pszName);
return E_NOTIMPL;
if(!pszName)
return E_INVALIDARG;
*pszName = NULL;
if(get_file_name(This, pszName))
return S_OK;
else
return E_FAIL;
} }
static HRESULT WINAPI IFileDialog2_fnSetTitle(IFileDialog2 *iface, LPCWSTR pszTitle) static HRESULT WINAPI IFileDialog2_fnSetTitle(IFileDialog2 *iface, LPCWSTR pszTitle)
@ -1705,6 +1765,8 @@ static HRESULT FileDialog_constructor(IUnknown *pUnkOuter, REFIID riid, void **p
fdimpl->dlg_hwnd = NULL; fdimpl->dlg_hwnd = NULL;
fdimpl->peb = NULL; fdimpl->peb = NULL;
fdimpl->set_filename = NULL;
/* FIXME: The default folder setting should be restored for the /* FIXME: The default folder setting should be restored for the
* application if it was previously set. */ * application if it was previously set. */
SHGetDesktopFolder(&psf); SHGetDesktopFolder(&psf);

View File

@ -371,8 +371,6 @@ static void test_basics(void)
} }
/* GetFileName */ /* GetFileName */
todo_wine
{
hr = IFileOpenDialog_GetFileName(pfod, NULL); hr = IFileOpenDialog_GetFileName(pfod, NULL);
ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr); ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
filename = (void*)0xdeadbeef; filename = (void*)0xdeadbeef;
@ -385,7 +383,6 @@ static void test_basics(void)
hr = IFileSaveDialog_GetFileName(pfsd, &filename); hr = IFileSaveDialog_GetFileName(pfsd, &filename);
ok(hr == E_FAIL, "got 0x%08x.\n", hr); ok(hr == E_FAIL, "got 0x%08x.\n", hr);
ok(filename == NULL, "got %p\n", filename); ok(filename == NULL, "got %p\n", filename);
}
/* GetFileTypeIndex */ /* GetFileTypeIndex */
hr = IFileOpenDialog_GetFileTypeIndex(pfod, NULL); hr = IFileOpenDialog_GetFileTypeIndex(pfod, NULL);
@ -546,14 +543,16 @@ static void test_basics(void)
} }
/* SetFileName */ /* SetFileName */
todo_wine
{
hr = IFileOpenDialog_SetFileName(pfod, NULL); hr = IFileOpenDialog_SetFileName(pfod, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IFileOpenDialog_SetFileName(pfod, null); hr = IFileOpenDialog_SetFileName(pfod, null);
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IFileOpenDialog_SetFileName(pfod, txt); hr = IFileOpenDialog_SetFileName(pfod, txt);
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IFileOpenDialog_GetFileName(pfod, &filename);
ok(hr == S_OK, "Got 0x%08x\n", hr);
ok(!lstrcmpW(filename, txt), "Strings do not match.\n");
CoTaskMemFree(filename);
hr = IFileSaveDialog_SetFileName(pfsd, NULL); hr = IFileSaveDialog_SetFileName(pfsd, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
@ -561,7 +560,10 @@ static void test_basics(void)
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IFileSaveDialog_SetFileName(pfsd, txt); hr = IFileSaveDialog_SetFileName(pfsd, txt);
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
} hr = IFileSaveDialog_GetFileName(pfsd, &filename);
ok(hr == S_OK, "Got 0x%08x\n", hr);
ok(!lstrcmpW(filename, txt), "Strings do not match.\n");
CoTaskMemFree(filename);
/* SetFileNameLabel */ /* SetFileNameLabel */
todo_wine todo_wine