comdlg32: rearrange some more controls when resizing a file dialog.

Rein Klazes wijn at online.nl
Tue Jul 7 01:11:55 CDT 2009


fixes bugs #5034 and #10394
---
 dlls/comdlg32/filedlg.c       |   65 ++++++++++++++++---
 dlls/comdlg32/tests/filedlg.c |  139 +++++++++++++++++++++++++++++++++++++---
 2 files changed, 182 insertions(+), 22 deletions(-)

diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c
index fd75479..eb92c0d 100644
--- a/dlls/comdlg32/filedlg.c
+++ b/dlls/comdlg32/filedlg.c
@@ -1019,6 +1019,8 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
     if( !(fodInfos->ofnInfos->Flags & OFN_ENABLESIZING)) return FALSE;
     /* get the new dialog rectangle */
     GetWindowRect( hwnd, &rc);
+    TRACE("Size from %d,%d to %d,%d\n", fodInfos->sizedlg.cx, fodInfos->sizedlg.cy,
+            rc.right -rc.left, rc.bottom -rc.top);
     /* not initialized yet */
     if( (fodInfos->sizedlg.cx == 0 && fodInfos->sizedlg.cy == 0) ||
         ((fodInfos->sizedlg.cx == rc.right -rc.left) && /* no change */
@@ -1039,6 +1041,7 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
     /* change position and sizes of the controls */
     for( ctrl = GetWindow( hwnd, GW_CHILD); ctrl ; ctrl = GetWindow( ctrl, GW_HWNDNEXT))
     {
+        int ctrlid = GetDlgCtrlID( ctrl);
         GetWindowRect( ctrl, &rc);
         MapWindowPoints( NULL, hwnd, (LPPOINT) &rc, 2);
         if( ctrl == fodInfos->DlgInfos.hwndGrip)
@@ -1047,29 +1050,69 @@ static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam)
                     0, 0,
                     SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
         }
-        else if( GetDlgCtrlID( ctrl) == IDC_SHELLSTATIC)
-        {
-            DeferWindowPos( hdwp, ctrl, NULL, 0, 0,
-                    rc.right - rc.left + chgx,
-                    rc.bottom - rc.top + chgy,
-                    SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
-        }
         else if( rc.top > rcview.bottom)
         {
             /* if it was below the shell view
              * move to bottom */
-            DeferWindowPos( hdwp, ctrl, NULL, rc.left, rc.top + chgy,
-                    rc.right - rc.left, rc.bottom - rc.top,
-                    SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+            switch( ctrlid)
+            {
+                /* file name box and file types combo change also width */
+                case edt1:
+                case cmb1:
+                    DeferWindowPos( hdwp, ctrl, NULL, rc.left, rc.top + chgy,
+                            rc.right - rc.left + chgx, rc.bottom - rc.top,
+                            SWP_NOACTIVATE | SWP_NOZORDER);
+                    break;
+                    /* then these buttons must move out of the way */
+                case IDOK:
+                case IDCANCEL:
+                case pshHelp:
+                    DeferWindowPos( hdwp, ctrl, NULL, rc.left + chgx, rc.top + chgy,
+                            0, 0,
+                            SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+                    break;
+                default:
+                DeferWindowPos( hdwp, ctrl, NULL, rc.left, rc.top + chgy,
+                        0, 0,
+                        SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+            }
         }
         else if( rc.left > rcview.right)
         {
             /* if it was to the right of the shell view
              * move to right */
             DeferWindowPos( hdwp, ctrl, NULL, rc.left + chgx, rc.top,
-                    rc.right - rc.left, rc.bottom - rc.top,
+                    0, 0,
                     SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
         }
+        else
+            /* special cases */
+        {
+            switch( ctrlid)
+            {
+#if 0 /* this is Win2k, Win XP. Vista and Higher don't move/size these controls */
+                case IDC_LOOKIN:
+                    DeferWindowPos( hdwp, ctrl, NULL, 0, 0,
+                            rc.right - rc.left + chgx, rc.bottom - rc.top,
+                            SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
+                    break;
+                case IDC_TOOLBARSTATIC:
+                case IDC_TOOLBAR:
+                    DeferWindowPos( hdwp, ctrl, NULL, rc.left + chgx, rc.top,
+                            0, 0,
+                            SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
+                    break;
+#endif
+                /* not resized in windows. Since wine uses this invisible control
+                 * to size the browser view it needs to be resized */
+                case IDC_SHELLSTATIC:
+                    DeferWindowPos( hdwp, ctrl, NULL, 0, 0,
+                            rc.right - rc.left + chgx,
+                            rc.bottom - rc.top + chgy,
+                            SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
+                    break;
+            }
+        }
     }
     if(fodInfos->DlgInfos.hwndCustomDlg &&
         (fodInfos->ofnInfos->Flags & (OFN_ENABLETEMPLATE | OFN_ENABLETEMPLATEHANDLE)))
diff --git a/dlls/comdlg32/tests/filedlg.c b/dlls/comdlg32/tests/filedlg.c
index da51246..e81d054 100644
--- a/dlls/comdlg32/tests/filedlg.c
+++ b/dlls/comdlg32/tests/filedlg.c
@@ -278,16 +278,17 @@ struct {
     int resize_timer1;     /* change in first WM_TIMER handler */
     int resize_check;      /* expected change (in second  WM_TIMER handler) */
     BOOL todo;             /* mark that test todo_wine */
+    BOOL testcontrols;     /* test resizing and moving of the controls */
 } resize_testcases[] = {
-    { 0                , 10, 10, 10, 30,FALSE},   /* 0 */
-    { 0                ,-10,-10,-10,-30,FALSE},
-    { OFN_ENABLESIZING ,  0,  0,  0,  0,FALSE},
-    { OFN_ENABLESIZING ,  0,  0,-10,  0,FALSE},
-    { OFN_ENABLESIZING ,  0,  0, 10, 10,FALSE},
-    { OFN_ENABLESIZING ,  0,-10,  0, 10, TRUE},   /* 5 */
-    { OFN_ENABLESIZING ,  0, 10,  0, 10,FALSE},
-    { OFN_ENABLESIZING ,-10,  0,  0, 10, TRUE},
-    { OFN_ENABLESIZING , 10,  0,  0, 10,FALSE},
+    { 0                , 10, 10, 10, 30,FALSE,FALSE},   /* 0 */
+    { 0                ,-10,-10,-10,-30,FALSE,FALSE},
+    { OFN_ENABLESIZING ,  0,  0,  0,  0,FALSE,FALSE},
+    { OFN_ENABLESIZING ,  0,  0,-10,  0,FALSE,FALSE},
+    { OFN_ENABLESIZING ,  0,  0, 10, 10,FALSE, TRUE},
+    { OFN_ENABLESIZING ,  0,-10,  0, 10, TRUE,FALSE},   /* 5 */
+    { OFN_ENABLESIZING ,  0, 10,  0, 10,FALSE,FALSE},
+    { OFN_ENABLESIZING ,-10,  0,  0, 10, TRUE,FALSE},
+    { OFN_ENABLESIZING , 10,  0,  0, 10,FALSE,FALSE},
     /* mark the end */
     { 0xffffffff }
 };
@@ -299,6 +300,12 @@ static LONG_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, L
     static int gotSWP_bottom, gotShowWindow;
     HWND parent = GetParent( dlg);
     int resize;
+#define MAXNRCTRLS 30
+    static RECT ctrlrcs[MAXNRCTRLS];
+    static int ctrlids[MAXNRCTRLS];
+    static HWND ctrls[MAXNRCTRLS];
+    static int nrctrls;
+
     switch( msg)
     {
         case WM_INITDIALOG:
@@ -343,6 +350,20 @@ static LONG_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, L
         case WM_TIMER:
         {
             if( count == 0){
+                /* store the control rectangles */
+                if( resize_testcases[index].testcontrols) {
+                    HWND ctrl;
+                    int i;
+                    for( i = 0, ctrl = GetWindow( parent, GW_CHILD);
+                            i < MAXNRCTRLS && ctrl;
+                            i++, ctrl = GetWindow( ctrl, GW_HWNDNEXT)) {
+                        ctrlids[i] = GetDlgCtrlID( ctrl);
+                        GetWindowRect( ctrl, &ctrlrcs[i]);
+                        MapWindowPoints( NULL, parent, (LPPOINT) &ctrlrcs[i], 2);
+                        ctrls[i] = ctrl;
+                    }
+                    nrctrls = i;
+                }
                 if( (resize  = resize_testcases[index].resize_timer1)){
                     GetWindowRect( parent, &rc);
                     MoveWindow( parent, rc.left,rc.top, rc.right - rc.left + resize,
@@ -368,6 +389,101 @@ static LONG_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, L
                         "testid %d size-y change %d expected %d\n", index,
                         rc.bottom - rc.top - initrc.bottom + initrc.top, resize);
                 }
+                if( resize_testcases[index].testcontrols) {
+                    int i;
+                    RECT rc;
+                    for( i = 0; i < nrctrls; i++) {
+                        GetWindowRect( ctrls[i], &rc);
+                        MapWindowPoints( NULL, parent, (LPPOINT) &rc, 2);
+                        switch( ctrlids[i]){
+
+/* test if RECT R1, moved and sized result in R2 */
+#define TESTRECTS( R1, R2, Mx, My, Sx, Sy) \
+         ((R1).left + (Mx) ==(R2).left \
+        &&(R1).top + (My) ==(R2).top \
+        &&(R1).right + (Mx) + (Sx) == (R2).right \
+        &&(R1).bottom + (My) + (Sy) ==(R2).bottom)
+
+                            /* sized horizontal and moved vertical */
+                            case cmb1:
+                            case edt1:
+                                ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 10, 0) ||
+                                    broken(TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0)),/*win98*/
+                                    "control id %03x should have sized horizontally and moved vertically, before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+                                break;
+                            /* sized horizontal and vertical */
+                            case lst2:
+                                ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 10),
+                                    "control id %03x should have sized horizontally and vertically, before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+                                break;
+                            /* moved horizontal and vertical */
+                            case IDCANCEL:
+                            case pshHelp:
+                                ok( TESTRECTS( ctrlrcs[i], rc, 10, 10, 0, 0) ||
+                                    broken(TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0)),/*win98*/
+                                    "control id %03x should have moved horizontally and vertically, before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+                                break;
+                            /* moved vertically */
+                            case chx1:
+                            case stc2:
+                            case stc3:
+                                ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0),
+                                    "control id %03x should have moved vertically, before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+                                break;
+                            /* resized horizontal */
+                            case cmb2: /* aka IDC_LOOKIN */
+                                ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 0)||
+                                        TESTRECTS( ctrlrcs[i], rc, 0, 0, 0, 0), /* Vista and higher */
+                                    "control id %03x should have resized horizontally, before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+                                break;
+                            /* non moving non sizing controls */
+                            case stc4:
+                                ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0),
+                                    "control id %03x was moved/resized, before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+                                break;
+                            /* todo_wine: non moving non sizing controls */
+                            case lst1:
+todo_wine
+                                ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0),
+                                    "control id %03x was moved/resized, before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+                                break;
+                            /* don't test: id is not unique */
+                            case IDOK:
+                            case stc1:
+                            case 0:
+                            case  -1:
+                                break;
+                            default:
+                                trace("untested control id %03x before %d,%d-%d,%d after  %d,%d-%d,%d\n",
+                                    ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top,
+                                    ctrlrcs[i].right, ctrlrcs[i].bottom,
+                                    rc.left, rc.top, rc.right, rc.bottom);
+#undef TESTRECTS
+#undef MAXNRCTRLS
+                        }
+                    }
+                }
                 KillTimer( dlg, 0);
                 PostMessage( parent, WM_COMMAND, IDCANCEL, 0);
             }
@@ -410,7 +526,7 @@ static void test_resize(void)
     for( i = 0; resize_testcases[i].flags != 0xffffffff; i++) {
         ofn.lCustData = i;
         ofn.Flags = resize_testcases[i].flags |
-            OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE ;
+            OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE | OFN_SHOWHELP ;
         ret = GetOpenFileName(&ofn);
         ok(!ret, "GetOpenFileName returned %#x\n", ret);
         ret = CommDlgExtendedError();
@@ -526,7 +642,8 @@ static void test_ok(void)
         ret = CommDlgExtendedError();
         ok(!ret, "CommDlgExtendedError returned %#x\n", ret);
     }
-    ok( DeleteFileA( tmpfilename), "Failed to delete temporary file\n");
+    ret =  DeleteFileA( tmpfilename);
+    ok( ret, "Failed to delete temporary file %s err %d\n", tmpfilename, GetLastError());
 }
 
 START_TEST(filedlg)
-- 
1.6.3.3




More information about the wine-patches mailing list