1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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;
}
|