SHELL32: split up the window procedure

Mike McCormack mike at codeweavers.com
Thu Apr 28 06:44:21 CDT 2005


ChangeLog:
* split up the window procedure
-------------- next part --------------
Index: dlls/shell32/brsfolder.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/brsfolder.c,v
retrieving revision 1.57
diff -u -p -r1.57 brsfolder.c
--- dlls/shell32/brsfolder.c	22 Apr 2005 19:07:00 -0000	1.57
+++ dlls/shell32/brsfolder.c	28 Apr 2005 11:43:31 -0000
@@ -41,6 +41,14 @@ static HWND		hwndTreeView;
 static LPBROWSEINFOW	lpBrowseInfo;
 static LPITEMIDLIST	pidlRet;
 
+typedef struct tagID
+{
+   LPSHELLFOLDER lpsfParent; /* IShellFolder of the parent */
+   LPITEMIDLIST  lpi;        /* PIDL relativ to parent */
+   LPITEMIDLIST  lpifq;      /* Fully qualified PIDL */
+   IEnumIDList*  pEnumIL;    /* Children iterator */ 
+} TV_ITEMDATA, *LPTV_ITEMDATA;
+
 static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST  lpifq, HTREEITEM hParent, IEnumIDList* lpe);
 static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent);
 
@@ -174,14 +182,6 @@ static void GetNormalAndSelectedIcons(LP
 	return;
 }
 
-typedef struct tagID
-{
-   LPSHELLFOLDER lpsfParent; /* IShellFolder of the parent */
-   LPITEMIDLIST  lpi;        /* PIDL relativ to parent */
-   LPITEMIDLIST  lpifq;      /* Fully qualified PIDL */
-   IEnumIDList*  pEnumIL;    /* Children iterator */ 
-} TV_ITEMDATA, *LPTV_ITEMDATA;
-
 /******************************************************************************
  * GetName [Internal]
  *
@@ -347,177 +347,220 @@ static void BrsFolder_CheckValidSelectio
     LPCITEMIDLIST pidl = lptvid->lpi;
     BOOL bEnabled = TRUE;
     DWORD dwAttributes;
+    HRESULT r;
+
     if ((lpBrowseInfo->ulFlags & BIF_BROWSEFORCOMPUTER) &&
         !PIDLIsType(pidl, PT_COMP))
         bEnabled = FALSE;
     if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS)
     {
         dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM;
-        if (FAILED(IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1, (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes)) ||
-            !dwAttributes)
+        r = IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1,
+                                (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes);
+        if (FAILED(r) || !dwAttributes)
             bEnabled = FALSE;
     }
     if (lpBrowseInfo->ulFlags & BIF_RETURNONLYFSDIRS)
     {
         dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM;
-        if (FAILED(IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1, (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes)) ||
-            (dwAttributes != (SFGAO_FOLDER | SFGAO_FILESYSTEM)))
+        r = IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1,
+                                (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes);
+        if (FAILED(r) || (dwAttributes != (SFGAO_FOLDER | SFGAO_FILESYSTEM)))
             bEnabled = FALSE;
     }
     SendMessageW(hWndTree, BFFM_ENABLEOK, 0, (LPARAM)bEnabled);
 }
 
-static LRESULT MsgNotify(HWND hWnd,  UINT CtlID, LPNMHDR lpnmh)
+static LRESULT BrsFolder_Treeview_Delete( NMTREEVIEWW *pnmtv )
 {
-	NMTREEVIEWW	*pnmtv   = (NMTREEVIEWW *)lpnmh;
-	LPTV_ITEMDATA	lptvid;  /* Long pointer to TreeView item data */
-	IShellFolder *	lpsf2=0;
+    LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA)pnmtv->itemOld.lParam;
 
+    TRACE("TVN_DELETEITEMA/W %p\n", lptvid);
 
-	TRACE("%p %x %p msg=%x\n", hWnd,  CtlID, lpnmh, pnmtv->hdr.code);
+    IShellFolder_Release(lptvid->lpsfParent);
+    if (lptvid->pEnumIL)
+        IEnumIDList_Release(lptvid->pEnumIL);
+    SHFree(lptvid->lpi);
+    SHFree(lptvid->lpifq);
+    SHFree(lptvid);
+    return 0;
+}
 
-	switch (pnmtv->hdr.idFrom)
-	{ case IDD_TREEVIEW:
-	    switch (pnmtv->hdr.code)
-	    {
-	      case TVN_DELETEITEMA:
-	      case TVN_DELETEITEMW:
-                TRACE("TVN_DELETEITEMA/W\n");
-	        lptvid=(LPTV_ITEMDATA)pnmtv->itemOld.lParam;
-	        IShellFolder_Release(lptvid->lpsfParent);
-	        if (lptvid->pEnumIL)
-	          IEnumIDList_Release(lptvid->pEnumIL);
-	        SHFree(lptvid->lpi);
-	        SHFree(lptvid->lpifq);
-	        SHFree(lptvid);
-	        break;
-
-	      case TVN_ITEMEXPANDINGA:
-	      case TVN_ITEMEXPANDINGW:
-		{
-                  TRACE("TVN_ITEMEXPANDINGA/W\n");
-		  if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
-	            break;
-
-	          lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam;
-	          if (SUCCEEDED(IShellFolder_BindToObject(lptvid->lpsfParent, lptvid->lpi,0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf2)))
-	          { FillTreeView( lpsf2, lptvid->lpifq, pnmtv->itemNew.hItem, lptvid->pEnumIL);
-	          }
-	          /* My Computer is already sorted and trying to do a simple text
-	           * sort will only mess things up */
-	          if (!_ILIsMyComputer(lptvid->lpi))
-	            TreeView_SortChildren(hwndTreeView, pnmtv->itemNew.hItem, FALSE);
-		}
-	        break;
-	      case TVN_SELCHANGEDA:
-	      case TVN_SELCHANGEDW:
-	        lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam;
-		pidlRet = lptvid->lpifq;
-		if (lpBrowseInfo->lpfn)
-		   (lpBrowseInfo->lpfn)(hWnd, BFFM_SELCHANGED, (LPARAM)pidlRet, lpBrowseInfo->lParam);
-		BrsFolder_CheckValidSelection(hWnd, lptvid);
-	        break;
-
-	      default:
-	        WARN("unhandled (%d)\n", pnmtv->hdr.code);
-		break;
-	    }
-	    break;
+static LRESULT BrsFolder_Treeview_Expand( NMTREEVIEWW *pnmtv )
+{
+    IShellFolder *lpsf2 = NULL;
+    LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
+    HRESULT r;
 
-	  default:
-	    break;
-	}
+    TRACE("TVN_ITEMEXPANDINGA/W\n");
 
-	return 0;
+    if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
+        return 0;
+
+    r = IShellFolder_BindToObject( lptvid->lpsfParent, lptvid->lpi, 0,
+                                  (REFIID)&IID_IShellFolder, (LPVOID *)&lpsf2 );
+    if (SUCCEEDED(r))
+        FillTreeView( lpsf2, lptvid->lpifq, pnmtv->itemNew.hItem, lptvid->pEnumIL);
+
+    /* My Computer is already sorted and trying to do a simple text
+     * sort will only mess things up */
+    if (!_ILIsMyComputer(lptvid->lpi))
+        TreeView_SortChildren(hwndTreeView, pnmtv->itemNew.hItem, FALSE);
+
+    return 0;
 }
 
+static HRESULT BrsFolder_Treeview_Changed( HWND hWnd, NMTREEVIEWW *pnmtv )
+{
+    LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
+
+    lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
+    pidlRet = lptvid->lpifq;
+    if (lpBrowseInfo->lpfn)
+        (lpBrowseInfo->lpfn)(hWnd, BFFM_SELCHANGED, (LPARAM)pidlRet, lpBrowseInfo->lParam);
+    BrsFolder_CheckValidSelection(hWnd, lptvid);
+    return 0;
+}
+
+static LRESULT BrsFolder_OnNotify( HWND hWnd, UINT CtlID, LPNMHDR lpnmh )
+{
+    NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh;
+
+    TRACE("%p %x %p msg=%x\n", hWnd,  CtlID, lpnmh, pnmtv->hdr.code);
+
+    if (pnmtv->hdr.idFrom != IDD_TREEVIEW)
+        return 0;
+
+    switch (pnmtv->hdr.code)
+    {
+    case TVN_DELETEITEMA:
+    case TVN_DELETEITEMW:
+        return BrsFolder_Treeview_Delete( pnmtv );
+
+    case TVN_ITEMEXPANDINGA:
+    case TVN_ITEMEXPANDINGW:
+        return BrsFolder_Treeview_Expand( pnmtv );
+
+    case TVN_SELCHANGEDA:
+    case TVN_SELCHANGEDW:
+        return BrsFolder_Treeview_Changed( hWnd, pnmtv );
+
+    default:
+        WARN("unhandled (%d)\n", pnmtv->hdr.code);
+        break;
+    }
+
+    return 0;
+}
+
+
+static BOOL BrsFolder_OnCreate( HWND hWnd, LPBROWSEINFOW lpbi )
+{
+    pidlRet = NULL;
+    lpBrowseInfo = lpbi;
+
+    if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS)
+	FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS);
+
+    if (lpBrowseInfo->lpszTitle)
+	SetWindowTextW( GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle );
+    else
+	ShowWindow( GetDlgItem(hWnd, IDD_TITLE), SW_HIDE );
+
+    if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT))
+	ShowWindow( GetDlgItem(hWnd, IDD_STATUS), SW_HIDE );
+
+    InitializeTreeView( hWnd, lpBrowseInfo->pidlRoot );
+
+    if (lpBrowseInfo->lpfn)
+	(lpBrowseInfo->lpfn)( hWnd, BFFM_INITIALIZED, 0, lpBrowseInfo->lParam );
+
+    return TRUE;
+}
+
+static BOOL BrsFolder_OnCommand( HWND hWnd, UINT id )
+{
+    switch (id)
+    {
+    case IDOK:
+        pdump( pidlRet );
+        if (lpBrowseInfo->pszDisplayName)
+            SHGetPathFromIDListW( pidlRet, lpBrowseInfo->pszDisplayName );
+        EndDialog(hWnd, (DWORD) ILClone(pidlRet));
+        return TRUE;
+
+    case IDCANCEL:
+        EndDialog(hWnd, 0);
+        return TRUE;
+    }
+    return FALSE;
+}
 
 /*************************************************************************
  *             BrsFolderDlgProc32  (not an exported API function)
  */
-static INT_PTR CALLBACK BrsFolderDlgProc(HWND hWnd, UINT msg, WPARAM wParam,
-				     LPARAM lParam )
+static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
+				          LPARAM lParam )
 {
-	TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd,  msg, wParam, lParam );
+    TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd,  msg, wParam, lParam );
 
-	switch(msg)
-	{ case WM_INITDIALOG:
-	    pidlRet = NULL;
-	    lpBrowseInfo = (LPBROWSEINFOW) lParam;
-	    if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS)
-	      FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS);
-	    if (lpBrowseInfo->lpszTitle) {
-	       SetWindowTextW(GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle);
-	    } else {
-	       ShowWindow(GetDlgItem(hWnd, IDD_TITLE), SW_HIDE);
-	    }
-	    if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT))
-	       ShowWindow(GetDlgItem(hWnd, IDD_STATUS), SW_HIDE);
+    if (msg == WM_INITDIALOG)
+        return BrsFolder_OnCreate( hWnd, (LPBROWSEINFOW) lParam );
 
-	    InitializeTreeView(hWnd, lpBrowseInfo->pidlRoot);
+    switch (msg)
+    {
+    case WM_NOTIFY:
+        return BrsFolder_OnNotify( hWnd, (UINT)wParam, (LPNMHDR)lParam);
 
-	    if (lpBrowseInfo->lpfn)
-	       (lpBrowseInfo->lpfn)(hWnd, BFFM_INITIALIZED, 0, lpBrowseInfo->lParam);
+    case WM_COMMAND:
+        return BrsFolder_OnCommand( hWnd, wParam );
 
-	    return TRUE;
-
-	  case WM_NOTIFY:
-	    MsgNotify( hWnd, (UINT)wParam, (LPNMHDR)lParam);
-	    break;
-
-	  case WM_COMMAND:
-	    switch (wParam)
-	    { case IDOK:
-	        pdump ( pidlRet );
-		if (lpBrowseInfo->pszDisplayName)
-	            SHGetPathFromIDListW(pidlRet, lpBrowseInfo->pszDisplayName);
-	        EndDialog(hWnd, (DWORD) ILClone(pidlRet));
-	        return TRUE;
-
-	      case IDCANCEL:
-	        EndDialog(hWnd, 0);
-	        return TRUE;
-	    }
-	    break;
-	case BFFM_SETSTATUSTEXTA:
-	   TRACE("Set status %s\n", debugstr_a((LPSTR)lParam));
-	   SetWindowTextA(GetDlgItem(hWnd, IDD_STATUS), (LPSTR)lParam);
-	   break;
-	case BFFM_SETSTATUSTEXTW:
-	   TRACE("Set status %s\n", debugstr_w((LPWSTR)lParam));
-	   SetWindowTextW(GetDlgItem(hWnd, IDD_STATUS), (LPWSTR)lParam);
-	   break;
-	case BFFM_ENABLEOK:
-	   TRACE("Enable %ld\n", lParam);
-	   EnableWindow(GetDlgItem(hWnd, 1), (lParam)?TRUE:FALSE);
-	   break;
-	case BFFM_SETOKTEXT: /* unicode only */
-	   TRACE("Set OK text %s\n", debugstr_w((LPWSTR)wParam));
-	   SetWindowTextW(GetDlgItem(hWnd, 1), (LPWSTR)wParam);
-	   break;
-	case BFFM_SETSELECTIONA:
-	   if (wParam)
-	      FIXME("Set selection %s\n", debugstr_a((LPSTR)lParam));
-	   else
-	      FIXME("Set selection %p\n", (void*)lParam);
-	   break;
-	case BFFM_SETSELECTIONW:
-	   if (wParam)
-	      FIXME("Set selection %s\n", debugstr_w((LPWSTR)lParam));
-	   else
-	      FIXME("Set selection %p\n", (void*)lParam);
-	   break;
-	case BFFM_SETEXPANDED: /* unicode only */
-	   if (wParam)
-	      FIXME("Set expanded %s\n", debugstr_w((LPWSTR)lParam));
-	   else
-	      FIXME("Set expanded %p\n", (void*)lParam);
-	   break;
-	}
-	return FALSE;
+    case BFFM_SETSTATUSTEXTA:
+        TRACE("Set status %s\n", debugstr_a((LPSTR)lParam));
+        SetWindowTextA(GetDlgItem(hWnd, IDD_STATUS), (LPSTR)lParam);
+        break;
+
+    case BFFM_SETSTATUSTEXTW:
+        TRACE("Set status %s\n", debugstr_w((LPWSTR)lParam));
+        SetWindowTextW(GetDlgItem(hWnd, IDD_STATUS), (LPWSTR)lParam);
+        break;
+
+    case BFFM_ENABLEOK:
+        TRACE("Enable %ld\n", lParam);
+        EnableWindow(GetDlgItem(hWnd, 1), (lParam)?TRUE:FALSE);
+        break;
+
+    case BFFM_SETOKTEXT: /* unicode only */
+        TRACE("Set OK text %s\n", debugstr_w((LPWSTR)wParam));
+        SetWindowTextW(GetDlgItem(hWnd, 1), (LPWSTR)wParam);
+        break;
+
+    case BFFM_SETSELECTIONA:
+        if (wParam)
+            FIXME("Set selection %s\n", debugstr_a((LPSTR)lParam));
+        else
+            FIXME("Set selection %p\n", (void*)lParam);
+        break;
+
+    case BFFM_SETSELECTIONW:
+        if (wParam)
+            FIXME("Set selection %s\n", debugstr_w((LPWSTR)lParam));
+        else
+            FIXME("Set selection %p\n", (void*)lParam);
+        break;
+
+    case BFFM_SETEXPANDED: /* unicode only */
+        if (wParam)
+            FIXME("Set expanded %s\n", debugstr_w((LPWSTR)lParam));
+        else
+            FIXME("Set expanded %p\n", (void*)lParam);
+        break;
+    }
+    return FALSE;
 }
 
-static const WCHAR swBrowseTempName[] = {'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0};
+static const WCHAR swBrowseTempName[] = {
+    'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0};
 
 /*************************************************************************
  * SHBrowseForFolderA [SHELL32.@]


More information about the wine-patches mailing list