[PATCH v2] comctl32: Implement handling of EM_SETCUEBANNER/EM_GETCUEBANNER messages.
Sergio Gómez Del Real
sdelreal at codeweavers.com
Mon Oct 22 13:13:54 CDT 2018
Signed-off-by: Sergio Gómez Del Real <sdelreal at codeweavers.com>
---
dlls/comctl32/edit.c | 66 ++++++++++++++++++++++++++++++++++++++
dlls/comctl32/tests/edit.c | 62 +++++++++++++++++++++++++++++++++++
2 files changed, 128 insertions(+)
diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c
index f0180adfbe..f58ceb1a39 100644
--- a/dlls/comctl32/edit.c
+++ b/dlls/comctl32/edit.c
@@ -131,6 +131,7 @@ typedef struct
should be sent to the first parent. */
HWND hwndListBox; /* handle of ComboBox's listbox or NULL */
INT wheelDeltaRemainder; /* scroll wheel delta left over after scrolling whole lines */
+ WCHAR *cue_banner_text;
/*
* only for multi line controls
*/
@@ -2181,6 +2182,12 @@ static void EDIT_PaintLine(EDITSTATE *es, HDC dc, INT line, BOOL rev)
x += EDIT_PaintText(es, dc, x, y, line, e - li, li + ll - e, FALSE);
} else
x += EDIT_PaintText(es, dc, x, y, line, 0, ll, FALSE);
+
+ if (!(es->flags & EF_FOCUSED) && es->cue_banner_text && es->text_length == 0)
+ {
+ SetTextColor(dc, GetSysColor(COLOR_GRAYTEXT));
+ TextOutW(dc, x, y, es->cue_banner_text, strlenW(es->cue_banner_text));
+ }
}
@@ -4152,6 +4159,56 @@ static LRESULT EDIT_EM_GetThumb(EDITSTATE *es)
EDIT_WM_HScroll(es, EM_GETTHUMB, 0));
}
+/*********************************************************************
+ *
+ * EM_SETCUEBANNER
+ *
+ */
+static BOOL EDIT_EM_SetCueBanner(EDITSTATE *es, const WCHAR *cue_text)
+{
+ SIZE_T str_size;
+
+ if (es->style & ES_MULTILINE || !cue_text)
+ return FALSE;
+
+ str_size = strlenW(cue_text);
+
+ if (es->cue_banner_text)
+ heap_free(es->cue_banner_text);
+
+ es->cue_banner_text = heap_alloc((str_size + 1) * sizeof(WCHAR));
+ if (!es->cue_banner_text)
+ return FALSE;
+
+ memcpy(es->cue_banner_text, cue_text, str_size * sizeof(WCHAR));
+ es->cue_banner_text[str_size] = 0;
+
+ return TRUE;
+}
+
+/*********************************************************************
+ *
+ * EM_GETCUEBANNER
+ *
+ */
+static BOOL EDIT_EM_GetCueBanner(EDITSTATE *es, WCHAR *buf, DWORD size)
+{
+ if (!es->cue_banner_text)
+ return FALSE;
+ else
+ {
+ if (size > strlenW(es->cue_banner_text))
+ size = strlenW(es->cue_banner_text) + 1;
+ //lstrcpynW(buf, es->cue_banner_text, strlenW(es->cue_banner_text)+1);
+ //else if (size > 0)
+ //{
+ memcpy(buf, es->cue_banner_text, (size - 1) * sizeof(WCHAR));
+ buf[size-1] = 0;
+ // }
+ return TRUE;
+ }
+}
+
/********************************************************************
*
@@ -4489,6 +4546,7 @@ static LRESULT EDIT_WM_NCDestroy(EDITSTATE *es)
SetWindowLongPtrW( es->hwndSelf, 0, 0 );
heap_free(es->undo_text);
+ heap_free(es->cue_banner_text);
heap_free(es);
return 0;
@@ -4703,6 +4761,14 @@ static LRESULT CALLBACK EDIT_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
result = EDIT_EM_CharFromPos(es, (short)LOWORD(lParam), (short)HIWORD(lParam));
break;
+ case EM_SETCUEBANNER:
+ result = EDIT_EM_SetCueBanner(es, (const WCHAR *)lParam);
+ break;
+
+ case EM_GETCUEBANNER:
+ result = EDIT_EM_GetCueBanner(es, (WCHAR *)wParam, (DWORD)lParam);
+ break;
+
/* End of the EM_ messages which were in numerical order; what order
* are these in? vaguely alphabetical?
*/
diff --git a/dlls/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c
index a5097d1cbb..5ab013efb3 100644
--- a/dlls/comctl32/tests/edit.c
+++ b/dlls/comctl32/tests/edit.c
@@ -3061,6 +3061,67 @@ static const struct message killfocus_combined_seq[] =
{ 0 }
};
+static void test_cue_banner(void)
+{
+ HWND hwnd_edit;
+ BOOL ret;
+ static WCHAR testW[5] = {'T','e','s','t',0};
+ static WCHAR testcmp1W[] = {'T','e','s','t',0};
+ static WCHAR testcmp2W[] = {'T','e','s',0};
+ static WCHAR getcuetestW[5];
+ static WCHAR emptyW[] = {0};
+
+ hwnd_edit = create_editcontrolW(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, 0, 0);
+ ok(ret == FALSE, "EM_GETCUEBANNER should have returned FALSE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, 0);
+ ok(ret == FALSE, "EM_SETCUEBANNER should have returned FALSE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, 0, 0);
+ ok(ret == FALSE, "EM_GETCUEBANNER should have returned FALSE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)testW);
+ ok(ret == TRUE, "EM_SETCUEBANNER should have returned TRUE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, 5);
+ if (ret == FALSE)
+ {
+ win_skip("skipping for Win XP and 2003 Server.\n");
+ DestroyWindow(hwnd_edit);
+ return;
+ }
+ ok(ret == TRUE, "EM_GETCUEBANNER should have returned TRUE.\n");
+ ok(lstrcmpW(getcuetestW, testW) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(getcuetestW));
+
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)emptyW);
+ ok(ret == TRUE, "EM_SETCUEBANNER should have returned TRUE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, 5);
+ ok(ret == TRUE, "EM_GETCUEBANNER should have returned TRUE.\n");
+ ok(lstrcmpW(getcuetestW, emptyW) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(getcuetestW));
+
+ /* EM_GETCUEBANNER's buffer size includes null char */
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)testW);
+ ok(ret == TRUE, "EM_SETCUEBANNER should have returned TRUE.\n");
+ memset(testW, 0, lstrlenW(testcmp1W)*sizeof(WCHAR));
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)testW, (LPARAM)lstrlenW(testcmp1W)+1);
+ ok(ret == TRUE, "EM_GETCUEBANNER should have returned TRUE.\n");
+ ok(lstrcmpW(testW, testcmp1W) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(testW));
+ memset(testW, 0, lstrlenW(testcmp1W)*sizeof(WCHAR));
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)testW, (LPARAM)lstrlenW(testcmp1W));
+ ok(lstrcmpW(testW, testcmp2W) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(testW));
+ DestroyWindow(hwnd_edit);
+
+ /* setting cue banner fails for multi-line edit controls */
+ hwnd_edit = create_editcontrolW(ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, 0);
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)testW);
+ ok(ret == FALSE, "EM_SETCUEBANNER.\n");
+
+ DestroyWindow(hwnd_edit);
+}
+
static void test_change_focus(void)
{
HWND hwnd, parent_wnd;
@@ -3138,6 +3199,7 @@ START_TEST(edit)
test_EM_GETLINE();
test_wordbreak_proc();
test_change_focus();
+ test_cue_banner();
UnregisterWindowClasses();
--
2.17.1
More information about the wine-devel
mailing list