Reverse the order for deleting the items in resetcontent to correctly
[wine] / dlls / richedit / richedit.c
1 /*
2  * RichEdit32  functions
3  *
4  * This module is a simple wrapper for the edit controls.
5  * At the point, it is good only for application who use the RICHEDIT
6  * control to display RTF text.
7  *
8  * Copyright 2000 by Jean-Claude Batista
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  */
24
25 #include <stdarg.h>
26 #include <string.h>
27 #include "windef.h"
28 #include "winbase.h"
29 #include "wingdi.h"
30 #include "winreg.h"
31 #include "winerror.h"
32 #include "riched32.h"
33 #include "richedit.h"
34 #define NO_SHLWAPI_STREAM
35 #include "shlwapi.h"
36
37 #include "rtf.h"
38 #include "rtf2text.h"
39 #include "wine/debug.h"
40
41 #define ID_EDIT      1
42
43 WINE_DEFAULT_DEBUG_CHANNEL(richedit);
44
45 HANDLE RICHED32_hHeap = NULL;
46 /* LPSTR  RICHED32_aSubclass = NULL; */
47 static WNDPROC lpfnEditWndProc = NULL;
48 static INT RTFInfoOffset = 0;
49
50 #define TRACE_EDIT_MSG32(str) \
51         TRACE(\
52                      "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\
53                      , \
54                      hwnd, (UINT)wParam, (UINT)lParam)
55
56 LPVOID* WINAPI CreateIRichEditOle();
57 VOID RICHEDIT_InitEditControlInfo(void);
58
59 /***********************************************************************
60  * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.
61  *
62  * PARAMS
63  *     hinstDLL    [I] handle to the DLL's instance
64  *     fdwReason   [I]
65  *     lpvReserved [I] reserved, must be NULL
66  *
67  * RETURNS
68  *     Success: TRUE
69  *     Failure: FALSE
70  */
71
72 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
73 {
74     TRACE("\n");
75     switch (fdwReason)
76     {
77     case DLL_PROCESS_ATTACH:
78         DisableThreadLibraryCalls(hinstDLL);
79         /* create private heap */
80         RICHED32_hHeap = HeapCreate (0, 0x10000, 0);
81         /* Retrieve edit control class info */
82         RICHEDIT_InitEditControlInfo();
83         /* register the Rich Edit class */
84         RICHED32_Register ();
85         break;
86
87     case DLL_PROCESS_DETACH:
88         /* unregister all common control classes */
89         RICHED32_Unregister ();
90         HeapDestroy (RICHED32_hHeap);
91         RICHED32_hHeap = NULL;
92         break;
93     }
94     return TRUE;
95 }
96
97 /* Support routines for window procedure */
98    INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr);
99    INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer);
100
101 typedef struct _RTFControl_info
102 {
103     HWND hwndParent;
104     char* rtfBuffer;
105     RTF_Info *parser;
106 } RTFControl_Info;
107
108 /*
109  *
110  * DESCRIPTION:
111  * Window procedure of the RichEdit control.
112  *
113  */
114 static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
115                                    LPARAM lParam)
116 {
117     LONG newstyle = 0;
118     LONG style = 0;
119     RTFControl_Info *info;
120     CHARRANGE *cr;
121
122     info = (RTFControl_Info *) GetWindowLongW( hwnd, RTFInfoOffset );
123
124     TRACE("uMsg: 0x%x hwnd: %p\n",uMsg,hwnd);
125
126     switch (uMsg)
127     {
128
129     case WM_CREATE:
130             TRACE_EDIT_MSG32("WM_CREATE Passed to default");
131             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
132         
133     case WM_NCCREATE :
134             TRACE_EDIT_MSG32("WM_NCCREATE");
135
136             info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
137                               sizeof (RTFControl_Info));
138             info->parser = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
139                               sizeof (RTF_Info));
140             SetWindowLongW( hwnd, RTFInfoOffset, (LONG)info );
141
142             /* remove SCROLLBARS from the current window style */
143             info->hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent;
144
145             newstyle = style = ((LPCREATESTRUCTA) lParam)->style;
146             newstyle &= ~WS_HSCROLL;
147             newstyle &= ~WS_VSCROLL;
148             newstyle &= ~ES_AUTOHSCROLL;
149             newstyle &= ~ES_AUTOVSCROLL;
150             newstyle &= ~ES_NUMBER;  /* Reused as ES_DISABLENOSCROLL */
151             SetWindowLongA(hwnd,GWL_STYLE, newstyle);
152
153             /* Note that SetWindowLongA(hwnd,GWL_STYLE...) doesnt update 
154                the style field in the text window as the edit structure is
155                not initialized until it processes this message. Therefore
156                update the style in the message itself                     */
157             ((LPCREATESTRUCTA) lParam)->style = newstyle;
158             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
159
160     case WM_SETFOCUS :
161             TRACE_EDIT_MSG32("WM_SETFOCUS");
162             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
163
164     case WM_SIZE :
165             TRACE_EDIT_MSG32("WM_SIZE");
166             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
167
168     case WM_COMMAND :
169         TRACE_EDIT_MSG32("WM_COMMAND");
170         switch(HIWORD(wParam)) {
171                 case EN_CHANGE:
172                 case EN_HSCROLL:
173                 case EN_KILLFOCUS:
174                 case EN_SETFOCUS:
175                 case EN_UPDATE:
176                 case EN_VSCROLL:
177                         return SendMessageA(info->hwndParent, WM_COMMAND,
178                                 wParam, (LPARAM)(hwnd));
179
180                 case EN_ERRSPACE:
181                 case EN_MAXTEXT:
182                         MessageBoxA (hwnd, "RichEdit control out of space.",
183                                   "ERROR", MB_OK | MB_ICONSTOP) ;
184                         return 0 ;
185                 }
186
187     case EM_STREAMIN:
188             TRACE_EDIT_MSG32("EM_STREAMIN");
189
190             /* setup the RTF parser */
191             RTFSetEditStream(info->parser,( EDITSTREAM*)lParam);
192             info->parser->rtfFormat = wParam&(SF_TEXT|SF_RTF);
193             info->parser->hwndEdit = hwnd;
194             WriterInit(info->parser);
195             RTFInit (info->parser);
196             BeginFile(info->parser);
197
198             /* do the parsing */
199             RTFRead (info->parser);
200             RTFFlushOutputBuffer( info->parser );
201
202             /* put the cursor at the top */
203             SendMessageA( hwnd, EM_SETSEL, 0, 0 );
204
205             return 0;
206
207 /* Messages specific to Richedit controls */
208
209     case EM_AUTOURLDETECT:
210             TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");
211             return 0;
212
213     case EM_CANPASTE:
214             TRACE_EDIT_MSG32("EM_CANPASTE Ignored");
215             return 0;
216
217     case EM_CANREDO:
218             TRACE_EDIT_MSG32("EM_CANREDO Ignored");
219             return 0;
220
221     case EM_DISPLAYBAND:
222             TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");
223             return 0;
224
225     case EM_EXGETSEL:
226             TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL");
227             cr = (VOID *) lParam;
228             CallWindowProcA(lpfnEditWndProc, hwnd, EM_GETSEL, (INT)&cr->cpMin, (INT)&cr->cpMax);
229             TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT)cr->cpMin,(INT)cr->cpMax);
230             return 0;
231
232     case EM_EXLIMITTEXT:
233         {
234            DWORD limit = lParam;
235            TRACE_EDIT_MSG32("EM_EXLIMITTEXT");
236            if (limit > 65534)
237            {
238                 limit = 0xFFFFFFFF;
239            }
240            return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETLIMITTEXT, limit, 0);
241         }
242
243     case EM_EXLINEFROMCHAR:
244             TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");
245             return CallWindowProcA(lpfnEditWndProc, hwnd, EM_LINEFROMCHAR, lParam, wParam);
246
247     case EM_EXSETSEL:
248             TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");
249             cr = (VOID *) lParam;
250             return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETSEL, cr->cpMin, cr->cpMax);
251
252     case EM_FINDTEXT:
253             TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");
254             return 0;
255
256     case EM_FINDTEXTEX:
257             TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");
258             return 0;
259
260     case EM_FINDTEXTEXW:
261             TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");
262             return 0;
263
264     case EM_FINDTEXTW:
265             TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");
266             return 0;
267
268     case EM_FINDWORDBREAK:
269             TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");
270             return 0;
271
272     case EM_FORMATRANGE:
273             TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");
274             return 0;
275
276     case EM_GETAUTOURLDETECT:
277             TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");
278             return 0;
279
280     case EM_GETBIDIOPTIONS:
281             TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");
282             return 0;
283
284     case EM_GETCHARFORMAT:
285             TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");
286             return 0;
287
288     case EM_GETEDITSTYLE:
289             TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");
290             return 0;
291
292     case EM_GETEVENTMASK:
293             TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");
294             return 0;
295
296     case EM_GETIMECOLOR:
297             TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");
298             return 0;
299
300     case EM_GETIMECOMPMODE:
301             TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");
302             return 0;
303
304     case EM_GETIMEOPTIONS:
305             TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");
306             return 0;
307
308     case EM_GETLANGOPTIONS:
309             TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");
310             return 0;
311
312     case EM_GETOLEINTERFACE:
313             TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");
314             return 0;
315
316     case EM_GETOPTIONS:
317             TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");
318             return 0;
319
320     case EM_GETPARAFORMAT:
321             TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");
322             return 0;
323
324     case EM_GETPUNCTUATION:
325             TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");
326             return 0;
327
328     case EM_GETREDONAME:
329             TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");
330             return 0;
331
332     case EM_GETSCROLLPOS:
333             TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");
334             return 0;
335
336     case EM_GETSELTEXT:
337             TRACE_EDIT_MSG32("EM_GETSELTEXT");
338             return RICHEDIT_GetSelText(hwnd,(void *)lParam);
339
340     case EM_GETTEXTEX:
341             TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");
342             return 0;
343
344     case EM_GETTEXTLENGTHEX:
345             TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");
346             return 0;
347
348     case EM_GETTEXTMODE:
349             TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");
350             return 0;
351
352     case EM_GETTEXTRANGE:
353             TRACE_EDIT_MSG32("EM_GETTEXTRANGE");
354             return RICHEDIT_GetTextRange(hwnd,(TEXTRANGEA *)lParam);
355
356     case EM_GETTYPOGRAPHYOPTIONS:
357             TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");
358             return 0;
359
360     case EM_GETUNDONAME:
361             TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");
362             return 0;
363
364     case EM_GETWORDBREAKPROCEX:
365             TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");
366             return 0;
367
368     case EM_GETWORDWRAPMODE:
369             TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");
370             return 0;
371
372     case EM_GETZOOM:
373             TRACE_EDIT_MSG32("EM_GETZOOM Ignored");
374             return 0;
375
376     case EM_HIDESELECTION:
377             TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");
378             return 0;
379
380     case EM_PASTESPECIAL:
381             TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");
382             return 0;
383
384     case EM_RECONVERSION:
385             TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");
386             return 0;
387
388     case EM_REDO:
389             TRACE_EDIT_MSG32("EM_REDO Ignored");
390             return 0;
391
392     case EM_REQUESTRESIZE:
393             TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");
394             return 0;
395
396     case EM_SELECTIONTYPE:
397             TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");
398             return 0;
399
400     case EM_SETBIDIOPTIONS:
401             TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");
402             return 0;
403
404     case EM_SETBKGNDCOLOR:
405             TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");
406             return 0;
407
408     case EM_SETCHARFORMAT:
409             TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");
410             return 0;
411
412     case EM_SETEDITSTYLE:
413             TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");
414             return 0;
415
416     case EM_SETEVENTMASK:
417             TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");
418             return 0;
419
420     case EM_SETFONTSIZE:
421             TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");
422             return 0;
423
424     case EM_SETIMECOLOR:
425             TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");
426             return 0;
427
428     case EM_SETIMEOPTIONS:
429             TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");
430             return 0;
431
432     case EM_SETLANGOPTIONS:
433             TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");
434             return 0;
435
436     case EM_SETOLECALLBACK:
437             TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");
438             return 0;
439
440     case EM_SETOPTIONS:
441             TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");
442             return 0;
443
444     case EM_SETPALETTE:
445             TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");
446             return 0;
447
448     case EM_SETPARAFORMAT:
449             TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");
450             return 0;
451
452     case EM_SETPUNCTUATION:
453             TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");
454             return 0;
455
456     case EM_SETSCROLLPOS:
457             TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");
458             return 0;
459
460     case EM_SETTARGETDEVICE:
461             TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");
462             return 0;
463
464     case EM_SETTEXTEX:
465             TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");
466             return 0;
467
468     case EM_SETTEXTMODE:
469             TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");
470             return 0;
471
472     case EM_SETTYPOGRAPHYOPTIONS:
473             TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");
474             return 0;
475
476     case EM_SETUNDOLIMIT:
477             TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");
478             return 0;
479
480     case EM_SETWORDBREAKPROCEX:
481             TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");
482             return 0;
483
484     case EM_SETWORDWRAPMODE:
485             TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");
486             return 0;
487
488     case EM_SETZOOM:
489             TRACE_EDIT_MSG32("EM_SETZOOM Ignored");
490             return 0;
491
492     case EM_SHOWSCROLLBAR:
493             TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");
494             return 0;
495
496     case EM_STOPGROUPTYPING:
497             TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");
498             return 0;
499
500     case EM_STREAMOUT:
501             TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");
502             return 0;
503
504 /* Messages dispatched to the edit control */
505      case EM_CANUNDO:
506             TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");
507             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
508      case EM_CHARFROMPOS:
509             TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control");
510             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
511      case EM_EMPTYUNDOBUFFER:
512             TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control");
513             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
514      case EM_FMTLINES:
515             TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control");
516             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
517      case EM_GETFIRSTVISIBLELINE:
518             TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control");
519             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
520      case EM_GETHANDLE:
521             TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control");
522             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
523  /*    case EM_GETIMESTATUS:*/
524      case EM_GETLIMITTEXT:
525             TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control");
526             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
527      case EM_GETLINE:
528             TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control");
529             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
530      case EM_GETLINECOUNT:
531             TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control");
532             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
533      case EM_GETMARGINS:
534             TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");
535             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
536      case EM_GETMODIFY:
537             TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control");
538             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
539      case EM_GETPASSWORDCHAR:
540             TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control");
541             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
542      case EM_GETRECT:
543             TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");
544             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
545      case EM_GETSEL:
546             TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");
547             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
548      case EM_GETTHUMB:
549             TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control");
550             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
551      case EM_GETWORDBREAKPROC:
552             TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control");
553             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
554      case EM_LINEFROMCHAR:
555             TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control");
556             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
557      case EM_LINEINDEX:
558             TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");
559             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
560      case EM_LINELENGTH:
561             TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");
562             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
563      case EM_LINESCROLL:
564             TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");
565             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
566      case EM_POSFROMCHAR:
567             TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");
568             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
569      case EM_REPLACESEL:
570             TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");
571             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
572      case EM_SCROLL:
573             TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");
574             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
575      case EM_SCROLLCARET:
576      case WM_USER+49:  /* EM_SCROLLCARET too */
577             TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control");
578             return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SCROLLCARET, wParam, lParam);
579      case EM_SETHANDLE:
580             TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control");
581             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
582  /*    case EM_SETIMESTATUS:*/
583      case EM_SETLIMITTEXT:
584             TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control");
585             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
586      case EM_SETMARGINS:
587             TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");
588             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
589      case EM_SETMODIFY:
590             TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control");
591             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
592      case EM_SETPASSWORDCHAR:
593             TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control");
594             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
595      case EM_SETREADONLY:
596             TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");
597             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
598      case EM_SETRECT:
599             TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");
600             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
601      case EM_SETRECTNP:
602             TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");
603             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
604      case EM_SETSEL:
605             TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");
606             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
607      case EM_SETTABSTOPS:
608             TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control");
609             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
610      case EM_SETWORDBREAKPROC:
611             TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control");
612             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
613      case EM_UNDO:
614             TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");
615             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
616
617      case WM_STYLECHANGING:
618             TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control");
619             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
620      case WM_STYLECHANGED:
621             TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control");
622             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
623      case WM_GETTEXT:
624             TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control");
625             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
626      case WM_GETTEXTLENGTH:
627             TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control");
628             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
629      case WM_SETTEXT:
630             TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");
631             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
632      case WM_CUT:
633             TRACE_EDIT_MSG32("WM_CUT Passed to edit control");
634             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
635      case WM_COPY:
636             TRACE_EDIT_MSG32("WM_COPY Passed to edit control");
637             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
638     case WM_PASTE:
639             TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");
640             return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
641
642     /* Messages passed to default handler. */
643     case WM_NCCALCSIZE:
644         TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");
645         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
646     case WM_NCPAINT:
647         TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");
648         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
649     case WM_PAINT:
650         TRACE_EDIT_MSG32("WM_PAINT Passed to default");
651         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
652     case WM_ERASEBKGND:
653         TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");
654         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
655     case WM_KILLFOCUS:
656         TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");
657         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
658     case WM_DESTROY:
659         TRACE_EDIT_MSG32("WM_DESTROY Passed to default");
660         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
661     case WM_CHILDACTIVATE:
662         TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default");
663         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
664
665     case WM_WINDOWPOSCHANGING:
666         TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default");
667         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
668     case WM_WINDOWPOSCHANGED:
669         TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default");
670         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
671 /*    case WM_INITIALUPDATE:
672         TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default");
673         return DefWindowProcA( hwnd,uMsg,wParam,lParam); */
674     case WM_CTLCOLOREDIT:
675         TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default");
676         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
677     case WM_SETCURSOR:
678         TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");
679         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
680     case WM_MOVE:
681         TRACE_EDIT_MSG32("WM_MOVE Passed to default");
682         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
683     case WM_SHOWWINDOW:
684         TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default");
685         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
686     case WM_PARENTNOTIFY:
687         TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default");
688         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
689     case WM_SETREDRAW:
690         TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");
691         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
692     case WM_NCDESTROY:
693     {
694         TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default");
695         HeapFree( GetProcessHeap(), 0, info->parser );
696         HeapFree( GetProcessHeap(), 0, info );
697         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
698     }
699
700     case WM_NCHITTEST:
701         TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default");
702         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
703     case WM_CTLCOLORSTATIC:
704         TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default");
705         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
706     case WM_NCMOUSEMOVE:
707         TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");
708         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
709     case WM_CLEAR:
710         TRACE_EDIT_MSG32("WM_CLEAR Passed to default");
711         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
712    /*
713     * used by IE in the EULA box
714     */
715     case WM_ALTTABACTIVE:
716         TRACE_EDIT_MSG32("WM_ALTTABACTIVE");
717         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
718     case WM_GETDLGCODE:
719         TRACE_EDIT_MSG32("WM_GETDLGCODE");
720         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
721     case WM_SETFONT:
722         TRACE_EDIT_MSG32("WM_SETFONT");
723         return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
724
725     }
726
727     if ((uMsg >= WM_USER) && (uMsg < WM_APP)) {
728         FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n",
729                uMsg, hwnd, (UINT)wParam, (UINT)lParam);
730     }
731
732    return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
733 }
734
735 /***********************************************************************
736  * DllGetVersion [RICHED32.2]
737  *
738  * Retrieves version information of the 'RICHED32.DLL'
739  *
740  * PARAMS
741  *     pdvi [O] pointer to version information structure.
742  *
743  * RETURNS
744  *     Success: S_OK
745  *     Failure: E_INVALIDARG
746  *
747  * NOTES
748  *     Returns version of a comctl32.dll from IE4.01 SP1.
749  */
750
751 HRESULT WINAPI
752 RICHED32_DllGetVersion (DLLVERSIONINFO *pdvi)
753 {
754     TRACE("\n");
755
756     if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {
757
758         return E_INVALIDARG;
759     }
760
761     pdvi->dwMajorVersion = 4;
762     pdvi->dwMinorVersion = 0;
763     pdvi->dwBuildNumber = 0;
764     pdvi->dwPlatformID = 0;
765
766     return S_OK;
767 }
768
769 /***
770  * DESCRIPTION:
771  * Registers the window class.
772  *
773  * PARAMETER(S):
774  * None
775  *
776  * RETURN:
777  * None
778  */
779 VOID RICHED32_Register(void)
780 {
781     WNDCLASSA wndClass;
782
783     TRACE("\n");
784
785     ZeroMemory(&wndClass, sizeof(WNDCLASSA));
786     wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
787     wndClass.lpfnWndProc = RICHED32_WindowProc;
788     wndClass.cbClsExtra = 0;
789     wndClass.cbWndExtra = RTFInfoOffset + sizeof(RTFControl_Info*);
790     wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);
791     wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
792     wndClass.lpszClassName = RICHEDIT_CLASS10A; /* WC_RICHED32A; */
793
794     RegisterClassA (&wndClass);
795 }
796
797 /***
798  * DESCRIPTION:
799  * Unregisters the window class.
800  *
801  * PARAMETER(S):
802  * None
803  *
804  * RETURN:
805  * None
806  */
807 VOID RICHED32_Unregister(void)
808 {
809     TRACE("\n");
810
811     UnregisterClassA(RICHEDIT_CLASS10A, NULL);
812 }
813
814
815 /***
816  * DESCRIPTION:
817  * Initialize edit control class info
818  */
819 VOID RICHEDIT_InitEditControlInfo(void)
820 {
821     WNDCLASSA wcEdit;
822
823     if (GetClassInfoA(0, "edit",  &wcEdit))
824     {
825         lpfnEditWndProc = wcEdit.lpfnWndProc;
826         RTFInfoOffset = wcEdit.cbWndExtra;
827     }
828     else
829         ERR("Failed to retrieve edit control class info\n");
830 }
831
832
833 INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr)
834 {
835     UINT alloc_size, text_size, range_size;
836     char *text;
837
838     TRACE("start: 0x%x stop: 0x%x\n",(INT)tr->chrg.cpMin,(INT)tr->chrg.cpMax);
839
840     if (!(alloc_size = SendMessageA(hwnd,WM_GETTEXTLENGTH,0,0))) return FALSE;
841     if (!(text = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (alloc_size+1))))
842                 return FALSE;
843     text_size = SendMessageA(hwnd,WM_GETTEXT,alloc_size,(INT)text);
844
845     if (text_size > tr->chrg.cpMin)
846     {
847        range_size = (text_size> tr->chrg.cpMax) ? (tr->chrg.cpMax - tr->chrg.cpMin) : (text_size - tr->chrg.cpMin);
848        TRACE("EditText: %.30s ...\n",text+tr->chrg.cpMin);
849        memcpy(tr->lpstrText,text+tr->chrg.cpMin,range_size);
850     }
851     else range_size = 0;
852     HeapFree(GetProcessHeap(), 0, text);
853
854     return range_size;
855 }
856
857 INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer)
858 {
859     TEXTRANGEA textrange;
860
861     textrange.lpstrText = lpstrBuffer;
862     SendMessageA(hwnd,EM_GETSEL,(INT)&textrange.chrg.cpMin,(INT)&textrange.chrg.cpMax);
863     return RICHEDIT_GetTextRange(hwnd,&textrange);
864 }