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