commdlg #3: better folder browsing/opening

Huw D M Davies h.davies1 at physics.ox.ac.uk
Fri Jun 3 10:35:00 CDT 2005


        Huw Davies <huw at codeweavers.com>
        If a folder is selected on Open then browse into it,
        otherwise we should return the path in the edit box whether
        that be a folder or a file.
        Don't add extensions to a folder.
-- 
Huw Davies
huw at codeweavers.com
--- dlls/commdlg/filedlg.c	2005-06-03 15:57:23.593900743 +0100
+++ dlls/commdlg/filedlg.c	2005-06-03 16:28:55.477192036 +0100
@@ -1712,9 +1712,8 @@ BOOL FILEDLG95_OnOpenMultipleFiles(HWND 
  *
  * If the function succeeds, the return value is nonzero.
  */
-#define ONOPEN_BROWSE 1
-#define ONOPEN_OPEN   2
-#define ONOPEN_SEARCH 3
+#define ONOPEN_OPEN   1
+#define ONOPEN_SEARCH 2
 static void FILEDLG95_OnOpenMessage(HWND hwnd, int idCaption, int idText)
 {
   WCHAR strMsgTitle[MAX_PATH];
@@ -1741,15 +1740,15 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
 
   TRACE("hwnd=%p\n", hwnd);
 
+  if(BrowseSelectedFolder(hwnd))
+      return FALSE;
+
   /* get the files from the edit control */
   nFileCount = FILEDLG95_FILENAME_GetFileNames(hwnd, &lpstrFileList, &sizeUsed, '\0');
 
   /* try if the user selected a folder in the shellview */
   if(nFileCount == 0)
-  {
-      BrowseSelectedFolder(hwnd);
       return FALSE;
-  }
 
   if(nFileCount > 1)
   {
@@ -1810,7 +1809,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
     lpstrPathAndFile: cleaned up path
  */
 
-  nOpenAction = ONOPEN_BROWSE;
+  nOpenAction = ONOPEN_OPEN;
 
   /* don't apply any checks with OFN_NOVALIDATE */
   {
@@ -1943,6 +1942,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
         int iPos;
         LPWSTR lpszTemp = PathFindFileNameW(lpstrPathAndFile);
         DWORD len;
+	IPersistFolder2 * ppf2;
 
         /* replace the current filter */
         if(fodInfos->ShellInfos.lpstrCurrentFilter)
@@ -1954,12 +1954,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
         /* set the filter cb to the extension when possible */
         if(-1 < (iPos = FILEDLG95_FILETYPE_SearchExt(fodInfos->DlgInfos.hwndFileTypeCB, lpszTemp)))
         CBSetCurSel(fodInfos->DlgInfos.hwndFileTypeCB, iPos);
-      }
-      /* fall through */
-    case ONOPEN_BROWSE:   /* browse to the highest folder we could bind to */
-      TRACE("ONOPEN_BROWSE\n");
-      {
-	IPersistFolder2 * ppf2;
+
         if(SUCCEEDED(IShellFolder_QueryInterface( lpsf, &IID_IPersistFolder2, (LPVOID*)&ppf2)))
         {
           LPITEMIDLIST pidlCurrent;
@@ -1969,10 +1964,11 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
 	  {
 	    IShellBrowser_BrowseObject(fodInfos->Shell.FOIShellBrowser, pidlCurrent, SBSP_ABSOLUTE);
 	  }
-	  else if( nOpenAction == ONOPEN_SEARCH )
+	  else
 	  {
             IShellView_Refresh(fodInfos->Shell.FOIShellView);
 	  }
+          SendCustomDlgNotificationMessage(hwnd, CDN_FOLDERCHANGE);
           COMDLG32_SHFree(pidlCurrent);
         }
       }
@@ -1990,48 +1986,51 @@ BOOL FILEDLG95_OnOpen(HWND hwnd)
 	  fodInfos->ofnInfos->Flags &= ~OFN_READONLY;
 
         /* Attach the file extension with file name*/
-        ext = PathFindExtensionW(lpstrPathAndFile);
-        if (! *ext)
+
+        if(!PathIsDirectoryW(lpstrPathAndFile))
         {
-            /* if no extension is specified with file name, then */
-            /* attach the extension from file filter or default one */
+            if((ext = PathFindExtensionW(lpstrPathAndFile)) == NULL)
+            {
+                /* if no extension is specified with file name, then */
+                /* attach the extension from file filter or default one */
             
-            WCHAR *filterExt = NULL;
-            LPWSTR lpstrFilter = NULL;
-            static const WCHAR szwDot[] = {'.',0};
-            int PathLength = strlenW(lpstrPathAndFile);
+                WCHAR *filterExt = NULL;
+                LPWSTR lpstrFilter = NULL;
+                static const WCHAR szwDot[] = {'.',0};
+                int PathLength = strlenW(lpstrPathAndFile);
 
-            /* Attach the dot*/
-            strcatW(lpstrPathAndFile, szwDot);
+                /* Attach the dot*/
+                strcatW(lpstrPathAndFile, szwDot);
     
-            /*Get the file extension from file type filter*/
-            lpstrFilter = (LPWSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB,
-                                             fodInfos->ofnInfos->nFilterIndex-1);
-
-            if (lpstrFilter != (LPWSTR)CB_ERR)  /* control is not empty */
-                filterExt = PathFindExtensionW(lpstrFilter);
-
-            if ( filterExt && *filterExt ) /* attach the file extension from file type filter*/
-                strcatW(lpstrPathAndFile, filterExt + 1);
-            else if ( fodInfos->defext ) /* attach the default file extension*/
-                strcatW(lpstrPathAndFile, fodInfos->defext);
-
-            /* In Open dialog: if file does not exist try without extension */
-            if (!(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) && !PathFileExistsW(lpstrPathAndFile))
-                  lpstrPathAndFile[PathLength] = '\0';
+                /*Get the file extension from file type filter*/
+                lpstrFilter = (LPWSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB,
+                                                        fodInfos->ofnInfos->nFilterIndex-1);
+
+                if (lpstrFilter != (LPWSTR)CB_ERR)  /* control is not empty */
+                    filterExt = PathFindExtensionW(lpstrFilter);
+
+                if ( filterExt && *filterExt ) /* attach the file extension from file type filter*/
+                    strcatW(lpstrPathAndFile, filterExt + 1);
+                else if ( fodInfos->defext ) /* attach the default file extension*/
+                    strcatW(lpstrPathAndFile, fodInfos->defext);
+
+                /* 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;
+            }
         }
 
-	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;
-	}
-
 	/* In Save dialog: check if the file already exists */
 	if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG
 	    && fodInfos->ofnInfos->Flags & OFN_OVERWRITEPROMPT



More information about the wine-patches mailing list