Index: dlls/user/edit.c =================================================================== RCS file: /home/wine/wine/dlls/user/edit.c,v retrieving revision 1.14 diff -u -p -r1.14 edit.c --- dlls/user/edit.c 19 Jan 2005 20:53:38 -0000 1.14 +++ dlls/user/edit.c 10 Feb 2005 17:49:00 -0000 @@ -1274,7 +1274,10 @@ static void EDIT_BuildLineDefs_ML(EDITST 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 +1315,27 @@ static void EDIT_BuildLineDefs_ML(EDITST */ 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 +1435,10 @@ static INT EDIT_CharFromPos(EDITSTATE *e 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); @@ -1441,11 +1468,22 @@ static INT EDIT_CharFromPos(EDITSTATE *e } else { LPWSTR text; SIZE size; + INT indent; if (after_wrap) *after_wrap = FALSE; x -= es->format_rect.left; if (!x) return es->x_offset; + + if (!es->x_offset) + { + 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 +2922,13 @@ static LRESULT EDIT_EM_PosFromChar(EDITS 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 +2940,7 @@ static LRESULT EDIT_EM_PosFromChar(EDITS 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 +2951,32 @@ static LRESULT EDIT_EM_PosFromChar(EDITS 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 /* if (es->style & 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 +2987,18 @@ static LRESULT EDIT_EM_PosFromChar(EDITS GetTextExtentPoint32W(dc, text + es->x_offset, index - es->x_offset, &size); x = size.cx; + + if (!es->x_offset) + { + 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 +3132,20 @@ static void EDIT_EM_ReplaceSel(EDITSTATE 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 +4526,11 @@ static LRESULT EDIT_WM_NCCreate(HWND hwn es->style |= ES_AUTOVSCROLL; } else { es->buffer_limit = BUFLIMIT_SINGLE; - es->style &= ~ES_CENTER; - es->style &= ~ES_RIGHT; + if ((es->style & ES_CENTER) || (es->style & ES_RIGHT)) + { + if (es->style & ES_RIGHT) + es->style &= ~ES_CENTER; + } es->style &= ~WS_HSCROLL; es->style &= ~WS_VSCROLL; if (es->style & ES_PASSWORD)