Implement ES_CENTER and ES_RIGHT alignment styles.
diff --git a/dlls/user/edit.c b/dlls/user/edit.c index 9b18c2b..deb542f 100644 --- a/dlls/user/edit.c +++ b/dlls/user/edit.c
@@ -38,9 +38,6 @@ * - EM_GETIMESTATUS, EM_SETIMESTATUS * - EN_ALIGN_LTR_EC * - EN_ALIGN_RTL_EC - * - ES_CENTER - * - ES_RIGHT - * - ES_LEFT * - ES_OEMCONVERT * -!ES_AUTOVSCROLL (every multi line control *is* auto vscroll) * -!ES_AUTOHSCROLL (every single line control *is* auto hscroll) @@ -1274,7 +1271,10 @@ rc.top = es->format_rect.top + nstart_line * es->line_height - (es->y_offset * es->line_height); /* Adjust for vertical scrollbar */ rc.bottom = rc.top + es->line_height; - rc.left = es->format_rect.left + (INT)LOWORD(GetTabbedTextExtentW(dc, + if ((es->style & ES_CENTER) || (es->style & ES_RIGHT)) + rc.left = es->format_rect.left; + else + rc.left = es->format_rect.left + (INT)LOWORD(GetTabbedTextExtentW(dc, es->text + nstart_index, istart - nstart_index, es->tabs_count, es->tabs)) - es->x_offset; /* Adjust for horz scroll */ rc.right = es->format_rect.right; @@ -1312,7 +1312,27 @@ */ static void EDIT_CalcLineWidth_SL(EDITSTATE *es) { - es->text_width = (short)LOWORD(EDIT_EM_PosFromChar(es, strlenW(es->text), FALSE)); + SIZE size; + LPWSTR text; + HDC dc; + HFONT old_font = 0; + + text = EDIT_GetPasswordPointer_SL(es); + + dc = GetDC(es->hwndSelf); + if (es->font) + old_font = SelectObject(dc, es->font); + + GetTextExtentPoint32W(dc, text, strlenW(text), &size); + + if (es->font) + SelectObject(dc, old_font); + ReleaseDC(es->hwndSelf, dc); + + if (es->style & ES_PASSWORD) + HeapFree(GetProcessHeap(), 0, text); + + es->text_width = size.cx; } /********************************************************************* @@ -1412,6 +1432,10 @@ line--; } x += es->x_offset - es->format_rect.left; + if (es->style & ES_RIGHT) + x -= (es->format_rect.right - es->format_rect.left) - line_def->width; + else if (es->style & ES_CENTER) + x -= ((es->format_rect.right - es->format_rect.left) - line_def->width) / 2; if (x >= line_def->width) { if (after_wrap) *after_wrap = (line_def->ending == END_WRAP); @@ -1446,6 +1470,16 @@ x -= es->format_rect.left; if (!x) return es->x_offset; + + if (!es->x_offset) + { + INT indent = (es->format_rect.right - es->format_rect.left) - es->text_width; + if (es->style & ES_RIGHT) + x -= indent; + else if (es->style & ES_CENTER) + x -= indent / 2; + } + text = EDIT_GetPasswordPointer_SL(es); dc = GetDC(es->hwndSelf); if (es->font) @@ -2884,9 +2918,13 @@ INT li; INT x; INT y = 0; + INT w; + INT lw = 0; + INT ll = 0; HDC dc; HFONT old_font = 0; SIZE size; + LINEDEF *line_def; index = min(index, len); dc = GetDC(es->hwndSelf); @@ -2898,7 +2936,7 @@ li = EDIT_EM_LineIndex(es, l); if (after_wrap && (li == index) && l) { INT l2 = l - 1; - LINEDEF *line_def = es->first_line_def; + line_def = es->first_line_def; while (l2) { line_def = line_def->next; l2--; @@ -2909,8 +2947,32 @@ li = EDIT_EM_LineIndex(es, l); } } - x = LOWORD(GetTabbedTextExtentW(dc, es->text + li, index - li, + + line_def = es->first_line_def; + while (line_def->index != li) + line_def = line_def->next; + + ll = line_def->net_length; + lw = line_def->width; + + w = es->format_rect.right - es->format_rect.left; + if (es->style & ES_RIGHT) + { + x = LOWORD(GetTabbedTextExtentW(dc, es->text + li + (index - li), ll - (index - li), es->tabs_count, es->tabs)) - es->x_offset; + x = w - x; + } + else if (es->style & ES_CENTER) + { + x = LOWORD(GetTabbedTextExtentW(dc, es->text + li, index - li, + es->tabs_count, es->tabs)) - es->x_offset; + x += (w - lw) / 2; + } + else /* ES_LEFT */ + { + x = LOWORD(GetTabbedTextExtentW(dc, es->text + li, index - li, + es->tabs_count, es->tabs)) - es->x_offset; + } } else { LPWSTR text = EDIT_GetPasswordPointer_SL(es); if (index < es->x_offset) { @@ -2921,6 +2983,18 @@ GetTextExtentPoint32W(dc, text + es->x_offset, index - es->x_offset, &size); x = size.cx; + + if (!es->x_offset && (es->style & (ES_RIGHT | ES_CENTER))) + { + w = es->format_rect.right - es->format_rect.left; + if (w > es->text_width) + { + if (es->style & ES_RIGHT) + x += w - es->text_width; + else if (es->style & ES_CENTER) + x += (w - es->text_width) / 2; + } + } } y = 0; if (es->style & ES_PASSWORD) @@ -3054,6 +3128,20 @@ else EDIT_CalcLineWidth_SL(es); + /* If text has been deleted and we're right or center aligned then scroll rightward */ + if (es->style & (ES_RIGHT | ES_CENTER)) + { + INT delta = strl - abs(es->selection_end - es->selection_start); + + if (delta < 0 && es->x_offset) + { + if (abs(delta) > es->x_offset) + es->x_offset = 0; + else + es->x_offset += delta; + } + } + EDIT_EM_SetSel(es, s, s, FALSE); es->flags |= EF_MODIFIED; if (send_update) es->flags |= EF_UPDATE; @@ -4434,8 +4522,8 @@ es->style |= ES_AUTOVSCROLL; } else { es->buffer_limit = BUFLIMIT_SINGLE; - es->style &= ~ES_CENTER; - es->style &= ~ES_RIGHT; + if ((es->style & ES_RIGHT) && (es->style & ES_CENTER)) + es->style &= ~ES_CENTER; es->style &= ~WS_HSCROLL; es->style &= ~WS_VSCROLL; if (es->style & ES_PASSWORD)