Fixes for FreeBSD.
[wine] / dlls / comctl32 / pager.c
1 /*
2  * Pager control
3  *
4  * Copyright 1998 Eric Kohl
5  *
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
16 #include "windows.h"
17 #include "commctrl.h"
18 #include "pager.h"
19 #include "win.h"
20 #include "debug.h"
21
22
23 #define PAGER_GetInfoPtr(wndPtr) ((PAGER_INFO *)wndPtr->wExtra[0])
24
25
26 static __inline__ LRESULT
27 PAGER_ForwardMouse (WND *wndPtr, WPARAM32 wParam)
28 {
29     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
30
31     infoPtr->bForward = (BOOL32)wParam;
32
33     return 0;
34 }
35
36
37 static __inline__ LRESULT
38 PAGER_GetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
39 {
40     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
41
42     return (LRESULT)infoPtr->clrBk;
43 }
44
45
46 static __inline__ LRESULT
47 PAGER_GetBorder (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
48 {
49     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
50
51     return (LRESULT)infoPtr->nBorder;
52 }
53
54
55 static __inline__ LRESULT
56 PAGER_GetButtonSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
57 {
58     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
59
60     return (LRESULT)infoPtr->nButtonSize;
61 }
62
63
64 static LRESULT
65 PAGER_GetButtonState (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
66 {
67     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
68
69     FIXME (pager, "empty stub!\n");
70
71     return PGF_INVISIBLE;
72 }
73
74
75 // << PAGER_GetDropTarget >>
76
77
78 static __inline__ LRESULT
79 PAGER_GetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
80 {
81     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
82
83     return infoPtr->nPos;
84 }
85
86
87 static LRESULT
88 PAGER_RecalcSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
89 {
90     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
91     NMPGCALCSIZE nmpgcs;
92
93     if (infoPtr->hwndChild) {
94         nmpgcs.hdr.hwndFrom = wndPtr->hwndSelf;
95         nmpgcs.hdr.idFrom = wndPtr->wIDmenu;
96         nmpgcs.hdr.code = PGN_CALCSIZE;
97         nmpgcs.dwFlag =
98              (wndPtr->dwStyle & PGS_HORZ) ? PGF_CALCWIDTH : PGF_CALCHEIGHT;
99         SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
100                         (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmpgcs);
101
102         infoPtr->nChildSize =
103              (wndPtr->dwStyle & PGS_HORZ) ? nmpgcs.iWidth : nmpgcs.iHeight;
104
105
106         FIXME (pager, "Child size %d\n", infoPtr->nChildSize);
107
108
109     }
110
111     return 0;
112 }
113
114
115 static __inline__ LRESULT
116 PAGER_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
117 {
118     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
119     COLORREF clrTemp = infoPtr->clrBk;
120
121     infoPtr->clrBk = (COLORREF)lParam;
122
123     /* FIXME: redraw */
124
125     return (LRESULT)clrTemp;
126 }
127
128
129 static __inline__ LRESULT
130 PAGER_SetBorder (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
131 {
132     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
133     INT32 nTemp = infoPtr->nBorder;
134
135     infoPtr->nBorder = (INT32)lParam;
136
137     /* FIXME: redraw */
138
139     return (LRESULT)nTemp;
140 }
141
142
143 static __inline__ LRESULT
144 PAGER_SetButtonSize (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
145 {
146     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
147     INT32 nTemp = infoPtr->nButtonSize;
148
149     infoPtr->nButtonSize = (INT32)lParam;
150
151     FIXME (pager, "size=%d\n", infoPtr->nButtonSize);
152
153     /* FIXME: redraw */
154
155     return (LRESULT)nTemp;
156 }
157
158
159 static __inline__ LRESULT
160 PAGER_SetChild (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
161 {
162     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
163
164     infoPtr->hwndChild = IsWindow32 ((HWND32)lParam) ? (HWND32)lParam : 0;
165
166     FIXME (pager, "hwnd=%x\n", infoPtr->hwndChild);
167
168     /* FIXME: redraw */
169     SetParent32 (infoPtr->hwndChild, wndPtr->hwndSelf);
170     SetWindowPos32 (infoPtr->hwndChild, wndPtr->hwndSelf,
171                     0, 0, 40, 40, SWP_SHOWWINDOW);
172     RedrawWindow32 (wndPtr->hwndSelf, NULL, NULL, RDW_INVALIDATE);
173
174     return 0;
175 }
176
177
178 static __inline__ LRESULT
179 PAGER_SetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
180 {
181     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
182
183     infoPtr->nPos = (INT32)lParam;
184
185     FIXME (pager, "pos=%d\n", infoPtr->nPos);
186
187     /* FIXME: redraw */
188     SetWindowPos32 (infoPtr->hwndChild, wndPtr->hwndSelf,
189                     0, 0, 0, 0, SWP_NOSIZE);
190
191     return 0;
192 }
193
194
195 static LRESULT
196 PAGER_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
197 {
198     PAGER_INFO *infoPtr;
199
200     /* allocate memory for info structure */
201     infoPtr = (PAGER_INFO *)COMCTL32_Alloc (sizeof(PAGER_INFO));
202     wndPtr->wExtra[0] = (DWORD)infoPtr;
203
204     if (infoPtr == NULL) {
205         ERR (pager, "could not allocate info memory!\n");
206         return 0;
207     }
208
209     if ((PAGER_INFO*)wndPtr->wExtra[0] != infoPtr) {
210         ERR (pager, "pointer assignment error!\n");
211         return 0;
212     }
213
214     /* set default settings */
215     infoPtr->hwndChild = 0;
216     infoPtr->clrBk = GetSysColor32 (COLOR_BTNFACE);
217     infoPtr->nBorder = 0;
218     infoPtr->nButtonSize = 0;
219     infoPtr->nPos = 0;
220
221
222     return 0;
223 }
224
225
226 static LRESULT
227 PAGER_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
228 {
229     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
230
231
232
233
234     /* free pager info data */
235     COMCTL32_Free (infoPtr);
236
237     return 0;
238 }
239
240
241 static LRESULT
242 PAGER_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
243 {
244     PAGER_INFO *infoPtr = PAGER_GetInfoPtr(wndPtr);
245     HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
246     RECT32 rect;
247
248 //    GetClientRect32 (wndPtr->hwndSelf, &rect);
249 //    FillRect32 ((HDC32)wParam, &rect, hBrush);
250 //    DeleteObject32 (hBrush);
251     return TRUE;
252 }
253
254
255 // << PAGER_MouseMove >>
256 // << PAGER_Paint >>
257
258
259 LRESULT WINAPI
260 PAGER_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
261 {
262     WND *wndPtr = WIN_FindWndPtr(hwnd);
263
264     switch (uMsg)
265     {
266         case PGM_FORWARDMOUSE:
267             return PAGER_ForwardMouse (wndPtr, wParam);
268
269         case PGM_GETBKCOLOR:
270             return PAGER_GetBkColor (wndPtr, wParam, lParam);
271
272         case PGM_GETBORDER:
273             return PAGER_GetBorder (wndPtr, wParam, lParam);
274
275         case PGM_GETBUTTONSIZE:
276             return PAGER_GetButtonSize (wndPtr, wParam, lParam);
277
278         case PGM_GETBUTTONSTATE:
279             return PAGER_GetButtonState (wndPtr, wParam, lParam);
280
281 //      case PGM_GETDROPTARGET:
282
283         case PGM_GETPOS:
284             return PAGER_SetPos (wndPtr, wParam, lParam);
285
286         case PGM_RECALCSIZE:
287             return PAGER_RecalcSize (wndPtr, wParam, lParam);
288
289         case PGM_SETBKCOLOR:
290             return PAGER_SetBkColor (wndPtr, wParam, lParam);
291
292         case PGM_SETBORDER:
293             return PAGER_SetBorder (wndPtr, wParam, lParam);
294
295         case PGM_SETBUTTONSIZE:
296             return PAGER_SetButtonSize (wndPtr, wParam, lParam);
297
298         case PGM_SETCHILD:
299             return PAGER_SetChild (wndPtr, wParam, lParam);
300
301         case PGM_SETPOS:
302             return PAGER_SetPos (wndPtr, wParam, lParam);
303
304         case WM_CREATE:
305             return PAGER_Create (wndPtr, wParam, lParam);
306
307         case WM_DESTROY:
308             return PAGER_Destroy (wndPtr, wParam, lParam);
309
310         case WM_ERASEBKGND:
311             return PAGER_EraseBackground (wndPtr, wParam, lParam);
312
313 //      case WM_MOUSEMOVE:
314 //          return PAGER_MouseMove (wndPtr, wParam, lParam);
315
316 //      case WM_PAINT:
317 //          return PAGER_Paint (wndPtr, wParam);
318
319
320         default:
321             if (uMsg >= WM_USER)
322                 ERR (pager, "unknown msg %04x wp=%08x lp=%08lx\n",
323                      uMsg, wParam, lParam);
324             return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
325     }
326     return 0;
327 }
328
329
330 void
331 PAGER_Register (void)
332 {
333     WNDCLASS32A wndClass;
334
335     if (GlobalFindAtom32A (WC_PAGESCROLLER32A)) return;
336
337     ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
338     wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS;
339     wndClass.lpfnWndProc   = (WNDPROC32)PAGER_WindowProc;
340     wndClass.cbClsExtra    = 0;
341     wndClass.cbWndExtra    = sizeof(PAGER_INFO *);
342     wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
343     wndClass.hbrBackground = 0;
344     wndClass.lpszClassName = WC_PAGESCROLLER32A;
345  
346     RegisterClass32A (&wndClass);
347 }
348