Sync to Wine-20050628: Robert Shearman rob@codeweavers.com - Document how the native lays out the internal components of buttons. - Fix control to follow these rules. - Don't redraw disabled buttons. - Padding is never less that GetSystemMetrics(SM_{CX,CY}EDGE). - Change default iListGap value to 4 to match native. - Fix a regression in IE where the Favourites menu didn't appear correctly because the height and width were swapped in the pager control. Stefan Huehner stefan@huehner.org - Fix more -Wstrict-prototypes warnings. Mike McCormack mike@codeweavers.com - Warning fixes for -Wmissing-declarations and -Wwrite-strings. Felix Nawothnig felix.nawothnig@t-online.de - Fix some missed invalidations after column resize. - Pass the right hwnd to ReleaseDC(). Kouji Sasaki taro-x@justsystem.co.jp - Added the feature to change row height in owner draw controls. - Added the callback item processing for LISTVIEW_EndEditLabelT function. - Corrected the priority of operators for LISTVIEW_GetNextItem function. Huw Davies huw@codeweavers.com - For modal propsheets we should run our own message loop rather than use a modal dialogbox just like Windows does. This helps apps that subclass the propsheet's wndproc. Francois Gouget fgouget@free.fr - Assorted spelling fixes. James Hawkins truiken@gmail.com - Audit the Tab control. - Factor out common text shifting logic. - Shift selected tab text up instead of down. Alex Zorach info@suscomputing.com - Fixed SetFocus behavior. Krzysztof Foltman wdev@foltman.com - Don't send TVN_SELCHANGING nor TVN_SELCHANGED if the same item is selected again. Modified: trunk/reactos/lib/comctl32/comctl32.h Modified: trunk/reactos/lib/comctl32/commctrl.c Modified: trunk/reactos/lib/comctl32/flatsb.c Modified: trunk/reactos/lib/comctl32/ipaddress.c Modified: trunk/reactos/lib/comctl32/listview.c Modified: trunk/reactos/lib/comctl32/monthcal.c Modified: trunk/reactos/lib/comctl32/pager.c Modified: trunk/reactos/lib/comctl32/propsheet.c Modified: trunk/reactos/lib/comctl32/tab.c Modified: trunk/reactos/lib/comctl32/toolbar.c Modified: trunk/reactos/lib/comctl32/treeview.c Modified: trunk/reactos/lib/comctl32/updown.c _____
Modified: trunk/reactos/lib/comctl32/comctl32.h --- trunk/reactos/lib/comctl32/comctl32.h 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/comctl32.h 2005-07-06 22:33:11 UTC (rev 16472) @@ -191,4 +191,62 @@
LRESULT WINAPI SetPathWordBreakProc(HWND hwnd, BOOL bSet); BOOL WINAPI MirrorIcon(HICON *phicon1, HICON *phicon2);
+extern void ANIMATE_Register(void); +extern void ANIMATE_Unregister(void); +extern void COMBOEX_Register(void); +extern void COMBOEX_Unregister(void); +extern void DATETIME_Register(void); +extern void DATETIME_Unregister(void); +extern void FLATSB_Register(void); +extern void FLATSB_Unregister(void); +extern void HEADER_Register(void); +extern void HEADER_Unregister(void); +extern void HOTKEY_Register(void); +extern void HOTKEY_Unregister(void); +extern void IPADDRESS_Register(void); +extern void IPADDRESS_Unregister(void); +extern void LISTVIEW_Register(void); +extern void LISTVIEW_Unregister(void); +extern void MONTHCAL_Register(void); +extern void MONTHCAL_Unregister(void); +extern void NATIVEFONT_Register(void); +extern void NATIVEFONT_Unregister(void); +extern void PAGER_Register(void); +extern void PAGER_Unregister(void); +extern void PROGRESS_Register(void); +extern void PROGRESS_Unregister(void); +extern void REBAR_Register(void); +extern void REBAR_Unregister(void); +extern void STATUS_Register(void); +extern void STATUS_Unregister(void); +extern void SYSLINK_Register(void); +extern void SYSLINK_Unregister(void); +extern void TAB_Register(void); +extern void TAB_Unregister(void); +extern void TOOLBAR_Register(void); +extern void TOOLBAR_Unregister(void); +extern void TOOLTIPS_Register(void); +extern void TOOLTIPS_Unregister(void); +extern void TRACKBAR_Register(void); +extern void TRACKBAR_Unregister(void); +extern void TREEVIEW_Register(void); +extern void TREEVIEW_Unregister(void); +extern void UPDOWN_Register(void); +extern void UPDOWN_Unregister(void); + + +int MONTHCAL_MonthLength(int month, int year); + +static inline void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) +{ + to->wYear = from->wYear; + to->wMonth = from->wMonth; + to->wDayOfWeek = from->wDayOfWeek; + to->wDay = from->wDay; + to->wHour = from->wHour; + to->wMinute = from->wMinute; + to->wSecond = from->wSecond; + to->wMilliseconds = from->wMilliseconds; +} + #endif /* __WINE_COMCTL32_H */ _____
Modified: trunk/reactos/lib/comctl32/commctrl.c --- trunk/reactos/lib/comctl32/commctrl.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/commctrl.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -73,49 +73,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(commctrl);
-extern void ANIMATE_Register(void); -extern void ANIMATE_Unregister(void); -extern void COMBOEX_Register(void); -extern void COMBOEX_Unregister(void); -extern void DATETIME_Register(void); -extern void DATETIME_Unregister(void); -extern void FLATSB_Register(void); -extern void FLATSB_Unregister(void); -extern void HEADER_Register(void); -extern void HEADER_Unregister(void); -extern void HOTKEY_Register(void); -extern void HOTKEY_Unregister(void); -extern void IPADDRESS_Register(void); -extern void IPADDRESS_Unregister(void); -extern void LISTVIEW_Register(void); -extern void LISTVIEW_Unregister(void); -extern void MONTHCAL_Register(void); -extern void MONTHCAL_Unregister(void); -extern void NATIVEFONT_Register(void); -extern void NATIVEFONT_Unregister(void); -extern void PAGER_Register(void); -extern void PAGER_Unregister(void); -extern void PROGRESS_Register(void); -extern void PROGRESS_Unregister(void); -extern void REBAR_Register(void); -extern void REBAR_Unregister(void); -extern void STATUS_Register(void); -extern void STATUS_Unregister(void); -extern void SYSLINK_Register(void); -extern void SYSLINK_Unregister(void); -extern void TAB_Register(void); -extern void TAB_Unregister(void); -extern void TOOLBAR_Register(void); -extern void TOOLBAR_Unregister(void); -extern void TOOLTIPS_Register(void); -extern void TOOLTIPS_Unregister(void); -extern void TRACKBAR_Register(void); -extern void TRACKBAR_Unregister(void); -extern void TREEVIEW_Register(void); -extern void TREEVIEW_Unregister(void); -extern void UPDOWN_Register(void); -extern void UPDOWN_Unregister(void); - LRESULT WINAPI COMCTL32_SubclassProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LPWSTR COMCTL32_wSubclass = NULL; _____
Modified: trunk/reactos/lib/comctl32/flatsb.c --- trunk/reactos/lib/comctl32/flatsb.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/flatsb.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -36,6 +36,7 @@
#include "winerror.h" #include "winuser.h" #include "commctrl.h" +#include "comctl32.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(commctrl); _____
Modified: trunk/reactos/lib/comctl32/ipaddress.c --- trunk/reactos/lib/comctl32/ipaddress.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/ipaddress.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -346,11 +346,7 @@
{ TRACE("(index=%d)\n", index);
- if (index > 3) { - for (index = 0; index < 4; index++) - if (!GetWindowTextLengthW(infoPtr->Part[index].EditHwnd)) break; - } - if (index < 9 || index > 3) index = 0; + if (index > 3 || index < 0) index=0;
SetFocus (infoPtr->Part[index].EditHwnd); } _____
Modified: trunk/reactos/lib/comctl32/listview.c --- trunk/reactos/lib/comctl32/listview.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/listview.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -277,7 +277,8 @@
HFONT hDefaultFont; HFONT hFont; INT ntmHeight; /* Some cached metrics of the font used */ - INT ntmAveCharWidth; /* by the listview to draw items */ + INT ntmMaxCharWidth; /* by the listview to draw items */ + INT nEllipsisWidth; BOOL bRedraw; /* Turns on/off repaints & invalidations */ BOOL bAutoarrange; /* Autoarrange flag when NOT in LVS_AUTOARRANGE */ BOOL bFocus; @@ -307,6 +308,7 @@ INT nSearchParamLength; WCHAR szSearchParam[ MAX_PATH ]; BOOL bIsDrawing; + INT nMeasureItemHeight; } LISTVIEW_INFO;
/* @@ -548,7 +550,7 @@ return isW ? debugstr_wn(text, n) : debugstr_an((LPCSTR)text, n); }
-static char* debug_getbuf() +static char* debug_getbuf(void) { static int index = 0; static char buffers[DEBUG_BUFFERS][DEBUG_BUFFER_SIZE]; @@ -2454,6 +2456,8 @@ nItemHeight = max(nItemHeight, infoPtr->iconSize.cy); if (infoPtr->himlState || infoPtr->himlSmall) nItemHeight += HEIGHT_PADDING; + if (infoPtr->nMeasureItemHeight > 0) + nItemHeight = infoPtr->nMeasureItemHeight; }
return max(nItemHeight, 1); @@ -2491,12 +2495,17 @@ HFONT hFont = infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont; HFONT hOldFont = SelectObject(hdc, hFont); TEXTMETRICW tm; + SIZE sz;
if (GetTextMetricsW(hdc, &tm)) { infoPtr->ntmHeight = tm.tmHeight; - infoPtr->ntmAveCharWidth = tm.tmAveCharWidth; + infoPtr->ntmMaxCharWidth = tm.tmMaxCharWidth; } + + if (GetTextExtentPoint32A(hdc, "...", 3, &sz)) + infoPtr->nEllipsisWidth = sz.cx; + SelectObject(hdc, hOldFont); ReleaseDC(infoPtr->hwndSelf, hdc);
@@ -4268,6 +4277,7 @@ { COLUMN_INFO *lpColumnInfo; RECT rcOld, rcCol; + POINT ptOrigin; INT nCol;
if (nColumn < 0 || DPA_GetPtrCount(infoPtr->hdpaColumns) < 1) return; @@ -4294,10 +4304,11 @@ infoPtr->nItemWidth += dx;
LISTVIEW_UpdateScroll(infoPtr); + LISTVIEW_GetOrigin(infoPtr, &ptOrigin);
/* scroll to cover the deleted column, and invalidate for redraw */ rcOld = infoPtr->rcList; - rcOld.left = rcCol.left; + rcOld.left = ptOrigin.x + rcCol.left + dx; ScrollWindowEx(infoPtr->hwndSelf, dx, 0, &rcOld, &rcOld, 0, 0, SW_ERASE | SW_INVALIDATE);
/* we can restore focus now */ @@ -4562,6 +4573,17 @@ if (!notify_dispinfoT(infoPtr, LVN_ENDLABELEDITW, &dispInfo, isW)) return FALSE; if (!pszText) return TRUE;
+ if (!(infoPtr->dwStyle & LVS_OWNERDATA)) + { + HDPA hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nEditLabelItem); + ITEM_INFO* lpItem = (ITEM_INFO *)DPA_GetPtr(hdpaSubItems, 0); + if (lpItem && lpItem->hdr.pszText == LPSTR_TEXTCALLBACKW) + { + LISTVIEW_InvalidateItem(infoPtr, infoPtr->nEditLabelItem); + return TRUE; + } + } + ZeroMemory(&dispInfo, sizeof(dispInfo)); dispInfo.item.mask = LVIF_TEXT; dispInfo.item.iItem = infoPtr->nEditLabelItem; @@ -5738,7 +5760,7 @@ * so it's worth optimizing */ if (uFlags & LVNI_FOCUSED) { - if (!(LISTVIEW_GetItemState(infoPtr, infoPtr->nFocusedItem, uMask) & uMask) == uMask) return -1; + if ((LISTVIEW_GetItemState(infoPtr, infoPtr->nFocusedItem, uMask) & uMask) != uMask) return -1; return (infoPtr->nFocusedItem == nItem) ? -1 : infoPtr->nFocusedItem; }
@@ -6906,7 +6928,7 @@ return oldspacing; }
-inline void set_icon_size(SIZE *size, HIMAGELIST himl, BOOL small) +static inline void set_icon_size(SIZE *size, HIMAGELIST himl, BOOL small) { INT cx, cy;
@@ -7500,6 +7522,7 @@ infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING); infoPtr->nEditLabelItem = -1; infoPtr->dwHoverTime = -1; /* default system hover time */ + infoPtr->nMeasureItemHeight = 0;
/* get default font (icon title) */ SystemParametersInfoW(SPI_GETICONTITLELOGFONT, 0, &logFont, 0); @@ -8275,21 +8298,27 @@ dx = cxy - (lpColumnInfo->rcHeader.right - lpColumnInfo->rcHeader.left); if (dx != 0) { - RECT rcCol = lpColumnInfo->rcHeader; - lpColumnInfo->rcHeader.right += dx; LISTVIEW_ScrollColumns(infoPtr, lpnmh->iItem + 1, dx); LISTVIEW_UpdateItemSize(infoPtr); if (uView == LVS_REPORT && is_redrawing(infoPtr)) { - /* this trick works for left aligned columns only */ + POINT ptOrigin; + RECT rcCol = lpColumnInfo->rcHeader; + + LISTVIEW_GetOrigin(infoPtr, &ptOrigin); + OffsetRect(&rcCol, ptOrigin.x, 0); + + rcCol.top = infoPtr->rcList.top; + rcCol.bottom = infoPtr->rcList.bottom; + + /* resizing left-aligned columns leaves most of the left side untouched */ if ((lpColumnInfo->fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_LEFT) { - rcCol.right = min (rcCol.right, lpColumnInfo->rcHeader.right); - rcCol.left = max (rcCol.left, rcCol.right - 3 * infoPtr->ntmAveCharWidth); + INT nMaxDirty = infoPtr->nEllipsisWidth + infoPtr->ntmMaxCharWidth + dx; + rcCol.left = max (rcCol.left, rcCol.right - nMaxDirty); } - rcCol.top = infoPtr->rcList.top; - rcCol.bottom = infoPtr->rcList.bottom; + LISTVIEW_InvalidateRect(infoPtr, &rcCol); } } @@ -9314,8 +9343,24 @@ case WM_WINDOWPOSCHANGED: if (!(((WINDOWPOS *)lParam)->flags & SWP_NOSIZE)) { + UINT uView = infoPtr->dwStyle & LVS_TYPEMASK; SetWindowPos(infoPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE); + + if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT)) + { + MEASUREITEMSTRUCT mis; + mis.CtlType = ODT_LISTVIEW; + mis.CtlID = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID); + mis.itemID = -1; + mis.itemWidth = 0; + mis.itemData = 0; + mis.itemHeight= infoPtr->nItemHeight; + SendMessageW(infoPtr->hwndNotify, WM_MEASUREITEM, mis.CtlID, (LPARAM)&mis); + if (infoPtr->nItemHeight != max(mis.itemHeight, 1)) + infoPtr->nMeasureItemHeight = infoPtr->nItemHeight = max(mis.itemHeight, 1); + } + LISTVIEW_UpdateSize(infoPtr); LISTVIEW_UpdateScroll(infoPtr); } @@ -9433,7 +9478,7 @@ if(hFont != 0) SelectObject(hdc, hOldFont);
- ReleaseDC(infoPtr->hwndSelf, hdc); + ReleaseDC(infoPtr->hwndEdit, hdc);
break; } _____
Modified: trunk/reactos/lib/comctl32/monthcal.c --- trunk/reactos/lib/comctl32/monthcal.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/monthcal.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -134,7 +134,7 @@
/* january is 1, december is 12 */ int MONTHCAL_MonthLength(int month, int year) { -const int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}; + const int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}; /*Wrap around, this eases handling*/ if(month == 0) month = 12; @@ -170,19 +170,6 @@ }
-void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to) -{ - to->wYear = from->wYear; - to->wMonth = from->wMonth; - to->wDayOfWeek = from->wDayOfWeek; - to->wDay = from->wDay; - to->wHour = from->wHour; - to->wMinute = from->wMinute; - to->wSecond = from->wSecond; - to->wMilliseconds = from->wMilliseconds; -} - - /* Note:Depending on DST, this may be offset by a day. Need to find out if we're on a DST place & adjust the clock accordingly. Above function assumes we have a valid data. @@ -212,7 +199,7 @@ GetClientRect(infoPtr->hwndSelf, &rcClient);
/* if the point is outside the x bounds of the window put - it at the boundry */ + it at the boundary */ if (x > rcClient.right) x = rcClient.right;
_____
Modified: trunk/reactos/lib/comctl32/pager.c --- trunk/reactos/lib/comctl32/pager.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/pager.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -1227,9 +1227,9 @@
TRACE("[%p] %d,%d\n", infoPtr->hwndSelf, x, y);
if (infoPtr->dwStyle & PGS_HORZ) - infoPtr->nHeight = x; + infoPtr->nHeight = y; else - infoPtr->nWidth = y; + infoPtr->nWidth = x;
return PAGER_RecalcSize(infoPtr); } _____
Modified: trunk/reactos/lib/comctl32/propsheet.c --- trunk/reactos/lib/comctl32/propsheet.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/propsheet.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -131,6 +131,7 @@
int width; int height; HIMAGELIST hImageList; + BOOL ended; } PropSheetInfo;
typedef struct @@ -296,7 +297,7 @@ * * Find page index corresponding to page resource id. */ -INT PROPSHEET_FindPageByResId(PropSheetInfo * psInfo, LRESULT resId) +static INT PROPSHEET_FindPageByResId(PropSheetInfo * psInfo, LRESULT resId) { INT i;
@@ -707,39 +708,21 @@ * -1 (error). */ if( psInfo->unicode ) { - if (!(psInfo->ppshheader.dwFlags & PSH_MODELESS)) - ret = DialogBoxIndirectParamW(psInfo->ppshheader.hInstance, - (LPDLGTEMPLATEW) temp, - psInfo->ppshheader.hwndParent, - PROPSHEET_DialogProc, - (LPARAM)psInfo); - else - { - ret = (int)CreateDialogIndirectParamW(psInfo->ppshheader.hInstance, - (LPDLGTEMPLATEW) temp, - psInfo->ppshheader.hwndParent, - PROPSHEET_DialogProc, - (LPARAM)psInfo); - if ( !ret ) ret = -1; - } + ret = (int)CreateDialogIndirectParamW(psInfo->ppshheader.hInstance, + (LPDLGTEMPLATEW) temp, + psInfo->ppshheader.hwndParent, + PROPSHEET_DialogProc, + (LPARAM)psInfo); + if ( !ret ) ret = -1; } else { - if (!(psInfo->ppshheader.dwFlags & PSH_MODELESS)) - ret = DialogBoxIndirectParamA(psInfo->ppshheader.hInstance, - (LPDLGTEMPLATEA) temp, - psInfo->ppshheader.hwndParent, - PROPSHEET_DialogProc, - (LPARAM)psInfo); - else - { - ret = (int)CreateDialogIndirectParamA(psInfo->ppshheader.hInstance, - (LPDLGTEMPLATEA) temp, - psInfo->ppshheader.hwndParent, - PROPSHEET_DialogProc, - (LPARAM)psInfo); - if ( !ret ) ret = -1; - } + ret = (int)CreateDialogIndirectParamA(psInfo->ppshheader.hInstance, + (LPDLGTEMPLATEA) temp, + psInfo->ppshheader.hwndParent, + PROPSHEET_DialogProc, + (LPARAM)psInfo); + if ( !ret ) ret = -1; }
Free(temp); @@ -1265,7 +1248,7 @@ * Subclassing window procedure for wizard extrior pages to prevent drawing * background and so drawing above the watermark. */ -LRESULT CALLBACK +static LRESULT CALLBACK PROPSHEET_WizardSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uID, DWORD_PTR dwRef) { switch (uMsg) @@ -1757,7 +1740,7 @@ if (psInfo->isModeless) psInfo->activeValid = FALSE; else - EndDialog(hwndDlg, TRUE); + psInfo->ended = TRUE;
return TRUE; } @@ -1870,7 +1853,7 @@ psInfo->activeValid = FALSE; } else - EndDialog(hwndDlg, FALSE); + psInfo->ended = TRUE; }
/*********************************************************************** ******* @@ -2396,7 +2379,7 @@ psInfo->active_page = -1; if (!psInfo->isModeless) { - EndDialog(hwndDlg, FALSE); + psInfo->ended = TRUE; return TRUE; } } @@ -2737,6 +2720,34 @@ GlobalFree((HGLOBAL)psInfo); }
+static INT do_loop(PropSheetInfo *psInfo) +{ + MSG msg; + INT ret = -1; + HWND hwnd = psInfo->hwnd; + + while(IsWindow(hwnd) && !psInfo->ended && (ret = GetMessageW(&msg, NULL, 0, 0))) + { + if(ret == -1) + break; + + if(!IsDialogMessageW(hwnd, &msg)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + } + + if(ret == 0) + { + PostQuitMessage(msg.wParam); + ret = -1; + } + + DestroyWindow(hwnd); + return ret; +} +
/*********************************************************************** ******* * PropertySheet (COMCTL32.@) * PropertySheetA (COMCTL32.@) @@ -2787,7 +2798,11 @@ }
psInfo->unicode = FALSE; + psInfo->ended = FALSE; + bRet = PROPSHEET_CreateDialog(psInfo); + if(!psInfo->isModeless) + bRet = do_loop(psInfo);
return bRet; } @@ -2834,7 +2849,11 @@ }
psInfo->unicode = TRUE; + psInfo->ended = FALSE; + bRet = PROPSHEET_CreateDialog(psInfo); + if(!psInfo->isModeless) + bRet = do_loop(psInfo);
return bRet; } @@ -3039,7 +3058,7 @@ if (psInfo->isModeless) psInfo->activeValid = FALSE; else - EndDialog(hwnd, result); + psInfo->ended = TRUE; } else EnableWindow(hwndApplyBtn, FALSE); @@ -3424,6 +3443,17 @@ } return TRUE;
+ case WM_SYSCOMMAND: + switch(wParam & 0xfff0) + { + case SC_CLOSE: + PROPSHEET_Cancel(hwnd, 1); + return TRUE; + + default: + return FALSE; + } + case WM_NOTIFY: { NMHDR* pnmh = (LPNMHDR) lParam; _____
Modified: trunk/reactos/lib/comctl32/tab.c --- trunk/reactos/lib/comctl32/tab.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/tab.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -20,17 +20,47 @@
* License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * NOTES + * + * This code was audited for completeness against the documented features + * of Comctl32.dll version 6.0 on May. 20, 2005, by James Hawkins. + * + * Unless otherwise noted, we believe this code to be complete, as per + * the specification mentioned above. + * If you discover missing features, or bugs, please note them below. + * * TODO: * * Styles: + * TCS_MULTISELECT + * TCS_RIGHT + * TCS_RIGHTJUSTIFY + * TCS_SCROLLOPPOSITE + * TCS_SINGLELINE * TCIF_RTLREADING * + * Extended Styles: + * TCS_EX_FLATSEPARATORS + * TCS_EX_REGISTERDROP + * + * States: + * TCIS_BUTTONPRESSED + * + * Notifications: + * NM_RELEASEDCAPTURE + * TCN_FOCUSCHANGE + * TCN_GETOBJECT + * TCN_KEYDOWN + * * Messages: * TCM_REMOVEIMAGE * TCM_DESELECTALL * TCM_GETEXTENDEDSTYLE * TCM_SETEXTENDEDSTYLE * + * Macros: + * TabCtrl_AdjustRect + * */
#include <stdarg.h> @@ -1727,14 +1757,20 @@ else drawRect->bottom-=center_offset_h;
- center_offset_v = ((drawRect->right - drawRect->left) - (rcText.bottom - rcText.top) + infoPtr->uVItemPadding) / 2; + center_offset_v = ((drawRect->right - drawRect->left) - (rcText.bottom - rcText.top)) / 2; } else { drawRect->left += center_offset_h; - center_offset_v = ((drawRect->bottom - drawRect->top) - (rcText.bottom - rcText.top) + infoPtr->uVItemPadding) / 2; + center_offset_v = ((drawRect->bottom - drawRect->top) - (rcText.bottom - rcText.top)) / 2; }
+ /* if an item is selected, the text is shifted up instead of down */ + if (iItem == infoPtr->iSelected) + center_offset_v -= infoPtr->uVItemPadding / 2; + else + center_offset_v += infoPtr->uVItemPadding / 2; + if (center_offset_v < 0) center_offset_v = 0;
_____
Modified: trunk/reactos/lib/comctl32/toolbar.c --- trunk/reactos/lib/comctl32/toolbar.c 2005-07-06 22:24:04 UTC (rev 16471) +++ trunk/reactos/lib/comctl32/toolbar.c 2005-07-06 22:33:11 UTC (rev 16472) @@ -211,12 +211,13 @@
#define DEFPAD_CX 7 #define DEFPAD_CY 6 +#define DEFLISTGAP 4
-/* gap between border of button and text/image */ -#define OFFSET_X 1 -#define OFFSET_Y 1 +/* vertical padding used in list mode when image is present */ +#define LISTPAD_CY 9 + /* how wide to treat the bitmap if it isn't present */ -#define LIST_IMAGE_ABSENT_WIDTH 2 +#define NONLIST_NOTEXT_OFFSET 2
#define TOOLBAR_NOWHERE (-1)
@@ -224,11 +225,6 @@ #define TOOLBAR_HasText(x, y) (TOOLBAR_GetText(x, y) ? TRUE : FALSE) #define TOOLBAR_HasDropDownArrows(exStyle) ((exStyle & TBSTYLE_EX_DRAWDDARROWS) ? TRUE : FALSE)
-static inline int TOOLBAR_GetListTextOffset(TOOLBAR_INFO *infoPtr, INT iListGap) -{ - return GetSystemMetrics(SM_CXEDGE) + iListGap - infoPtr->szPadding.cx/2; -} - /* Used to find undocumented extended styles */ #define TBSTYLE_EX_ALL (TBSTYLE_EX_DRAWDDARROWS | \ TBSTYLE_EX_UNDOC1 | \ @@ -396,6 +392,14 @@ }
+static inline BOOL +TOOLBAR_IsValidImageList(TOOLBAR_INFO *infoPtr, INT index) +{ + HIMAGELIST himl = GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr, index)); + return (himl != NULL) && (ImageList_GetImageCount(himl) > 0); +} + +
/*********************************************************************** * TOOLBAR_GetImageListForDrawing * @@ -445,37 +449,6 @@ }
-/********************************************************************** * -* TOOLBAR_TestImageExist -* -* This function is similar to TOOLBAR_GetImageListForDrawing, except it does not -* return the image list. The I_IMAGECALLBACK functionality is implemented. -*/ -static BOOL -TOOLBAR_TestImageExist (TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr, HIMAGELIST himl) -{ - INT index; - - if (!himl) return FALSE; - - if (!TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) { - if (btnPtr->iBitmap == I_IMAGENONE) return FALSE; - ERR("index %d is not valid, max %d\n", - btnPtr->iBitmap, infoPtr->nNumBitmaps); - return FALSE; - } - - if ((index = TOOLBAR_GetBitmapIndex(infoPtr, btnPtr)) < 0) { - if ((index == I_IMAGECALLBACK) || - (index == I_IMAGENONE)) return FALSE; - ERR("TBN_GETDISPINFO returned invalid index %d\n", - index); - return FALSE; - } - return TRUE; -} - - static void TOOLBAR_DrawFlatSeparator (LPRECT lpRect, HDC hdc, TOOLBAR_INFO *infoPtr) { @@ -755,7 +728,7 @@
/* draws a blank frame for a toolbar button */ static void -TOOLBAR_DrawFrame(const TOOLBAR_INFO *infoPtr, BOOL flat, const NMTBCUSTOMDRAW *tbcd) +TOOLBAR_DrawFrame(const TOOLBAR_INFO *infoPtr, const NMTBCUSTOMDRAW *tbcd) { HDC hdc = tbcd->nmcd.hdc; RECT rc = tbcd->nmcd.rc; @@ -771,7 +744,7 @@ if (infoPtr->dwItemCDFlag & TBCDRF_NOEDGES) return;
- if (flat) + if (infoPtr->dwStyle & TBSTYLE_FLAT) { if (pressed_look) DrawEdge (hdc, &rc, BDR_SUNKENOUTER, BF_RECT); @@ -845,7 +818,6 @@
rc = btnPtr->rect; CopyRect (&rcArrow, &rc); - CopyRect(&rcBitmap, &rc);
/* get a pointer to the text */ lpText = TOOLBAR_GetText(infoPtr, btnPtr); @@ -865,47 +837,51 @@ rcArrow.left = right; }
- /* copy text rect after adjusting for drop-down arrow - * so that text is centred in the rectangle not containing + /* copy text & bitmap rects after adjusting for drop-down arrow + * so that text & bitmap is centred in the rectangle not containing * the arrow */ CopyRect(&rcText, &rc); + CopyRect(&rcBitmap, &rc);
/* Center the bitmap horizontally and vertically */ if (dwStyle & TBSTYLE_LIST) - rcBitmap.left += GetSystemMetrics(SM_CXEDGE); + { + if (lpText && + infoPtr->nMaxTextRows > 0 && + (!(infoPtr->dwExStyle & TBSTYLE_EX_MIXEDBUTTONS) || + (btnPtr->fsStyle & BTNS_SHOWTEXT)) ) + rcBitmap.left += GetSystemMetrics(SM_CXEDGE) + infoPtr->szPadding.cx / 2; + else + rcBitmap.left += GetSystemMetrics(SM_CXEDGE) + infoPtr->iListGap / 2; + } else - rcBitmap.left+=(infoPtr->nButtonWidth - infoPtr->nBitmapWidth) / 2; + rcBitmap.left += (infoPtr->nButtonWidth - infoPtr->nBitmapWidth) / 2;
- if(lpText) - rcBitmap.top+= GetSystemMetrics(SM_CYEDGE); - else - rcBitmap.top+=(infoPtr->nButtonHeight - infoPtr->nBitmapHeight) / 2; + rcBitmap.top += infoPtr->szPadding.cy / 2;
- TRACE("iBitmap: %d, start=(%ld,%ld) w=%d, h=%d\n", + TRACE("iBitmap=%d, start=(%ld,%ld) w=%d, h=%d\n", btnPtr->iBitmap, rcBitmap.left, rcBitmap.top, infoPtr->nBitmapWidth, infoPtr->nBitmapHeight); - TRACE ("iString: %x\n", btnPtr->iString); - TRACE ("Stringtext: %s\n", debugstr_w(lpText)); + TRACE("Text=%s\n", debugstr_w(lpText)); + TRACE("iListGap=%d, padding = { %ld, %ld }\n", infoPtr->iListGap, infoPtr->szPadding.cx, infoPtr->szPadding.cy);
- /* draw text */ - if (lpText) { - rcText.left += GetSystemMetrics(SM_CXEDGE) + OFFSET_X; - rcText.right -= GetSystemMetrics(SM_CXEDGE) + OFFSET_X; - if (GETDEFIMAGELIST(infoPtr, GETHIMLID(infoPtr,btnPtr->iBitmap)) && - TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) + /* calculate text position */ + if (lpText) + { + rcText.left += GetSystemMetrics(SM_CXEDGE); + rcText.right -= GetSystemMetrics(SM_CXEDGE); + if (dwStyle & TBSTYLE_LIST) { - if (dwStyle & TBSTYLE_LIST) - rcText.left += infoPtr->nBitmapWidth + TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap); + if (TOOLBAR_IsValidBitmapIndex(infoPtr,btnPtr->iBitmap)) + rcText.left += infoPtr->nBitmapWidth + infoPtr->iListGap + 2; + } + else + { + if (ImageList_GetImageCount(GETDEFIMAGELIST(infoPtr, 0)) > 0) + rcText.top += infoPtr->szPadding.cy/2 + infoPtr->nBitmapHeight + 1; else - rcText.top += GetSystemMetrics(SM_CYEDGE) + OFFSET_Y + infoPtr->nBitmapHeight + infoPtr->szPadding.cy/2; + rcText.top += infoPtr->szPadding.cy/2 + 2; } - else - if (dwStyle & TBSTYLE_LIST) - rcText.left += LIST_IMAGE_ABSENT_WIDTH + TOOLBAR_GetListTextOffset(infoPtr, infoPtr->iListGap); - - if (!(infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) && - (btnPtr->fsState & (TBSTATE_PRESSED | TBSTATE_CHECKED))) - OffsetRect(&rcText, 1, 1); }
/* Initialize fields in all cases, because we use these later @@ -980,6 +956,10 @@ goto FINALNOTIFY; }
+ if (!(infoPtr->dwItemCDFlag & TBCDRF_NOOFFSET) && + (btnPtr->fsState & (TBSTATE_PRESSED | TBSTATE_CHECKED))) + OffsetRect(&rcText, 1, 1); + if (!(tbcd.nmcd.uItemState & CDIS_HOT) && ((tbcd.nmcd.uItemState & CDIS_CHECKED) || (tbcd.nmcd.uItemState & CDIS_INDETERMINATE))) TOOLBAR_DrawPattern (&rc, &tbcd); @@ -998,7 +978,7 @@ } }
- TOOLBAR_DrawFrame(infoPtr, dwStyle & TBSTYLE_FLAT, &tbcd); + TOOLBAR_DrawFrame(infoPtr, &tbcd);
if (drawSepDropDownArrow) TOOLBAR_DrawSepDDArrow(infoPtr, &tbcd, &rcArrow, btnPtr->bDropDownPressed); @@ -1398,6 +1378,166 @@
/*********************************************************************** +* TOOLBAR_MeasureButton +* +* Calculates the width and height required for a button. Used in +* TOOLBAR_CalcToolbar to set the all-button width and height and also for +* the width of buttons that are autosized. +* +* Note that it would have been rather elegant to use one piece of code for +* both the laying out of the toolbar and for controlling where button parts +* are drawn, but the native control has inconsistencies between the two that +* prevent this from being effectively. These inconsistencies can be seen as +* artefacts where parts of the button appear outside of the bounding button +* rectangle. +* +* There are several cases for the calculation of the button dimensions and +* button part positioning: +* +* List +* ==== +* +* With Bitmap: +* +* +--------------------------------------------------------+ ^ +* | ^ ^ | | +* | | pad.cy / 2 | centred | | +* | pad.cx/2 + cxedge +--------------+ +------------+ | | DEFPAD_CY + +* |<----------------->| nBitmapWidth | | Text | | | max(nBitmapHeight, szText.cy) +* | |<------------>| | | | | +* | +--------------+ +------------+ | | +* |<-------------------------------------->| | | +* | cxedge + iListGap + nBitmapWidth + 2 |<-----------> | | +* | szText.cx | | +* +--------------------------------------------------------+ - +* <--------------------------------------------------------> +* 2*cxedge + nBitmapWidth + iListGap + szText.cx + pad.cx +* +* Without Bitmap (I_IMAGENONE): +* +* +-----------------------------------+ ^ +* | ^ | | +* | | centred | | LISTPAD_CY + +* | +------------+ | | szText.cy +* | | Text | | | +* | | | | | +* | +------------+ | | +* |<----------------->| | | +* | cxedge |<-----------> | | +* | szText.cx | | +* +-----------------------------------+ - +* <-----------------------------------> +* szText.cx + pad.cx +* +* Without text: +* +* +--------------------------------------+ ^ +* | ^ | | +* | | padding.cy/2 | | DEFPAD_CY + +* | +------------+ | | nBitmapHeight +* | | Bitmap | | | +* | | | | | +* | +------------+ | | +* |<------------------->| | | +* | cxedge + iListGap/2 |<-----------> | | +* | nBitmapWidth | | +* +--------------------------------------+ - +* <--------------------------------------> +* 2*cxedge + nBitmapWidth + iListGap +* +* Non-List +* ======== +* +* With bitmap: +* +* +-----------------------------------+ ^ +* | ^ | | +* | | pad.cy / 2 | | nBitmapHeight + +* | - | | szText.cy + +* | +------------+ | | DEFPAD_CY + 1 +* | centred | Bitmap | | | +* |<----------------->| | | | +* | +------------+ | | +* | ^ | | +* | 1 | | | +* | - | | +* | centred +---------------+ | | +* |<--------------->| Text | | | +* | +---------------+ | | +* +-----------------------------------+ - +* <-----------------------------------> +* pad.cx + max(nBitmapWidth, szText.cx) +* +* Without bitmaps (NULL imagelist or ImageList_GetImageCount() = 0): +* +* +---------------------------------------+ ^ +* | ^ | | +* | | 2 + pad.cy / 2 | | +* | - | | szText.cy + +* | centred +-----------------+ | | pad.cy + 2 +* |<--------------->| Text | | | +* | +-----------------+ | | +* | | | +* +---------------------------------------+ - +* <---------------------------------------> +* 2*cxedge + pad.cx + szText.cx +* +* Without text: +* As for with bitmaps, but with szText.cx zero. +*/ +static inline SIZE TOOLBAR_MeasureButton(TOOLBAR_INFO *infoPtr, SIZE sizeString, BOOL bHasBitmap, BOOL bValidImageList) +{ + SIZE sizeButton; + if (infoPtr->dwStyle & TBSTYLE_LIST) + { + /* set button height from bitmap / text height... */ [truncated at 1000 lines; 234 more skipped]