[PATCH] shell32: make new style Browse For Folders dialog resiza=

=3D?utf-8?q?Miko=3DC5=3D82aj=3D20Zalewski?=3D mikolaj at zalewski.pl
Mon Jul 7 05:05:02 CDT 2008


ble

---
 dlls/shell32/brsfolder.c   |  124 ++++++++++++++++++++++++++++++++++++++=
+++++-
 dlls/shell32/shell32_Da.rc |    2 +-
 dlls/shell32/shell32_De.rc |    2 +-
 dlls/shell32/shell32_En.rc |    2 +-
 dlls/shell32/shell32_Es.rc |    2 +-
 dlls/shell32/shell32_Fr.rc |    2 +-
 dlls/shell32/shell32_Ko.rc |    2 +-
 dlls/shell32/shell32_Nl.rc |    2 +-
 dlls/shell32/shell32_No.rc |    2 +-
 dlls/shell32/shell32_Pl.rc |    2 +-
 dlls/shell32/shell32_Ro.rc |    2 +-
 dlls/shell32/shell32_Ru.rc |    2 +-
 dlls/shell32/shell32_Si.rc |    2 +-
 13 files changed, 135 insertions(+), 13 deletions(-)

diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c
index 45e7519..00cf728 100644
--- a/dlls/shell32/brsfolder.c
+++ b/dlls/shell32/brsfolder.c
@@ -20,7 +20,6 @@
  *  - many flags unimplemented
  *    - implement new dialog style "make new folder" button
  *    - implement editbox
- *    - implement new dialog style resizing
  */
=20
 #include <stdlib.h>
@@ -39,12 +38,21 @@
=20
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
=20
+/* original margins and control size */
+typedef struct tagLAYOUT_DATA
+{
+    LONG left, width, right;
+    LONG top, height, bottom;
+} LAYOUT_DATA;
+
 typedef struct tagbrowse_info
 {
     HWND          hWnd;
     HWND          hwndTreeView;
     LPBROWSEINFOW lpBrowseInfo;
     LPITEMIDLIST  pidlRet;
+    LAYOUT_DATA  *layout;  /* filled by LayoutInit, used by LayoutUpdate=
 */
+    SIZE          szMin;
 } browse_info;
=20
 typedef struct tagTV_ITEMDATA
@@ -55,6 +63,26 @@ typedef struct tagTV_ITEMDATA
    IEnumIDList*  pEnumIL;    /* Children iterator */=20
 } TV_ITEMDATA, *LPTV_ITEMDATA;
=20
+typedef struct tagLAYOUT_INFO
+{
+    int iItemId;          /* control id */
+    DWORD dwAnchor;       /* BF_* flags specifying which margins should =
remain constant */
+} LAYOUT_INFO;
+
+static const LAYOUT_INFO g_layout_info[] =3D
+{
+    {IDD_TITLE,         BF_TOP|BF_LEFT|BF_RIGHT},
+    {IDD_STATUS,        BF_TOP|BF_LEFT|BF_RIGHT},
+    {IDD_FOLDER,        BF_TOP|BF_LEFT|BF_RIGHT},
+    {IDD_TREEVIEW,      BF_TOP|BF_BOTTOM|BF_LEFT|BF_RIGHT},
+    {IDD_FOLDERTEXT,    BF_BOTTOM|BF_LEFT|BF_RIGHT},
+    {IDD_MAKENEWFOLDER, BF_BOTTOM|BF_LEFT},
+    {IDOK,              BF_BOTTOM|BF_RIGHT},
+    {IDCANCEL,          BF_BOTTOM|BF_RIGHT}
+};
+
+#define LAYOUT_INFO_COUNT (sizeof(g_layout_info)/sizeof(g_layout_info[0]=
))
+
 #define SUPPORTEDFLAGS (BIF_STATUSTEXT | \
                         BIF_BROWSEFORCOMPUTER | \
                         BIF_RETURNFSANCESTORS | \
@@ -87,6 +115,68 @@ static void browsefolder_callback( LPBROWSEINFOW lpBr=
owseInfo, HWND hWnd,
     lpBrowseInfo->lpfn( hWnd, msg, param, lpBrowseInfo->lParam );
 }
=20
+static LAYOUT_DATA *LayoutInit(HWND hwnd, const LAYOUT_INFO *layout_info=
, int layout_count)
+{
+    LAYOUT_DATA *data;
+    RECT rcWnd;
+    int i;
+
+    GetClientRect(hwnd, &rcWnd);
+    data =3D SHAlloc(sizeof(LAYOUT_DATA)*layout_count);
+    for (i =3D 0; i < layout_count; i++)
+    {
+        RECT r;
+        HWND hItem =3D GetDlgItem(hwnd, layout_info[i].iItemId);
+
+        if (hItem =3D=3D NULL)
+            ERR("Item %d not found\n", i);
+        GetWindowRect(hItem, &r);
+        MapWindowPoints(HWND_DESKTOP, hwnd, (LPPOINT)&r, 2);
+
+        data[i].left =3D r.left;
+        data[i].right =3D rcWnd.right - r.right;
+        data[i].width =3D r.right - r.left;
+
+        data[i].top =3D r.top;
+        data[i].bottom =3D rcWnd.bottom - r.bottom;
+        data[i].height =3D r.bottom - r.top;
+    }
+    return data;
+}
+
+static void LayoutUpdate(HWND hwnd, LAYOUT_DATA *data, const LAYOUT_INFO=
 *layout_info, int layout_count)
+{
+    RECT rcWnd;
+    int i;
+
+    GetClientRect(hwnd, &rcWnd);
+    for (i =3D 0; i < layout_count; i++)
+    {
+        RECT r;
+        HWND hItem =3D GetDlgItem(hwnd, layout_info[i].iItemId);
+
+        GetWindowRect(hItem, &r);
+        MapWindowPoints(HWND_DESKTOP, hwnd, (LPPOINT)&r, 2);
+
+        if (layout_info[i].dwAnchor & BF_RIGHT)
+        {
+            r.right =3D rcWnd.right - data[i].right;
+            if (!(layout_info[i].dwAnchor & BF_LEFT))
+                r.left =3D r.right - data[i].width;
+        }
+
+        if (layout_info[i].dwAnchor & BF_BOTTOM)
+        {
+            r.bottom =3D rcWnd.bottom - data[i].bottom;
+            if (!(layout_info[i].dwAnchor & BF_TOP))
+                r.top =3D r.bottom - data[i].height;
+        }
+
+        SetWindowPos(hItem, NULL, r.left, r.top, r.right - r.left, r.bot=
tom - r.top, SWP_NOZORDER);
+    }
+}
+
+
 /***********************************************************************=
*******
  * InitializeTreeView [Internal]
  *
@@ -504,6 +594,18 @@ static BOOL BrsFolder_OnCreate( HWND hWnd, browse_in=
fo *info )
     if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS)
 	FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDF=
LAGS);
=20
+    if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)
+    {
+        RECT rcWnd;
+
+        info->layout =3D LayoutInit(hWnd, g_layout_info, LAYOUT_INFO_COU=
NT);
+
+        /* TODO: Windows allows shrinking the windows a bit */
+        GetWindowRect(hWnd, &rcWnd);
+        info->szMin.cx =3D rcWnd.right - rcWnd.left;
+        info->szMin.cy =3D rcWnd.bottom - rcWnd.top;
+    }
+
     if (lpBrowseInfo->lpszTitle)
 	SetWindowTextW( GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle );
     else
@@ -682,6 +784,18 @@ static BOOL BrsFolder_OnSetSelectionA(browse_info *i=
nfo, LPVOID selection, BOOL
     return result;
 }
=20
+static BOOL BrsFolder_OnWindowPosChanging(browse_info *info, WINDOWPOS *=
pos)
+{
+    if ((info->lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) && !(pos->fla=
gs & SWP_NOSIZE))
+    {
+        if (pos->cx < info->szMin.cx)
+            pos->cx =3D info->szMin.cx;
+        if (pos->cy < info->szMin.cy)
+            pos->cy =3D info->szMin.cy;
+    }
+    return 0;
+}
+
 /***********************************************************************=
**
  *             BrsFolderDlgProc32  (not an exported API function)
  */
@@ -704,6 +818,14 @@ static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd,=
 UINT msg, WPARAM wParam,
=20
     case WM_COMMAND:
         return BrsFolder_OnCommand( info, wParam );
+   =20
+    case WM_WINDOWPOSCHANGING:
+        return BrsFolder_OnWindowPosChanging( info, (WINDOWPOS *)lParam)=
;
+
+    case WM_SIZE:
+        if (info->layout)  /* new style dialogs */
+            LayoutUpdate(hWnd, info->layout, g_layout_info, LAYOUT_INFO_=
COUNT);
+        return 0;
=20
     case BFFM_SETSTATUSTEXTA:
         TRACE("Set status %s\n", debugstr_a((LPSTR)lParam));
diff --git a/dlls/shell32/shell32_Da.rc b/dlls/shell32/shell32_Da.rc
index 59f8c62..c525c88 100644
--- a/dlls/shell32/shell32_Da.rc
+++ b/dlls/shell32/shell32_Da.rc
@@ -107,7 +107,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "V=E6lg Folder"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_De.rc b/dlls/shell32/shell32_De.rc
index e6dc749..e8ac7cb 100644
--- a/dlls/shell32/shell32_De.rc
+++ b/dlls/shell32/shell32_De.rc
@@ -107,7 +107,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Verzeichnis ausw=E4hlen"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_En.rc b/dlls/shell32/shell32_En.rc
index 732490b..ce84374 100644
--- a/dlls/shell32/shell32_En.rc
+++ b/dlls/shell32/shell32_En.rc
@@ -106,7 +106,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Browse for Folder"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Es.rc b/dlls/shell32/shell32_Es.rc
index 15abaf1..b545460 100644
--- a/dlls/shell32/shell32_Es.rc
+++ b/dlls/shell32/shell32_Es.rc
@@ -107,7 +107,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Explorar carpeta"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Fr.rc b/dlls/shell32/shell32_Fr.rc
index 9378b94..face6f1 100644
--- a/dlls/shell32/shell32_Fr.rc
+++ b/dlls/shell32/shell32_Fr.rc
@@ -112,7 +112,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Parcourir les dossiers"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Ko.rc b/dlls/shell32/shell32_Ko.rc
index 04f4af0..0f5fb8f 100644
--- a/dlls/shell32/shell32_Ko.rc
+++ b/dlls/shell32/shell32_Ko.rc
@@ -108,7 +108,7 @@ WS_BORDER | WS_TABSTOP,
=20
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "=C6=FA=B4=F5 =C5=BD=BB=F6"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Nl.rc b/dlls/shell32/shell32_Nl.rc
index d50e011..f24bc61 100644
--- a/dlls/shell32/shell32_Nl.rc
+++ b/dlls/shell32/shell32_Nl.rc
@@ -108,7 +108,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Bladeren naar Map"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_No.rc b/dlls/shell32/shell32_No.rc
index b6ad967..6acd396 100644
--- a/dlls/shell32/shell32_No.rc
+++ b/dlls/shell32/shell32_No.rc
@@ -106,7 +106,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Bla etter mappe"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Pl.rc b/dlls/shell32/shell32_Pl.rc
index 8099ab5..3df49c8 100644
--- a/dlls/shell32/shell32_Pl.rc
+++ b/dlls/shell32/shell32_Pl.rc
@@ -107,7 +107,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Wybierz folder"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Ro.rc b/dlls/shell32/shell32_Ro.rc
index 36789ca..0694d2f 100644
--- a/dlls/shell32/shell32_Ro.rc
+++ b/dlls/shell32/shell32_Ro.rc
@@ -109,7 +109,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Selectare dosar"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Ru.rc b/dlls/shell32/shell32_Ru.rc
index ebd7b96..d68f1d5 100644
--- a/dlls/shell32/shell32_Ru.rc
+++ b/dlls/shell32/shell32_Ru.rc
@@ -107,7 +107,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "=CE=E1=E7=EE=F0"
 FONT 8, "MS Shell Dlg"
 {
diff --git a/dlls/shell32/shell32_Si.rc b/dlls/shell32/shell32_Si.rc
index ccf9420..18ce181 100644
--- a/dlls/shell32/shell32_Si.rc
+++ b/dlls/shell32/shell32_Si.rc
@@ -108,7 +108,7 @@ FONT 8, "MS Shell Dlg"
 }
=20
 SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, =
218, 196
-STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFO=
NT | DS_3DLOOK
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX | DS_MODALFRA=
ME | DS_SETFONT | DS_3DLOOK
 CAPTION "Brskanje po mapah"
 FONT 8, "MS Shell Dlg"
 {
--=20
1.5.4


--------------030702010605060401000501--



More information about the wine-patches mailing list