diff --git a/redo/basicctrls_windows.c b/redo/basicctrls_windows.c index 1676776..c82c5d6 100644 --- a/redo/basicctrls_windows.c +++ b/redo/basicctrls_windows.c @@ -104,3 +104,23 @@ void setTextFieldSubclass(HWND hwnd, void *data) if ((*fv_SetWindowSubclass)(hwnd, textfieldSubProc, 0, (DWORD_PTR) data) == FALSE) xpanic("error subclassing TextField to give it its own event handler", GetLastError()); } + +void textfieldSetAndShowInvalidBalloonTip(HWND hwnd, WCHAR *text) +{ + EDITBALLOONTIP ti; + + ZeroMemory(&ti, sizeof (EDITBALLOONTIP)); + ti.cbStruct = sizeof (EDITBALLOONTIP); + ti.pszTitle = L"Invalid Input"; // TODO verify + ti.pszText = text; + ti.ttiIcon = TTI_ERROR; + if (SendMessageW(hwnd, EM_SHOWBALLOONTIP, 0, (LPARAM) (&ti)) == FALSE) + xpanic("error showing TextField.Invalid() balloon tip", GetLastError()); + MessageBeep(0xFFFFFFFF); // TODO can this return an error? +} + +void textfieldHideInvalidBalloonTip(HWND hwnd) +{ + if (SendMessageW(hwnd, EM_HIDEBALLOONTIP, 0, 0) == FALSE) + xpanic("error hiding TextField.Invalid() balloon tip", GetLastError()); +} diff --git a/redo/textfield_unix.go b/redo/textfield_unix.go index e9624ee..cef2765 100644 --- a/redo/textfield_unix.go +++ b/redo/textfield_unix.go @@ -71,6 +71,7 @@ func (t *textfield) Invalid(reason string) { creason := togstr(reason) defer freegstr(creason) C.gtk_entry_set_icon_tooltip_text(t.entry, C.GTK_ENTRY_ICON_SECONDARY, creason) + // TODO beep } //export textfieldChanged diff --git a/redo/textfield_windows.go b/redo/textfield_windows.go index 7345205..5f89691 100644 --- a/redo/textfield_windows.go +++ b/redo/textfield_windows.go @@ -51,7 +51,11 @@ func (t *textfield) OnChanged(f func()) { } func (t *textfield) Invalid(reason string) { - // TODO + if reason == "" { + C.textfieldHideInvalidBalloonTip(t._hwnd) + return + } + C.textfieldSetAndShowInvalidBalloonTip(t._hwnd, toUTF16(reason)) } //export textfieldChanged diff --git a/redo/winapi_windows.h b/redo/winapi_windows.h index ea9fe17..5787331 100644 --- a/redo/winapi_windows.h +++ b/redo/winapi_windows.h @@ -64,6 +64,8 @@ extern void setCheckboxSubclass(HWND, void *); extern BOOL checkboxChecked(HWND); extern void checkboxSetChecked(HWND, BOOL); extern void setTextFieldSubclass(HWND, void *); +extern void textfieldSetAndShowInvalidBalloonTip(HWND, WCHAR *); +extern void textfieldHideInvalidBalloonTip(HWND); // init_windows.c extern HINSTANCE hInstance;