ChangeLog Implement CBES_EX_PATHWORDBREAKPROC for the ComboEx control. Index: dlls/comctl32/comboex.c =================================================================== RCS file: /var/cvs/wine/dlls/comctl32/comboex.c,v retrieving revision 1.49 diff -u -r1.49 comboex.c --- dlls/comctl32/comboex.c 26 Aug 2002 21:46:25 -0000 1.49 +++ dlls/comctl32/comboex.c 27 Aug 2002 03:46:35 -0000 @@ -21,7 +21,6 @@ * * FIXME: * 1. Implement following extended styles: - * CBES_EX_PATHWORDBREAKPROC * CBES_EX_NOSIZELIMIT * 2. Notify CBEN_DRAGBEGIN is not implemented. * @@ -119,6 +118,8 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT WINAPI COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +static int CALLBACK +COMBOEX_PathWordBreakProc(LPWSTR lpch, int ichCurrent, int cch, int code); static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr); typedef INT (WINAPI *cmp_func_t)(LPCWSTR, LPCWSTR); @@ -622,15 +623,21 @@ dwTemp = infoPtr->dwExtStyle; - if (style & (CBES_EX_PATHWORDBREAKPROC | - CBES_EX_NOSIZELIMIT)) - FIXME("Extended style not implemented %08lx\n", style); + if (style & CBES_EX_NOSIZELIMIT) + FIXME("Extended style CBES_EX_NOSIZELIMIT implemented\n"); if (mask) infoPtr->dwExtStyle = (infoPtr->dwExtStyle & ~mask) | style; else infoPtr->dwExtStyle = style; + /* see if we need to change the word break proc on the edit */ + if ((infoPtr->dwExtStyle ^ dwTemp) & CBES_EX_PATHWORDBREAKPROC) { + SendMessageW(infoPtr->hwndEdit, EM_SETWORDBREAKPROC, 0, + (infoPtr->dwExtStyle & CBES_EX_PATHWORDBREAKPROC) ? + (LPARAM)COMBOEX_PathWordBreakProc : 0); + } + /* test if the control's appearance has changed */ mask = CBES_EX_NOEDITIMAGE | CBES_EX_NOEDITIMAGEINDENT; if ((infoPtr->dwExtStyle & mask) != (dwTemp & mask)) { @@ -912,9 +919,9 @@ infoPtr->hwndCombo = CreateWindowW (COMBOBOX, NIL, /* following line added to match native */ WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL | - CBS_NOINTEGRALHEIGHT | CBS_DROPDOWNLIST | + CBS_NOINTEGRALHEIGHT | CBS_DROPDOWNLIST | /* was base and is necessary */ - WS_CHILD | WS_VISIBLE | CBS_OWNERDRAWFIXED | + WS_CHILD | WS_VISIBLE | CBS_OWNERDRAWFIXED | GetWindowLongW (hwnd, GWL_STYLE), cs->y, cs->x, cs->cx, cs->cy, hwnd, (HMENU) GetWindowLongW (hwnd, GWL_ID), @@ -1598,6 +1605,29 @@ return 0; } +static inline int is_delimiter(WCHAR c) +{ + switch(c) { + case '/': + case '\\': + case '.': + return TRUE; + } + return FALSE; +} + +static int CALLBACK +COMBOEX_PathWordBreakProc(LPWSTR lpch, int ichCurrent, int cch, int code) +{ + if (code == WB_ISDELIMITER) { + return is_delimiter(lpch[ichCurrent]); + } else { + int dir = (code == WB_LEFT) ? -1 : 1; + for(; 0 <= ichCurrent && ichCurrent < cch; ichCurrent += dir) + if (is_delimiter(lpch[ichCurrent])) return ichCurrent; + } + return ichCurrent; +} static LRESULT WINAPI COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)