From f54f76debddfad0b79fa0bbbca60f469fc7548e7 Mon Sep 17 00:00:00 2001 From: "law%netscape.com" Date: Fri, 1 Feb 2002 23:58:55 +0000 Subject: [PATCH] Bug 120931; remember last used directory (for older versions of windows that don't do it automatically); r=cmanske, sr=ben git-svn-id: svn://10.0.0.236/trunk@113464 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/windows/nsFilePicker.cpp | 45 +++++++++++++++------ mozilla/widget/src/windows/nsFilePicker.h | 2 + 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/mozilla/widget/src/windows/nsFilePicker.cpp b/mozilla/widget/src/windows/nsFilePicker.cpp index 14afdce9465..50851311fe2 100644 --- a/mozilla/widget/src/windows/nsFilePicker.cpp +++ b/mozilla/widget/src/windows/nsFilePicker.cpp @@ -45,6 +45,8 @@ static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CI NS_IMPL_ISUPPORTS1(nsFilePicker, nsIFilePicker) +char nsFilePicker::mLastUsedDirectory[MAX_PATH+1] = { 0 }; + //------------------------------------------------------------------------- // // nsFilePicker constructor @@ -56,6 +58,7 @@ nsFilePicker::nsFilePicker() mWnd = NULL; mUnicodeEncoder = nsnull; mUnicodeDecoder = nsnull; + mSelectedType = 1; mDisplayDirectory = do_CreateInstance("@mozilla.org/file/local;1"); } @@ -97,6 +100,15 @@ NS_IMETHODIMP nsFilePicker::Show(PRInt16 *retval) title = ToNewCString(mTitle); char *initialDir; mDisplayDirectory->GetPath(&initialDir); + // If no display directory, re-use the last one. + if(!initialDir || !*initialDir) { + // Free empty string returned from GetPath. + if (initialDir) { + nsMemory::Free(initialDir); + } + // Allocate copy of last used dir. + initialDir = NS_STATIC_CAST( char*, nsMemory::Clone(mLastUsedDirectory, PL_strlen(mLastUsedDirectory)+1) ); + } mFile.SetLength(0); @@ -206,12 +218,6 @@ NS_IMETHODIMP nsFilePicker::Show(PRInt16 *retval) // Remember what filter type the user selected mSelectedType = (PRInt16)ofn.nFilterIndex; - // Store the current directory in mDisplayDirectory - char* newCurrentDirectory = NS_STATIC_CAST( char*, nsMemory::Alloc( MAX_PATH+1 ) ); - VERIFY(::GetCurrentDirectory(MAX_PATH, newCurrentDirectory) > 0); - mDisplayDirectory->InitWithPath(newCurrentDirectory); - nsMemory::Free( newCurrentDirectory ); - // Clean up filter buffers if (filterBuffer) nsMemory::Free( filterBuffer ); @@ -234,15 +240,30 @@ NS_IMETHODIMP nsFilePicker::Show(PRInt16 *retval) if (result) { PRInt16 returnOKorReplace = returnOK; + // Remember last used directory. + nsCOMPtr file(do_CreateInstance("@mozilla.org/file/local;1")); + NS_ENSURE_TRUE(file, NS_ERROR_FAILURE); + + file->InitWithPath(mFile.get()); + nsCOMPtr dir; + if (NS_SUCCEEDED(file->GetParent(getter_AddRefs(dir)))) { + nsCOMPtr localDir(do_QueryInterface(dir)); + if (localDir) { + char *newDir; + localDir->GetPath(&newDir); + if(newDir) { + PL_strncpyz(mLastUsedDirectory, newDir, MAX_PATH+1); + nsMemory::Free(newDir); + } + // Update mDisplayDirectory with this directory, also. + // Some callers rely on this. + mDisplayDirectory->InitWithPath( mLastUsedDirectory ); + } + } + if (mMode == modeSave) { // Windows does not return resultReplace, // we must check if file already exists - nsCOMPtr file(do_CreateInstance("@mozilla.org/file/local;1")); - - NS_ENSURE_TRUE(file, NS_ERROR_FAILURE); - - file->InitWithPath(mFile.get()); - PRBool exists = PR_FALSE; file->Exists(&exists); if (exists) diff --git a/mozilla/widget/src/windows/nsFilePicker.h b/mozilla/widget/src/windows/nsFilePicker.h index 275118133e7..2a79076c3ea 100644 --- a/mozilla/widget/src/windows/nsFilePicker.h +++ b/mozilla/widget/src/windows/nsFilePicker.h @@ -81,6 +81,8 @@ protected: nsCOMPtr mDisplayDirectory; PRInt16 mSelectedType; + static char mLastUsedDirectory[]; + }; #endif // nsFilePicker_h__