Implement ES_CENTER and ES_RIGHT alignment styles.

This commit is contained in:
Ulrich Czekalla 2005-02-16 16:28:34 +00:00 committed by Alexandre Julliard
parent 084e596a95
commit 7df337514b

View file

@ -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 @@ static void EDIT_BuildLineDefs_ML(EDITSTATE *es, INT istart, INT iend, INT delta
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_BuildLineDefs_ML(EDITSTATE *es, INT istart, INT iend, INT delta
*/
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 @@ static INT EDIT_CharFromPos(EDITSTATE *es, INT x, INT y, LPBOOL after_wrap)
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 @@ static INT EDIT_CharFromPos(EDITSTATE *es, INT x, INT y, LPBOOL after_wrap)
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 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap)
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 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap)
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 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap)
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 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap)
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 @@ static void EDIT_EM_ReplaceSel(EDITSTATE *es, BOOL can_undo, LPCWSTR lpsz_replac
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 @@ static LRESULT EDIT_WM_NCCreate(HWND hwnd, LPCREATESTRUCTW lpcs, BOOL unicode)
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)