[PATCH 3/5] riched20: Use the host to set hide/save-sel, auto-word-sel, and vertical properties.
Huw Davies
huw at codeweavers.com
Tue Mar 16 03:22:47 CDT 2021
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/riched20/editor.c | 30 ++++++------------------------
dlls/riched20/paint.c | 6 +++---
dlls/riched20/txthost.c | 35 +++++++++++++++++++++++++++++++----
dlls/riched20/txtsrv.c | 2 ++
4 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index cf723d66cf6..b7c07058801 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3118,20 +3118,13 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
if (ed->props & TXTBIT_USEPASSWORD)
ITextHost_TxGetPasswordChar(texthost, &ed->cPasswordMask);
- if (ed->props & TXTBIT_AUTOWORDSEL)
- ed->styleFlags |= ECO_AUTOWORDSELECTION;
if (ed->props & TXTBIT_MULTILINE) {
ed->styleFlags |= ES_MULTILINE;
ed->bWordWrap = (ed->props & TXTBIT_WORDWRAP) != 0;
} else {
ed->bWordWrap = FALSE;
}
- if (!(ed->props & TXTBIT_HIDESELECTION))
- ed->styleFlags |= ES_NOHIDESEL;
- if (ed->props & TXTBIT_SAVESELECTION)
- ed->styleFlags |= ES_SAVESEL;
- if (ed->props & TXTBIT_VERTICAL)
- ed->styleFlags |= ES_VERTICAL;
+
if (ed->props & TXTBIT_DISABLEDRAG)
ed->styleFlags |= ES_NOOLEDRAGDROP;
@@ -3444,7 +3437,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
editor->bDialogMode = TRUE;
if (editor->styleFlags & ES_MULTILINE)
code |= DLGC_WANTMESSAGE;
- if (!(editor->styleFlags & ES_SAVESEL))
+ if (!(editor->props & TXTBIT_SAVESELECTION))
code |= DLGC_HASSETSEL;
return code;
}
@@ -3492,8 +3485,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
case EM_GETOPTIONS:
{
/* these flags are equivalent to the ES_* counterparts */
- DWORD mask = ECO_VERTICAL |
- ECO_NOHIDESEL | ECO_WANTRETURN | ECO_SELECTIONBAR;
+ DWORD mask = ECO_WANTRETURN | ECO_SELECTIONBAR;
DWORD settings = editor->styleFlags & mask;
return settings;
@@ -3544,9 +3536,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
/* these flags are equivalent to ES_* counterparts, except for
* ECO_AUTOWORDSELECTION that doesn't have an ES_* counterpart,
* but is still stored in editor->styleFlags. */
- const DWORD mask = ECO_VERTICAL |
- ECO_NOHIDESEL | ECO_WANTRETURN |
- ECO_SELECTIONBAR | ECO_AUTOWORDSELECTION;
+ const DWORD mask = ECO_WANTRETURN | ECO_SELECTIONBAR;
DWORD settings = mask & editor->styleFlags;
DWORD oldSettings = settings;
DWORD changedSettings;
@@ -3584,15 +3574,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
ME_RewrapRepaint(editor);
}
- if ((changedSettings & settings & ES_NOHIDESEL) && !editor->bHaveFocus)
- ME_InvalidateSelection( editor );
- if (changedSettings & settings & ECO_VERTICAL)
- FIXME("ECO_VERTICAL not implemented yet!\n");
- if (changedSettings & settings & ECO_AUTOHSCROLL)
- FIXME("ECO_WANTRETURN not implemented yet!\n");
- if (changedSettings & settings & ECO_AUTOWORDSELECTION)
- FIXME("ECO_AUTOWORDSELECTION not implemented yet!\n");
}
return settings;
@@ -4216,7 +4198,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
create_caret(editor);
update_caret(editor);
ME_SendOldNotify(editor, EN_SETFOCUS);
- if (!editor->bHideSelection && !(editor->styleFlags & ES_NOHIDESEL))
+ if (!editor->bHideSelection && (editor->props & TXTBIT_HIDESELECTION))
ME_InvalidateSelection( editor );
return 0;
case WM_KILLFOCUS:
@@ -4226,7 +4208,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
hide_caret(editor);
DestroyCaret();
ME_SendOldNotify(editor, EN_KILLFOCUS);
- if (!editor->bHideSelection && !(editor->styleFlags & ES_NOHIDESEL))
+ if (!editor->bHideSelection && (editor->props & TXTBIT_HIDESELECTION))
ME_InvalidateSelection( editor );
return 0;
case WM_COMMAND:
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index e22dc64ebdb..34d0ab8a54f 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -270,8 +270,8 @@ static void draw_space( ME_Context *c, ME_Run *run, int x, int y,
SetRect( &rect, x, ymin, x + run->nWidth, ymin + cy );
- if (c->editor->bHideSelection || (!c->editor->bHaveFocus &&
- !(c->editor->styleFlags & ES_NOHIDESEL))) selected = FALSE;
+ if (c->editor->bHideSelection || (!c->editor->bHaveFocus && (c->editor->props & TXTBIT_HIDESELECTION)))
+ selected = FALSE;
if (c->editor->bEmulateVersion10)
{
old_style_selected = selected;
@@ -366,7 +366,7 @@ static void draw_text_with_style( ME_Context *c, ME_Run *run, int x, int y,
int yOffset = 0;
BOOL selected = (nSelFrom < run->len && nSelTo >= 0
&& nSelFrom < nSelTo && !c->editor->bHideSelection &&
- (c->editor->bHaveFocus || (c->editor->styleFlags & ES_NOHIDESEL)));
+ (c->editor->bHaveFocus || !(c->editor->props & TXTBIT_HIDESELECTION)));
BOOL old_style_selected = FALSE;
RECT sel_rect;
HRGN clip = NULL, sel_rgn = NULL;
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index 027b079d654..d10b303a137 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -60,7 +60,7 @@ static void host_init_props( struct host *host )
if (style & WS_VSCROLL) host->scrollbars |= ES_AUTOVSCROLL;
if ((style & WS_HSCROLL) && !host->emulate_10) host->scrollbars |= ES_AUTOHSCROLL;
- host->props = TXTBIT_RICHTEXT | TXTBIT_AUTOWORDSEL | TXTBIT_ALLOWBEEP;
+ host->props = TXTBIT_RICHTEXT | TXTBIT_ALLOWBEEP;
if (style & ES_MULTILINE) host->props |= TXTBIT_MULTILINE;
if (style & ES_READONLY) host->props |= TXTBIT_READONLY;
if (style & ES_PASSWORD) host->props |= TXTBIT_USEPASSWORD;
@@ -765,9 +765,11 @@ static HRESULT get_text_rangeA( struct host *host, TEXTRANGEA *rangeA, LRESULT *
static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *res )
{
DWORD style, old_options, new_options, change, props_mask = 0;
- const DWORD mask = ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_NOHIDESEL | ECO_READONLY | ECO_WANTRETURN |
- ECO_SELECTIONBAR | ECO_VERTICAL;
- const DWORD host_mask = ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_READONLY;
+ DWORD mask = ECO_AUTOWORDSELECTION | ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_NOHIDESEL | ECO_READONLY |
+ ECO_WANTRETURN | ECO_SAVESEL | ECO_SELECTIONBAR | ECO_VERTICAL;
+ const DWORD host_mask = ECO_AUTOWORDSELECTION | ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_NOHIDESEL | ECO_READONLY |
+ ECO_SAVESEL | ECO_VERTICAL;
+
HRESULT hr = S_OK;
new_options = old_options = SendMessageW( host->window, EM_GETOPTIONS, 0, 0 );
@@ -790,6 +792,11 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
change = (new_options ^ old_options);
+ if (change & ECO_AUTOWORDSELECTION)
+ {
+ host->props ^= TXTBIT_AUTOWORDSEL;
+ props_mask |= TXTBIT_AUTOWORDSEL;
+ }
if (change & ECO_AUTOVSCROLL)
{
host->scrollbars ^= WS_VSCROLL;
@@ -800,11 +807,26 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
host->scrollbars ^= WS_HSCROLL;
props_mask |= TXTBIT_SCROLLBARCHANGE;
}
+ if (change & ECO_NOHIDESEL)
+ {
+ host->props ^= TXTBIT_HIDESELECTION;
+ props_mask |= TXTBIT_HIDESELECTION;
+ }
if (change & ECO_READONLY)
{
host->props ^= TXTBIT_READONLY;
props_mask |= TXTBIT_READONLY;
}
+ if (change & ECO_SAVESEL)
+ {
+ host->props ^= TXTBIT_SAVESELECTION;
+ props_mask |= TXTBIT_SAVESELECTION;
+ }
+ if (change & ECO_VERTICAL)
+ {
+ host->props ^= TXTBIT_VERTICAL;
+ props_mask |= TXTBIT_VERTICAL;
+ }
if (props_mask)
ITextServices_OnTxPropertyBitsChange( host->text_srv, props_mask, host->props & props_mask );
@@ -813,6 +835,7 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
hr = ITextServices_TxSendMessage( host->text_srv, EM_SETOPTIONS, op, value, res );
*res = (*res & ~host_mask) | (new_options & host_mask);
+ mask &= ~ECO_AUTOWORDSELECTION; /* doesn't correspond to a window style */
style = GetWindowLongW( host->window, GWL_STYLE );
style = (style & ~mask) | (*res & mask);
SetWindowLongW( host->window, GWL_STYLE, style );
@@ -926,6 +949,10 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
case EM_GETOPTIONS:
hr = ITextServices_TxSendMessage( host->text_srv, EM_GETOPTIONS, 0, 0, &res );
if (host->props & TXTBIT_READONLY) res |= ECO_READONLY;
+ if (!(host->props & TXTBIT_HIDESELECTION)) res |= ECO_NOHIDESEL;
+ if (host->props & TXTBIT_SAVESELECTION) res |= ECO_SAVESEL;
+ if (host->props & TXTBIT_AUTOWORDSEL) res |= ECO_AUTOWORDSELECTION;
+ if (host->props & TXTBIT_VERTICAL) res |= ECO_VERTICAL;
if (host->scrollbars & ES_AUTOHSCROLL) res |= ECO_AUTOHSCROLL;
if (host->scrollbars & ES_AUTOVSCROLL) res |= ECO_AUTOVSCROLL;
break;
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index c017f5bae16..8fb6416d38b 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -347,6 +347,8 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic
}
}
+ if ((mask & TXTBIT_HIDESELECTION) && !services->editor->bHaveFocus) ME_InvalidateSelection( services->editor );
+
return S_OK;
}
--
2.23.0
More information about the wine-devel
mailing list