<div dir="ltr">Thanks for review. I sent another try.</div><div class="gmail_extra"><br><div class="gmail_quote">2018-04-19 15:27 GMT+08:00 Huw Davies <span dir="ltr"><<a href="mailto:huw@codeweavers.com" target="_blank">huw@codeweavers.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, Apr 17, 2018 at 10:47:52PM +0800, Jactry Zeng wrote:<br>
> Signed-off-by: Jactry Zeng <<a href="mailto:jzeng@codeweavers.com">jzeng@codeweavers.com</a>><br>
> ---<br>
>  dlls/riched20/editor.c       | 46 +++++++++++++++++-<br>
>  dlls/riched20/tests/editor.c | 92 ++++++++++++++++++++++++++++++<wbr>++++++<br>
>  2 files changed, 136 insertions(+), 2 deletions(-)<br>
> <br>
> <br>
<br>
</div></div>This looks fine.  However, since there's a mix of 2- and 4-space<br>
indentation styles in this file, I tend to using 4-space when writing<br>
a new function.  Could you do likewise?<br>
<br>
Huw.<br>
<br>
> diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c<br>
> index c57d3ea9b9..df1f1870cd 100644<br>
> --- a/dlls/riched20/editor.c<br>
> +++ b/dlls/riched20/editor.c<br>
> @@ -90,7 +90,7 @@<br>
>    + EM_REPLACESEL (proper style?) ANSI&Unicode<br>
>    + EM_SCROLL<br>
>    + EM_SCROLLCARET<br>
> -  - EM_SELECTIONTYPE<br>
> +  + EM_SELECTIONTYPE<br>
>    - EM_SETBIDIOPTIONS 3.0<br>
>    + EM_SETBKGNDCOLOR<br>
>    + EM_SETCHARFORMAT (partly done, no ANSI)<br>
> @@ -2960,6 +2960,47 @@ static void ME_SetDefaultFormatRect(ME_<wbr>TextEditor *editor)<br>
>    editor->rcFormat.right -= 1;<br>
>  }<br>
>  <br>
> +static LONG ME_GetSelectionType(ME_<wbr>TextEditor *editor)<br>
> +{<br>
> +  LONG sel_type = SEL_EMPTY;<br>
> +  LONG start, end;<br>
> +<br>
> +  ME_GetSelectionOfs(editor, &start, &end);<br>
> +  if (start == end)<br>
> +    sel_type = SEL_EMPTY;<br>
> +  else<br>
> +  {<br>
> +    LONG object_count = 0, character_count = 0;<br>
> +    int i;<br>
> +<br>
> +    for (i = 0; i < end - start; i++)<br>
> +    {<br>
> +      ME_Cursor cursor;<br>
> +<br>
> +      ME_CursorFromCharOfs(editor, start + i, &cursor);<br>
> +      if (cursor.pRun->member.run.<wbr>reobj)<br>
> +        object_count++;<br>
> +      else<br>
> +        character_count++;<br>
> +      if (character_count >= 2 && object_count >= 2)<br>
> +        return (SEL_TEXT | SEL_MULTICHAR | SEL_OBJECT | SEL_MULTIOBJECT);<br>
> +    }<br>
> +    if (character_count)<br>
> +    {<br>
> +      sel_type |= SEL_TEXT;<br>
> +      if (character_count >= 2)<br>
> +        sel_type |= SEL_MULTICHAR;<br>
> +    }<br>
> +    if (object_count)<br>
> +    {<br>
> +      sel_type |= SEL_OBJECT;<br>
> +      if (object_count >= 2)<br>
> +        sel_type |= SEL_MULTIOBJECT;<br>
> +    }<br>
> +  }<br>
> +  return sel_type;<br>
> +}<br>
> +<br>
>  static BOOL ME_ShowContextMenu(ME_<wbr>TextEditor *editor, int x, int y)<br>
>  {<br>
>    CHARRANGE selrange;<br>
> @@ -3498,7 +3539,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,<br>
>    UNSUPPORTED_MSG(EM_<wbr>GETTYPOGRAPHYOPTIONS)<br>
>    UNSUPPORTED_MSG(EM_<wbr>GETUNDONAME)<br>
>    UNSUPPORTED_MSG(EM_<wbr>GETWORDBREAKPROCEX)<br>
> -  UNSUPPORTED_MSG(EM_<wbr>SELECTIONTYPE)<br>
>    UNSUPPORTED_MSG(EM_<wbr>SETBIDIOPTIONS)<br>
>    UNSUPPORTED_MSG(EM_<wbr>SETEDITSTYLE)<br>
>    UNSUPPORTED_MSG(EM_<wbr>SETLANGOPTIONS)<br>
> @@ -3814,6 +3854,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,<br>
>      ME_UpdateRepaint(editor, FALSE);<br>
>      return len;<br>
>    }<br>
> +  case EM_SELECTIONTYPE:<br>
> +    return ME_GetSelectionType(editor);<br>
>    case EM_SETBKGNDCOLOR:<br>
>    {<br>
>      LRESULT lColor;<br>
> diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c<br>
> index 9bfbf45837..2a6907bfe7 100644<br>
> --- a/dlls/riched20/tests/editor.c<br>
> +++ b/dlls/riched20/tests/editor.c<br>
> @@ -20,6 +20,8 @@<br>
>  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA<br>
>  */<br>
>  <br>
> +#define COBJMACROS<br>
> +<br>
>  #include <stdarg.h><br>
>  #include <stdio.h><br>
>  #include <assert.h><br>
> @@ -30,6 +32,7 @@<br>
>  #include <winnls.h><br>
>  #include <ole2.h><br>
>  #include <richedit.h><br>
> +#include <richole.h><br>
>  #include <commdlg.h><br>
>  #include <time.h><br>
>  #include <wine/test.h><br>
> @@ -8798,6 +8801,94 @@ static void test_para_numbering(void)<br>
>      DestroyWindow( edit );<br>
>  }<br>
>  <br>
> +static void fill_reobject_struct(REOBJECT *reobj, LONG cp, LPOLEOBJECT poleobj,<br>
> +                                 LPSTORAGE pstg, LPOLECLIENTSITE polesite, LONG sizel_cx,<br>
> +                                 LONG sizel_cy, DWORD aspect, DWORD flags, DWORD user)<br>
> +{<br>
> +    reobj->cbStruct = sizeof(*reobj);<br>
> +    reobj->clsid = CLSID_NULL;<br>
> +    reobj->cp = cp;<br>
> +    reobj->poleobj = poleobj;<br>
> +    reobj->pstg = pstg;<br>
> +    reobj->polesite = polesite;<br>
> +    reobj-><a href="http://sizel.cx" rel="noreferrer" target="_blank">sizel.cx</a> = sizel_cx;<br>
> +    reobj-><a href="http://sizel.cy" rel="noreferrer" target="_blank">sizel.cy</a> = sizel_cy;<br>
> +    reobj->dvaspect = aspect;<br>
> +    reobj->dwFlags = flags;<br>
> +    reobj->dwUser = user;<br>
> +}<br>
> +<br>
> +static void test_EM_SELECTIONTYPE(void)<br>
> +{<br>
> +    HWND hwnd = new_richedit(NULL);<br>
> +    IRichEditOle *reole = NULL;<br>
> +    static const char text1[] = "abcdefg\n";<br>
> +    int result;<br>
> +    REOBJECT reo1, reo2;<br>
> +    IOleClientSite *clientsite;<br>
> +    HRESULT hr;<br>
> +<br>
> +    SendMessageA(hwnd, WM_SETTEXT, 0, (LPARAM)text1);<br>
> +    SendMessageA(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&reole);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 1, 1);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == SEL_EMPTY, "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 1, 2);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == SEL_TEXT, "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 2, 5);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == (SEL_TEXT | SEL_MULTICHAR), "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 0, 1);<br>
> +    hr = IRichEditOle_GetClientSite(<wbr>reole, &clientsite);<br>
> +    ok(hr == S_OK, "IRichEditOle_GetClientSite failed: 0x%08x\n", hr);<br>
> +    fill_reobject_struct(&reo1, REO_CP_SELECTION, NULL, NULL, clientsite, 10, 10,<br>
> +                         DVASPECT_CONTENT, 0, 1);<br>
> +    hr = IRichEditOle_InsertObject(<wbr>reole, &reo1);<br>
> +    ok(hr == S_OK, "IRichEditOle_InsertObject failed: 0x%08x\n", hr);<br>
> +    IOleClientSite_Release(<wbr>clientsite);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 0, 1);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == SEL_OBJECT, "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 0, 2);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == (SEL_TEXT | SEL_OBJECT), "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 0, 3);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == (SEL_TEXT | SEL_MULTICHAR | SEL_OBJECT), "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 2, 3);<br>
> +    hr = IRichEditOle_GetClientSite(<wbr>reole, &clientsite);<br>
> +    ok(hr == S_OK, "IRichEditOle_GetClientSite failed: 0x%08x\n", hr);<br>
> +    fill_reobject_struct(&reo2, REO_CP_SELECTION, NULL, NULL, clientsite, 10, 10,<br>
> +                         DVASPECT_CONTENT, 0, 2);<br>
> +    hr = IRichEditOle_InsertObject(<wbr>reole, &reo2);<br>
> +    ok(hr == S_OK, "IRichEditOle_InsertObject failed: 0x%08x\n", hr);<br>
> +    IOleClientSite_Release(<wbr>clientsite);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 0, 2);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == (SEL_OBJECT | SEL_TEXT), "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 0, 3);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == (SEL_OBJECT | SEL_MULTIOBJECT | SEL_TEXT), "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    SendMessageA(hwnd, EM_SETSEL, 0, 4);<br>
> +    result = SendMessageA(hwnd, EM_SELECTIONTYPE, 0, 0);<br>
> +    ok(result == (SEL_TEXT| SEL_MULTICHAR | SEL_OBJECT | SEL_MULTIOBJECT), "got wrong selection type: %x.\n", result);<br>
> +<br>
> +    IRichEditOle_Release(reole);<br>
> +    DestroyWindow(hwnd);<br>
> +}<br>
> +<br>
>  START_TEST( editor )<br>
>  {<br>
>    BOOL ret;<br>
> @@ -8872,6 +8963,7 @@ START_TEST( editor )<br>
>    test_background();<br>
>    test_eop_char_fmt();<br>
>    test_para_numbering();<br>
> +  test_EM_SELECTIONTYPE();<br>
>  <br>
>    /* Set the environment variable WINETEST_RICHED20 to keep windows<br>
>     * responsive and open for 30 seconds. This is useful for debugging.<br>
> <br>
<br>
> <br>
<br>
<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Jactry Zeng</div><div><br></div></div></div>
</div>