New debug scheme with explicit debug channels declaration.
[wine.git] / dlls / comctl32 / comboex.c
blobd4a6ba530808d9ecdd5ed00bf87e4dc6979b41d0
1 /*
2 * ComboBoxEx control
4 * Copyright 1998, 1999 Eric Kohl
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>
11 * TODO:
12 * - All messages.
13 * - All notifications.
15 * FIXME:
16 * - should include "combo.h"
19 #include "winbase.h"
20 #include "commctrl.h"
21 #include "comboex.h"
22 #include "debug.h"
24 DEFAULT_DEBUG_CHANNEL(comboex)
26 #define ID_CB_EDIT 1001
28 #define COMBOEX_GetInfoPtr(wndPtr) ((COMBOEX_INFO *)GetWindowLongA (hwnd, 0))
31 /* << COMBOEX_DeleteItem >> */
34 __inline__ static LRESULT
35 COMBOEX_GetComboControl (HWND hwnd, WPARAM wParam, LPARAM lParam)
37 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
39 TRACE (comboex, "\n");
41 return (LRESULT)infoPtr->hwndCombo;
45 __inline__ static LRESULT
46 COMBOEX_GetEditControl (HWND hwnd, WPARAM wParam, LPARAM lParam)
48 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
50 if ((GetWindowLongA (hwnd, GWL_STYLE) & CBS_DROPDOWNLIST) != CBS_DROPDOWN)
51 return 0;
53 TRACE (comboex, "-- 0x%x\n", GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT));
55 return (LRESULT)GetDlgItem (infoPtr->hwndCombo, ID_CB_EDIT);
59 __inline__ static LRESULT
60 COMBOEX_GetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
62 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
64 return (LRESULT)infoPtr->dwExtStyle;
68 __inline__ static LRESULT
69 COMBOEX_GetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
71 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
73 TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
75 return (LRESULT)infoPtr->himl;
81 static LRESULT
82 COMBOEX_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
84 /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
86 FIXME (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
88 return -1;
93 static LRESULT
94 COMBOEX_SetExtendedStyle (HWND hwnd, WPARAM wParam, LPARAM lParam)
96 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
97 DWORD dwTemp;
99 TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
101 dwTemp = infoPtr->dwExtStyle;
103 if ((DWORD)wParam) {
104 infoPtr->dwExtStyle = (infoPtr->dwExtStyle & ~(DWORD)wParam) | (DWORD)lParam;
106 else
107 infoPtr->dwExtStyle = (DWORD)lParam;
109 /* FIXME: repaint?? */
111 return (LRESULT)dwTemp;
115 __inline__ static LRESULT
116 COMBOEX_SetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
118 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
119 HIMAGELIST himlTemp;
121 TRACE (comboex, "(0x%08x 0x%08lx)\n", wParam, lParam);
123 himlTemp = infoPtr->himl;
124 infoPtr->himl = (HIMAGELIST)lParam;
126 return (LRESULT)himlTemp;
130 static LRESULT
131 COMBOEX_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
133 /* COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd); */
135 FIXME (comboex, "(%p): stub\n", (LPVOID)lParam);
137 return TRUE;
141 /* << COMBOEX_SetItem32W >> */
144 __inline__ static LRESULT
145 COMBOEX_Forward (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
147 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
149 FIXME (comboex, "(0x%x 0x%x 0x%lx): stub\n", uMsg, wParam, lParam);
151 if (infoPtr->hwndCombo)
152 return SendMessageA (infoPtr->hwndCombo, uMsg, wParam, lParam);
154 return 0;
158 static LRESULT
159 COMBOEX_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
161 COMBOEX_INFO *infoPtr;
162 DWORD dwComboStyle;
164 /* allocate memory for info structure */
165 infoPtr = (COMBOEX_INFO *)COMCTL32_Alloc (sizeof(COMBOEX_INFO));
166 if (infoPtr == NULL) {
167 ERR (comboex, "could not allocate info memory!\n");
168 return 0;
171 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
174 /* initialize info structure */
177 /* create combo box */
178 dwComboStyle = GetWindowLongA (hwnd, GWL_STYLE) &
179 (CBS_SIMPLE|CBS_DROPDOWN|CBS_DROPDOWNLIST|WS_CHILD);
181 infoPtr->hwndCombo = CreateWindowA ("ComboBox", "",
182 WS_CHILD | WS_VISIBLE | CBS_OWNERDRAWFIXED | dwComboStyle,
183 0, 0, 0, 0, hwnd, (HMENU)1,
184 GetWindowLongA (hwnd, GWL_HINSTANCE), NULL);
186 return 0;
190 static LRESULT
191 COMBOEX_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
193 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
196 if (infoPtr->hwndCombo)
197 DestroyWindow (infoPtr->hwndCombo);
202 /* free comboex info data */
203 COMCTL32_Free (infoPtr);
205 return 0;
209 static LRESULT
210 COMBOEX_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
212 COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwnd);
213 RECT rect;
215 GetClientRect (hwnd, &rect);
217 MoveWindow (infoPtr->hwndCombo, 0, 0, rect.right -rect.left,
218 rect.bottom - rect.top, TRUE);
220 return 0;
224 LRESULT WINAPI
225 COMBOEX_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
227 switch (uMsg)
229 /* case CBEM_DELETEITEM: */
231 case CBEM_GETCOMBOCONTROL:
232 return COMBOEX_GetComboControl (hwnd, wParam, lParam);
234 case CBEM_GETEDITCONTROL:
235 return COMBOEX_GetEditControl (hwnd, wParam, lParam);
237 case CBEM_GETEXTENDEDSTYLE:
238 return COMBOEX_GetExtendedStyle (hwnd, wParam, lParam);
240 case CBEM_GETIMAGELIST:
241 return COMBOEX_GetImageList (hwnd, wParam, lParam);
243 /* case CBEM_GETITEM32A:
244 case CBEM_GETITEM32W:
245 case CBEM_GETUNICODEFORMAT:
246 case CBEM_HASEDITCHANGED:
249 case CBEM_INSERTITEMA:
250 return COMBOEX_InsertItemA (hwnd, wParam, lParam);
252 /* case CBEM_INSERTITEM32W: */
254 case CBEM_SETEXTENDEDSTYLE:
255 return COMBOEX_SetExtendedStyle (hwnd, wParam, lParam);
257 case CBEM_SETIMAGELIST:
258 return COMBOEX_SetImageList (hwnd, wParam, lParam);
260 case CBEM_SETITEMA:
261 return COMBOEX_SetItemA (hwnd, wParam, lParam);
263 /* case CBEM_SETITEM32W:
264 case CBEM_SETUNICODEFORMAT:
267 case CB_DELETESTRING:
268 case CB_FINDSTRINGEXACT:
269 case CB_GETCOUNT:
270 case CB_GETCURSEL:
271 case CB_GETDROPPEDCONTROLRECT:
272 case CB_GETDROPPEDSTATE:
273 case CB_GETITEMDATA:
274 case CB_GETITEMHEIGHT:
275 case CB_GETLBTEXT:
276 case CB_GETLBTEXTLEN:
277 case CB_GETEXTENDEDUI:
278 case CB_LIMITTEXT:
279 case CB_RESETCONTENT:
280 case CB_SELECTSTRING:
281 case CB_SETCURSEL:
282 case CB_SETDROPPEDWIDTH:
283 case CB_SETEXTENDEDUI:
284 case CB_SETITEMDATA:
285 case CB_SETITEMHEIGHT:
286 case CB_SHOWDROPDOWN:
287 return COMBOEX_Forward (hwnd, uMsg, wParam, lParam);
290 case WM_CREATE:
291 return COMBOEX_Create (hwnd, wParam, lParam);
293 case WM_DESTROY:
294 return COMBOEX_Destroy (hwnd, wParam, lParam);
296 case WM_SIZE:
297 return COMBOEX_Size (hwnd, wParam, lParam);
299 default:
300 if (uMsg >= WM_USER)
301 ERR (comboex, "unknown msg %04x wp=%08x lp=%08lx\n",
302 uMsg, wParam, lParam);
303 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
305 return 0;
309 VOID
310 COMBOEX_Register (VOID)
312 WNDCLASSA wndClass;
314 if (GlobalFindAtomA (WC_COMBOBOXEXA)) return;
316 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
317 wndClass.style = CS_GLOBALCLASS;
318 wndClass.lpfnWndProc = (WNDPROC)COMBOEX_WindowProc;
319 wndClass.cbClsExtra = 0;
320 wndClass.cbWndExtra = sizeof(COMBOEX_INFO *);
321 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
322 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
323 wndClass.lpszClassName = WC_COMBOBOXEXA;
325 RegisterClassA (&wndClass);
329 VOID
330 COMBOEX_Unregister (VOID)
332 if (GlobalFindAtomA (WC_COMBOBOXEXA))
333 UnregisterClassA (WC_COMBOBOXEXA, (HINSTANCE)NULL);