| /* |
| * 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 "debugtools.h" |
| |
| #define ID_EDIT 1 |
| |
| 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_CHANGE: |
| case EN_HSCROLL: |
| case EN_KILLFOCUS: |
| case EN_SETFOCUS: |
| case EN_UPDATE: |
| case EN_VSCROLL: |
| 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); |
| 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 %d\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); |
| } |