blob: 7c101ff83f2b453146aa94cadb522aa08b908ab5 [file] [log] [blame]
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001/*
2 * ComboBoxEx control
3 *
Eric Kohlcad17ff1999-03-12 17:42:50 +00004 * Copyright 1998, 1999 Eric Kohl
Alexandre Julliarda0d77311998-09-13 16:32:00 +00005 *
6 * NOTES
7 * This is just a dummy control. An author is needed! Any volunteers?
8 * I will only improve this control once in a while.
9 * Eric <ekohl@abo.rhein-zeitung.de>
10 *
11 * TODO:
12 * - All messages.
13 * - All notifications.
14 *
15 * FIXME:
16 * - should include "combo.h"
17 */
18
Marcus Meissner04c3e1d1999-02-19 10:37:02 +000019#include "win.h"
Alexandre Julliarda0d77311998-09-13 16:32:00 +000020#include "commctrl.h"
21#include "comboex.h"
Alexandre Julliarda0d77311998-09-13 16:32:00 +000022#include "debug.h"
23
24#define ID_CB_EDIT 1001
25
Eric Kohlcad17ff1999-03-12 17:42:50 +000026#define COMBOEX_GetInfoPtr(wndPtr) ((COMBOEX_INFO *)GetWindowLongA (hwnd, 0))
Alexandre Julliarda0d77311998-09-13 16:32:00 +000027
28
Andreas Mohr7a6228d1998-12-11 09:16:48 +000029/* << COMBOEX_DeleteItem >> */
Alexandre Julliarda0d77311998-09-13 16:32:00 +000030
31
32__inline__ static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +000033COMBOEX_GetComboControl (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +000034{
Eric Kohlcad17ff1999-03-12 17:42:50 +000035 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda0d77311998-09-13 16:32:00 +000036
37 TRACE (comboex, "\n");
38
39 return (LRESULT)infoPtr->hwndCombo;
40}
41
42
43__inline__ static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +000044COMBOEX_GetEditControl (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +000045{
Eric Kohlcad17ff1999-03-12 17:42:50 +000046 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda0d77311998-09-13 16:32:00 +000047
Eric Kohlcad17ff1999-03-12 17:42:50 +000048 if ((GetWindowLongA (hwnd, GWL_STYLE) & CBS_DROPDOWNLIST) != CBS_DROPDOWN)
Alexandre Julliarda0d77311998-09-13 16:32:00 +000049 return 0;
50
Alexandre Julliarda3960291999-02-26 11:11:13 +000051 TRACE (comboex, "-- 0x%x\n", GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT));
Alexandre Julliarda0d77311998-09-13 16:32:00 +000052
Alexandre Julliarda3960291999-02-26 11:11:13 +000053 return (LRESULT)GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT);
Alexandre Julliarda0d77311998-09-13 16:32:00 +000054}
55
56
57__inline__ static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +000058COMBOEX_GetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +000059{
Eric Kohlcad17ff1999-03-12 17:42:50 +000060 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda0d77311998-09-13 16:32:00 +000061
62 return (LRESULT)infoPtr->dwExtStyle;
63}
64
65
66__inline__ static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +000067COMBOEX_GetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +000068{
Eric Kohlcad17ff1999-03-12 17:42:50 +000069 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda0d77311998-09-13 16:32:00 +000070
71 TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
72
73 return (LRESULT)infoPtr->himl;
74}
75
76
77
78
79static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +000080COMBOEX_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +000081{
Eric Kohlcad17ff1999-03-12 17:42:50 +000082 /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
Alexandre Julliarda0d77311998-09-13 16:32:00 +000083
84 FIXME (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
85
86 return -1;
87}
88
89
90
91static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +000092COMBOEX_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +000093{
Eric Kohlcad17ff1999-03-12 17:42:50 +000094 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda0d77311998-09-13 16:32:00 +000095 DWORD dwTemp;
96
97 TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
98
99 dwTemp = infoPtr->dwExtStyle;
100
101 if ((DWORD)wParam) {
102 infoPtr->dwExtStyle = (infoPtr->dwExtStyle & ~(DWORD)wParam) | (DWORD)lParam;
103 }
104 else
105 infoPtr->dwExtStyle = (DWORD)lParam;
106
107 /* FIXME: repaint?? */
108
109 return (LRESULT)dwTemp;
110}
111
112
113__inline__ static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000114COMBOEX_SetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000115{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000116 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000117 HIMAGELIST himlTemp;
118
119 TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
120
121 himlTemp = infoPtr->himl;
122 infoPtr->himl = (HIMAGELIST)lParam;
123
124 return (LRESULT)himlTemp;
125}
126
127
Eric Kohl66ef0111998-11-22 17:58:40 +0000128static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000129COMBOEX_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Eric Kohl66ef0111998-11-22 17:58:40 +0000130{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000131 /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
Eric Kohl66ef0111998-11-22 17:58:40 +0000132
133 FIXME (comboex, "(%p): stub\n", (LPVOID)lParam);
134
135 return TRUE;
136}
137
138
Andreas Mohr7a6228d1998-12-11 09:16:48 +0000139/* << COMBOEX_SetItem32W >> */
Eric Kohl66ef0111998-11-22 17:58:40 +0000140
141
142__inline__ static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000143COMBOEX_Forward (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Eric Kohl66ef0111998-11-22 17:58:40 +0000144{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000145 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Eric Kohl66ef0111998-11-22 17:58:40 +0000146
Andreas Mohr7a6228d1998-12-11 09:16:48 +0000147 FIXME (comboex, "(0x%x 0x%x 0x%lx): stub\n", uMsg, wParam, lParam);
Eric Kohl66ef0111998-11-22 17:58:40 +0000148
149 if (infoPtr->hwndCombo)
Alexandre Julliarda3960291999-02-26 11:11:13 +0000150 return SendMessageA (infoPtr->hwndCombo, uMsg, wParam, lParam);
Eric Kohl66ef0111998-11-22 17:58:40 +0000151
152 return 0;
153}
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000154
155
156static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000157COMBOEX_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000158{
159 COMBOEX_INFO *infoPtr;
160 DWORD dwComboStyle;
161
162 /* allocate memory for info structure */
163 infoPtr = (COMBOEX_INFO *)COMCTL32_Alloc (sizeof(COMBOEX_INFO));
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000164 if (infoPtr == NULL) {
165 ERR (listview, "could not allocate info memory!\n");
166 return 0;
167 }
168
Eric Kohlcad17ff1999-03-12 17:42:50 +0000169 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000170
171
172 /* initialize info structure */
173
174
175 /* create combo box */
Eric Kohlcad17ff1999-03-12 17:42:50 +0000176 dwComboStyle = GetWindowLongA (hwnd, GWL_STYLE) &
177 (CBS_SIMPLE|CBS_DROPDOWN|CBS_DROPDOWNLIST|WS_CHILD);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000178
Eric Kohlcad17ff1999-03-12 17:42:50 +0000179 infoPtr->hwndCombo = CreateWindowA ("ComboBox", "",
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000180 WS_CHILD | WS_VISIBLE | CBS_OWNERDRAWFIXED | dwComboStyle,
Eric Kohlcad17ff1999-03-12 17:42:50 +0000181 0, 0, 0, 0, hwnd, (HMENU)1,
182 GetWindowLongA (hwnd, GWL_HINSTANCE), NULL);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000183
184 return 0;
185}
186
187
188static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000189COMBOEX_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000190{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000191 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000192
193
194 if (infoPtr->hwndCombo)
Alexandre Julliarda3960291999-02-26 11:11:13 +0000195 DestroyWindow (infoPtr->hwndCombo);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000196
197
198
199
200 /* free comboex info data */
201 COMCTL32_Free (infoPtr);
202
203 return 0;
204}
205
206
207static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000208COMBOEX_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000209{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000210 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000211 RECT rect;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000212
Eric Kohlcad17ff1999-03-12 17:42:50 +0000213 GetClientRect (hwnd, &rect);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000214
Alexandre Julliarda3960291999-02-26 11:11:13 +0000215 MoveWindow (infoPtr->hwndCombo, 0, 0, rect.right -rect.left,
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000216 rect.bottom - rect.top, TRUE);
217
218 return 0;
219}
220
221
222LRESULT WINAPI
Alexandre Julliarda3960291999-02-26 11:11:13 +0000223COMBOEX_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000224{
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000225 switch (uMsg)
226 {
Andreas Mohr7a6228d1998-12-11 09:16:48 +0000227/* case CBEM_DELETEITEM: */
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000228
229 case CBEM_GETCOMBOCONTROL:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000230 return COMBOEX_GetComboControl (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000231
232 case CBEM_GETEDITCONTROL:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000233 return COMBOEX_GetEditControl (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000234
235 case CBEM_GETEXTENDEDSTYLE:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000236 return COMBOEX_GetExtendedStyle (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000237
238 case CBEM_GETIMAGELIST:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000239 return COMBOEX_GetImageList (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000240
Andreas Mohr7a6228d1998-12-11 09:16:48 +0000241/* case CBEM_GETITEM32A:
242 case CBEM_GETITEM32W:
243 case CBEM_GETUNICODEFORMAT:
244 case CBEM_HASEDITCHANGED:
245*/
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000246
Alexandre Julliarda3960291999-02-26 11:11:13 +0000247 case CBEM_INSERTITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000248 return COMBOEX_InsertItemA (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000249
Andreas Mohr7a6228d1998-12-11 09:16:48 +0000250/* case CBEM_INSERTITEM32W: */
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000251
252 case CBEM_SETEXTENDEDSTYLE:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000253 return COMBOEX_SetExtendedStyle (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000254
255 case CBEM_SETIMAGELIST:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000256 return COMBOEX_SetImageList (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000257
Alexandre Julliarda3960291999-02-26 11:11:13 +0000258 case CBEM_SETITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000259 return COMBOEX_SetItemA (hwnd, wParam, lParam);
Eric Kohl66ef0111998-11-22 17:58:40 +0000260
Andreas Mohr7a6228d1998-12-11 09:16:48 +0000261/* case CBEM_SETITEM32W:
262 case CBEM_SETUNICODEFORMAT:
263*/
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000264
Alexandre Julliarda3960291999-02-26 11:11:13 +0000265 case CB_DELETESTRING:
266 case CB_FINDSTRINGEXACT:
267 case CB_GETCOUNT:
268 case CB_GETCURSEL:
269 case CB_GETDROPPEDCONTROLRECT:
270 case CB_GETDROPPEDSTATE:
271 case CB_GETITEMDATA:
272 case CB_GETITEMHEIGHT:
273 case CB_GETLBTEXT:
274 case CB_GETLBTEXTLEN:
275 case CB_GETEXTENDEDUI:
276 case CB_LIMITTEXT:
277 case CB_RESETCONTENT:
278 case CB_SELECTSTRING:
279 case CB_SETCURSEL:
280 case CB_SETDROPPEDWIDTH:
281 case CB_SETEXTENDEDUI:
282 case CB_SETITEMDATA:
283 case CB_SETITEMHEIGHT:
284 case CB_SHOWDROPDOWN:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000285 return COMBOEX_Forward (hwnd, uMsg, wParam, lParam);
Eric Kohl66ef0111998-11-22 17:58:40 +0000286
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000287
288 case WM_CREATE:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000289 return COMBOEX_Create (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000290
291 case WM_DESTROY:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000292 return COMBOEX_Destroy (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000293
294 case WM_SIZE:
Eric Kohlcad17ff1999-03-12 17:42:50 +0000295 return COMBOEX_Size (hwnd, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000296
297 default:
298 if (uMsg >= WM_USER)
299 ERR (comboex, "unknown msg %04x wp=%08x lp=%08lx\n",
300 uMsg, wParam, lParam);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000301 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000302 }
303 return 0;
304}
305
306
Eric Kohl9d8e8641998-10-24 10:49:27 +0000307VOID
308COMBOEX_Register (VOID)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000309{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000310 WNDCLASSA wndClass;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000311
Alexandre Julliarda3960291999-02-26 11:11:13 +0000312 if (GlobalFindAtomA (WC_COMBOBOXEXA)) return;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000313
Alexandre Julliarda3960291999-02-26 11:11:13 +0000314 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000315 wndClass.style = CS_GLOBALCLASS;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000316 wndClass.lpfnWndProc = (WNDPROC)COMBOEX_WindowProc;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000317 wndClass.cbClsExtra = 0;
318 wndClass.cbWndExtra = sizeof(COMBOEX_INFO *);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000319 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
320 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
321 wndClass.lpszClassName = WC_COMBOBOXEXA;
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000322
Alexandre Julliarda3960291999-02-26 11:11:13 +0000323 RegisterClassA (&wndClass);
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000324}
325
Eric Kohl9d8e8641998-10-24 10:49:27 +0000326
327VOID
328COMBOEX_Unregister (VOID)
329{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000330 if (GlobalFindAtomA (WC_COMBOBOXEXA))
331 UnregisterClassA (WC_COMBOBOXEXA, (HINSTANCE)NULL);
Eric Kohl9d8e8641998-10-24 10:49:27 +0000332}
333