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.
8 * Copyright 2000 by Jean-Claude Batista
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.
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.
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
34 #define NO_SHLWAPI_STREAM
39 #include "wine/debug.h"
43 WINE_DEFAULT_DEBUG_CHANNEL(richedit);
45 HANDLE RICHED32_hHeap = NULL;
46 /* LPSTR RICHED32_aSubclass = NULL; */
47 static WNDPROC lpfnEditWndProc = NULL;
48 static INT RTFInfoOffset = 0;
50 #define TRACE_EDIT_MSG32(str) \
52 "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\
54 hwnd, (UINT)wParam, (UINT)lParam)
56 LPVOID* WINAPI CreateIRichEditOle();
57 VOID RICHEDIT_InitEditControlInfo(void);
59 /***********************************************************************
60 * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.
63 * hinstDLL [I] handle to the DLL's instance
65 * lpvReserved [I] reserved, must be NULL
72 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
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 */
87 case DLL_PROCESS_DETACH:
88 /* unregister all common control classes */
89 RICHED32_Unregister ();
90 HeapDestroy (RICHED32_hHeap);
91 RICHED32_hHeap = NULL;
97 /* Support routines for window procedure */
98 INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr);
99 INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer);
101 typedef struct _RTFControl_info
111 * Window procedure of the RichEdit control.
114 static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
119 RTFControl_Info *info;
122 info = (RTFControl_Info *) GetWindowLongW( hwnd, RTFInfoOffset );
124 TRACE("uMsg: 0x%x hwnd: %p\n",uMsg,hwnd);
130 TRACE_EDIT_MSG32("WM_CREATE Passed to default");
131 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
134 TRACE_EDIT_MSG32("WM_NCCREATE");
136 info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
137 sizeof (RTFControl_Info));
138 info->parser = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
140 SetWindowLongW( hwnd, RTFInfoOffset, (LONG)info );
142 /* remove SCROLLBARS from the current window style */
143 info->hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent;
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);
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);
161 TRACE_EDIT_MSG32("WM_SETFOCUS");
162 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
165 TRACE_EDIT_MSG32("WM_SIZE");
166 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
169 TRACE_EDIT_MSG32("WM_COMMAND");
170 switch(HIWORD(wParam)) {
177 return SendMessageA(info->hwndParent, WM_COMMAND,
178 wParam, (LPARAM)(hwnd));
182 MessageBoxA (hwnd, "RichEdit control out of space.",
183 "ERROR", MB_OK | MB_ICONSTOP) ;
188 TRACE_EDIT_MSG32("EM_STREAMIN");
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);
199 RTFRead (info->parser);
200 RTFFlushOutputBuffer( info->parser );
202 /* put the cursor at the top */
203 SendMessageA( hwnd, EM_SETSEL, 0, 0 );
207 /* Messages specific to Richedit controls */
209 case EM_AUTOURLDETECT:
210 TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");
214 TRACE_EDIT_MSG32("EM_CANPASTE Ignored");
218 TRACE_EDIT_MSG32("EM_CANREDO Ignored");
222 TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");
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);
234 DWORD limit = lParam;
235 TRACE_EDIT_MSG32("EM_EXLIMITTEXT");
240 return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETLIMITTEXT, limit, 0);
243 case EM_EXLINEFROMCHAR:
244 TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");
245 return CallWindowProcA(lpfnEditWndProc, hwnd, EM_LINEFROMCHAR, lParam, wParam);
248 TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");
249 cr = (VOID *) lParam;
250 return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETSEL, cr->cpMin, cr->cpMax);
253 TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");
257 TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");
261 TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");
265 TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");
268 case EM_FINDWORDBREAK:
269 TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");
273 TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");
276 case EM_GETAUTOURLDETECT:
277 TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");
280 case EM_GETBIDIOPTIONS:
281 TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");
284 case EM_GETCHARFORMAT:
285 TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");
288 case EM_GETEDITSTYLE:
289 TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");
292 case EM_GETEVENTMASK:
293 TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");
297 TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");
300 case EM_GETIMECOMPMODE:
301 TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");
304 case EM_GETIMEOPTIONS:
305 TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");
308 case EM_GETLANGOPTIONS:
309 TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");
312 case EM_GETOLEINTERFACE:
313 TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");
317 TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");
320 case EM_GETPARAFORMAT:
321 TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");
324 case EM_GETPUNCTUATION:
325 TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");
329 TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");
332 case EM_GETSCROLLPOS:
333 TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");
337 TRACE_EDIT_MSG32("EM_GETSELTEXT");
338 return RICHEDIT_GetSelText(hwnd,(void *)lParam);
341 TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");
344 case EM_GETTEXTLENGTHEX:
345 TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");
349 TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");
352 case EM_GETTEXTRANGE:
353 TRACE_EDIT_MSG32("EM_GETTEXTRANGE");
354 return RICHEDIT_GetTextRange(hwnd,(TEXTRANGEA *)lParam);
356 case EM_GETTYPOGRAPHYOPTIONS:
357 TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");
361 TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");
364 case EM_GETWORDBREAKPROCEX:
365 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");
368 case EM_GETWORDWRAPMODE:
369 TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");
373 TRACE_EDIT_MSG32("EM_GETZOOM Ignored");
376 case EM_HIDESELECTION:
377 TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");
380 case EM_PASTESPECIAL:
381 TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");
384 case EM_RECONVERSION:
385 TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");
389 TRACE_EDIT_MSG32("EM_REDO Ignored");
392 case EM_REQUESTRESIZE:
393 TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");
396 case EM_SELECTIONTYPE:
397 TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");
400 case EM_SETBIDIOPTIONS:
401 TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");
404 case EM_SETBKGNDCOLOR:
405 TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");
408 case EM_SETCHARFORMAT:
409 TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");
412 case EM_SETEDITSTYLE:
413 TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");
416 case EM_SETEVENTMASK:
417 TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");
421 TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");
425 TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");
428 case EM_SETIMEOPTIONS:
429 TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");
432 case EM_SETLANGOPTIONS:
433 TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");
436 case EM_SETOLECALLBACK:
437 TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");
441 TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");
445 TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");
448 case EM_SETPARAFORMAT:
449 TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");
452 case EM_SETPUNCTUATION:
453 TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");
456 case EM_SETSCROLLPOS:
457 TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");
460 case EM_SETTARGETDEVICE:
461 TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");
465 TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");
469 TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");
472 case EM_SETTYPOGRAPHYOPTIONS:
473 TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");
476 case EM_SETUNDOLIMIT:
477 TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");
480 case EM_SETWORDBREAKPROCEX:
481 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");
484 case EM_SETWORDWRAPMODE:
485 TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");
489 TRACE_EDIT_MSG32("EM_SETZOOM Ignored");
492 case EM_SHOWSCROLLBAR:
493 TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");
496 case EM_STOPGROUPTYPING:
497 TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");
501 TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");
504 /* Messages dispatched to the edit control */
506 TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");
507 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
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);
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);
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);
534 TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");
535 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
543 TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");
544 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
546 TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");
547 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
558 TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");
559 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
561 TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");
562 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
564 TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");
565 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
567 TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");
568 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
570 TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");
571 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
573 TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");
574 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
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);
587 TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");
588 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
596 TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");
597 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
599 TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");
600 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
602 TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");
603 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
605 TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");
606 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
614 TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");
615 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
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);
630 TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");
631 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
633 TRACE_EDIT_MSG32("WM_CUT Passed to edit control");
634 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
636 TRACE_EDIT_MSG32("WM_COPY Passed to edit control");
637 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
639 TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");
640 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
642 /* Messages passed to default handler. */
644 TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");
645 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
647 TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");
648 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
650 TRACE_EDIT_MSG32("WM_PAINT Passed to default");
651 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
653 TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");
654 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
656 TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");
657 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
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);
678 TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");
679 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
681 TRACE_EDIT_MSG32("WM_MOVE Passed to default");
682 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
690 TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");
691 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
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);
707 TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");
708 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
710 TRACE_EDIT_MSG32("WM_CLEAR Passed to default");
711 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
713 * used by IE in the EULA box
715 case WM_ALTTABACTIVE:
716 TRACE_EDIT_MSG32("WM_ALTTABACTIVE");
717 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
719 TRACE_EDIT_MSG32("WM_GETDLGCODE");
720 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
722 TRACE_EDIT_MSG32("WM_SETFONT");
723 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
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);
732 return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);
735 /***********************************************************************
736 * DllGetVersion [RICHED32.2]
738 * Retrieves version information of the 'RICHED32.DLL'
741 * pdvi [O] pointer to version information structure.
745 * Failure: E_INVALIDARG
748 * Returns version of a comctl32.dll from IE4.01 SP1.
752 RICHED32_DllGetVersion (DLLVERSIONINFO *pdvi)
756 if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {
761 pdvi->dwMajorVersion = 4;
762 pdvi->dwMinorVersion = 0;
763 pdvi->dwBuildNumber = 0;
764 pdvi->dwPlatformID = 0;
771 * Registers the window class.
779 VOID RICHED32_Register(void)
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; */
794 RegisterClassA (&wndClass);
799 * Unregisters the window class.
807 VOID RICHED32_Unregister(void)
811 UnregisterClassA(RICHEDIT_CLASS10A, NULL);
817 * Initialize edit control class info
819 VOID RICHEDIT_InitEditControlInfo(void)
823 if (GetClassInfoA(0, "edit", &wcEdit))
825 lpfnEditWndProc = wcEdit.lpfnWndProc;
826 RTFInfoOffset = wcEdit.cbWndExtra;
829 ERR("Failed to retrieve edit control class info\n");
833 INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr)
835 UINT alloc_size, text_size, range_size;
838 TRACE("start: 0x%x stop: 0x%x\n",(INT)tr->chrg.cpMin,(INT)tr->chrg.cpMax);
840 if (!(alloc_size = SendMessageA(hwnd,WM_GETTEXTLENGTH,0,0))) return FALSE;
841 if (!(text = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (alloc_size+1))))
843 text_size = SendMessageA(hwnd,WM_GETTEXT,alloc_size,(INT)text);
845 if (text_size > tr->chrg.cpMin)
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);
852 HeapFree(GetProcessHeap(), 0, text);
857 INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer)
859 TEXTRANGEA textrange;
861 textrange.lpstrText = lpstrBuffer;
862 SendMessageA(hwnd,EM_GETSEL,(INT)&textrange.chrg.cpMin,(INT)&textrange.chrg.cpMax);
863 return RICHEDIT_GetTextRange(hwnd,&textrange);