/*
 * RichEdit32  functions
 *
 * This module is a simple wrapper for the edit controls.
 * At the point, it is good only for application who use the RICHEDIT
 * control to display RTF text.
 *
 * Copyright 2000 by Jean-Claude Batista
 *
 */

#include <string.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winreg.h"
#include "winerror.h"
#include "riched32.h"
#include "richedit.h"
#include "charlist.h"
#define NO_SHLWAPI_STREAM
#include "shlwapi.h"

#include "rtf.h"
#include "rtf2text.h"
#include "wine/debug.h"

/* Needed for edit->richedit scroll bar replication */
#include "win.h"
typedef struct
{
    INT   CurVal;   /* Current scroll-bar value */
    INT   MinVal;   /* Minimum scroll-bar value */
    INT   MaxVal;   /* Maximum scroll-bar value */
    INT   Page;     /* Page size of scroll bar (Win32) */
    UINT  flags;    /* EnableScrollBar flags */
} SCROLLBAR_INFO;
/* END: needed for scroll bar replication stuff */


#define ID_EDIT      1

WINE_DEFAULT_DEBUG_CHANNEL(richedit);

HANDLE RICHED32_hHeap = (HANDLE)NULL;
/* LPSTR  RICHED32_aSubclass = (LPSTR)NULL; */

#define DPRINTF_EDIT_MSG32(str) \
        TRACE(\
                     "32 bit : " str ": hwnd=%08x, wParam=%08x, lParam=%08x\n"\
                     , \
                     hwnd, (UINT)wParam, (UINT)lParam)


/***********************************************************************
 * RICHED32_LibMain [Internal] Initializes the internal 'RICHED32.DLL'.
 *
 * PARAMS
 *     hinstDLL    [I] handle to the DLL's instance
 *     fdwReason   [I]
 *     lpvReserved [I] reserved, must be NULL
 *
 * RETURNS
 *     Success: TRUE
 *     Failure: FALSE
 */

BOOL WINAPI
RICHED32_LibMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    TRACE("\n");
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        /* create private heap */
        RICHED32_hHeap = HeapCreate (0, 0x10000, 0);
        /* register the Rich Edit class */
        RICHED32_Register ();
        break;

    case DLL_PROCESS_DETACH:
        /* unregister all common control classes */
        RICHED32_Unregister ();
        HeapDestroy (RICHED32_hHeap);
        RICHED32_hHeap = (HANDLE)NULL;
        break;
    }
    return TRUE;
}

/*
 *
 * DESCRIPTION:
 * Window procedure of the RichEdit control.
 *
 */
static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                                   LPARAM lParam)
{
    int RTFToBuffer(char* pBuffer, int nBufferSize);
    LONG newstyle = 0;
    LONG style = 0;

    static HWND hwndEdit;
    static HWND hwndParent;
    static char* rtfBuffer;
    int rtfBufferSize;

    TRACE("\n");

    switch (uMsg)
    {

    case WM_CREATE :
	    DPRINTF_EDIT_MSG32("WM_CREATE");

	    /* remove SCROLLBARS from the current window style */
	    hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent;

	    newstyle = style = ((LPCREATESTRUCTA) lParam)->style;
            newstyle &= ~WS_HSCROLL;
            newstyle &= ~WS_VSCROLL;
            newstyle &= ~ES_AUTOHSCROLL;
            newstyle &= ~ES_AUTOVSCROLL;

            hwndEdit = CreateWindowA ("edit", ((LPCREATESTRUCTA) lParam)->lpszName,
                                   style, 0, 0, 0, 0,
                                   hwnd, (HMENU) ID_EDIT,
                                   ((LPCREATESTRUCTA) lParam)->hInstance, NULL) ;

	    SetWindowLongA(hwnd,GWL_STYLE, newstyle);
            return 0 ;

    case WM_SETFOCUS :
	    DPRINTF_EDIT_MSG32("WM_SETFOCUS");
            SetFocus (hwndEdit) ;
            return 0 ;

    case WM_SIZE :
            DPRINTF_EDIT_MSG32("WM_SIZE");
            MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE) ;
            return 0 ;

    case WM_COMMAND :
        DPRINTF_EDIT_MSG32("WM_COMMAND");
	switch(HIWORD(wParam)) {
		case EN_VSCROLL:
                {  
                   /* Basically, we need to send ourselves a WM_VSCROLL message, as 
                      there is a game that actually sets up its own wndproc to determine
                      if you have scrolled to the bottom of the EULA or not. 

                      Also, they get the scrollinfo from richedit, even though that gets
                      updated inside the edit control - need to replicate the information
                   */
                   WND *wndPtr = WIN_FindWndPtr( hwndEdit );
                   SCROLLINFO scrolltemp;

                   /* Get the scrollbar info from the edit control */
                   if (!wndPtr)
                   {
                      ERR("Unable to obtain WND for edit control\n");
                      return 0;
                   }

                   if (wndPtr->pVScroll)
                   {
                      memcpy(&scrolltemp, wndPtr->pVScroll, sizeof(SCROLLINFO));
                   }
                   else
                   {
                       WIN_ReleaseWndPtr( wndPtr );
                       /* Send the scroll message anyway.. */
                       SendMessageA(hwnd, WM_VSCROLL, 1, 0);
                       return 0;
                   }
                   WIN_ReleaseWndPtr( wndPtr );
                    
                   /* Do the swap to the richedit control */
                   wndPtr = WIN_FindWndPtr(hwnd);
                   if (!wndPtr)
                   {
                      ERR("Unable to obtain WND for richedit control\n");
                      return 0;
                   }

                   if (wndPtr->pVScroll)
                   {
                       memcpy(wndPtr->pVScroll, &scrolltemp, sizeof(SCROLLINFO));
                   }
                   else
                   {
                       WIN_ReleaseWndPtr( wndPtr );
                       /* Send the scroll message anyway.. */
                       SendMessageA(hwnd, WM_VSCROLL, 1, 0);
                       return 0;
                   }
                   WIN_ReleaseWndPtr( wndPtr );

                   SendMessageA(hwnd, WM_VSCROLL, 1, 0);
                   return 0;
                }



		case EN_HSCROLL:
                {  
                   /* Basically, we need to send ourselves a WM_HSCROLL message, as 
                      there is a game that actually sets up its own wndproc to determine
                      if you have scrolled to the bottom of the EULA or not. 

                      Also, they get the scrollinfo from richedit, even though that gets
                      updated inside the edit control - need to replicate the information
                   */
                   WND *wndPtr = WIN_FindWndPtr( hwndEdit );
                   SCROLLINFO scrolltemp;

                   /* Get the scrollbar info from the edit control */
                   if (!wndPtr)
                   {
                      ERR("Unable to obtain WND for edit control\n");
                      return 0;
                   }

                   if (wndPtr->pHScroll)
                   {
                      memcpy(&scrolltemp, wndPtr->pHScroll, sizeof(SCROLLINFO));
                   }
                   else
                   {
                       WIN_ReleaseWndPtr( wndPtr );
                       /* Send scroll message anyway */
                       SendMessageA(hwnd, WM_HSCROLL, 1, 0);
                       return 0;
                   }
                   WIN_ReleaseWndPtr( wndPtr );
                    
                   /* Do the swap to the richedit control */
                   wndPtr = WIN_FindWndPtr(hwnd);
                   if (!wndPtr)
                   {
                       ERR("Unable to obtain WND for richedit control\n");
                       /* Send scroll message anyway */
                       SendMessageA(hwnd, WM_HSCROLL, 1, 0);
                       return 0;
                   }

                   if (wndPtr->pHScroll)
                   {
                       memcpy(wndPtr->pHScroll, &scrolltemp, sizeof(SCROLLINFO));
                   }
                   else
                   {
                       WIN_ReleaseWndPtr( wndPtr );
                       return 0;
                   }
                   WIN_ReleaseWndPtr( wndPtr );
                   
                   SendMessageA(hwnd, WM_HSCROLL, 1, 0);
                   return 0;
                }


		case EN_CHANGE:
		case EN_KILLFOCUS:
		case EN_SETFOCUS:
		case EN_UPDATE:
			return SendMessageA(hwndParent, WM_COMMAND,
				wParam, (LPARAM)(hwnd));

		case EN_ERRSPACE:
		case EN_MAXTEXT:
			MessageBoxA (hwnd, "RichEdit control out of space.",
                                  "ERROR", MB_OK | MB_ICONSTOP) ;
			return 0 ;
		}

    case EM_STREAMIN:
            DPRINTF_EDIT_MSG32("EM_STREAMIN");

	    /* setup the RTF parser */
	    RTFSetEditStream(( EDITSTREAM*)lParam);
	    rtfFormat = wParam&(SF_TEXT|SF_RTF);
	    WriterInit();
	    RTFInit ();
	    BeginFile();

	    /* do the parsing */
	    RTFRead ();

	    rtfBufferSize = RTFToBuffer(NULL, 0);
	    rtfBuffer = HeapAlloc(RICHED32_hHeap, 0,rtfBufferSize*sizeof(char));
	    if(rtfBuffer)
	    {
	    	RTFToBuffer(rtfBuffer, rtfBufferSize);
            	SetWindowTextA(hwndEdit,rtfBuffer);
	    	HeapFree(RICHED32_hHeap, 0,rtfBuffer);
	    }
	    else
		WARN("Not enough memory for a allocating rtfBuffer\n");

            return 0;

/* Message specific to Richedit controls */

    case EM_AUTOURLDETECT:
            DPRINTF_EDIT_MSG32("EM_AUTOURLDETECT");
	    return 0;

    case EM_CANPASTE:
            DPRINTF_EDIT_MSG32("EM_CANPASTE");
	    return 0;

    case EM_CANREDO:
            DPRINTF_EDIT_MSG32("EM_CANREDO");
	    return 0;

    case EM_DISPLAYBAND:
            DPRINTF_EDIT_MSG32("EM_DISPLAYBAND");
	    return 0;

    case EM_EXGETSEL:
            DPRINTF_EDIT_MSG32("EM_EXGETSEL");
            return 0;

    case EM_EXLIMITTEXT:
            DPRINTF_EDIT_MSG32("EM_EXLIMITTEXT");
            return 0;

    case EM_EXLINEFROMCHAR:
            DPRINTF_EDIT_MSG32("EM_EXLINEFROMCHAR");
            return 0;

    case EM_EXSETSEL:
            DPRINTF_EDIT_MSG32("EM_EXSETSEL");
            return 0;

    case EM_FINDTEXT:
            DPRINTF_EDIT_MSG32("EM_FINDTEXT");
            return 0;

    case EM_FINDTEXTEX:
            DPRINTF_EDIT_MSG32("EM_FINDTEXTEX");
            return 0;

    case EM_FINDTEXTEXW:
            DPRINTF_EDIT_MSG32("EM_FINDTEXTEXW");
            return 0;

    case EM_FINDTEXTW:
            DPRINTF_EDIT_MSG32("EM_FINDTEXTW");
            return 0;

    case EM_FINDWORDBREAK:
            DPRINTF_EDIT_MSG32("EM_FINDWORDBREAK");
            return 0;

    case EM_FORMATRANGE:
            DPRINTF_EDIT_MSG32("EM_FORMATRANGE");
            return 0;

    case EM_GETAUTOURLDETECT:
            DPRINTF_EDIT_MSG32("EM_GETAUTOURLDETECT");
            return 0;

    case EM_GETBIDIOPTIONS:
            DPRINTF_EDIT_MSG32("EM_GETBIDIOPTIONS");
            return 0;

    case EM_GETCHARFORMAT:
            DPRINTF_EDIT_MSG32("EM_GETCHARFORMAT");
            return 0;

    case EM_GETEDITSTYLE:
            DPRINTF_EDIT_MSG32("EM_GETEDITSTYLE");
            return 0;

    case EM_GETEVENTMASK:
            DPRINTF_EDIT_MSG32("EM_GETEVENTMASK");
            return 0;

    case EM_GETIMECOLOR:
            DPRINTF_EDIT_MSG32("EM_GETIMECOLOR");
            return 0;

    case EM_GETIMECOMPMODE:
            DPRINTF_EDIT_MSG32("EM_GETIMECOMPMODE");
            return 0;

    case EM_GETIMEOPTIONS:
            DPRINTF_EDIT_MSG32("EM_GETIMEOPTIONS");
            return 0;

    case EM_GETLANGOPTIONS:
            DPRINTF_EDIT_MSG32("EM_GETLANGOPTIONS");
            return 0;

    case EM_GETOLEINTERFACE:
            DPRINTF_EDIT_MSG32("EM_GETOLEINTERFACE");
            return 0;

    case EM_GETOPTIONS:
            DPRINTF_EDIT_MSG32("EM_GETOPTIONS");
            return 0;

    case EM_GETPARAFORMAT:
            DPRINTF_EDIT_MSG32("EM_GETPARAFORMAT");
            return 0;

    case EM_GETPUNCTUATION:
            DPRINTF_EDIT_MSG32("EM_GETPUNCTUATION");
            return 0;

    case EM_GETREDONAME:
            DPRINTF_EDIT_MSG32("EM_GETREDONAME");
            return 0;

    case EM_GETSCROLLPOS:
            DPRINTF_EDIT_MSG32("EM_GETSCROLLPOS");
            return 0;

    case EM_GETSELTEXT:
            DPRINTF_EDIT_MSG32("EM_GETSELTEXT");
            return 0;

    case EM_GETTEXTEX:
            DPRINTF_EDIT_MSG32("EM_GETTEXTEX");
            return 0;

    case EM_GETTEXTLENGTHEX:
            DPRINTF_EDIT_MSG32("EM_GETTEXTLENGTHEX");
            return 0;

    case EM_GETTEXTMODE:
            DPRINTF_EDIT_MSG32("EM_GETTEXTMODE");
            return 0;

    case EM_GETTEXTRANGE:
            DPRINTF_EDIT_MSG32("EM_GETTEXTRANGE");
            return 0;

    case EM_GETTYPOGRAPHYOPTIONS:
            DPRINTF_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS");
            return 0;

    case EM_GETUNDONAME:
            DPRINTF_EDIT_MSG32("EM_GETUNDONAME");
            return 0;

    case EM_GETWORDBREAKPROCEX:
            DPRINTF_EDIT_MSG32("EM_GETWORDBREAKPROCEX");
            return 0;

    case EM_GETWORDWRAPMODE:
            DPRINTF_EDIT_MSG32("EM_GETWORDWRAPMODE");
            return 0;

    case EM_GETZOOM:
            DPRINTF_EDIT_MSG32("EM_GETZOOM");
            return 0;

    case EM_HIDESELECTION:
            DPRINTF_EDIT_MSG32("EM_HIDESELECTION");
            return 0;

    case EM_PASTESPECIAL:
            DPRINTF_EDIT_MSG32("EM_PASTESPECIAL");
            return 0;

    case EM_RECONVERSION:
            DPRINTF_EDIT_MSG32("EM_RECONVERSION");
            return 0;

    case EM_REDO:
            DPRINTF_EDIT_MSG32("EM_REDO");
            return 0;

    case EM_REQUESTRESIZE:
            DPRINTF_EDIT_MSG32("EM_REQUESTRESIZE");
            return 0;

    case EM_SELECTIONTYPE:
            DPRINTF_EDIT_MSG32("EM_SELECTIONTYPE");
            return 0;

    case EM_SETBIDIOPTIONS:
            DPRINTF_EDIT_MSG32("EM_SETBIDIOPTIONS");
            return 0;

    case EM_SETBKGNDCOLOR:
            DPRINTF_EDIT_MSG32("EM_SETBKGNDCOLOR");
            return 0;

    case EM_SETCHARFORMAT:
            DPRINTF_EDIT_MSG32("EM_SETCHARFORMAT");
            return 0;

    case EM_SETEDITSTYLE:
            DPRINTF_EDIT_MSG32("EM_SETEDITSTYLE");
            return 0;

    case EM_SETEVENTMASK:
            DPRINTF_EDIT_MSG32("EM_SETEVENTMASK");
            return 0;

    case EM_SETFONTSIZE:
            DPRINTF_EDIT_MSG32("EM_SETFONTSIZE");
            return 0;

    case EM_SETIMECOLOR:
            DPRINTF_EDIT_MSG32("EM_SETIMECOLO");
            return 0;

    case EM_SETIMEOPTIONS:
            DPRINTF_EDIT_MSG32("EM_SETIMEOPTIONS");
            return 0;

    case EM_SETLANGOPTIONS:
            DPRINTF_EDIT_MSG32("EM_SETLANGOPTIONS");
            return 0;

    case EM_SETOLECALLBACK:
            DPRINTF_EDIT_MSG32("EM_SETOLECALLBACK");
            return 0;

    case EM_SETOPTIONS:
            DPRINTF_EDIT_MSG32("EM_SETOPTIONS");
            return 0;

    case EM_SETPALETTE:
            DPRINTF_EDIT_MSG32("EM_SETPALETTE");
            return 0;

    case EM_SETPARAFORMAT:
            DPRINTF_EDIT_MSG32("EM_SETPARAFORMAT");
            return 0;

    case EM_SETPUNCTUATION:
            DPRINTF_EDIT_MSG32("EM_SETPUNCTUATION");
            return 0;

    case EM_SETSCROLLPOS:
            DPRINTF_EDIT_MSG32("EM_SETSCROLLPOS");
            return 0;

    case EM_SETTARGETDEVICE:
            DPRINTF_EDIT_MSG32("EM_SETTARGETDEVICE");
            return 0;

    case EM_SETTEXTEX:
            DPRINTF_EDIT_MSG32("EM_SETTEXTEX");
            return 0;

    case EM_SETTEXTMODE:
            DPRINTF_EDIT_MSG32("EM_SETTEXTMODE");
            return 0;

    case EM_SETTYPOGRAPHYOPTIONS:
            DPRINTF_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS");
            return 0;

    case EM_SETUNDOLIMIT:
            DPRINTF_EDIT_MSG32("EM_SETUNDOLIMIT");
            return 0;

    case EM_SETWORDBREAKPROCEX:
            DPRINTF_EDIT_MSG32("EM_SETWORDBREAKPROCEX");
            return 0;

    case EM_SETWORDWRAPMODE:
            DPRINTF_EDIT_MSG32("EM_SETWORDWRAPMODE");
            return 0;

    case EM_SETZOOM:
            DPRINTF_EDIT_MSG32("EM_SETZOOM");
            return 0;

    case EM_SHOWSCROLLBAR:
            DPRINTF_EDIT_MSG32("EM_SHOWSCROLLBAR");
            return 0;

    case EM_STOPGROUPTYPING:
            DPRINTF_EDIT_MSG32("EM_STOPGROUPTYPING");
            return 0;

    case EM_STREAMOUT:
            DPRINTF_EDIT_MSG32("EM_STREAMOUT");
            return 0;

/* Messaged dispatched to the edit control */
    case EM_CANUNDO:
    case EM_CHARFROMPOS:
    case EM_EMPTYUNDOBUFFER:
    case EM_FMTLINES:
    case EM_GETFIRSTVISIBLELINE:
    case EM_GETHANDLE:
/*    case EM_GETIMESTATUS:*/
    case EM_GETLIMITTEXT:
    case EM_GETLINE:
    case EM_GETLINECOUNT:
    case EM_GETMARGINS:
    case EM_GETMODIFY:
    case EM_GETPASSWORDCHAR:
    case EM_GETRECT:
    case EM_GETSEL:
    case EM_GETTHUMB:
    case EM_GETWORDBREAKPROC:
    case EM_LINEFROMCHAR:
    case EM_LINEINDEX:
    case EM_LINELENGTH:
    case EM_LINESCROLL:
    case EM_POSFROMCHAR:
    case EM_REPLACESEL:
    case EM_SCROLL:
    case EM_SCROLLCARET:
    case EM_SETHANDLE:
/*    case EM_SETIMESTATUS:*/
    case EM_SETLIMITTEXT:
    case EM_SETMARGINS:
    case EM_SETMODIFY:
    case EM_SETPASSWORDCHAR:
    case EM_SETREADONLY:
    case EM_SETRECT:
    case EM_SETRECTNP:
    case EM_SETSEL:
    case EM_SETTABSTOPS:
    case EM_SETWORDBREAKPROC:
    case EM_UNDO:

    case WM_STYLECHANGING:
    case WM_STYLECHANGED:
    case WM_NCCALCSIZE:
    case WM_GETTEXT:
    case WM_GETTEXTLENGTH:
    case WM_SETTEXT:
	    return SendMessageA( hwndEdit, uMsg, wParam, lParam);

    /* Messages known , but ignored. */
    case WM_NCPAINT:
        DPRINTF_EDIT_MSG32("WM_NCPAINT");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_PAINT:
        DPRINTF_EDIT_MSG32("WM_PAINT");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_ERASEBKGND:
        DPRINTF_EDIT_MSG32("WM_ERASEBKGND");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_KILLFOCUS:
        DPRINTF_EDIT_MSG32("WM_KILLFOCUS");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_DESTROY:
        DPRINTF_EDIT_MSG32("WM_DESTROY");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_CHILDACTIVATE:
	DPRINTF_EDIT_MSG32("WM_CHILDACTIVATE");
	return DefWindowProcA( hwnd,uMsg,wParam,lParam);

    case WM_WINDOWPOSCHANGING:
        DPRINTF_EDIT_MSG32("WM_WINDOWPOSCHANGING");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_WINDOWPOSCHANGED:
        DPRINTF_EDIT_MSG32("WM_WINDOWPOSCHANGED");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
/*    case WM_INITIALUPDATE:
        DPRINTF_EDIT_MSG32("WM_INITIALUPDATE");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam); */
    case WM_CTLCOLOREDIT:
        DPRINTF_EDIT_MSG32("WM_CTLCOLOREDIT");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_SETCURSOR:
        DPRINTF_EDIT_MSG32("WM_SETCURSOR");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_MOVE:
        DPRINTF_EDIT_MSG32("WM_MOVE");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);
    case WM_SHOWWINDOW:
        DPRINTF_EDIT_MSG32("WM_SHOWWINDOW");
        return DefWindowProcA( hwnd,uMsg,wParam,lParam);

    }


    FIXME("Unknown message 0x%04x\n", uMsg); 
    return DefWindowProcA( hwnd,uMsg,wParam,lParam);
}

/***********************************************************************
 * DllGetVersion [RICHED32.2]
 *
 * Retrieves version information of the 'RICHED32.DLL'
 *
 * PARAMS
 *     pdvi [O] pointer to version information structure.
 *
 * RETURNS
 *     Success: S_OK
 *     Failure: E_INVALIDARG
 *
 * NOTES
 *     Returns version of a comctl32.dll from IE4.01 SP1.
 */

HRESULT WINAPI
RICHED32_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;
}

/***
 * DESCRIPTION:
 * Registers the window class.
 *
 * PARAMETER(S):
 * None
 *
 * RETURN:
 * None
 */
VOID RICHED32_Register(void)
{
    WNDCLASSA wndClass;

    TRACE("\n");

    ZeroMemory(&wndClass, sizeof(WNDCLASSA));
    wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
    wndClass.lpfnWndProc = (WNDPROC)RICHED32_WindowProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0; /*(sizeof(RICHED32_INFO *);*/
    wndClass.hCursor = LoadCursorA(0, IDC_ARROWA);
    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wndClass.lpszClassName = RICHEDIT_CLASS10A; /* WC_RICHED32A; */

    RegisterClassA (&wndClass);
}

/***
 * DESCRIPTION:
 * Unregisters the window class.
 *
 * PARAMETER(S):
 * None
 *
 * RETURN:
 * None
 */
VOID RICHED32_Unregister(void)
{
    TRACE("\n");

    UnregisterClassA(RICHEDIT_CLASS10A, (HINSTANCE)NULL);
}
