diff options
Diffstat (limited to 'src/libui_sdl/libui/windows/entry.cpp')
-rw-r--r-- | src/libui_sdl/libui/windows/entry.cpp | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/windows/entry.cpp b/src/libui_sdl/libui/windows/entry.cpp new file mode 100644 index 0000000..a7a077f --- /dev/null +++ b/src/libui_sdl/libui/windows/entry.cpp @@ -0,0 +1,134 @@ +// 8 april 2015 +#include "uipriv_windows.hpp" + +struct uiEntry { + uiWindowsControl c; + HWND hwnd; + void (*onChanged)(uiEntry *, void *); + void *onChangedData; + BOOL inhibitChanged; +}; + +static BOOL onWM_COMMAND(uiControl *c, HWND hwnd, WORD code, LRESULT *lResult) +{ + uiEntry *e = uiEntry(c); + + if (code != EN_CHANGE) + return FALSE; + if (e->inhibitChanged) + return FALSE; + (*(e->onChanged))(e, e->onChangedData); + *lResult = 0; + return TRUE; +} + +static void uiEntryDestroy(uiControl *c) +{ + uiEntry *e = uiEntry(c); + + uiWindowsUnregisterWM_COMMANDHandler(e->hwnd); + uiWindowsEnsureDestroyWindow(e->hwnd); + uiFreeControl(uiControl(e)); +} + +uiWindowsControlAllDefaultsExceptDestroy(uiEntry) + +// from http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing +#define entryWidth 107 /* this is actually the shorter progress bar width, but Microsoft only indicates as wide as necessary */ +#define entryHeight 14 + +static void uiEntryMinimumSize(uiWindowsControl *c, int *width, int *height) +{ + uiEntry *e = uiEntry(c); + uiWindowsSizing sizing; + int x, y; + + x = entryWidth; + y = entryHeight; + uiWindowsGetSizing(e->hwnd, &sizing); + uiWindowsSizingDlgUnitsToPixels(&sizing, &x, &y); + *width = x; + *height = y; +} + +static void defaultOnChanged(uiEntry *e, void *data) +{ + // do nothing +} + +char *uiEntryText(uiEntry *e) +{ + return uiWindowsWindowText(e->hwnd); +} + +void uiEntrySetText(uiEntry *e, const char *text) +{ + // doing this raises an EN_CHANGED + e->inhibitChanged = TRUE; + uiWindowsSetWindowText(e->hwnd, text); + e->inhibitChanged = FALSE; + // don't queue the control for resize; entry sizes are independent of their contents +} + +void uiEntryOnChanged(uiEntry *e, void (*f)(uiEntry *, void *), void *data) +{ + e->onChanged = f; + e->onChangedData = data; +} + +int uiEntryReadOnly(uiEntry *e) +{ + return (getStyle(e->hwnd) & ES_READONLY) != 0; +} + +void uiEntrySetReadOnly(uiEntry *e, int readonly) +{ + WPARAM ro; + + ro = (WPARAM) FALSE; + if (readonly) + ro = (WPARAM) TRUE; + if (SendMessage(e->hwnd, EM_SETREADONLY, ro, 0) == 0) + logLastError(L"error making uiEntry read-only"); +} + +static uiEntry *finishNewEntry(DWORD style) +{ + uiEntry *e; + + uiWindowsNewControl(uiEntry, e); + + e->hwnd = uiWindowsEnsureCreateControlHWND(WS_EX_CLIENTEDGE, + L"edit", L"", + style | ES_AUTOHSCROLL | ES_LEFT | ES_NOHIDESEL | WS_TABSTOP, + hInstance, NULL, + TRUE); + + uiWindowsRegisterWM_COMMANDHandler(e->hwnd, onWM_COMMAND, uiControl(e)); + uiEntryOnChanged(e, defaultOnChanged, NULL); + + return e; +} + +uiEntry *uiNewEntry(void) +{ + return finishNewEntry(0); +} + +uiEntry *uiNewPasswordEntry(void) +{ + return finishNewEntry(ES_PASSWORD); +} + +uiEntry *uiNewSearchEntry(void) +{ + uiEntry *e; + HRESULT hr; + + e = finishNewEntry(0); + // TODO this is from ThemeExplorer; is it documented anywhere? + // TODO SearchBoxEditComposited has no border + hr = SetWindowTheme(e->hwnd, L"SearchBoxEdit", NULL); + // TODO will hr be S_OK if themes are disabled? + return e; +} |