Fix the MHz detection code.
[wine/multimedia.git] / dlls / richedit / richedit.c
blobe3525d14a60e30278e4bba26b7d35bf2c6a95dd9
1 /*
2 * RichEdit32 functions
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
25 #include <string.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "winreg.h"
30 #include "winerror.h"
31 #include "riched32.h"
32 #include "richedit.h"
33 #include "charlist.h"
34 #define NO_SHLWAPI_STREAM
35 #include "shlwapi.h"
37 #include "rtf.h"
38 #include "rtf2text.h"
39 #include "wine/debug.h"
41 #define ID_EDIT 1
43 WINE_DEFAULT_DEBUG_CHANNEL(richedit);
45 HANDLE RICHED32_hHeap = NULL;
46 /* LPSTR RICHED32_aSubclass = NULL; */
48 #define TRACE_EDIT_MSG32(str) \
49 TRACE(\
50 "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\
51 , \
52 hwnd, (UINT)wParam, (UINT)lParam)
55 /***********************************************************************
56 * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.
58 * PARAMS
59 * hinstDLL [I] handle to the DLL's instance
60 * fdwReason [I]
61 * lpvReserved [I] reserved, must be NULL
63 * RETURNS
64 * Success: TRUE
65 * Failure: FALSE
68 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
70 TRACE("\n");
71 switch (fdwReason)
73 case DLL_PROCESS_ATTACH:
74 DisableThreadLibraryCalls(hinstDLL);
75 /* create private heap */
76 RICHED32_hHeap = HeapCreate (0, 0x10000, 0);
77 /* register the Rich Edit class */
78 RICHED32_Register ();
79 break;
81 case DLL_PROCESS_DETACH:
82 /* unregister all common control classes */
83 RICHED32_Unregister ();
84 HeapDestroy (RICHED32_hHeap);
85 RICHED32_hHeap = NULL;
86 break;
88 return TRUE;
91 /* Support routines for window procedure */
92 INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr);
93 INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer);
98 * DESCRIPTION:
99 * Window procedure of the RichEdit control.
102 static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
103 LPARAM lParam)
105 int RTFToBuffer(char* pBuffer, int nBufferSize);
106 LONG newstyle = 0;
107 LONG style = 0;
109 static HWND hwndEdit;
110 static HWND hwndParent;
111 static char* rtfBuffer;
112 int rtfBufferSize;
114 CHARRANGE *cr;
115 TRACE("previous hwndEdit: %p hwndParent %p\n",hwndEdit,hwndParent);
116 hwndEdit = GetWindow(hwnd,GW_CHILD);
117 TRACE("uMsg: 0x%x hwnd: %p hwndEdit: %p\n",uMsg,hwnd,hwndEdit);
119 switch (uMsg)
122 case WM_CREATE:
123 TRACE_EDIT_MSG32("WM_CREATE Passed to default");
124 DefWindowProcA( hwnd,uMsg,wParam,lParam);
125 return 0 ;
127 case WM_NCCREATE :
128 TRACE_EDIT_MSG32("WM_NCCREATE");
130 /* remove SCROLLBARS from the current window style */
131 hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent;
133 newstyle = style = ((LPCREATESTRUCTA) lParam)->style;
134 newstyle &= ~WS_HSCROLL;
135 newstyle &= ~WS_VSCROLL;
136 newstyle &= ~ES_AUTOHSCROLL;
137 newstyle &= ~ES_AUTOVSCROLL;
138 SetWindowLongA(hwnd,GWL_STYLE, newstyle);
140 TRACE("previous hwndEdit: %p\n",hwndEdit);
141 hwndEdit = CreateWindowA ("edit", ((LPCREATESTRUCTA) lParam)->lpszName,
142 style, 0, 0, 0, 0,
143 hwnd, (HMENU) ID_EDIT,
144 ((LPCREATESTRUCTA) lParam)->hInstance, NULL) ;
145 TRACE("hwndEdit: %p hwnd: %p\n",hwndEdit,hwnd);
147 if (hwndEdit)
148 return TRUE ;
149 else
150 return FALSE ;
152 case WM_SETFOCUS :
153 TRACE_EDIT_MSG32("WM_SETFOCUS");
154 SetFocus (hwndEdit) ;
155 return 0 ;
157 case WM_SIZE :
158 TRACE_EDIT_MSG32("WM_SIZE");
159 MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE) ;
160 return 0 ;
162 case WM_COMMAND :
163 TRACE_EDIT_MSG32("WM_COMMAND");
164 switch(HIWORD(wParam)) {
165 case EN_CHANGE:
166 case EN_HSCROLL:
167 case EN_KILLFOCUS:
168 case EN_SETFOCUS:
169 case EN_UPDATE:
170 case EN_VSCROLL:
171 return SendMessageA(hwndParent, WM_COMMAND,
172 wParam, (LPARAM)(hwnd));
174 case EN_ERRSPACE:
175 case EN_MAXTEXT:
176 MessageBoxA (hwnd, "RichEdit control out of space.",
177 "ERROR", MB_OK | MB_ICONSTOP) ;
178 return 0 ;
181 case EM_STREAMIN:
182 TRACE_EDIT_MSG32("EM_STREAMIN");
184 /* setup the RTF parser */
185 RTFSetEditStream(( EDITSTREAM*)lParam);
186 rtfFormat = wParam&(SF_TEXT|SF_RTF);
187 WriterInit();
188 RTFInit ();
189 BeginFile();
191 /* do the parsing */
192 RTFRead ();
194 rtfBufferSize = RTFToBuffer(NULL, 0);
195 rtfBuffer = HeapAlloc(RICHED32_hHeap, 0,rtfBufferSize*sizeof(char));
196 if(rtfBuffer)
198 RTFToBuffer(rtfBuffer, rtfBufferSize);
199 SetWindowTextA(hwndEdit,rtfBuffer);
200 HeapFree(RICHED32_hHeap, 0,rtfBuffer);
202 else
203 WARN("Not enough memory for a allocating rtfBuffer\n");
205 return 0;
207 /* Messages specific to Richedit controls */
209 case EM_AUTOURLDETECT:
210 TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");
211 return 0;
213 case EM_CANPASTE:
214 TRACE_EDIT_MSG32("EM_CANPASTE Ignored");
215 return 0;
217 case EM_CANREDO:
218 TRACE_EDIT_MSG32("EM_CANREDO Ignored");
219 return 0;
221 case EM_DISPLAYBAND:
222 TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");
223 return 0;
225 case EM_EXGETSEL:
226 TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL");
227 cr = (VOID *) lParam;
228 if (hwndEdit) SendMessageA( hwndEdit, 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;
232 case EM_EXLIMITTEXT:
234 DWORD limit = lParam;
235 TRACE_EDIT_MSG32("EM_EXLIMITTEXT");
236 if (limit > 65534)
238 limit = 0xFFFFFFFF;
240 return SendMessageA(hwndEdit,EM_SETLIMITTEXT,limit,0);
243 case EM_EXLINEFROMCHAR:
244 TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");
245 if (hwndEdit) return SendMessageA( hwndEdit, EM_LINEFROMCHAR, lParam, wParam);
246 return 0;
248 case EM_EXSETSEL:
249 TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");
250 cr = (VOID *) lParam;
251 if (hwndEdit) SendMessageA( hwndEdit, EM_SETSEL, cr->cpMin, cr->cpMax);
252 return 0;
254 case EM_FINDTEXT:
255 TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");
256 return 0;
258 case EM_FINDTEXTEX:
259 TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");
260 return 0;
262 case EM_FINDTEXTEXW:
263 TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");
264 return 0;
266 case EM_FINDTEXTW:
267 TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");
268 return 0;
270 case EM_FINDWORDBREAK:
271 TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");
272 return 0;
274 case EM_FORMATRANGE:
275 TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");
276 return 0;
278 case EM_GETAUTOURLDETECT:
279 TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");
280 return 0;
282 case EM_GETBIDIOPTIONS:
283 TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");
284 return 0;
286 case EM_GETCHARFORMAT:
287 TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");
288 return 0;
290 case EM_GETEDITSTYLE:
291 TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");
292 return 0;
294 case EM_GETEVENTMASK:
295 TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");
296 return 0;
298 case EM_GETIMECOLOR:
299 TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");
300 return 0;
302 case EM_GETIMECOMPMODE:
303 TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");
304 return 0;
306 case EM_GETIMEOPTIONS:
307 TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");
308 return 0;
310 case EM_GETLANGOPTIONS:
311 TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");
312 return 0;
314 case EM_GETOLEINTERFACE:
315 TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");
316 return 0;
318 case EM_GETOPTIONS:
319 TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");
320 return 0;
322 case EM_GETPARAFORMAT:
323 TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");
324 return 0;
326 case EM_GETPUNCTUATION:
327 TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");
328 return 0;
330 case EM_GETREDONAME:
331 TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");
332 return 0;
334 case EM_GETSCROLLPOS:
335 TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");
336 return 0;
338 case EM_GETSELTEXT:
339 TRACE_EDIT_MSG32("EM_GETSELTEXT");
340 return RICHEDIT_GetSelText(hwndEdit,(void *)lParam);
342 case EM_GETTEXTEX:
343 TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");
344 return 0;
346 case EM_GETTEXTLENGTHEX:
347 TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");
348 return 0;
350 case EM_GETTEXTMODE:
351 TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");
352 return 0;
354 case EM_GETTEXTRANGE:
355 TRACE_EDIT_MSG32("EM_GETTEXTRANGE");
356 return RICHEDIT_GetTextRange(hwndEdit,(TEXTRANGEA *)lParam);
358 case EM_GETTYPOGRAPHYOPTIONS:
359 TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");
360 return 0;
362 case EM_GETUNDONAME:
363 TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");
364 return 0;
366 case EM_GETWORDBREAKPROCEX:
367 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");
368 return 0;
370 case EM_GETWORDWRAPMODE:
371 TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");
372 return 0;
374 case EM_GETZOOM:
375 TRACE_EDIT_MSG32("EM_GETZOOM Ignored");
376 return 0;
378 case EM_HIDESELECTION:
379 TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");
380 return 0;
382 case EM_PASTESPECIAL:
383 TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");
384 return 0;
386 case EM_RECONVERSION:
387 TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");
388 return 0;
390 case EM_REDO:
391 TRACE_EDIT_MSG32("EM_REDO Ignored");
392 return 0;
394 case EM_REQUESTRESIZE:
395 TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");
396 return 0;
398 case EM_SELECTIONTYPE:
399 TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");
400 return 0;
402 case EM_SETBIDIOPTIONS:
403 TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");
404 return 0;
406 case EM_SETBKGNDCOLOR:
407 TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");
408 return 0;
410 case EM_SETCHARFORMAT:
411 TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");
412 return 0;
414 case EM_SETEDITSTYLE:
415 TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");
416 return 0;
418 case EM_SETEVENTMASK:
419 TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");
420 return 0;
422 case EM_SETFONTSIZE:
423 TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");
424 return 0;
426 case EM_SETIMECOLOR:
427 TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");
428 return 0;
430 case EM_SETIMEOPTIONS:
431 TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");
432 return 0;
434 case EM_SETLANGOPTIONS:
435 TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");
436 return 0;
438 case EM_SETOLECALLBACK:
439 TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");
440 return 0;
442 case EM_SETOPTIONS:
443 TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");
444 return 0;
446 case EM_SETPALETTE:
447 TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");
448 return 0;
450 case EM_SETPARAFORMAT:
451 TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");
452 return 0;
454 case EM_SETPUNCTUATION:
455 TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");
456 return 0;
458 case EM_SETSCROLLPOS:
459 TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");
460 return 0;
462 case EM_SETTARGETDEVICE:
463 TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");
464 return 0;
466 case EM_SETTEXTEX:
467 TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");
468 return 0;
470 case EM_SETTEXTMODE:
471 TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");
472 return 0;
474 case EM_SETTYPOGRAPHYOPTIONS:
475 TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");
476 return 0;
478 case EM_SETUNDOLIMIT:
479 TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");
480 return 0;
482 case EM_SETWORDBREAKPROCEX:
483 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");
484 return 0;
486 case EM_SETWORDWRAPMODE:
487 TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");
488 return 0;
490 case EM_SETZOOM:
491 TRACE_EDIT_MSG32("EM_SETZOOM Ignored");
492 return 0;
494 case EM_SHOWSCROLLBAR:
495 TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");
496 return 0;
498 case EM_STOPGROUPTYPING:
499 TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");
500 return 0;
502 case EM_STREAMOUT:
503 TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");
504 return 0;
506 /* Messages dispatched to the edit control */
507 case EM_CANUNDO:
508 TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");
509 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
510 case EM_CHARFROMPOS:
511 TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control");
512 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
513 case EM_EMPTYUNDOBUFFER:
514 TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control");
515 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
516 case EM_FMTLINES:
517 TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control");
518 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
519 case EM_GETFIRSTVISIBLELINE:
520 TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control");
521 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
522 case EM_GETHANDLE:
523 TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control");
524 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
525 /* case EM_GETIMESTATUS:*/
526 case EM_GETLIMITTEXT:
527 TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control");
528 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
529 case EM_GETLINE:
530 TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control");
531 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
532 case EM_GETLINECOUNT:
533 TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control");
534 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
535 case EM_GETMARGINS:
536 TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");
537 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
538 case EM_GETMODIFY:
539 TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control");
540 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
541 case EM_GETPASSWORDCHAR:
542 TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control");
543 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
544 case EM_GETRECT:
545 TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");
546 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
547 case EM_GETSEL:
548 TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");
549 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
550 case EM_GETTHUMB:
551 TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control");
552 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
553 case EM_GETWORDBREAKPROC:
554 TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control");
555 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
556 case EM_LINEFROMCHAR:
557 TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control");
558 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
559 case EM_LINEINDEX:
560 TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");
561 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
562 case EM_LINELENGTH:
563 TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");
564 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
565 case EM_LINESCROLL:
566 TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");
567 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
568 case EM_POSFROMCHAR:
569 TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");
570 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
571 case EM_REPLACESEL:
572 TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");
573 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
574 case EM_SCROLL:
575 TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");
576 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
577 case EM_SCROLLCARET:
578 TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control");
579 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
580 case EM_SETHANDLE:
581 TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control");
582 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
583 /* case EM_SETIMESTATUS:*/
584 case EM_SETLIMITTEXT:
585 TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control");
586 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
587 case EM_SETMARGINS:
588 TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");
589 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
590 case EM_SETMODIFY:
591 TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control");
592 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
593 case EM_SETPASSWORDCHAR:
594 TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control");
595 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
596 case EM_SETREADONLY:
597 TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");
598 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
599 case EM_SETRECT:
600 TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");
601 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
602 case EM_SETRECTNP:
603 TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");
604 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
605 case EM_SETSEL:
606 TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");
607 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
608 case EM_SETTABSTOPS:
609 TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control");
610 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
611 case EM_SETWORDBREAKPROC:
612 TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control");
613 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
614 case EM_UNDO:
615 TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");
616 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
618 case WM_STYLECHANGING:
619 TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control");
620 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
621 case WM_STYLECHANGED:
622 TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control");
623 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
624 case WM_GETTEXT:
625 TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control");
626 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
627 case WM_GETTEXTLENGTH:
628 TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control");
629 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
630 case WM_SETTEXT:
631 TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");
632 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
633 case WM_CUT:
634 TRACE_EDIT_MSG32("WM_CUT Passed to edit control");
635 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
636 case WM_COPY:
637 TRACE_EDIT_MSG32("WM_COPY Passed to edit control");
638 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
639 case WM_PASTE:
640 TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");
641 return SendMessageA( hwndEdit, uMsg, wParam, lParam);
643 /* Messages passed to default handler. */
644 case WM_NCCALCSIZE:
645 /* A fundamental problem with embedding an edit control within another
646 window to emulate the richedit control, is that normally, the
647 WM_NCCALCSIZE message window would return the client area of the
648 edit control.
650 While we could send a message to the edit control here to get that size
651 and return that value, this causes problems with the WM_SIZE message.
652 That is because the WM_SIZE message uses the returned value of
653 WM_NCCALCSIZE (via X11DRV_SetWindowSize) to determine the size to make
654 the edit control. If we return the size of the edit control client area
655 here, the result is the symptom of the edit control being inset on the
656 right and bottom by the width of any existing scrollbars.
658 The easy fix is to have WM_NCCALCSIZE return the true size of this
659 enclosing window, which is what we have done here. The more difficult
660 fix is to create a custom Richedit MoveWindow procedure for use in the
661 WM_SIZE message above. Since it is very unlikely that an app would call
662 and use the WM_NCCALCSIZE message, we stick with the easy fix for now.
664 TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");
665 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
666 case WM_NCPAINT:
667 TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");
668 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
669 case WM_PAINT:
670 TRACE_EDIT_MSG32("WM_PAINT Passed to default");
671 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
672 case WM_ERASEBKGND:
673 TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");
674 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
675 case WM_KILLFOCUS:
676 TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");
677 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
678 case WM_DESTROY:
679 TRACE_EDIT_MSG32("WM_DESTROY Passed to default");
680 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
681 case WM_CHILDACTIVATE:
682 TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default");
683 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
685 case WM_WINDOWPOSCHANGING:
686 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default");
687 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
688 case WM_WINDOWPOSCHANGED:
689 TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default");
690 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
691 /* case WM_INITIALUPDATE:
692 TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default");
693 return DefWindowProcA( hwnd,uMsg,wParam,lParam); */
694 case WM_CTLCOLOREDIT:
695 TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default");
696 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
697 case WM_SETCURSOR:
698 TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");
699 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
700 case WM_MOVE:
701 TRACE_EDIT_MSG32("WM_MOVE Passed to default");
702 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
703 case WM_SHOWWINDOW:
704 TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default");
705 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
706 case WM_PARENTNOTIFY:
707 TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default");
708 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
709 case WM_SETREDRAW:
710 TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");
711 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
712 case WM_NCDESTROY:
713 TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default");
714 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
715 case WM_NCHITTEST:
716 TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default");
717 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
718 case WM_CTLCOLORSTATIC:
719 TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default");
720 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
721 case WM_NCMOUSEMOVE:
722 TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");
723 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
724 case WM_CLEAR:
725 TRACE_EDIT_MSG32("WM_CLEAR Passed to default");
726 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
728 * used by IE in the EULA box
730 case WM_ALTTABACTIVE:
731 TRACE_EDIT_MSG32("WM_ALTTABACTIVE");
732 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
733 case WM_GETDLGCODE:
734 TRACE_EDIT_MSG32("WM_GETDLGCODE");
735 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
736 case WM_SETFONT:
737 TRACE_EDIT_MSG32("WM_SETFONT");
738 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
742 if ((uMsg >= WM_USER) && (uMsg < WM_APP)) {
743 FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n",
744 uMsg, hwnd, (UINT)wParam, (UINT)lParam);
747 return DefWindowProcA( hwnd,uMsg,wParam,lParam);
750 /***********************************************************************
751 * DllGetVersion [RICHED32.2]
753 * Retrieves version information of the 'RICHED32.DLL'
755 * PARAMS
756 * pdvi [O] pointer to version information structure.
758 * RETURNS
759 * Success: S_OK
760 * Failure: E_INVALIDARG
762 * NOTES
763 * Returns version of a comctl32.dll from IE4.01 SP1.
766 HRESULT WINAPI
767 RICHED32_DllGetVersion (DLLVERSIONINFO *pdvi)
769 TRACE("\n");
771 if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {
773 return E_INVALIDARG;
776 pdvi->dwMajorVersion = 4;
777 pdvi->dwMinorVersion = 0;
778 pdvi->dwBuildNumber = 0;
779 pdvi->dwPlatformID = 0;
781 return S_OK;
784 /***
785 * DESCRIPTION:
786 * Registers the window class.
788 * PARAMETER(S):
789 * None
791 * RETURN:
792 * None
794 VOID RICHED32_Register(void)
796 WNDCLASSA wndClass;
798 TRACE("\n");
800 ZeroMemory(&wndClass, sizeof(WNDCLASSA));
801 wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
802 wndClass.lpfnWndProc = (WNDPROC)RICHED32_WindowProc;
803 wndClass.cbClsExtra = 0;
804 wndClass.cbWndExtra = 0; /*(sizeof(RICHED32_INFO *);*/
805 wndClass.hCursor = LoadCursorA(0, IDC_ARROWA);
806 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
807 wndClass.lpszClassName = RICHEDIT_CLASS10A; /* WC_RICHED32A; */
809 RegisterClassA (&wndClass);
812 /***
813 * DESCRIPTION:
814 * Unregisters the window class.
816 * PARAMETER(S):
817 * None
819 * RETURN:
820 * None
822 VOID RICHED32_Unregister(void)
824 TRACE("\n");
826 UnregisterClassA(RICHEDIT_CLASS10A, NULL);
829 INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr)
831 UINT alloc_size, text_size, range_size;
832 char *text;
834 TRACE("start: 0x%x stop: 0x%x\n",(INT)tr->chrg.cpMin,(INT)tr->chrg.cpMax);
836 if (!(alloc_size = SendMessageA(hwnd,WM_GETTEXTLENGTH,0,0))) return FALSE;
837 if (!(text = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (alloc_size+1))))
838 return FALSE;
839 text_size = SendMessageA(hwnd,WM_GETTEXT,alloc_size,(INT)text);
841 if (text_size > tr->chrg.cpMin)
843 range_size = (text_size> tr->chrg.cpMax) ? (tr->chrg.cpMax - tr->chrg.cpMin) : (text_size - tr->chrg.cpMin);
844 TRACE("EditText: %.30s ...\n",text+tr->chrg.cpMin);
845 memcpy(tr->lpstrText,text+tr->chrg.cpMin,range_size);
847 else range_size = 0;
848 HeapFree(GetProcessHeap(), 0, text);
850 return range_size;
853 INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer)
855 TEXTRANGEA textrange;
857 textrange.lpstrText = lpstrBuffer;
858 SendMessageA(hwnd,EM_GETSEL,(INT)&textrange.chrg.cpMin,(INT)&textrange.chrg.cpMax);
859 return RICHEDIT_GetTextRange(hwnd,&textrange);