Commit b563ea01 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

user32/combo: Simplify rectangles sizing helper.

parent c5bceecb
...@@ -319,111 +319,70 @@ static void CBForceDummyResize( ...@@ -319,111 +319,70 @@ static void CBForceDummyResize(
* *
* Set up component coordinates given valid lphc->RectCombo. * Set up component coordinates given valid lphc->RectCombo.
*/ */
static void CBCalcPlacement( static void CBCalcPlacement(HEADCOMBO *combo)
HWND hwnd,
LPHEADCOMBO lphc,
LPRECT lprEdit,
LPRECT lprButton,
LPRECT lprLB)
{ {
/* /* Start with the client rectangle. */
* Again, start with the client rectangle. GetClientRect(combo->self, &combo->textRect);
*/
GetClientRect(hwnd, lprEdit);
/* /* Remove the borders */
* Remove the borders InflateRect(&combo->textRect, -COMBO_XBORDERSIZE(), -COMBO_YBORDERSIZE());
*/
InflateRect(lprEdit, -COMBO_XBORDERSIZE(), -COMBO_YBORDERSIZE());
/* /* Chop off the bottom part to fit with the height of the text area. */
* Chop off the bottom part to fit with the height of the text area. combo->textRect.bottom = combo->textRect.top + CBGetTextAreaHeight(combo->self, combo);
*/
lprEdit->bottom = lprEdit->top + CBGetTextAreaHeight(hwnd, lphc);
/*
* The button starts the same vertical position as the text area.
*/
CopyRect(lprButton, lprEdit);
/* /* The button starts the same vertical position as the text area. */
* If the combobox is "simple" there is no button. combo->buttonRect = combo->textRect;
*/
if( CB_GETTYPE(lphc) == CBS_SIMPLE )
lprButton->left = lprButton->right = lprButton->bottom = 0;
else
{
/*
* Let's assume the combobox button is the same width as the
* scrollbar button.
* size the button horizontally and cut-off the text area.
*/
lprButton->left = lprButton->right - GetSystemMetrics(SM_CXVSCROLL);
lprEdit->right = lprButton->left;
}
/* /* If the combobox is "simple" there is no button. */
* In the case of a dropdown, there is an additional spacing between the if (CB_GETTYPE(combo) == CBS_SIMPLE)
* text area and the button. combo->buttonRect.left = combo->buttonRect.right = combo->buttonRect.bottom = 0;
*/ else
if( CB_GETTYPE(lphc) == CBS_DROPDOWN ) {
{ /*
lprEdit->right -= COMBO_EDITBUTTONSPACE(); * Let's assume the combobox button is the same width as the
} * scrollbar button.
* size the button horizontally and cut-off the text area.
*/
combo->buttonRect.left = combo->buttonRect.right - GetSystemMetrics(SM_CXVSCROLL);
combo->textRect.right = combo->buttonRect.left;
}
/* /* In the case of a dropdown, there is an additional spacing between the text area and the button. */
* If we have an edit control, we space it away from the borders slightly. if (CB_GETTYPE(combo) == CBS_DROPDOWN)
*/ combo->textRect.right -= COMBO_EDITBUTTONSPACE();
if (CB_GETTYPE(lphc) != CBS_DROPDOWNLIST)
{
InflateRect(lprEdit, -EDIT_CONTROL_PADDING(), -EDIT_CONTROL_PADDING());
}
/* /* If we have an edit control, we space it away from the borders slightly. */
* Adjust the size of the listbox popup. if (CB_GETTYPE(combo) != CBS_DROPDOWNLIST)
*/ InflateRect(&combo->textRect, -EDIT_CONTROL_PADDING(), -EDIT_CONTROL_PADDING());
if( CB_GETTYPE(lphc) == CBS_SIMPLE )
{
/*
* Use the client rectangle to initialize the listbox rectangle
*/
GetClientRect(hwnd, lprLB);
/* /* Adjust the size of the listbox popup. */
* Then, chop-off the top part. if (CB_GETTYPE(combo) == CBS_SIMPLE)
*/
lprLB->top = lprEdit->bottom + COMBO_YBORDERSIZE();
}
else
{
/*
* Make sure the dropped width is as large as the combobox itself.
*/
if (lphc->droppedWidth < (lprButton->right + COMBO_XBORDERSIZE()))
{ {
lprLB->right = lprLB->left + (lprButton->right + COMBO_XBORDERSIZE()); GetClientRect(combo->self, &combo->droppedRect);
combo->droppedRect.top = combo->textRect.bottom + COMBO_YBORDERSIZE();
/*
* In the case of a dropdown, the popup listbox is offset to the right.
* so, we want to make sure it's flush with the right side of the
* combobox
*/
if( CB_GETTYPE(lphc) == CBS_DROPDOWN )
lprLB->right -= COMBO_EDITBUTTONSPACE();
} }
else else
lprLB->right = lprLB->left + lphc->droppedWidth; {
} /* Make sure the dropped width is as large as the combobox itself. */
if (combo->droppedWidth < (combo->buttonRect.right + COMBO_XBORDERSIZE()))
/* don't allow negative window width */ {
if (lprEdit->right < lprEdit->left) combo->droppedRect.right = combo->droppedRect.left + (combo->buttonRect.right + COMBO_XBORDERSIZE());
lprEdit->right = lprEdit->left;
TRACE("\ttext\t= (%s)\n", wine_dbgstr_rect(lprEdit)); /* In the case of a dropdown, the popup listbox is offset to the right. We want to make sure it's flush
with the right side of the combobox. */
if (CB_GETTYPE(combo) == CBS_DROPDOWN)
combo->droppedRect.right -= COMBO_EDITBUTTONSPACE();
}
else
combo->droppedRect.right = combo->droppedRect.left + combo->droppedWidth;
}
TRACE("\tbutton\t= (%s)\n", wine_dbgstr_rect(lprButton)); /* Disallow negative window width */
if (combo->textRect.right < combo->textRect.left)
combo->textRect.right = combo->textRect.left;
TRACE("\tlbox\t= (%s)\n", wine_dbgstr_rect(lprLB)); TRACE("text %s, button %s, lbox %s.\n", wine_dbgstr_rect(&combo->textRect), wine_dbgstr_rect(&combo->buttonRect),
wine_dbgstr_rect(&combo->droppedRect));
} }
/*********************************************************************** /***********************************************************************
...@@ -479,7 +438,7 @@ static LRESULT COMBO_Create( HWND hwnd, LPHEADCOMBO lphc, HWND hwndParent, LONG ...@@ -479,7 +438,7 @@ static LRESULT COMBO_Create( HWND hwnd, LPHEADCOMBO lphc, HWND hwndParent, LONG
* recalculated. * recalculated.
*/ */
GetClientRect( hwnd, &lphc->droppedRect ); GetClientRect( hwnd, &lphc->droppedRect );
CBCalcPlacement(hwnd, lphc, &lphc->textRect, &lphc->buttonRect, &lphc->droppedRect ); CBCalcPlacement(lphc);
/* /*
* Adjust the position of the popup listbox if it's necessary * Adjust the position of the popup listbox if it's necessary
...@@ -1530,11 +1489,7 @@ static void COMBO_Size( LPHEADCOMBO lphc ) ...@@ -1530,11 +1489,7 @@ static void COMBO_Size( LPHEADCOMBO lphc )
SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOREDRAW); SWP_NOZORDER|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOREDRAW);
} }
CBCalcPlacement(lphc->self, CBCalcPlacement(lphc);
lphc,
&lphc->textRect,
&lphc->buttonRect,
&lphc->droppedRect);
CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, FALSE ); CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, FALSE );
} }
...@@ -1562,11 +1517,7 @@ static void COMBO_Font( LPHEADCOMBO lphc, HFONT hFont, BOOL bRedraw ) ...@@ -1562,11 +1517,7 @@ static void COMBO_Font( LPHEADCOMBO lphc, HFONT hFont, BOOL bRedraw )
*/ */
if ( CB_GETTYPE(lphc) == CBS_SIMPLE) if ( CB_GETTYPE(lphc) == CBS_SIMPLE)
{ {
CBCalcPlacement(lphc->self, CBCalcPlacement(lphc);
lphc,
&lphc->textRect,
&lphc->buttonRect,
&lphc->droppedRect);
CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE ); CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE );
} }
...@@ -1595,11 +1546,7 @@ static LRESULT COMBO_SetItemHeight( LPHEADCOMBO lphc, INT index, INT height ) ...@@ -1595,11 +1546,7 @@ static LRESULT COMBO_SetItemHeight( LPHEADCOMBO lphc, INT index, INT height )
*/ */
if ( CB_GETTYPE(lphc) == CBS_SIMPLE) if ( CB_GETTYPE(lphc) == CBS_SIMPLE)
{ {
CBCalcPlacement(lphc->self, CBCalcPlacement(lphc);
lphc,
&lphc->textRect,
&lphc->buttonRect,
&lphc->droppedRect);
CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE ); CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE );
} }
...@@ -2100,7 +2047,7 @@ LRESULT ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar ...@@ -2100,7 +2047,7 @@ LRESULT ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar
lphc->droppedWidth = 0; lphc->droppedWidth = 0;
/* recalculate the combobox area */ /* recalculate the combobox area */
CBCalcPlacement(hwnd, lphc, &lphc->textRect, &lphc->buttonRect, &lphc->droppedRect ); CBCalcPlacement(lphc);
/* fall through */ /* fall through */
case CB_GETDROPPEDWIDTH: case CB_GETDROPPEDWIDTH:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment