Author: jimtabor Date: Sun Jun 2 20:47:56 2013 New Revision: 59158
URL: http://svn.reactos.org/svn/reactos?rev=59158&view=rev Log: [User32] - Sync port to 1.5.31.
Modified: trunk/reactos/win32ss/user/user32/controls/edit.c
Modified: trunk/reactos/win32ss/user/user32/controls/edit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/control... ============================================================================== --- trunk/reactos/win32ss/user/user32/controls/edit.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/user32/controls/edit.c [iso-8859-1] Sun Jun 2 20:47:56 2013 @@ -68,9 +68,7 @@ #define EF_AFTER_WRAP 0x0080 /* the caret is displayed after the last character of a wrapped line, instead of in front of the next character */ #define EF_USE_SOFTBRK 0x0100 /* Enable soft breaks in text. */ -#define EF_APP_HAS_HANDLE 0x0200 /* Set when an app sends EM_[G|S]ETHANDLE. We are in sole control of - the text buffer if this is clear. */ -#define EF_DIALOGMODE 0x0400 /* Indicates that we are inside a dialog window */ +#define EF_DIALOGMODE 0x0200 /* Indicates that we are inside a dialog window */
typedef enum { @@ -129,6 +127,7 @@ Even if parent will change, EN_* messages should be sent to the first parent. */ HWND hwndListBox; /* handle of ComboBox's listbox or NULL */ + INT wheelDeltaRemainder; /* scroll wheel delta left over after scrolling whole lines */ /* * only for multi line controls */ @@ -139,6 +138,7 @@ HLOCAL hloc32W; /* our unicode local memory block */ HLOCAL hloc32A; /* alias for ANSI control receiving EM_GETHANDLE or EM_SETHANDLE */ + HLOCAL hlocapp; /* The text buffer handle belongs to the app */ /* * IME Data */ @@ -391,6 +391,7 @@ HFONT old_font = NULL; HDC udc = dc; SCRIPT_TABDEF tabdef; + HRESULT hr;
if (!udc) udc = GetDC(es->hwndSelf); @@ -401,10 +402,19 @@ tabdef.iScale = 0; tabdef.pTabStops = es->tabs; tabdef.iTabOrigin = 0; - - ScriptStringAnalyse(udc, &es->text[index], line_def->net_length, (3*line_def->net_length/2+16), -1, SSA_LINK|SSA_FALLBACK|SSA_GLYPHS|SSA_TAB, -1, NULL, NULL, NULL, &tabdef, NULL, &line_def->ssa); - - if (es->font) + //// ReactOS r57679 + hr = ScriptStringAnalyse(udc, &es->text[index], line_def->net_length, + (3*line_def->net_length/2+16), -1, + SSA_LINK|SSA_FALLBACK|SSA_GLYPHS|SSA_TAB, -1, + NULL, NULL, NULL, &tabdef, NULL, &line_def->ssa); + //// + if (FAILED(hr)) + { + WARN("ScriptStringAnalyse failed (%x)\n",hr); + line_def->ssa = NULL; + } + + if (es->font) SelectObject(udc, old_font); if (udc != dc) ReleaseDC(es->hwndSelf, udc); @@ -435,12 +445,12 @@ udc = GetDC(es->hwndSelf); if (es->font) old_font = SelectObject(udc, es->font); - + //// ReactOS r57677 if (es->style & ES_PASSWORD) ScriptStringAnalyse(udc, &es->password_char, length, (3*length/2+16), -1, SSA_LINK|SSA_FALLBACK|SSA_GLYPHS|SSA_PASSWORD, -1, NULL, NULL, NULL, NULL, NULL, &es->ssa); else ScriptStringAnalyse(udc, es->text, length, (3*length/2+16), -1, SSA_LINK|SSA_FALLBACK|SSA_GLYPHS, -1, NULL, NULL, NULL, NULL, NULL, &es->ssa); - + //// if (es->font) SelectObject(udc, old_font); if (udc != dc) @@ -562,9 +572,9 @@ cp = current_position; while (*cp) { if (*cp == '\n') break; - if ((*cp == '\r') && (*(cp + 1) == '\n')) - break; - cp++; + if ((*cp == '\r') && (*(cp + 1) == '\n')) + break; + cp++; }
/* Mark type of line termination */ @@ -587,9 +597,13 @@ const SIZE *sz; EDIT_InvalidateUniscribeData_linedef(current_line); EDIT_UpdateUniscribeData_linedef(es, NULL, current_line); - sz = ScriptString_pSize(current_line->ssa); - /* Calculate line width */ - current_line->width = sz->cx; + if (current_line->ssa) + { + sz = ScriptString_pSize(current_line->ssa); + /* Calculate line width */ + current_line->width = sz->cx; + } + else current_line->width = es->char_width * current_line->net_length; } else current_line->width = 0;
@@ -617,7 +631,9 @@ current_line->net_length = prev; EDIT_InvalidateUniscribeData_linedef(current_line); EDIT_UpdateUniscribeData_linedef(es, NULL, current_line); - sz = ScriptString_pSize(current_line->ssa); + if (current_line->ssa) + sz = ScriptString_pSize(current_line->ssa); + else sz = 0; if (sz) current_line->width = sz->cx; else @@ -633,18 +649,23 @@ EDIT_InvalidateUniscribeData_linedef(current_line); EDIT_UpdateUniscribeData_linedef(es, NULL, current_line);
- count = ScriptString_pcOutChars(current_line->ssa); - piDx = HeapAlloc(GetProcessHeap(),0,sizeof(INT) * (*count)); - ScriptStringGetLogicalWidths(current_line->ssa,piDx); - - prev = current_line->net_length-1; - do { - current_line->width -= piDx[prev]; - prev--; - } while ( prev > 0 && current_line->width > fw); - if (prev<=0) - prev = 1; - HeapFree(GetProcessHeap(),0,piDx); + if (current_line->ssa) + { + count = ScriptString_pcOutChars(current_line->ssa); + piDx = HeapAlloc(GetProcessHeap(),0,sizeof(INT) * (*count)); + ScriptStringGetLogicalWidths(current_line->ssa,piDx); + + prev = current_line->net_length-1; + do { + current_line->width -= piDx[prev]; + prev--; + } while ( prev > 0 && current_line->width > fw); + if (prev<=0) + prev = 1; + HeapFree(GetProcessHeap(),0,piDx); + } + else + prev = (fw / es->char_width); }
/* If the first line we are calculating, wrapped before istart, we must @@ -669,8 +690,13 @@ if (current_line->net_length > 0) { EDIT_UpdateUniscribeData_linedef(es, NULL, current_line); - sz = ScriptString_pSize(current_line->ssa); - current_line->width = sz->cx; + if (current_line->ssa) + { + sz = ScriptString_pSize(current_line->ssa); + current_line->width = sz->cx; + } + else + current_line->width = 0; } else current_line->width = 0; } @@ -1228,6 +1254,8 @@ */ static void EDIT_LockBuffer(EDITSTATE *es) { + if (es->hlocapp) return; + if (!es->text) {
CHAR *textA = NULL; // ReactOS Hacked! r45670 @@ -1247,7 +1275,7 @@ return; }
- if(textA) + if (textA) //// ReactOS { HLOCAL hloc32W_new; UINT countW_new = MultiByteToWideChar(CP_ACP, 0, textA, -1, NULL, 0); @@ -1271,7 +1299,6 @@ } else es->text = LocalLock(es->hloc32W); } - if(es->flags & EF_APP_HAS_HANDLE) text_buffer_changed(es); es->lock_count++; }
@@ -2463,7 +2490,11 @@ hLocal = es->hloc32A; }
- es->flags |= EF_APP_HAS_HANDLE; + EDIT_UnlockBuffer(es, TRUE); + + /* The text buffer handle belongs to the app */ + es->hlocapp = hLocal; + TRACE("Returning %p, LocalSize() = %ld\n", hLocal, LocalSize(hLocal)); return hLocal; } @@ -2804,8 +2835,11 @@
es->buffer_size = LocalSize(es->hloc32W)/sizeof(WCHAR) - 1;
- es->flags |= EF_APP_HAS_HANDLE; + /* The text buffer handle belongs to the control */ + es->hlocapp = NULL; + EDIT_LockBuffer(es); + text_buffer_changed(es);
es->x_offset = es->y_offset = 0; es->selection_start = es->selection_end = 0; @@ -3575,6 +3609,8 @@ if(!(es->style & ES_NOHIDESEL)) EDIT_InvalidateText(es, es->selection_start, es->selection_end); EDIT_NOTIFY_PARENT(es, EN_KILLFOCUS); + /* throw away left over scroll when we lose focus */ + es->wheelDeltaRemainder = 0; return 0; }
@@ -4618,12 +4654,14 @@ { LINEDEF *pc, *pp;
- if (es->hloc32W) { - LocalFree(es->hloc32W); - } - if (es->hloc32A) { - LocalFree(es->hloc32A); - } + /* The app can own the text buffer handle */ + if (es->hloc32W && (es->hloc32W != es->hlocapp)) { + LocalFree(es->hloc32W); + } + if (es->hloc32A && (es->hloc32A != es->hlocapp)) { + LocalFree(es->hloc32A); + } + EDIT_InvalidateUniscribeData(es); pc = es->first_line_def; while (pc) { @@ -4632,7 +4670,6 @@ pc = pp; }
- EDIT_InvalidateUniscribeData(es); SetWindowLongPtrW( es->hwndSelf, 0, 0 ); HeapFree(GetProcessHeap(), 0, es->undo_text); HeapFree(GetProcessHeap(), 0, es); @@ -5155,7 +5192,7 @@
case WM_MOUSEWHEEL: { - int gcWheelDelta = 0; + int wheelDelta; UINT pulScrollLines = 3; SystemParametersInfoW(SPI_GETWHEELSCROLLLINES,0, &pulScrollLines, 0);
@@ -5163,12 +5200,20 @@ result = DefWindowProcW(hwnd, msg, wParam, lParam); break; } - gcWheelDelta -= GET_WHEEL_DELTA_WPARAM(wParam); - if (abs(gcWheelDelta) >= WHEEL_DELTA && pulScrollLines) + wheelDelta = GET_WHEEL_DELTA_WPARAM(wParam); + /* if scrolling changes direction, ignore left overs */ + if ((wheelDelta < 0 && es->wheelDeltaRemainder < 0) || + (wheelDelta > 0 && es->wheelDeltaRemainder > 0)) + es->wheelDeltaRemainder += wheelDelta; + else + es->wheelDeltaRemainder = wheelDelta; + if (es->wheelDeltaRemainder && pulScrollLines) { - int cLineScroll= (int) min((UINT) es->line_count, pulScrollLines); - cLineScroll *= (gcWheelDelta / WHEEL_DELTA); - result = EDIT_EM_LineScroll(es, 0, cLineScroll); + int cLineScroll; + pulScrollLines = (int) min((UINT) es->line_count, pulScrollLines); + cLineScroll = pulScrollLines * (float)es->wheelDeltaRemainder / WHEEL_DELTA; + es->wheelDeltaRemainder -= WHEEL_DELTA * cLineScroll / (int)pulScrollLines; + result = EDIT_EM_LineScroll(es, 0, -cLineScroll); } } break; @@ -5204,6 +5249,28 @@
case WM_IME_CONTROL: break; + + case WM_IME_REQUEST: + switch (wParam) + { + case IMR_QUERYCHARPOSITION: + { + LRESULT pos; + IMECHARPOSITION *chpos = (IMECHARPOSITION *)lParam; + + pos = EDIT_EM_PosFromChar(es, es->selection_start + chpos->dwCharPos, FALSE); + chpos->pt.x = LOWORD(pos); + chpos->pt.y = HIWORD(pos); + chpos->cLineHeight = es->line_height; + chpos->rcDocument = es->format_rect; + MapWindowPoints(hwnd, 0, &chpos->pt, 1); + MapWindowPoints(hwnd, 0, (POINT*)&chpos->rcDocument, 2); + result = 1; + break; + } + } + break; +
default: result = DefWindowProcT(hwnd, msg, wParam, lParam, unicode);