Return 32-bit module in GetModuleHandle16() if appropriate.
[wine/testsucceed.git] / dlls / comctl32 / pager.c
blob23903fce5eb772e14ec330ee216212a40a45659e
1 /*
2 * Pager 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.
16 #include "winbase.h"
17 #include "commctrl.h"
18 #include "pager.h"
19 #include "debug.h"
21 DEFAULT_DEBUG_CHANNEL(pager)
24 #define PAGER_GetInfoPtr(hwnd) ((PAGER_INFO *)GetWindowLongA(hwnd, 0))
27 static __inline__ LRESULT
28 PAGER_ForwardMouse (HWND hwnd, WPARAM wParam)
30 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
32 infoPtr->bForward = (BOOL)wParam;
34 return 0;
38 static __inline__ LRESULT
39 PAGER_GetBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
41 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
43 return (LRESULT)infoPtr->clrBk;
47 static __inline__ LRESULT
48 PAGER_GetBorder (HWND hwnd, WPARAM wParam, LPARAM lParam)
50 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
52 return (LRESULT)infoPtr->nBorder;
56 static __inline__ LRESULT
57 PAGER_GetButtonSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
59 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
61 return (LRESULT)infoPtr->nButtonSize;
65 static LRESULT
66 PAGER_GetButtonState (HWND hwnd, WPARAM wParam, LPARAM lParam)
68 /* PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd); */
70 FIXME (pager, "empty stub!\n");
72 return PGF_INVISIBLE;
76 /* << PAGER_GetDropTarget >> */
79 static __inline__ LRESULT
80 PAGER_GetPos (HWND hwnd, WPARAM wParam, LPARAM lParam)
82 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
84 return infoPtr->nPos;
88 static LRESULT
89 PAGER_RecalcSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
91 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
92 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
93 NMPGCALCSIZE nmpgcs;
95 if (infoPtr->hwndChild) {
96 ZeroMemory (&nmpgcs, sizeof (NMPGCALCSIZE));
97 nmpgcs.hdr.hwndFrom = hwnd;
98 nmpgcs.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID);
99 nmpgcs.hdr.code = PGN_CALCSIZE;
100 nmpgcs.dwFlag = (dwStyle & PGS_HORZ) ? PGF_CALCWIDTH : PGF_CALCHEIGHT;
101 SendMessageA (GetParent (hwnd), WM_NOTIFY,
102 (WPARAM)nmpgcs.hdr.idFrom, (LPARAM)&nmpgcs);
104 infoPtr->nChildSize = (dwStyle & PGS_HORZ) ? nmpgcs.iWidth : nmpgcs.iHeight;
107 FIXME (pager, "Child size %d\n", infoPtr->nChildSize);
112 return 0;
116 static __inline__ LRESULT
117 PAGER_SetBkColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
119 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
120 COLORREF clrTemp = infoPtr->clrBk;
122 infoPtr->clrBk = (COLORREF)lParam;
124 /* FIXME: redraw */
126 return (LRESULT)clrTemp;
130 static __inline__ LRESULT
131 PAGER_SetBorder (HWND hwnd, WPARAM wParam, LPARAM lParam)
133 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
134 INT nTemp = infoPtr->nBorder;
136 infoPtr->nBorder = (INT)lParam;
138 /* FIXME: redraw */
140 return (LRESULT)nTemp;
144 static __inline__ LRESULT
145 PAGER_SetButtonSize (HWND hwnd, WPARAM wParam, LPARAM lParam)
147 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
148 INT nTemp = infoPtr->nButtonSize;
150 infoPtr->nButtonSize = (INT)lParam;
152 FIXME (pager, "size=%d\n", infoPtr->nButtonSize);
154 /* FIXME: redraw */
156 return (LRESULT)nTemp;
160 static __inline__ LRESULT
161 PAGER_SetChild (HWND hwnd, WPARAM wParam, LPARAM lParam)
163 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
165 infoPtr->hwndChild = IsWindow ((HWND)lParam) ? (HWND)lParam : 0;
167 FIXME (pager, "hwnd=%x\n", infoPtr->hwndChild);
169 /* FIXME: redraw */
170 if (infoPtr->hwndChild) {
171 SetParent (infoPtr->hwndChild, hwnd);
172 SetWindowPos (infoPtr->hwndChild, HWND_TOP,
173 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE);
176 return 0;
180 static __inline__ LRESULT
181 PAGER_SetPos (HWND hwnd, WPARAM wParam, LPARAM lParam)
183 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
185 infoPtr->nPos = (INT)lParam;
187 FIXME (pager, "pos=%d\n", infoPtr->nPos);
189 /* FIXME: redraw */
190 SetWindowPos (infoPtr->hwndChild, HWND_TOP,
191 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE);
193 return 0;
197 static LRESULT
198 PAGER_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
200 PAGER_INFO *infoPtr;
202 /* allocate memory for info structure */
203 infoPtr = (PAGER_INFO *)COMCTL32_Alloc (sizeof(PAGER_INFO));
204 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
206 /* set default settings */
207 infoPtr->hwndChild = (HWND)NULL;
208 infoPtr->clrBk = GetSysColor (COLOR_BTNFACE);
209 infoPtr->nBorder = 0;
210 infoPtr->nButtonSize = 0;
211 infoPtr->nPos = 0;
214 return 0;
218 static LRESULT
219 PAGER_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
221 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
226 /* free pager info data */
227 COMCTL32_Free (infoPtr);
229 return 0;
233 static LRESULT
234 PAGER_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
236 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
237 HBRUSH hBrush = CreateSolidBrush (infoPtr->clrBk);
238 RECT rect;
240 GetClientRect (hwnd, &rect);
241 FillRect ((HDC)wParam, &rect, hBrush);
242 DeleteObject (hBrush);
244 /* return TRUE; */
245 return FALSE;
249 static LRESULT
250 PAGER_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam)
252 /* PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd); */
254 TRACE (pager, "stub!\n");
256 return 0;
260 /* << PAGER_Paint >> */
263 static LRESULT
264 PAGER_Size (HWND hwnd, WPARAM wParam, LPARAM lParam)
266 PAGER_INFO *infoPtr = PAGER_GetInfoPtr (hwnd);
267 RECT rect;
269 GetClientRect (hwnd, &rect);
270 if (infoPtr->hwndChild) {
271 SetWindowPos (infoPtr->hwndChild, HWND_TOP, rect.left, rect.top,
272 rect.right - rect.left, rect.bottom - rect.top,
273 SWP_SHOWWINDOW);
274 /* MoveWindow32 (infoPtr->hwndChild, 1, 1, rect.right - 2, rect.bottom-2, TRUE); */
275 /* UpdateWindow32 (infoPtr->hwndChild); */
278 /* FillRect32 ((HDC32)wParam, &rect, hBrush); */
279 /* DeleteObject32 (hBrush); */
280 return TRUE;
285 LRESULT WINAPI
286 PAGER_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
288 switch (uMsg)
290 case PGM_FORWARDMOUSE:
291 return PAGER_ForwardMouse (hwnd, wParam);
293 case PGM_GETBKCOLOR:
294 return PAGER_GetBkColor (hwnd, wParam, lParam);
296 case PGM_GETBORDER:
297 return PAGER_GetBorder (hwnd, wParam, lParam);
299 case PGM_GETBUTTONSIZE:
300 return PAGER_GetButtonSize (hwnd, wParam, lParam);
302 case PGM_GETBUTTONSTATE:
303 return PAGER_GetButtonState (hwnd, wParam, lParam);
305 /* case PGM_GETDROPTARGET: */
307 case PGM_GETPOS:
308 return PAGER_SetPos (hwnd, wParam, lParam);
310 case PGM_RECALCSIZE:
311 return PAGER_RecalcSize (hwnd, wParam, lParam);
313 case PGM_SETBKCOLOR:
314 return PAGER_SetBkColor (hwnd, wParam, lParam);
316 case PGM_SETBORDER:
317 return PAGER_SetBorder (hwnd, wParam, lParam);
319 case PGM_SETBUTTONSIZE:
320 return PAGER_SetButtonSize (hwnd, wParam, lParam);
322 case PGM_SETCHILD:
323 return PAGER_SetChild (hwnd, wParam, lParam);
325 case PGM_SETPOS:
326 return PAGER_SetPos (hwnd, wParam, lParam);
328 case WM_CREATE:
329 return PAGER_Create (hwnd, wParam, lParam);
331 case WM_DESTROY:
332 return PAGER_Destroy (hwnd, wParam, lParam);
334 case WM_ERASEBKGND:
335 return PAGER_EraseBackground (hwnd, wParam, lParam);
337 case WM_MOUSEMOVE:
338 return PAGER_MouseMove (hwnd, wParam, lParam);
340 case WM_NOTIFY:
341 case WM_COMMAND:
342 return SendMessageA (GetParent (hwnd), uMsg, wParam, lParam);
344 /* case WM_PAINT: */
345 /* return PAGER_Paint (hwnd, wParam); */
347 case WM_SIZE:
348 return PAGER_Size (hwnd, wParam, lParam);
350 default:
351 if (uMsg >= WM_USER)
352 ERR (pager, "unknown msg %04x wp=%08x lp=%08lx\n",
353 uMsg, wParam, lParam);
354 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
356 return 0;
360 VOID
361 PAGER_Register (VOID)
363 WNDCLASSA wndClass;
365 if (GlobalFindAtomA (WC_PAGESCROLLERA)) return;
367 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
368 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
369 wndClass.lpfnWndProc = (WNDPROC)PAGER_WindowProc;
370 wndClass.cbClsExtra = 0;
371 wndClass.cbWndExtra = sizeof(PAGER_INFO *);
372 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
373 wndClass.hbrBackground = 0;
374 wndClass.lpszClassName = WC_PAGESCROLLERA;
376 RegisterClassA (&wndClass);
380 VOID
381 PAGER_Unregister (VOID)
383 if (GlobalFindAtomA (WC_PAGESCROLLERA))
384 UnregisterClassA (WC_PAGESCROLLERA, (HINSTANCE)NULL);