From 25eeb8f880fe4e68905c39421e03a241e04784a3 Mon Sep 17 00:00:00 2001 From: Francois Boisvert Date: Fri, 3 Sep 1999 16:46:41 +0000 Subject: [PATCH] Some features in the file dialog 95. --- dlls/commdlg/filedlg95.c | 49 +++++++++++++++++++++++++++++------ dlls/commdlg/filedlgbrowser.c | 21 ++++++++++++--- dlls/commdlg/filedlgbrowser.h | 10 +++++++ dlls/shell32/shlview.c | 9 ++++++- 4 files changed, 76 insertions(+), 13 deletions(-) diff --git a/dlls/commdlg/filedlg95.c b/dlls/commdlg/filedlg95.c index 29d4f4ef1c0..e19c9f31728 100644 --- a/dlls/commdlg/filedlg95.c +++ b/dlls/commdlg/filedlg95.c @@ -395,12 +395,16 @@ BOOL WINAPI GetFileDialog95A(LPOPENFILENAMEA ofn,UINT iDlgType) GetCurrentDirectoryA(MAX_PATH,(LPSTR)fodInfos->ofnInfos.lpstrInitialDir); } + /* Initialise the dialog property */ + fodInfos->DlgInfos.dwDlgProp = 0; + switch(iDlgType) { case OPEN_DIALOG : ret = GetOpenFileName95(fodInfos); break; case SAVE_DIALOG : + fodInfos->DlgInfos.dwDlgProp |= FODPROP_SAVEDLG; ret = GetSaveFileName95(fodInfos); break; default : @@ -512,31 +516,46 @@ BOOL WINAPI GetFileDialog95W(LPOPENFILENAMEW ofn,UINT iDlgType) if (ofn->nMaxFileTitle) fodInfos->ofnInfos.lpstrFileTitle = (LPSTR)MemAlloc(ofn->nMaxFileTitle); if (ofn->lpstrInitialDir) - fodInfos->ofnInfos.lpstrInitialDir = (LPSTR)MemAlloc(lstrlenW(ofn->lpstrInitialDir)); + { + fodInfos->ofnInfos.lpstrInitialDir = (LPSTR)MemAlloc(lstrlenW(ofn->lpstrInitialDir)+1); + lstrcpyWtoA(fodInfos->ofnInfos.lpstrInitialDir,ofn->lpstrInitialDir); + } if (ofn->lpstrTitle) - fodInfos->ofnInfos.lpstrTitle = (LPSTR)MemAlloc(lstrlenW(ofn->lpstrTitle)); + { + fodInfos->ofnInfos.lpstrTitle = (LPSTR)MemAlloc(lstrlenW(ofn->lpstrTitle)+1); + lstrcpyWtoA(fodInfos->ofnInfos.lpstrTitle,ofn->lpstrTitle); + } fodInfos->ofnInfos.Flags = ofn->Flags|OFN_WINE|OFN_UNICODE; fodInfos->ofnInfos.nFileOffset = ofn->nFileOffset; fodInfos->ofnInfos.nFileExtension = ofn->nFileExtension; if (ofn->lpstrDefExt) - fodInfos->ofnInfos.lpstrDefExt = (LPSTR)MemAlloc(lstrlenW(ofn->lpstrDefExt)); + { + fodInfos->ofnInfos.lpstrDefExt = (LPSTR)MemAlloc(lstrlenW(ofn->lpstrDefExt)+1); + lstrcpyWtoA(fodInfos->ofnInfos.lpstrDefExt,ofn->lpstrDefExt); + } fodInfos->ofnInfos.lCustData = ofn->lCustData; fodInfos->ofnInfos.lpfnHook = (LPOFNHOOKPROC)ofn->lpfnHook; if (ofn->lpTemplateName) - fodInfos->ofnInfos.lpTemplateName = (LPSTR)MemAlloc(lstrlenW(ofn->lpTemplateName)); + { + fodInfos->ofnInfos.lpTemplateName = (LPSTR)MemAlloc(lstrlenW(ofn->lpTemplateName)+1); + lstrcpyWtoA(fodInfos->ofnInfos.lpTemplateName,ofn->lpTemplateName); + } + /* Initialise the dialog property */ + fodInfos->DlgInfos.dwDlgProp = 0; + switch(iDlgType) { case OPEN_DIALOG : ret = GetOpenFileName95(fodInfos); break; case SAVE_DIALOG : + fodInfos->DlgInfos.dwDlgProp |= FODPROP_SAVEDLG; ret = GetSaveFileName95(fodInfos); break; default : ret = 0; } - /* Cleaning */ ofn->nFileOffset = fodInfos->ofnInfos.nFileOffset; ofn->nFileExtension = fodInfos->ofnInfos.nFileExtension; @@ -600,6 +619,7 @@ HRESULT WINAPI FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa case WM_DESTROY: RemovePropA(hwnd, FileOpenDlgInfosStr); + default : return FALSE; } @@ -676,6 +696,7 @@ static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { WORD wNotifyCode = HIWORD(wParam); /* notification code */ WORD wID = LOWORD(wParam); /* item, control, or accelerator identifier */ + FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(hwnd,FileOpenDlgInfosStr); switch(wID) { @@ -717,7 +738,8 @@ static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) break; } - + /* Do not use the listview selection anymore */ + fodInfos->DlgInfos.dwDlgProp &= ~FODPROP_USEVIEW; return 0; } @@ -819,10 +841,22 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) { char lpstrSpecifiedByUser[MAX_PATH] = ""; FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(hwnd,FileOpenDlgInfosStr); + LPITEMIDLIST pidlSelection; TRACE("\n"); - if(GetDlgItemTextA(hwnd,IDC_FILENAME,lpstrSpecifiedByUser,MAX_PATH)) + /* Check if there is a selected item in the listview */ + if(fodInfos->DlgInfos.dwDlgProp & FODPROP_USEVIEW) + { + pidlSelection = GetSelectedPidl(fodInfos->Shell.FOIShellView); + GetName(fodInfos->Shell.FOIShellFolder,pidlSelection,SHGDN_NORMAL,lpstrSpecifiedByUser); + COMDLG32_SHFree((LPVOID)pidlSelection); + } + else + /* Get the text from the filename edit */ + GetDlgItemTextA(hwnd,IDC_FILENAME,lpstrSpecifiedByUser,MAX_PATH); + + if(strlen(lpstrSpecifiedByUser)) { LPSHELLFOLDER psfDesktop; LPITEMIDLIST browsePidl; @@ -1148,7 +1182,6 @@ static HRESULT FILEDLG95_SHELL_Init(HWND hwnd) /* Construct the IShellBrowser interface */ fodInfos->Shell.FOIShellBrowser = IShellBrowserImpl_Construct(hwnd); - return NOERROR; } diff --git a/dlls/commdlg/filedlgbrowser.c b/dlls/commdlg/filedlgbrowser.c index 257aa04fd7c..d2e062404b4 100644 --- a/dlls/commdlg/filedlgbrowser.c +++ b/dlls/commdlg/filedlgbrowser.c @@ -72,7 +72,7 @@ static ICOM_VTABLE(ICommDlgBrowser) IShellBrowserImpl_ICommDlgBrowser_Vtbl = */ HRESULT IShellBrowserImpl_ICommDlgBrowser_OnSelChange(ICommDlgBrowser *iface, IShellView *ppshv); -LPITEMIDLIST GetSelectedPidl(IShellView *ppshv); +//LPITEMIDLIST GetSelectedPidl(IShellView *ppshv); /************************************************************************** * External Prototypes @@ -658,6 +658,11 @@ HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_OnStateChange(ICommDlgBrowser * case CDBOSC_SETFOCUS: break; case CDBOSC_KILLFOCUS: + { + FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(This->hwndOwner,FileOpenDlgInfosStr); + if(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) + SetDlgItemTextA(fodInfos->ShellInfos.hwndOwner,IDOK,"&Save"); + } break; case CDBOSC_SELCHANGE: return IShellBrowserImpl_ICommDlgBrowser_OnSelChange(iface,ppshv); @@ -717,9 +722,10 @@ HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_IncludeObject(ICommDlgBrowser * HRESULT IShellBrowserImpl_ICommDlgBrowser_OnSelChange(ICommDlgBrowser *iface, IShellView *ppshv) { LPITEMIDLIST pidl; - + FileOpenDlgInfos *fodInfos; _ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface); + fodInfos = (FileOpenDlgInfos *) GetPropA(This->hwndOwner,FileOpenDlgInfosStr); TRACE("(%p)\n", This); if((pidl = GetSelectedPidl(ppshv))) @@ -727,20 +733,27 @@ HRESULT IShellBrowserImpl_ICommDlgBrowser_OnSelChange(ICommDlgBrowser *iface, IS HRESULT hRes = E_FAIL; char lpstrFileName[MAX_PATH]; - FileOpenDlgInfos *fodInfos = (FileOpenDlgInfos *) GetPropA(This->hwndOwner,FileOpenDlgInfosStr); - ULONG ulAttr = SFGAO_FOLDER | SFGAO_HASSUBFOLDER; IShellFolder_GetAttributesOf(fodInfos->Shell.FOIShellFolder, 1, &pidl, &ulAttr); if (!ulAttr) { if(SUCCEEDED(hRes = GetName(fodInfos->Shell.FOIShellFolder,pidl,SHGDN_NORMAL,lpstrFileName))) SetWindowTextA(fodInfos->DlgInfos.hwndFileName,lpstrFileName); + if(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) + SetDlgItemTextA(fodInfos->ShellInfos.hwndOwner,IDOK,"&Save"); } + else + SetDlgItemTextA(fodInfos->ShellInfos.hwndOwner,IDOK,"&Open"); + + fodInfos->DlgInfos.dwDlgProp |= FODPROP_USEVIEW; COMDLG32_SHFree((LPVOID)pidl); return hRes; } + if(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) + SetDlgItemTextA(fodInfos->ShellInfos.hwndOwner,IDOK,"&Save"); + fodInfos->DlgInfos.dwDlgProp &= ~FODPROP_USEVIEW; return E_FAIL; } diff --git a/dlls/commdlg/filedlgbrowser.h b/dlls/commdlg/filedlgbrowser.h index 4f2c16aa253..6c23dff4829 100644 --- a/dlls/commdlg/filedlgbrowser.h +++ b/dlls/commdlg/filedlgbrowser.h @@ -17,6 +17,12 @@ */ #define _ICOM_THIS_FromICommDlgBrowser(Class,name) Class* This = (Class*) (((char*)name)-sizeof(void *)) +/* dialog internal property */ + +#define FODPROP_SAVEDLG 0x0001 /* File dialog is a Save file dialog */ +#define FODPROP_USEVIEW 0x0002 /* Indicates the user selection must be taken + from the IShellView */ + /*********************************************************************** * Data structure */ @@ -55,6 +61,7 @@ typedef struct HWND hwndFileTypeCB; HWND hwndLookInCB; HWND hwndFileName; + DWORD dwDlgProp; } DlgInfos; } FileOpenDlgInfos; @@ -160,4 +167,7 @@ HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_IncludeObject(ICommDlgBrowser * LPCITEMIDLIST pidl); + +LPITEMIDLIST GetSelectedPidl(IShellView *ppshv); + #endif /*SHBROWSER_H*/ diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index 8d61eebb058..c2eef67ad19 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -226,7 +226,7 @@ static BOOL ShellView_CreateList (IShellViewImpl * This) TRACE("%p\n",This); - dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER | + dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE; switch (This->FolderSettings.ViewMode) @@ -787,6 +787,9 @@ static LRESULT ShellView_OnSetFocus(IShellViewImpl * This) IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This); ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS); + /* Notify the ICommDlgBrowser interface */ + OnStateChange(This,CDBOSC_SETFOCUS); + return 0; } @@ -798,6 +801,8 @@ static LRESULT ShellView_OnKillFocus(IShellViewImpl * This) TRACE("(%p) stub\n",This); ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS); + /* Notify the ICommDlgBrowser */ + OnStateChange(This,CDBOSC_KILLFOCUS); return 0; } @@ -859,6 +864,8 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn case NM_KILLFOCUS: TRACE("-- NM_KILLFOCUS %p\n",This); ShellView_OnDeactivate(This); + /* Notify the ICommDlgBrowser interface */ + OnStateChange(This,CDBOSC_KILLFOCUS); break; case HDN_ENDTRACKA: