Sync to Wine-20050830:
[reactos.git] / reactos / lib / richedit / richedit.c
index 648c7be..155d4d8 100644 (file)
-/*\r
- * RichEdit32  functions\r
- *\r
- * This module is a simple wrapper for the edit controls.\r
- * At the point, it is good only for application who use the RICHEDIT\r
- * control to display RTF text.\r
- *\r
- * Copyright 2000 by Jean-Claude Batista\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Lesser General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2.1 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
- * Lesser General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Lesser General Public\r
- * License along with this library; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
- */\r
-\r
-#include <stdarg.h>\r
-#include <string.h>\r
-#include "windef.h"\r
-#include "winbase.h"\r
-#include "wingdi.h"\r
-#include "winreg.h"\r
-#include "winerror.h"\r
-#include "riched32.h"\r
-#include "richedit.h"\r
-#define NO_SHLWAPI_STREAM\r
-#include "shlwapi.h"\r
-\r
-#include "rtf.h"\r
-#include "rtf2text.h"\r
-#include "wine/debug.h"\r
-\r
-#define ID_EDIT      1\r
-\r
-WINE_DEFAULT_DEBUG_CHANNEL(richedit);\r
-\r
-HANDLE RICHED32_hHeap = NULL;\r
-/* LPSTR  RICHED32_aSubclass = NULL; */\r
-static WNDPROC lpfnEditWndProc = NULL;\r
-static INT RTFInfoOffset = 0;\r
-\r
-#define TRACE_EDIT_MSG32(str) \\r
-        TRACE(\\r
-                     "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\\r
-                     , \\r
-                     hwnd, (UINT)wParam, (UINT)lParam)\r
-\r
-LPVOID* WINAPI CreateIRichEditOle();\r
-VOID RICHEDIT_InitEditControlInfo(void);\r
-\r
-/***********************************************************************\r
- * DllMain [Internal] Initializes the internal 'RICHED32.DLL'.\r
- *\r
- * PARAMS\r
- *     hinstDLL    [I] handle to the DLL's instance\r
- *     fdwReason   [I]\r
- *     lpvReserved [I] reserved, must be NULL\r
- *\r
- * RETURNS\r
- *     Success: TRUE\r
- *     Failure: FALSE\r
- */\r
-\r
-BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)\r
-{\r
-    TRACE("\n");\r
-    switch (fdwReason)\r
-    {\r
-    case DLL_PROCESS_ATTACH:\r
-        DisableThreadLibraryCalls(hinstDLL);\r
-        /* create private heap */\r
-        RICHED32_hHeap = HeapCreate (0, 0x10000, 0);\r
-        /* Retrieve edit control class info */\r
-        RICHEDIT_InitEditControlInfo();\r
-        /* register the Rich Edit class */\r
-        RICHED32_Register ();\r
-        break;\r
-\r
-    case DLL_PROCESS_DETACH:\r
-        /* unregister all common control classes */\r
-        RICHED32_Unregister ();\r
-        HeapDestroy (RICHED32_hHeap);\r
-        RICHED32_hHeap = NULL;\r
-        break;\r
-    }\r
-    return TRUE;\r
-}\r
-\r
-/* Support routines for window procedure */\r
-   INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr);\r
-   INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer);\r
-\r
-typedef struct _RTFControl_info\r
-{\r
-    HWND hwndParent;\r
-    char* rtfBuffer;\r
-    RTF_Info *parser;\r
-} RTFControl_Info;\r
-\r
-/*\r
- *\r
- * DESCRIPTION:\r
- * Window procedure of the RichEdit control.\r
- *\r
- */\r
-static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,\r
-                                   LPARAM lParam)\r
-{\r
-    LONG newstyle = 0;\r
-    LONG style = 0;\r
-    RTFControl_Info *info;\r
-    CHARRANGE *cr;\r
-\r
-    info = (RTFControl_Info *) GetWindowLongW( hwnd, RTFInfoOffset );\r
-\r
-    TRACE("uMsg: 0x%x hwnd: %p\n",uMsg,hwnd);\r
-\r
-    switch (uMsg)\r
-    {\r
-\r
-    case WM_CREATE:\r
-            TRACE_EDIT_MSG32("WM_CREATE Passed to default");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-        \r
-    case WM_NCCREATE :\r
-           TRACE_EDIT_MSG32("WM_NCCREATE");\r
-\r
-            info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,\r
-                              sizeof (RTFControl_Info));\r
-            info->parser = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,\r
-                              sizeof (RTF_Info));\r
-            SetWindowLongW( hwnd, RTFInfoOffset, (LONG)info );\r
-\r
-           /* remove SCROLLBARS from the current window style */\r
-           info->hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent;\r
-\r
-           newstyle = style = ((LPCREATESTRUCTA) lParam)->style;\r
-            newstyle &= ~WS_HSCROLL;\r
-            newstyle &= ~WS_VSCROLL;\r
-            newstyle &= ~ES_AUTOHSCROLL;\r
-            newstyle &= ~ES_AUTOVSCROLL;\r
-           SetWindowLongA(hwnd,GWL_STYLE, newstyle);\r
-\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-\r
-    case WM_SETFOCUS :\r
-           TRACE_EDIT_MSG32("WM_SETFOCUS");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-\r
-    case WM_SIZE :\r
-            TRACE_EDIT_MSG32("WM_SIZE");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-\r
-    case WM_COMMAND :\r
-        TRACE_EDIT_MSG32("WM_COMMAND");\r
-       switch(HIWORD(wParam)) {\r
-               case EN_CHANGE:\r
-               case EN_HSCROLL:\r
-               case EN_KILLFOCUS:\r
-               case EN_SETFOCUS:\r
-               case EN_UPDATE:\r
-               case EN_VSCROLL:\r
-                       return SendMessageA(info->hwndParent, WM_COMMAND,\r
-                               wParam, (LPARAM)(hwnd));\r
-\r
-               case EN_ERRSPACE:\r
-               case EN_MAXTEXT:\r
-                       MessageBoxA (hwnd, "RichEdit control out of space.",\r
-                                  "ERROR", MB_OK | MB_ICONSTOP) ;\r
-                       return 0 ;\r
-               }\r
-\r
-    case EM_STREAMIN:\r
-            TRACE_EDIT_MSG32("EM_STREAMIN");\r
-\r
-           /* setup the RTF parser */\r
-           RTFSetEditStream(info->parser,( EDITSTREAM*)lParam);\r
-           info->parser->rtfFormat = wParam&(SF_TEXT|SF_RTF);\r
-           info->parser->hwndEdit = hwnd;\r
-           WriterInit(info->parser);\r
-           RTFInit (info->parser);\r
-           BeginFile(info->parser);\r
-\r
-           /* do the parsing */\r
-           RTFRead (info->parser);\r
-            RTFFlushOutputBuffer( info->parser );\r
-\r
-            /* put the cursor at the top */\r
-            SendMessageA( hwnd, EM_SETSEL, 0, 0 );\r
-\r
-            return 0;\r
-\r
-/* Messages specific to Richedit controls */\r
-\r
-    case EM_AUTOURLDETECT:\r
-            TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored");\r
-           return 0;\r
-\r
-    case EM_CANPASTE:\r
-            TRACE_EDIT_MSG32("EM_CANPASTE Ignored");\r
-           return 0;\r
-\r
-    case EM_CANREDO:\r
-            TRACE_EDIT_MSG32("EM_CANREDO Ignored");\r
-           return 0;\r
-\r
-    case EM_DISPLAYBAND:\r
-            TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored");\r
-           return 0;\r
-\r
-    case EM_EXGETSEL:\r
-            TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL");\r
-            cr = (VOID *) lParam;\r
-            CallWindowProcA(lpfnEditWndProc, hwnd, EM_GETSEL, (INT)&cr->cpMin, (INT)&cr->cpMax);\r
-            TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT)cr->cpMin,(INT)cr->cpMax);\r
-            return 0;\r
-\r
-    case EM_EXLIMITTEXT:\r
-        {\r
-           DWORD limit = lParam;\r
-           TRACE_EDIT_MSG32("EM_EXLIMITTEXT");\r
-           if (limit > 65534)\r
-           {\r
-                limit = 0xFFFFFFFF;\r
-           }\r
-           return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETLIMITTEXT, limit, 0);\r
-        }\r
-\r
-    case EM_EXLINEFROMCHAR:\r
-            TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, EM_LINEFROMCHAR, lParam, wParam);\r
-\r
-    case EM_EXSETSEL:\r
-            TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL");\r
-            cr = (VOID *) lParam;\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETSEL, cr->cpMin, cr->cpMax);\r
-\r
-    case EM_FINDTEXT:\r
-            TRACE_EDIT_MSG32("EM_FINDTEXT Ignored");\r
-            return 0;\r
-\r
-    case EM_FINDTEXTEX:\r
-            TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored");\r
-            return 0;\r
-\r
-    case EM_FINDTEXTEXW:\r
-            TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored");\r
-            return 0;\r
-\r
-    case EM_FINDTEXTW:\r
-            TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored");\r
-            return 0;\r
-\r
-    case EM_FINDWORDBREAK:\r
-            TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored");\r
-            return 0;\r
-\r
-    case EM_FORMATRANGE:\r
-            TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored");\r
-            return 0;\r
-\r
-    case EM_GETAUTOURLDETECT:\r
-            TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored");\r
-            return 0;\r
-\r
-    case EM_GETBIDIOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_GETCHARFORMAT:\r
-            TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored");\r
-            return 0;\r
-\r
-    case EM_GETEDITSTYLE:\r
-            TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored");\r
-            return 0;\r
-\r
-    case EM_GETEVENTMASK:\r
-            TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored");\r
-            return 0;\r
-\r
-    case EM_GETIMECOLOR:\r
-            TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored");\r
-            return 0;\r
-\r
-    case EM_GETIMECOMPMODE:\r
-            TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored");\r
-            return 0;\r
-\r
-    case EM_GETIMEOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_GETLANGOPTIONS:\r
-            TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS");\r
-            return 0;\r
-\r
-    case EM_GETOLEINTERFACE:\r
-            TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored");\r
-            return 0;\r
-\r
-    case EM_GETOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_GETPARAFORMAT:\r
-            TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored");\r
-            return 0;\r
-\r
-    case EM_GETPUNCTUATION:\r
-            TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored");\r
-            return 0;\r
-\r
-    case EM_GETREDONAME:\r
-            TRACE_EDIT_MSG32("EM_GETREDONAME Ignored");\r
-            return 0;\r
-\r
-    case EM_GETSCROLLPOS:\r
-            TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored");\r
-            return 0;\r
-\r
-    case EM_GETSELTEXT:\r
-            TRACE_EDIT_MSG32("EM_GETSELTEXT");\r
-            return RICHEDIT_GetSelText(hwnd,(void *)lParam);\r
-\r
-    case EM_GETTEXTEX:\r
-            TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored");\r
-            return 0;\r
-\r
-    case EM_GETTEXTLENGTHEX:\r
-            TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored");\r
-            return 0;\r
-\r
-    case EM_GETTEXTMODE:\r
-            TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored");\r
-            return 0;\r
-\r
-    case EM_GETTEXTRANGE:\r
-            TRACE_EDIT_MSG32("EM_GETTEXTRANGE");\r
-            return RICHEDIT_GetTextRange(hwnd,(TEXTRANGEA *)lParam);\r
-\r
-    case EM_GETTYPOGRAPHYOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_GETUNDONAME:\r
-            TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored");\r
-            return 0;\r
-\r
-    case EM_GETWORDBREAKPROCEX:\r
-            TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored");\r
-            return 0;\r
-\r
-    case EM_GETWORDWRAPMODE:\r
-            TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored");\r
-            return 0;\r
-\r
-    case EM_GETZOOM:\r
-            TRACE_EDIT_MSG32("EM_GETZOOM Ignored");\r
-            return 0;\r
-\r
-    case EM_HIDESELECTION:\r
-            TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored");\r
-            return 0;\r
-\r
-    case EM_PASTESPECIAL:\r
-            TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored");\r
-            return 0;\r
-\r
-    case EM_RECONVERSION:\r
-            TRACE_EDIT_MSG32("EM_RECONVERSION Ignored");\r
-            return 0;\r
-\r
-    case EM_REDO:\r
-            TRACE_EDIT_MSG32("EM_REDO Ignored");\r
-            return 0;\r
-\r
-    case EM_REQUESTRESIZE:\r
-            TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored");\r
-            return 0;\r
-\r
-    case EM_SELECTIONTYPE:\r
-            TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored");\r
-            return 0;\r
-\r
-    case EM_SETBIDIOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_SETBKGNDCOLOR:\r
-            TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored");\r
-            return 0;\r
-\r
-    case EM_SETCHARFORMAT:\r
-            TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored");\r
-            return 0;\r
-\r
-    case EM_SETEDITSTYLE:\r
-            TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored");\r
-            return 0;\r
-\r
-    case EM_SETEVENTMASK:\r
-            TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored");\r
-            return 0;\r
-\r
-    case EM_SETFONTSIZE:\r
-            TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored");\r
-            return 0;\r
-\r
-    case EM_SETIMECOLOR:\r
-            TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored");\r
-            return 0;\r
-\r
-    case EM_SETIMEOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_SETLANGOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_SETOLECALLBACK:\r
-            TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored");\r
-            return 0;\r
-\r
-    case EM_SETOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_SETPALETTE:\r
-            TRACE_EDIT_MSG32("EM_SETPALETTE Ignored");\r
-            return 0;\r
-\r
-    case EM_SETPARAFORMAT:\r
-            TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored");\r
-            return 0;\r
-\r
-    case EM_SETPUNCTUATION:\r
-            TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored");\r
-            return 0;\r
-\r
-    case EM_SETSCROLLPOS:\r
-            TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored");\r
-            return 0;\r
-\r
-    case EM_SETTARGETDEVICE:\r
-            TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored");\r
-            return 0;\r
-\r
-    case EM_SETTEXTEX:\r
-            TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored");\r
-            return 0;\r
-\r
-    case EM_SETTEXTMODE:\r
-            TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored");\r
-            return 0;\r
-\r
-    case EM_SETTYPOGRAPHYOPTIONS:\r
-            TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored");\r
-            return 0;\r
-\r
-    case EM_SETUNDOLIMIT:\r
-            TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored");\r
-            return 0;\r
-\r
-    case EM_SETWORDBREAKPROCEX:\r
-            TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored");\r
-            return 0;\r
-\r
-    case EM_SETWORDWRAPMODE:\r
-            TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored");\r
-            return 0;\r
-\r
-    case EM_SETZOOM:\r
-            TRACE_EDIT_MSG32("EM_SETZOOM Ignored");\r
-            return 0;\r
-\r
-    case EM_SHOWSCROLLBAR:\r
-            TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored");\r
-            return 0;\r
-\r
-    case EM_STOPGROUPTYPING:\r
-            TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored");\r
-            return 0;\r
-\r
-    case EM_STREAMOUT:\r
-            TRACE_EDIT_MSG32("EM_STREAMOUT Ignored");\r
-            return 0;\r
-\r
-/* Messages dispatched to the edit control */\r
-     case EM_CANUNDO:\r
-            TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_CHARFROMPOS:\r
-            TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_EMPTYUNDOBUFFER:\r
-            TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_FMTLINES:\r
-            TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETFIRSTVISIBLELINE:\r
-            TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETHANDLE:\r
-            TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
- /*    case EM_GETIMESTATUS:*/\r
-     case EM_GETLIMITTEXT:\r
-            TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETLINE:\r
-            TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETLINECOUNT:\r
-            TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETMARGINS:\r
-            TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETMODIFY:\r
-            TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETPASSWORDCHAR:\r
-            TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETRECT:\r
-            TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETSEL:\r
-            TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETTHUMB:\r
-            TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_GETWORDBREAKPROC:\r
-            TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_LINEFROMCHAR:\r
-            TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_LINEINDEX:\r
-            TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_LINELENGTH:\r
-            TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_LINESCROLL:\r
-            TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_POSFROMCHAR:\r
-            TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_REPLACESEL:\r
-            TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SCROLL:\r
-            TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SCROLLCARET:\r
-     case WM_USER+49:  /* EM_SCROLLCARET too */\r
-            TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SCROLLCARET, wParam, lParam);\r
-     case EM_SETHANDLE:\r
-            TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
- /*    case EM_SETIMESTATUS:*/\r
-     case EM_SETLIMITTEXT:\r
-            TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETMARGINS:\r
-            TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETMODIFY:\r
-            TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETPASSWORDCHAR:\r
-            TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETREADONLY:\r
-            TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETRECT:\r
-            TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETRECTNP:\r
-            TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETSEL:\r
-            TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETTABSTOPS:\r
-            TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_SETWORDBREAKPROC:\r
-            TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case EM_UNDO:\r
-            TRACE_EDIT_MSG32("EM_UNDO Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-\r
-     case WM_STYLECHANGING:\r
-            TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case WM_STYLECHANGED:\r
-            TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case WM_GETTEXT:\r
-            TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case WM_GETTEXTLENGTH:\r
-            TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case WM_SETTEXT:\r
-            TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case WM_CUT:\r
-            TRACE_EDIT_MSG32("WM_CUT Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-     case WM_COPY:\r
-            TRACE_EDIT_MSG32("WM_COPY Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_PASTE:\r
-            TRACE_EDIT_MSG32("WM_PASTE Passed to edit control");\r
-            return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-\r
-    /* Messages passed to default handler. */\r
-    case WM_NCCALCSIZE:\r
-        TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_NCPAINT:\r
-        TRACE_EDIT_MSG32("WM_NCPAINT Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_PAINT:\r
-        TRACE_EDIT_MSG32("WM_PAINT Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_ERASEBKGND:\r
-        TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_KILLFOCUS:\r
-        TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_DESTROY:\r
-        TRACE_EDIT_MSG32("WM_DESTROY Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_CHILDACTIVATE:\r
-       TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-\r
-    case WM_WINDOWPOSCHANGING:\r
-        TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_WINDOWPOSCHANGED:\r
-        TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-/*    case WM_INITIALUPDATE:\r
-        TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default");\r
-        return DefWindowProcA( hwnd,uMsg,wParam,lParam); */\r
-    case WM_CTLCOLOREDIT:\r
-        TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_SETCURSOR:\r
-        TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_MOVE:\r
-        TRACE_EDIT_MSG32("WM_MOVE Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_SHOWWINDOW:\r
-        TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_PARENTNOTIFY:\r
-        TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_SETREDRAW:\r
-        TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_NCDESTROY:\r
-    {\r
-        TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default");\r
-        HeapFree( GetProcessHeap(), 0, info->parser );\r
-        HeapFree( GetProcessHeap(), 0, info );\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    }\r
-\r
-    case WM_NCHITTEST:\r
-        TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_CTLCOLORSTATIC:\r
-        TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_NCMOUSEMOVE:\r
-        TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_CLEAR:\r
-        TRACE_EDIT_MSG32("WM_CLEAR Passed to default");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-   /*\r
-    * used by IE in the EULA box\r
-    */\r
-    case WM_ALTTABACTIVE:\r
-        TRACE_EDIT_MSG32("WM_ALTTABACTIVE");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_GETDLGCODE:\r
-        TRACE_EDIT_MSG32("WM_GETDLGCODE");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-    case WM_SETFONT:\r
-        TRACE_EDIT_MSG32("WM_SETFONT");\r
-        return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-\r
-    }\r
-\r
-    if ((uMsg >= WM_USER) && (uMsg < WM_APP)) {\r
-       FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n",\r
-              uMsg, hwnd, (UINT)wParam, (UINT)lParam);\r
-    }\r
-\r
-   return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam);\r
-}\r
-\r
-/***********************************************************************\r
- * DllGetVersion [RICHED32.2]\r
- *\r
- * Retrieves version information of the 'RICHED32.DLL'\r
- *\r
- * PARAMS\r
- *     pdvi [O] pointer to version information structure.\r
- *\r
- * RETURNS\r
- *     Success: S_OK\r
- *     Failure: E_INVALIDARG\r
- *\r
- * NOTES\r
- *     Returns version of a comctl32.dll from IE4.01 SP1.\r
- */\r
-\r
-HRESULT WINAPI\r
-RICHED32_DllGetVersion (DLLVERSIONINFO *pdvi)\r
-{\r
-    TRACE("\n");\r
-\r
-    if (pdvi->cbSize != sizeof(DLLVERSIONINFO)) {\r
-\r
-       return E_INVALIDARG;\r
-    }\r
-\r
-    pdvi->dwMajorVersion = 4;\r
-    pdvi->dwMinorVersion = 0;\r
-    pdvi->dwBuildNumber = 0;\r
-    pdvi->dwPlatformID = 0;\r
-\r
-    return S_OK;\r
-}\r
-\r
-/***\r
- * DESCRIPTION:\r
- * Registers the window class.\r
- *\r
- * PARAMETER(S):\r
- * None\r
- *\r
- * RETURN:\r
- * None\r
- */\r
-VOID RICHED32_Register(void)\r
-{\r
-    WNDCLASSA wndClass;\r
-\r
-    TRACE("\n");\r
-\r
-    ZeroMemory(&wndClass, sizeof(WNDCLASSA));\r
-    wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;\r
-    wndClass.lpfnWndProc = RICHED32_WindowProc;\r
-    wndClass.cbClsExtra = 0;\r
-    wndClass.cbWndExtra = RTFInfoOffset + sizeof(RTFControl_Info*);\r
-    wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);\r
-    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);\r
-    wndClass.lpszClassName = RICHEDIT_CLASS10A; /* WC_RICHED32A; */\r
-\r
-    RegisterClassA (&wndClass);\r
-}\r
-\r
-/***\r
- * DESCRIPTION:\r
- * Unregisters the window class.\r
- *\r
- * PARAMETER(S):\r
- * None\r
- *\r
- * RETURN:\r
- * None\r
- */\r
-VOID RICHED32_Unregister(void)\r
-{\r
-    TRACE("\n");\r
-\r
-    UnregisterClassA(RICHEDIT_CLASS10A, NULL);\r
-}\r
-\r
-\r
-/***\r
- * DESCRIPTION:\r
- * Initialize edit control class info\r
- */\r
-VOID RICHEDIT_InitEditControlInfo(void)\r
-{\r
-    WNDCLASSA wcEdit;\r
-\r
-    if (GetClassInfoA(0, "edit",  &wcEdit))\r
-    {\r
-        lpfnEditWndProc = wcEdit.lpfnWndProc;\r
-        RTFInfoOffset = wcEdit.cbWndExtra;\r
-    }\r
-    else\r
-        ERR("Failed to retrieve edit control class info\n");\r
-}\r
-\r
-\r
-INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr)\r
-{\r
-    UINT alloc_size, text_size, range_size;\r
-    char *text;\r
-\r
-    TRACE("start: 0x%x stop: 0x%x\n",(INT)tr->chrg.cpMin,(INT)tr->chrg.cpMax);\r
-\r
-    if (!(alloc_size = SendMessageA(hwnd,WM_GETTEXTLENGTH,0,0))) return FALSE;\r
-    if (!(text = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (alloc_size+1))))\r
-               return FALSE;\r
-    text_size = SendMessageA(hwnd,WM_GETTEXT,alloc_size,(INT)text);\r
-\r
-    if (text_size > tr->chrg.cpMin)\r
-    {\r
-       range_size = (text_size> tr->chrg.cpMax) ? (tr->chrg.cpMax - tr->chrg.cpMin) : (text_size - tr->chrg.cpMin);\r
-       TRACE("EditText: %.30s ...\n",text+tr->chrg.cpMin);\r
-       memcpy(tr->lpstrText,text+tr->chrg.cpMin,range_size);\r
-    }\r
-    else range_size = 0;\r
-    HeapFree(GetProcessHeap(), 0, text);\r
-\r
-    return range_size;\r
-}\r
-\r
-INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer)\r
-{\r
-    TEXTRANGEA textrange;\r
-\r
-    textrange.lpstrText = lpstrBuffer;\r
-    SendMessageA(hwnd,EM_GETSEL,(INT)&textrange.chrg.cpMin,(INT)&textrange.chrg.cpMax);\r
-    return RICHEDIT_GetTextRange(hwnd,&textrange);\r
-}\r
+/*
+ * RichEdit32  functions
+ *
+ * This module is a simple wrapper for the RichEdit 2.0 control
+ *
+ * Copyright 2000 by Jean-Claude Batista
+ * Copyright 2005 Mike McCormack
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include <string.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winreg.h"
+#include "winerror.h"
+#include "winuser.h"
+#include "richedit.h"
+#include "shlwapi.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(richedit);
+
+/* Window procedure of the RichEdit 1.0 control in riched20.dll */
+extern LRESULT WINAPI RichEdit10ANSIWndProc(HWND, UINT, WPARAM, LPARAM);
+
+
+/* Unregisters the window class. */
+static BOOL RICHED32_Unregister(void)
+{
+    TRACE("\n");
+
+    UnregisterClassA(RICHEDIT_CLASS10A, NULL);
+    return TRUE;
+}
+
+
+/* Registers the window class. */
+static BOOL RICHED32_Register(void)
+{
+    WNDCLASSA wndClass;
+
+    ZeroMemory(&wndClass, sizeof(WNDCLASSA));
+    wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
+    wndClass.lpfnWndProc = RichEdit10ANSIWndProc;
+    wndClass.cbClsExtra = 0;
+    wndClass.cbWndExtra = 4;
+    wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);
+    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
+    wndClass.lpszClassName = RICHEDIT_CLASS10A; /* WC_RICHED32A; */
+
+    RegisterClassA(&wndClass);
+
+    return TRUE;
+}
+
+/* Initialization function */
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+    TRACE("\n");
+    switch (fdwReason)
+    {
+    case DLL_PROCESS_ATTACH:
+        DisableThreadLibraryCalls(hinstDLL);
+        return RICHED32_Register();
+
+    case DLL_PROCESS_DETACH:
+        return RICHED32_Unregister();
+    }
+    return TRUE;
+}
+
+/***********************************************************************
+ * DllGetVersion [RICHED32.2]
+ *
+ * Retrieves version information
+ */
+HRESULT WINAPI DllGetVersion (DLLVERSIONINFO *pdvi)
+{
+    TRACE("\n");
+
+    if (pdvi->cbSize != sizeof(DLLVERSIONINFO))
+       return E_INVALIDARG;
+
+    pdvi->dwMajorVersion = 4;
+    pdvi->dwMinorVersion = 0;
+    pdvi->dwBuildNumber = 0;
+    pdvi->dwPlatformID = 0;
+
+    return S_OK;
+}