Sync to Wine-20050830:
Michael Jung <mjung@iss.tu-darmstadt.de>
- Check the GetPidlFromDataObject's doSelected parameter before calling
  a method on it.
Alexandre Julliard <julliard@winehq.org>
- Replace the _ICOM_THIS_From macros by inline functions the way it's
  already done in shelllink.c.
Vincent Béron <vberon@mecano.gme.usherb.ca>
- Uniformize DllMain TRACEing across dlls.
Vitaly Lipatov <lav@etersoft.ru>
- Restore paper orientation when pagesetupdlg is initializing.
Troy Rollo <wine@troy.rollo.name>
- Browse to the directory if a directory name is typed into the edit box
  of a file dialog and the confirmation button (or Enter key) is hit.
  Return any file name in the edit box if OFN_NOVALIDATE is set and
  OFN_FILEMUSTEXIST is not, even if that file name includes a path name
  or is the name of a folder.
Modified: trunk/reactos/lib/comdlg32/cdlg32.c
Modified: trunk/reactos/lib/comdlg32/comdlg32.spec
Modified: trunk/reactos/lib/comdlg32/filedlg.c
Modified: trunk/reactos/lib/comdlg32/filedlgbrowser.c
Modified: trunk/reactos/lib/comdlg32/filedlgbrowser.h
Modified: trunk/reactos/lib/comdlg32/printdlg.c

Modified: trunk/reactos/lib/comdlg32/cdlg32.c
--- trunk/reactos/lib/comdlg32/cdlg32.c	2005-09-05 20:25:31 UTC (rev 17665)
+++ trunk/reactos/lib/comdlg32/cdlg32.c	2005-09-05 21:04:10 UTC (rev 17666)
@@ -73,7 +73,7 @@
 
 BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
 {
-	TRACE("(%p, %08lx, %p)\n", hInstance, Reason, Reserved);
+	TRACE("(%p, %ld, %p)\n", hInstance, Reason, Reserved);
 
 	switch(Reason)
 	{

Modified: trunk/reactos/lib/comdlg32/comdlg32.spec
--- trunk/reactos/lib/comdlg32/comdlg32.spec	2005-09-05 20:25:31 UTC (rev 17665)
+++ trunk/reactos/lib/comdlg32/comdlg32.spec	2005-09-05 21:04:10 UTC (rev 17666)
@@ -1,25 +1,25 @@
-@ stdcall ChooseColorA(ptr)
-@ stdcall ChooseColorW(ptr)
-@ stdcall ChooseFontA(ptr)
-@ stdcall ChooseFontW(ptr)
-@ stdcall CommDlgExtendedError()
-@ stdcall FindTextA(ptr)
-@ stdcall FindTextW(ptr)
-@ stdcall GetFileTitleA(str ptr long)
-@ stdcall GetFileTitleW(wstr ptr long)
-@ stdcall GetOpenFileNameA(ptr)
-@ stdcall GetOpenFileNameW(ptr)
-@ stdcall GetSaveFileNameA(ptr)
-@ stdcall GetSaveFileNameW(ptr)
-@ stub LoadAlterBitmap
-@ stdcall PageSetupDlgA(ptr)
-@ stdcall PageSetupDlgW(ptr)
-@ stdcall PrintDlgA(ptr)
-@ stdcall PrintDlgExA(ptr)
-@ stdcall PrintDlgExW(ptr)
-@ stdcall PrintDlgW(ptr)
-@ stdcall ReplaceTextA(ptr)
-@ stdcall ReplaceTextW(ptr)
-@ stub WantArrows
-@ stub dwLBSubclass
-@ stub dwOKSubclass
+@ stdcall ChooseColorA(ptr)
+@ stdcall ChooseColorW(ptr)
+@ stdcall ChooseFontA(ptr)
+@ stdcall ChooseFontW(ptr)
+@ stdcall CommDlgExtendedError()
+@ stdcall FindTextA(ptr)
+@ stdcall FindTextW(ptr)
+@ stdcall GetFileTitleA(str ptr long)
+@ stdcall GetFileTitleW(wstr ptr long)
+@ stdcall GetOpenFileNameA(ptr)
+@ stdcall GetOpenFileNameW(ptr)
+@ stdcall GetSaveFileNameA(ptr)
+@ stdcall GetSaveFileNameW(ptr)
+@ stub LoadAlterBitmap
+@ stdcall PageSetupDlgA(ptr)
+@ stdcall PageSetupDlgW(ptr)
+@ stdcall PrintDlgA(ptr)
+@ stdcall PrintDlgExA(ptr)
+@ stdcall PrintDlgExW(ptr)
+@ stdcall PrintDlgW(ptr)
+@ stdcall ReplaceTextA(ptr)
+@ stdcall ReplaceTextW(ptr)
+@ stub WantArrows
+@ stub dwLBSubclass
+@ stub dwOKSubclass

Modified: trunk/reactos/lib/comdlg32/filedlg.c
--- trunk/reactos/lib/comdlg32/filedlg.c	2005-09-05 20:25:31 UTC (rev 17665)
+++ trunk/reactos/lib/comdlg32/filedlg.c	2005-09-05 21:04:10 UTC (rev 17666)
@@ -1711,8 +1711,9 @@
  *
  * If the function succeeds, the return value is nonzero.
  */
-#define ONOPEN_OPEN   1
-#define ONOPEN_SEARCH 2
+#define ONOPEN_BROWSE 1
+#define ONOPEN_OPEN   2
+#define ONOPEN_SEARCH 3
 static void FILEDLG95_OnOpenMessage(HWND hwnd, int idCaption, int idText)
 {
   WCHAR strMsgTitle[MAX_PATH];
@@ -1739,15 +1740,15 @@
 
   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)
   {
@@ -1808,7 +1809,12 @@
     lpstrPathAndFile: cleaned up path
  */
 
-  nOpenAction = ONOPEN_OPEN;
+  if (nFileCount &&
+      (fodInfos->ofnInfos->Flags & OFN_NOVALIDATE) &&
+      !(fodInfos->ofnInfos->Flags & OFN_FILEMUSTEXIST))
+    nOpenAction = ONOPEN_OPEN;
+  else
+    nOpenAction = ONOPEN_BROWSE;
 
   /* don't apply any checks with OFN_NOVALIDATE */
   {
@@ -1842,7 +1848,8 @@
       *p = 0;
       lpszTemp = lpszTemp + strlenW(lpwstrTemp);
 
-      if(*lpszTemp==0)
+      /* There are no wildcards when OFN_NOVALIDATE is set */
+      if(*lpszTemp==0 && !(fodInfos->ofnInfos->Flags & OFN_NOVALIDATE))
       {
         static const WCHAR wszWild[] = { '*', '?', 0 };
 	/* if the last element is a wildcard do a search */
@@ -1941,7 +1948,6 @@
         int iPos;
         LPWSTR lpszTemp = PathFindFileNameW(lpstrPathAndFile);
         DWORD len;
-	IPersistFolder2 * ppf2;
 
         /* replace the current filter */
         if(fodInfos->ShellInfos.lpstrCurrentFilter)
@@ -1953,7 +1959,12 @@
         /* 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;
@@ -1963,11 +1974,10 @@
 	  {
 	    IShellBrowser_BrowseObject(fodInfos->Shell.FOIShellBrowser, pidlCurrent, SBSP_ABSOLUTE);
 	  }
-	  else
+	  else if( nOpenAction == ONOPEN_SEARCH )
 	  {
             IShellView_Refresh(fodInfos->Shell.FOIShellView);
 	  }
-          SendCustomDlgNotificationMessage(hwnd, CDN_FOLDERCHANGE);
           COMDLG32_SHFree(pidlCurrent);
         }
       }
@@ -1985,51 +1995,48 @@
 	  fodInfos->ofnInfos->Flags &= ~OFN_READONLY;
 
         /* Attach the file extension with file name*/
-
-        if(!PathIsDirectoryW(lpstrPathAndFile))
+        ext = PathFindExtensionW(lpstrPathAndFile);
+        if (! *ext)
         {
-            if((ext = PathFindExtensionW(lpstrPathAndFile)) == NULL)
-            {
-                /* if no extension is specified with file name, then */
-                /* attach the extension from file filter or default one */
+            /* 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);
+            /*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 (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);
+            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;
-            }
+            /* 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;
+	}
+
 	/* In Save dialog: check if the file already exists */
 	if (fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG
 	    && fodInfos->ofnInfos->Flags & OFN_OVERWRITEPROMPT
@@ -3201,6 +3208,9 @@
 
     TRACE("sv=%p index=%u\n", doSelected, nPidlIndex);
 
+    if (!doSelected)
+        return NULL;
+	
     /* Set the FORMATETC structure*/
     SETDefFormatEtc(formatetc, RegisterClipboardFormatA(CFSTR_SHELLIDLIST), TYMED_HGLOBAL);
 

Modified: trunk/reactos/lib/comdlg32/filedlgbrowser.c
--- trunk/reactos/lib/comdlg32/filedlgbrowser.c	2005-09-05 20:25:31 UTC (rev 17665)
+++ trunk/reactos/lib/comdlg32/filedlgbrowser.c	2005-09-05 21:04:10 UTC (rev 17666)
@@ -55,6 +55,16 @@
 
 } IShellBrowserImpl;
 
+static inline IShellBrowserImpl *impl_from_ICommDlgBrowser( ICommDlgBrowser *iface )
+{
+    return (IShellBrowserImpl *)((char*)iface - FIELD_OFFSET(IShellBrowserImpl, lpVtblCommDlgBrowser));
+}
+
+static inline IShellBrowserImpl *impl_from_IServiceProvider( IServiceProvider *iface )
+{
+    return (IShellBrowserImpl *)((char*)iface - FIELD_OFFSET(IShellBrowserImpl, lpVtblServiceProvider));
+}
+
 /**************************************************************************
 *   vtable
 */
@@ -728,11 +738,11 @@
 	REFIID riid,
 	LPVOID *ppvObj)
 {
-    _ICOM_THIS_FromICommDlgBrowser(IShellBrowser,iface);
+    IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface);
 
     TRACE("(%p)\n", This);
 
-    return IShellBrowserImpl_QueryInterface(This,riid,ppvObj);
+    return IShellBrowserImpl_QueryInterface((IShellBrowser *)This,riid,ppvObj);
 }
 
 /**************************************************************************
@@ -740,11 +750,11 @@
 */
 static ULONG WINAPI IShellBrowserImpl_ICommDlgBrowser_AddRef(ICommDlgBrowser * iface)
 {
-    _ICOM_THIS_FromICommDlgBrowser(IShellBrowser,iface);
+    IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface);
 
     TRACE("(%p)\n", This);
 
-    return IShellBrowserImpl_AddRef(This);
+    return IShellBrowserImpl_AddRef((IShellBrowser *)This);
 }
 
 /**************************************************************************
@@ -752,11 +762,11 @@
 */
 static ULONG WINAPI IShellBrowserImpl_ICommDlgBrowser_Release(ICommDlgBrowser * iface)
 {
-    _ICOM_THIS_FromICommDlgBrowser(IShellBrowser,iface);
+    IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface);
 
     TRACE("(%p)\n", This);
 
-    return IShellBrowserImpl_Release(This);
+    return IShellBrowserImpl_Release((IShellBrowser *)This);
 }
 
 /**************************************************************************
@@ -770,7 +780,7 @@
     LPITEMIDLIST pidl;
     FileOpenDlgInfos *fodInfos;
 
-    _ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
+    IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface);
 
     TRACE("(%p)\n", This);
 
@@ -812,7 +822,7 @@
                                                                ULONG uChange)
 {
 
-    _ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
+    IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface);
 
     TRACE("(%p shv=%p)\n", This, ppshv);
 
@@ -855,7 +865,7 @@
     STRRET str;
     WCHAR szPathW[MAX_PATH];
 
-    _ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
+    IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface);
 
     TRACE("(%p)\n", This);
 
@@ -895,7 +905,7 @@
 {
     FileOpenDlgInfos *fodInfos;
 
-    _ICOM_THIS_FromICommDlgBrowser(IShellBrowserImpl,iface);
+    IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface);
 
     fodInfos = (FileOpenDlgInfos *) GetPropA(This->hwndOwner,FileOpenDlgInfosStr);
     TRACE("(%p do=%p view=%p)\n", This, fodInfos->Shell.FOIDataObject, fodInfos->Shell.FOIShellView);
@@ -942,11 +952,11 @@
 	REFIID riid,
 	LPVOID *ppvObj)
 {
-    _ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
+    IShellBrowserImpl *This = impl_from_IServiceProvider(iface);
 
     FIXME("(%p)\n", This);
 
-    return IShellBrowserImpl_QueryInterface(This,riid,ppvObj);
+    return IShellBrowserImpl_QueryInterface((IShellBrowser *)This,riid,ppvObj);
 }
 
 /**************************************************************************
@@ -954,11 +964,11 @@
 */
 static ULONG WINAPI IShellBrowserImpl_IServiceProvider_AddRef(IServiceProvider * iface)
 {
-    _ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
+    IShellBrowserImpl *This = impl_from_IServiceProvider(iface);
 
     FIXME("(%p)\n", This);
 
-    return IShellBrowserImpl_AddRef(This);
+    return IShellBrowserImpl_AddRef((IShellBrowser *)This);
 }
 
 /**************************************************************************
@@ -966,11 +976,11 @@
 */
 static ULONG WINAPI IShellBrowserImpl_IServiceProvider_Release(IServiceProvider * iface)
 {
-    _ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
+    IShellBrowserImpl *This = impl_from_IServiceProvider(iface);
 
     FIXME("(%p)\n", This);
 
-    return IShellBrowserImpl_Release(This);
+    return IShellBrowserImpl_Release((IShellBrowser *)This);
 }
 
 /**************************************************************************
@@ -990,14 +1000,14 @@
 	REFIID riid,
 	void** ppv)
 {
-    _ICOM_THIS_FromIServiceProvider(IShellBrowser,iface);
+    IShellBrowserImpl *This = impl_from_IServiceProvider(iface);
 
     FIXME("(%p)\n\t%s\n\t%s\n", This,debugstr_guid(guidService), debugstr_guid(riid) );
 
     *ppv = NULL;
     if(guidService && IsEqualIID(guidService, &SID_STopLevelBrowser))
     {
-      return IShellBrowserImpl_QueryInterface(This,riid,ppv);
+      return IShellBrowserImpl_QueryInterface((IShellBrowser *)This,riid,ppv);
     }
     FIXME("(%p) unknown interface requested\n", This);
     return E_NOINTERFACE;

Modified: trunk/reactos/lib/comdlg32/filedlgbrowser.h
--- trunk/reactos/lib/comdlg32/filedlgbrowser.h	2005-09-05 20:25:31 UTC (rev 17665)
+++ trunk/reactos/lib/comdlg32/filedlgbrowser.h	2005-09-05 21:04:10 UTC (rev 17666)
@@ -37,12 +37,7 @@
 /***********************************************************************
  * Defines and global variables
  */
-#define _ICommDlgBrowser_Offset ((int)(&(((IShellBrowserImpl*)0)->lpVtblCommDlgBrowser)))
-#define _ICOM_THIS_FromICommDlgBrowser(class, name) class* This = (class*)(((char*)name)-_ICommDlgBrowser_Offset);
 
-#define _IServiceProvider_Offset ((int)(&(((IShellBrowserImpl*)0)->lpVtblServiceProvider)))
-#define _ICOM_THIS_FromIServiceProvider(class, name) class* This = (class*)(((char*)name)-_IServiceProvider_Offset);
-
 /* dialog internal property */
 
 #define FODPROP_SAVEDLG 0x0001  /* File dialog is a Save file dialog */

Modified: trunk/reactos/lib/comdlg32/printdlg.c
--- trunk/reactos/lib/comdlg32/printdlg.c	2005-09-05 20:25:31 UTC (rev 17665)
+++ trunk/reactos/lib/comdlg32/printdlg.c	2005-09-05 21:04:10 UTC (rev 17666)
@@ -2968,7 +2968,7 @@
     HDC hdc;
     HBRUSH hbrush, holdbrush;
     PageSetupDataA *pda;
-    int papersize=0, orientation=0; /* FIXME: set this values */
+    int papersize=0, orientation=0; /* FIXME: set this values for user paint hook */
     double scalx, scaly;
 #define CALLPAINTHOOK(msg,lprc) PRINTDLG_DefaultPagePaintHook( hWnd, msg, (WPARAM)hdc, (LPARAM)lprc, pda)
 
@@ -3085,11 +3085,8 @@
 	/* FIXME: Paint hook. Must it be at begin of initializtion or at end? */
 	res = TRUE;
 	if (pda->dlga->Flags & PSD_ENABLEPAGESETUPHOOK) {
-	    res = pda->dlga->lpfnPageSetupHook(hDlg,uMsg,wParam,(LPARAM)pda->dlga);
-	    if (!res) {
+            if (!pda->dlga->lpfnPageSetupHook(hDlg,uMsg,wParam,(LPARAM)pda->dlga))
 		FIXME("Setup page hook failed?\n");
-		res = TRUE;
-	    }
 	}
 
 	/* if printer button disabled */
@@ -3102,11 +3099,14 @@
             EnableWindow(GetDlgItem(hDlg, edt6), FALSE);
             EnableWindow(GetDlgItem(hDlg, edt7), FALSE);
 	}
-	/* width larger as height -> landscape */
-	if (pda->dlga->ptPaperSize.x > pda->dlga->ptPaperSize.y)
+        /* Set orientation radiobutton properly */
+        dm = GlobalLock(pda->dlga->hDevMode);
+        if (dm->u.s.dmOrientation == DMORIENT_LANDSCAPE)
             CheckRadioButton(hDlg, rad1, rad2, rad2);
 	else /* this is default if papersize is not set */
             CheckRadioButton(hDlg, rad1, rad2, rad1);
+        GlobalUnlock(pda->dlga->hDevMode);
+
 	/* if orientation disabled */
 	if (pda->dlga->Flags & PSD_DISABLEORIENTATION) {
 	    EnableWindow(GetDlgItem(hDlg,rad1),FALSE);
@@ -3151,6 +3151,11 @@
             GlobalUnlock(pda->pdlg.hDevMode);
 	    pda->curdlg.ptPaperSize.x = _c_10mm2size(pda->dlga, pda->curdlg.ptPaperSize.x);
 	    pda->curdlg.ptPaperSize.y = _c_10mm2size(pda->dlga, pda->curdlg.ptPaperSize.y);
+            if (IsDlgButtonChecked(hDlg, rad2) == BST_CHECKED) { /* Landscape orientation */
+                DWORD tmp = pda->curdlg.ptPaperSize.y;
+                pda->curdlg.ptPaperSize.y = pda->curdlg.ptPaperSize.x;
+                pda->curdlg.ptPaperSize.x = tmp;
+            }
 	} else 
 	    WARN("GlobalLock(pda->pdlg.hDevMode) fail? hDevMode=%ld", (DWORD)pda->pdlg.hDevMode);
 	/* Drawing paper prev */