- New implementation of SendMessage, ReceiveMessage, ReplyMessage functions
[wine] / dlls / comctl32 / animate.c
1 /*
2  * Animation 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
17 #include "win.h"
18 #include "commctrl.h"
19 #include "animate.h"
20 #include "debug.h"
21
22 #define ANIMATE_GetInfoPtr(wndPtr) ((ANIMATE_INFO *)wndPtr->wExtra[0])
23
24
25 static BOOL32
26 ANIMATE_LoadRes32A (ANIMATE_INFO *infoPtr, HINSTANCE32 hInst, LPSTR lpName)
27 {
28     HRSRC32 hrsrc;
29     HGLOBAL32 handle;
30
31     hrsrc = FindResource32A (hInst, lpName, "AVI");
32     if (!hrsrc)
33         return FALSE;
34
35     handle = LoadResource32 (hInst, hrsrc);
36     if (!handle)
37         return FALSE;
38
39     infoPtr->lpAvi = LockResource32 (handle);
40     if (!infoPtr->lpAvi)
41         return FALSE;
42
43     return TRUE;
44 }
45
46
47 static BOOL32
48 ANIMATE_LoadFile32A (ANIMATE_INFO *infoPtr, LPSTR lpName)
49 {
50     HANDLE32 handle;
51
52     infoPtr->hFile =
53         CreateFile32A (lpName, GENERIC_READ, 0, NULL, OPEN_EXISTING,
54                        FILE_ATTRIBUTE_NORMAL, 0);
55     if (!infoPtr->hFile)
56         return FALSE;
57
58     handle =
59         CreateFileMapping32A (infoPtr->hFile, NULL, PAGE_READONLY | SEC_COMMIT,
60                               0, 0, NULL);
61     if (!handle) {
62         CloseHandle (infoPtr->hFile);
63         infoPtr->hFile = 0;
64         return FALSE;
65     }
66
67     infoPtr->lpAvi = MapViewOfFile (handle, FILE_MAP_READ, 0, 0, 0);
68     if (!infoPtr->lpAvi) {
69         CloseHandle (infoPtr->hFile);
70         infoPtr->hFile = 0;
71         return FALSE;
72     }
73
74     return TRUE;
75 }
76
77
78 static VOID
79 ANIMATE_Free (ANIMATE_INFO *infoPtr)
80 {
81     if (infoPtr->hFile) {
82         UnmapViewOfFile (infoPtr->lpAvi);
83         CloseHandle (infoPtr->hFile);
84         infoPtr->lpAvi = NULL;
85     }
86     else {
87         GlobalFree32 ((HGLOBAL32)infoPtr->lpAvi);
88         infoPtr->lpAvi = NULL;
89     }
90 }
91
92
93 static VOID
94 ANIMATE_GetAviInfo (infoPtr)
95 {
96
97
98 }
99
100
101 static LRESULT
102 ANIMATE_Open32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
103 {
104     ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
105     HINSTANCE32 hInstance = (HINSTANCE32)wParam;
106
107     ANIMATE_Free (infoPtr);
108
109     if (!lParam) {
110         TRACE (animate, "closing avi!\n");
111         return TRUE;
112     }
113     
114     if (HIWORD(lParam)) {
115         FIXME (animate, "(\"%s\") empty stub!\n", (LPSTR)lParam);
116
117         if (ANIMATE_LoadRes32A (infoPtr, hInstance, (LPSTR)lParam)) {
118
119             FIXME (animate, "AVI resource found!\n");
120
121         }
122         else {
123             FIXME (animate, "No AVI resource found!\n");
124             if (ANIMATE_LoadFile32A (infoPtr, (LPSTR)lParam)) {
125                 FIXME (animate, "AVI file found!\n");
126             }
127             else {
128                 FIXME (animate, "No AVI file found!\n");
129                 return FALSE;
130             }
131         }
132     }
133     else {
134         FIXME (animate, "(%u) empty stub!\n", (WORD)LOWORD(lParam));
135
136         if (ANIMATE_LoadRes32A (infoPtr, hInstance,
137                                 MAKEINTRESOURCE32A((INT32)lParam))) {
138             FIXME (animate, "AVI resource found!\n");
139         }
140         else {
141             FIXME (animate, "No AVI resource found!\n");
142             return FALSE;
143         }
144     }
145
146     ANIMATE_GetAviInfo (infoPtr);
147
148     return TRUE;
149 }
150
151
152 /* << ANIMATE_Open32W >> */
153
154
155 static LRESULT
156 ANIMATE_Play (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
157 {
158     /* ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr); */
159     INT32 nFrom   = (INT32)LOWORD(lParam);
160     INT32 nTo     = (INT32)HIWORD(lParam);
161     INT32 nRepeat = (INT32)wParam;
162
163 #if 0
164     /* nothing opened */
165     if (...)
166         return FALSE;
167 #endif
168     
169     if (nRepeat == -1) {
170
171         FIXME (animate, "(loop from=%d to=%d) empty stub!\n",
172                nFrom, nTo);
173
174     }
175     else {
176
177         FIXME (animate, "(repeat=%d from=%d to=%d) empty stub!\n",
178                nRepeat, nFrom, nTo);
179
180     }
181
182
183     return TRUE;
184 }
185
186
187 static LRESULT
188 ANIMATE_Stop (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
189 {
190     /* ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr); */
191
192 #if 0
193     /* nothing opened */
194     if (...)
195         return FALSE;
196 #endif
197     
198     return TRUE;
199 }
200
201
202
203 static LRESULT
204 ANIMATE_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
205 {
206     ANIMATE_INFO *infoPtr;
207
208     /* allocate memory for info structure */
209     infoPtr = (ANIMATE_INFO *)COMCTL32_Alloc (sizeof(ANIMATE_INFO));
210     wndPtr->wExtra[0] = (DWORD)infoPtr;
211
212     if (infoPtr == NULL) {
213         ERR (animate, "could not allocate info memory!\n");
214         return 0;
215     }
216
217     if ((ANIMATE_INFO*)wndPtr->wExtra[0] != infoPtr) {
218         ERR (animate, "pointer assignment error!\n");
219         return 0;
220     }
221
222     /* set default settings */
223
224
225     return 0;
226 }
227
228
229 static LRESULT
230 ANIMATE_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
231 {
232     ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
233
234
235     /* free avi data */
236     ANIMATE_Free (infoPtr);
237
238     /* free animate info data */
239     COMCTL32_Free (infoPtr);
240
241     return 0;
242 }
243
244
245 #if 0
246 static LRESULT
247 ANIMATE_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
248 {
249     ANIMATE_INFO *infoPtr = ANIMATE_GetInfoPtr(wndPtr);
250 /*
251     HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
252     RECT32 rect;
253
254     GetClientRect32 (wndPtr->hwndSelf, &rect);
255     FillRect32 ((HDC32)wParam, &rect, hBrush);
256     DeleteObject32 (hBrush);
257 */
258     return TRUE;
259 }
260 #endif
261
262
263
264 LRESULT WINAPI
265 ANIMATE_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
266 {
267     WND *wndPtr = WIN_FindWndPtr(hwnd);
268
269     switch (uMsg)
270     {
271         case ACM_OPEN32A:
272             return ANIMATE_Open32A (wndPtr, wParam, lParam);
273
274 /*      case ACM_OPEN32W: */
275 /*          return ANIMATE_Open32W (wndPtr, wParam, lParam); */
276
277         case ACM_PLAY:
278             return ANIMATE_Play (wndPtr, wParam, lParam);
279
280         case ACM_STOP:
281             return ANIMATE_Stop (wndPtr, wParam, lParam);
282
283
284         case WM_CREATE:
285             return ANIMATE_Create (wndPtr, wParam, lParam);
286
287         case WM_DESTROY:
288             return ANIMATE_Destroy (wndPtr, wParam, lParam);
289
290 /*      case WM_ERASEBKGND: */
291 /*          return ANIMATE_EraseBackground (wndPtr, wParam, lParam); */
292
293 /*      case WM_NCCREATE: */
294 /*      case WM_NCHITTEST: */
295 /*      case WM_PAINT: */
296 /*      case WM_SIZE: */
297 /*      case WM_STYLECHANGED: */
298 /*      case WM_TIMER: */
299
300         default:
301             if (uMsg >= WM_USER)
302                 ERR (animate, "unknown msg %04x wp=%08x lp=%08lx\n",
303                      uMsg, wParam, lParam);
304             return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
305     }
306     return 0;
307 }
308
309
310 VOID
311 ANIMATE_Register (VOID)
312 {
313     WNDCLASS32A wndClass;
314
315     if (GlobalFindAtom32A (ANIMATE_CLASS32A)) return;
316
317     ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
318     wndClass.style         = CS_GLOBALCLASS | CS_DBLCLKS;
319     wndClass.lpfnWndProc   = (WNDPROC32)ANIMATE_WindowProc;
320     wndClass.cbClsExtra    = 0;
321     wndClass.cbWndExtra    = sizeof(ANIMATE_INFO *);
322     wndClass.hCursor       = LoadCursor32A (0, IDC_ARROW32A);
323     wndClass.hbrBackground = (HBRUSH32)(COLOR_BTNFACE + 1);
324     wndClass.lpszClassName = ANIMATE_CLASS32A;
325  
326     RegisterClass32A (&wndClass);
327 }
328
329
330 VOID
331 ANIMATE_Unregister (VOID)
332 {
333     if (GlobalFindAtom32A (ANIMATE_CLASS32A))
334         UnregisterClass32A (ANIMATE_CLASS32A, (HINSTANCE32)NULL);
335 }
336