| /* | |
| * 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 | |
| * | |
| * 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 "riched32.h" | |
| #include "richedit.h" | |
| #define NO_SHLWAPI_STREAM | |
| #include "shlwapi.h" | |
| #include "rtf.h" | |
| #include "rtf2text.h" | |
| #include "wine/debug.h" | |
| #define ID_EDIT 1 | |
| WINE_DEFAULT_DEBUG_CHANNEL(richedit); | |
| HANDLE RICHED32_hHeap = NULL; | |
| /* LPSTR RICHED32_aSubclass = NULL; */ | |
| static WNDPROC lpfnEditWndProc = NULL; | |
| static INT RTFInfoOffset = 0; | |
| #define TRACE_EDIT_MSG32(str) \ | |
| TRACE(\ | |
| "32 bit : " str ": hwnd=%p, wParam=%08x, lParam=%08x\n"\ | |
| , \ | |
| hwnd, (UINT)wParam, (UINT)lParam) | |
| LPVOID* WINAPI CreateIRichEditOle(); | |
| VOID RICHEDIT_InitEditControlInfo(void); | |
| /*********************************************************************** | |
| * DllMain [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 DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) | |
| { | |
| TRACE("\n"); | |
| switch (fdwReason) | |
| { | |
| case DLL_PROCESS_ATTACH: | |
| DisableThreadLibraryCalls(hinstDLL); | |
| /* create private heap */ | |
| RICHED32_hHeap = HeapCreate (0, 0x10000, 0); | |
| /* Retrieve edit control class info */ | |
| RICHEDIT_InitEditControlInfo(); | |
| /* register the Rich Edit class */ | |
| RICHED32_Register (); | |
| break; | |
| case DLL_PROCESS_DETACH: | |
| /* unregister all common control classes */ | |
| RICHED32_Unregister (); | |
| HeapDestroy (RICHED32_hHeap); | |
| RICHED32_hHeap = NULL; | |
| break; | |
| } | |
| return TRUE; | |
| } | |
| /* Support routines for window procedure */ | |
| INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr); | |
| INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer); | |
| typedef struct _RTFControl_info | |
| { | |
| HWND hwndParent; | |
| char* rtfBuffer; | |
| RTF_Info *parser; | |
| } RTFControl_Info; | |
| /* | |
| * | |
| * DESCRIPTION: | |
| * Window procedure of the RichEdit control. | |
| * | |
| */ | |
| static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, | |
| LPARAM lParam) | |
| { | |
| LONG newstyle = 0; | |
| LONG style = 0; | |
| RTFControl_Info *info; | |
| CHARRANGE *cr; | |
| info = (RTFControl_Info *) GetWindowLongW( hwnd, RTFInfoOffset ); | |
| TRACE("uMsg: 0x%x hwnd: %p\n",uMsg,hwnd); | |
| switch (uMsg) | |
| { | |
| case WM_CREATE: | |
| TRACE_EDIT_MSG32("WM_CREATE Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_NCCREATE : | |
| TRACE_EDIT_MSG32("WM_NCCREATE"); | |
| info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof (RTFControl_Info)); | |
| info->parser = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, | |
| sizeof (RTF_Info)); | |
| SetWindowLongW( hwnd, RTFInfoOffset, (LONG)info ); | |
| /* remove SCROLLBARS from the current window style */ | |
| info->hwndParent = ((LPCREATESTRUCTA) lParam)->hwndParent; | |
| newstyle = style = ((LPCREATESTRUCTA) lParam)->style; | |
| newstyle &= ~WS_HSCROLL; | |
| newstyle &= ~WS_VSCROLL; | |
| newstyle &= ~ES_AUTOHSCROLL; | |
| newstyle &= ~ES_AUTOVSCROLL; | |
| SetWindowLongA(hwnd,GWL_STYLE, newstyle); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_SETFOCUS : | |
| TRACE_EDIT_MSG32("WM_SETFOCUS"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_SIZE : | |
| TRACE_EDIT_MSG32("WM_SIZE"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_COMMAND : | |
| TRACE_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(info->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: | |
| TRACE_EDIT_MSG32("EM_STREAMIN"); | |
| /* setup the RTF parser */ | |
| RTFSetEditStream(info->parser,( EDITSTREAM*)lParam); | |
| info->parser->rtfFormat = wParam&(SF_TEXT|SF_RTF); | |
| info->parser->hwndEdit = hwnd; | |
| WriterInit(info->parser); | |
| RTFInit (info->parser); | |
| BeginFile(info->parser); | |
| /* do the parsing */ | |
| RTFRead (info->parser); | |
| RTFFlushOutputBuffer( info->parser ); | |
| /* put the cursor at the top */ | |
| SendMessageA( hwnd, EM_SETSEL, 0, 0 ); | |
| return 0; | |
| /* Messages specific to Richedit controls */ | |
| case EM_AUTOURLDETECT: | |
| TRACE_EDIT_MSG32("EM_AUTOURLDETECT Ignored"); | |
| return 0; | |
| case EM_CANPASTE: | |
| TRACE_EDIT_MSG32("EM_CANPASTE Ignored"); | |
| return 0; | |
| case EM_CANREDO: | |
| TRACE_EDIT_MSG32("EM_CANREDO Ignored"); | |
| return 0; | |
| case EM_DISPLAYBAND: | |
| TRACE_EDIT_MSG32("EM_DISPLAYBAND Ignored"); | |
| return 0; | |
| case EM_EXGETSEL: | |
| TRACE_EDIT_MSG32("EM_EXGETSEL -> EM_GETSEL"); | |
| cr = (VOID *) lParam; | |
| CallWindowProcA(lpfnEditWndProc, hwnd, EM_GETSEL, (INT)&cr->cpMin, (INT)&cr->cpMax); | |
| TRACE("cpMin: 0x%x cpMax: 0x%x\n",(INT)cr->cpMin,(INT)cr->cpMax); | |
| return 0; | |
| case EM_EXLIMITTEXT: | |
| { | |
| DWORD limit = lParam; | |
| TRACE_EDIT_MSG32("EM_EXLIMITTEXT"); | |
| if (limit > 65534) | |
| { | |
| limit = 0xFFFFFFFF; | |
| } | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETLIMITTEXT, limit, 0); | |
| } | |
| case EM_EXLINEFROMCHAR: | |
| TRACE_EDIT_MSG32("EM_EXLINEFROMCHAR -> LINEFROMCHAR"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, EM_LINEFROMCHAR, lParam, wParam); | |
| case EM_EXSETSEL: | |
| TRACE_EDIT_MSG32("EM_EXSETSEL -> EM_SETSEL"); | |
| cr = (VOID *) lParam; | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SETSEL, cr->cpMin, cr->cpMax); | |
| case EM_FINDTEXT: | |
| TRACE_EDIT_MSG32("EM_FINDTEXT Ignored"); | |
| return 0; | |
| case EM_FINDTEXTEX: | |
| TRACE_EDIT_MSG32("EM_FINDTEXTEX Ignored"); | |
| return 0; | |
| case EM_FINDTEXTEXW: | |
| TRACE_EDIT_MSG32("EM_FINDTEXTEXW Ignored"); | |
| return 0; | |
| case EM_FINDTEXTW: | |
| TRACE_EDIT_MSG32("EM_FINDTEXTW Ignored"); | |
| return 0; | |
| case EM_FINDWORDBREAK: | |
| TRACE_EDIT_MSG32("EM_FINDWORDBREAK Ignored"); | |
| return 0; | |
| case EM_FORMATRANGE: | |
| TRACE_EDIT_MSG32("EM_FORMATRANGE Ignored"); | |
| return 0; | |
| case EM_GETAUTOURLDETECT: | |
| TRACE_EDIT_MSG32("EM_GETAUTOURLDETECT Ignored"); | |
| return 0; | |
| case EM_GETBIDIOPTIONS: | |
| TRACE_EDIT_MSG32("EM_GETBIDIOPTIONS Ignored"); | |
| return 0; | |
| case EM_GETCHARFORMAT: | |
| TRACE_EDIT_MSG32("EM_GETCHARFORMAT Ignored"); | |
| return 0; | |
| case EM_GETEDITSTYLE: | |
| TRACE_EDIT_MSG32("EM_GETEDITSTYLE Ignored"); | |
| return 0; | |
| case EM_GETEVENTMASK: | |
| TRACE_EDIT_MSG32("EM_GETEVENTMASK Ignored"); | |
| return 0; | |
| case EM_GETIMECOLOR: | |
| TRACE_EDIT_MSG32("EM_GETIMECOLOR Ignored"); | |
| return 0; | |
| case EM_GETIMECOMPMODE: | |
| TRACE_EDIT_MSG32("EM_GETIMECOMPMODE Ignored"); | |
| return 0; | |
| case EM_GETIMEOPTIONS: | |
| TRACE_EDIT_MSG32("EM_GETIMEOPTIONS Ignored"); | |
| return 0; | |
| case EM_GETLANGOPTIONS: | |
| TRACE_EDIT_MSG32("STUB: EM_GETLANGOPTIONS"); | |
| return 0; | |
| case EM_GETOLEINTERFACE: | |
| TRACE_EDIT_MSG32("EM_GETOLEINTERFACE Ignored"); | |
| return 0; | |
| case EM_GETOPTIONS: | |
| TRACE_EDIT_MSG32("EM_GETOPTIONS Ignored"); | |
| return 0; | |
| case EM_GETPARAFORMAT: | |
| TRACE_EDIT_MSG32("EM_GETPARAFORMAT Ignored"); | |
| return 0; | |
| case EM_GETPUNCTUATION: | |
| TRACE_EDIT_MSG32("EM_GETPUNCTUATION Ignored"); | |
| return 0; | |
| case EM_GETREDONAME: | |
| TRACE_EDIT_MSG32("EM_GETREDONAME Ignored"); | |
| return 0; | |
| case EM_GETSCROLLPOS: | |
| TRACE_EDIT_MSG32("EM_GETSCROLLPOS Ignored"); | |
| return 0; | |
| case EM_GETSELTEXT: | |
| TRACE_EDIT_MSG32("EM_GETSELTEXT"); | |
| return RICHEDIT_GetSelText(hwnd,(void *)lParam); | |
| case EM_GETTEXTEX: | |
| TRACE_EDIT_MSG32("EM_GETTEXTEX Ignored"); | |
| return 0; | |
| case EM_GETTEXTLENGTHEX: | |
| TRACE_EDIT_MSG32("EM_GETTEXTLENGTHEX Ignored"); | |
| return 0; | |
| case EM_GETTEXTMODE: | |
| TRACE_EDIT_MSG32("EM_GETTEXTMODE Ignored"); | |
| return 0; | |
| case EM_GETTEXTRANGE: | |
| TRACE_EDIT_MSG32("EM_GETTEXTRANGE"); | |
| return RICHEDIT_GetTextRange(hwnd,(TEXTRANGEA *)lParam); | |
| case EM_GETTYPOGRAPHYOPTIONS: | |
| TRACE_EDIT_MSG32("EM_GETTYPOGRAPHYOPTIONS Ignored"); | |
| return 0; | |
| case EM_GETUNDONAME: | |
| TRACE_EDIT_MSG32("EM_GETUNDONAME Ignored"); | |
| return 0; | |
| case EM_GETWORDBREAKPROCEX: | |
| TRACE_EDIT_MSG32("EM_GETWORDBREAKPROCEX Ignored"); | |
| return 0; | |
| case EM_GETWORDWRAPMODE: | |
| TRACE_EDIT_MSG32("EM_GETWORDWRAPMODE Ignored"); | |
| return 0; | |
| case EM_GETZOOM: | |
| TRACE_EDIT_MSG32("EM_GETZOOM Ignored"); | |
| return 0; | |
| case EM_HIDESELECTION: | |
| TRACE_EDIT_MSG32("EM_HIDESELECTION Ignored"); | |
| return 0; | |
| case EM_PASTESPECIAL: | |
| TRACE_EDIT_MSG32("EM_PASTESPECIAL Ignored"); | |
| return 0; | |
| case EM_RECONVERSION: | |
| TRACE_EDIT_MSG32("EM_RECONVERSION Ignored"); | |
| return 0; | |
| case EM_REDO: | |
| TRACE_EDIT_MSG32("EM_REDO Ignored"); | |
| return 0; | |
| case EM_REQUESTRESIZE: | |
| TRACE_EDIT_MSG32("EM_REQUESTRESIZE Ignored"); | |
| return 0; | |
| case EM_SELECTIONTYPE: | |
| TRACE_EDIT_MSG32("EM_SELECTIONTYPE Ignored"); | |
| return 0; | |
| case EM_SETBIDIOPTIONS: | |
| TRACE_EDIT_MSG32("EM_SETBIDIOPTIONS Ignored"); | |
| return 0; | |
| case EM_SETBKGNDCOLOR: | |
| TRACE_EDIT_MSG32("EM_SETBKGNDCOLOR Ignored"); | |
| return 0; | |
| case EM_SETCHARFORMAT: | |
| TRACE_EDIT_MSG32("EM_SETCHARFORMAT Ignored"); | |
| return 0; | |
| case EM_SETEDITSTYLE: | |
| TRACE_EDIT_MSG32("EM_SETEDITSTYLE Ignored"); | |
| return 0; | |
| case EM_SETEVENTMASK: | |
| TRACE_EDIT_MSG32("EM_SETEVENTMASK Ignored"); | |
| return 0; | |
| case EM_SETFONTSIZE: | |
| TRACE_EDIT_MSG32("EM_SETFONTSIZE Ignored"); | |
| return 0; | |
| case EM_SETIMECOLOR: | |
| TRACE_EDIT_MSG32("EM_SETIMECOLO Ignored"); | |
| return 0; | |
| case EM_SETIMEOPTIONS: | |
| TRACE_EDIT_MSG32("EM_SETIMEOPTIONS Ignored"); | |
| return 0; | |
| case EM_SETLANGOPTIONS: | |
| TRACE_EDIT_MSG32("EM_SETLANGOPTIONS Ignored"); | |
| return 0; | |
| case EM_SETOLECALLBACK: | |
| TRACE_EDIT_MSG32("EM_SETOLECALLBACK Ignored"); | |
| return 0; | |
| case EM_SETOPTIONS: | |
| TRACE_EDIT_MSG32("EM_SETOPTIONS Ignored"); | |
| return 0; | |
| case EM_SETPALETTE: | |
| TRACE_EDIT_MSG32("EM_SETPALETTE Ignored"); | |
| return 0; | |
| case EM_SETPARAFORMAT: | |
| TRACE_EDIT_MSG32("EM_SETPARAFORMAT Ignored"); | |
| return 0; | |
| case EM_SETPUNCTUATION: | |
| TRACE_EDIT_MSG32("EM_SETPUNCTUATION Ignored"); | |
| return 0; | |
| case EM_SETSCROLLPOS: | |
| TRACE_EDIT_MSG32("EM_SETSCROLLPOS Ignored"); | |
| return 0; | |
| case EM_SETTARGETDEVICE: | |
| TRACE_EDIT_MSG32("EM_SETTARGETDEVICE Ignored"); | |
| return 0; | |
| case EM_SETTEXTEX: | |
| TRACE_EDIT_MSG32("EM_SETTEXTEX Ignored"); | |
| return 0; | |
| case EM_SETTEXTMODE: | |
| TRACE_EDIT_MSG32("EM_SETTEXTMODE Ignored"); | |
| return 0; | |
| case EM_SETTYPOGRAPHYOPTIONS: | |
| TRACE_EDIT_MSG32("EM_SETTYPOGRAPHYOPTIONS Ignored"); | |
| return 0; | |
| case EM_SETUNDOLIMIT: | |
| TRACE_EDIT_MSG32("EM_SETUNDOLIMIT Ignored"); | |
| return 0; | |
| case EM_SETWORDBREAKPROCEX: | |
| TRACE_EDIT_MSG32("EM_SETWORDBREAKPROCEX Ignored"); | |
| return 0; | |
| case EM_SETWORDWRAPMODE: | |
| TRACE_EDIT_MSG32("EM_SETWORDWRAPMODE Ignored"); | |
| return 0; | |
| case EM_SETZOOM: | |
| TRACE_EDIT_MSG32("EM_SETZOOM Ignored"); | |
| return 0; | |
| case EM_SHOWSCROLLBAR: | |
| TRACE_EDIT_MSG32("EM_SHOWSCROLLBAR Ignored"); | |
| return 0; | |
| case EM_STOPGROUPTYPING: | |
| TRACE_EDIT_MSG32("EM_STOPGROUPTYPING Ignored"); | |
| return 0; | |
| case EM_STREAMOUT: | |
| TRACE_EDIT_MSG32("EM_STREAMOUT Ignored"); | |
| return 0; | |
| /* Messages dispatched to the edit control */ | |
| case EM_CANUNDO: | |
| TRACE_EDIT_MSG32("EM_CANUNDO Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_CHARFROMPOS: | |
| TRACE_EDIT_MSG32("EM_CHARFROMPOS Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_EMPTYUNDOBUFFER: | |
| TRACE_EDIT_MSG32("EM_EMPTYUNDOBUFFER Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_FMTLINES: | |
| TRACE_EDIT_MSG32("EM_FMTLINES Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETFIRSTVISIBLELINE: | |
| TRACE_EDIT_MSG32("EM_GETFIRSTVISIBLELINE Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETHANDLE: | |
| TRACE_EDIT_MSG32("EM_GETHANDLE Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| /* case EM_GETIMESTATUS:*/ | |
| case EM_GETLIMITTEXT: | |
| TRACE_EDIT_MSG32("EM_GETLIMITTEXT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETLINE: | |
| TRACE_EDIT_MSG32("EM_GETLINE Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETLINECOUNT: | |
| TRACE_EDIT_MSG32("EM_GETLINECOUNT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETMARGINS: | |
| TRACE_EDIT_MSG32("EM_GETMARGINS Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETMODIFY: | |
| TRACE_EDIT_MSG32("EM_GETMODIFY Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETPASSWORDCHAR: | |
| TRACE_EDIT_MSG32("EM_GETPASSWORDCHAR Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETRECT: | |
| TRACE_EDIT_MSG32("EM_GETRECT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETSEL: | |
| TRACE_EDIT_MSG32("EM_GETSEL Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETTHUMB: | |
| TRACE_EDIT_MSG32("EM_GETTHUMB Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_GETWORDBREAKPROC: | |
| TRACE_EDIT_MSG32("EM_GETWORDBREAKPROC Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_LINEFROMCHAR: | |
| TRACE_EDIT_MSG32("EM_LINEFROMCHAR Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_LINEINDEX: | |
| TRACE_EDIT_MSG32("EM_LINEINDEX Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_LINELENGTH: | |
| TRACE_EDIT_MSG32("EM_LINELENGTH Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_LINESCROLL: | |
| TRACE_EDIT_MSG32("EM_LINESCROLL Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_POSFROMCHAR: | |
| TRACE_EDIT_MSG32("EM_POSFROMCHAR Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_REPLACESEL: | |
| TRACE_EDIT_MSG32("case EM_REPLACESEL Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SCROLL: | |
| TRACE_EDIT_MSG32("case EM_SCROLL Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SCROLLCARET: | |
| case WM_USER+49: /* EM_SCROLLCARET too */ | |
| TRACE_EDIT_MSG32("EM_SCROLLCARET Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, EM_SCROLLCARET, wParam, lParam); | |
| case EM_SETHANDLE: | |
| TRACE_EDIT_MSG32("EM_SETHANDLE Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| /* case EM_SETIMESTATUS:*/ | |
| case EM_SETLIMITTEXT: | |
| TRACE_EDIT_MSG32("EM_SETLIMITTEXT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETMARGINS: | |
| TRACE_EDIT_MSG32("case EM_SETMARGINS Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETMODIFY: | |
| TRACE_EDIT_MSG32("EM_SETMODIFY Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETPASSWORDCHAR: | |
| TRACE_EDIT_MSG32("EM_SETPASSWORDCHAR Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETREADONLY: | |
| TRACE_EDIT_MSG32("EM_SETREADONLY Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETRECT: | |
| TRACE_EDIT_MSG32("EM_SETRECT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETRECTNP: | |
| TRACE_EDIT_MSG32("EM_SETRECTNP Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETSEL: | |
| TRACE_EDIT_MSG32("EM_SETSEL Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETTABSTOPS: | |
| TRACE_EDIT_MSG32("EM_SETTABSTOPS Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_SETWORDBREAKPROC: | |
| TRACE_EDIT_MSG32("EM_SETWORDBREAKPROC Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case EM_UNDO: | |
| TRACE_EDIT_MSG32("EM_UNDO Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_STYLECHANGING: | |
| TRACE_EDIT_MSG32("WM_STYLECHANGING Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_STYLECHANGED: | |
| TRACE_EDIT_MSG32("WM_STYLECHANGED Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_GETTEXT: | |
| TRACE_EDIT_MSG32("WM_GETTEXT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_GETTEXTLENGTH: | |
| TRACE_EDIT_MSG32("WM_GETTEXTLENGTH Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_SETTEXT: | |
| TRACE_EDIT_MSG32("WM_SETTEXT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_CUT: | |
| TRACE_EDIT_MSG32("WM_CUT Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_COPY: | |
| TRACE_EDIT_MSG32("WM_COPY Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_PASTE: | |
| TRACE_EDIT_MSG32("WM_PASTE Passed to edit control"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| /* Messages passed to default handler. */ | |
| case WM_NCCALCSIZE: | |
| TRACE_EDIT_MSG32("WM_NCCALCSIZE Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_NCPAINT: | |
| TRACE_EDIT_MSG32("WM_NCPAINT Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_PAINT: | |
| TRACE_EDIT_MSG32("WM_PAINT Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_ERASEBKGND: | |
| TRACE_EDIT_MSG32("WM_ERASEBKGND Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_KILLFOCUS: | |
| TRACE_EDIT_MSG32("WM_KILLFOCUS Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_DESTROY: | |
| TRACE_EDIT_MSG32("WM_DESTROY Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_CHILDACTIVATE: | |
| TRACE_EDIT_MSG32("WM_CHILDACTIVATE Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_WINDOWPOSCHANGING: | |
| TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGING Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_WINDOWPOSCHANGED: | |
| TRACE_EDIT_MSG32("WM_WINDOWPOSCHANGED Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| /* case WM_INITIALUPDATE: | |
| TRACE_EDIT_MSG32("WM_INITIALUPDATE Passed to default"); | |
| return DefWindowProcA( hwnd,uMsg,wParam,lParam); */ | |
| case WM_CTLCOLOREDIT: | |
| TRACE_EDIT_MSG32("WM_CTLCOLOREDIT Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_SETCURSOR: | |
| TRACE_EDIT_MSG32("WM_SETCURSOR Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_MOVE: | |
| TRACE_EDIT_MSG32("WM_MOVE Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_SHOWWINDOW: | |
| TRACE_EDIT_MSG32("WM_SHOWWINDOW Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_PARENTNOTIFY: | |
| TRACE_EDIT_MSG32("WM_PARENTNOTIFY Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_SETREDRAW: | |
| TRACE_EDIT_MSG32("WM_SETREDRAW Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_NCDESTROY: | |
| { | |
| TRACE_EDIT_MSG32("WM_NCDESTROY Passed to default"); | |
| HeapFree( GetProcessHeap(), 0, info->parser ); | |
| HeapFree( GetProcessHeap(), 0, info ); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| } | |
| case WM_NCHITTEST: | |
| TRACE_EDIT_MSG32("WM_NCHITTEST Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_CTLCOLORSTATIC: | |
| TRACE_EDIT_MSG32("WM_CTLCOLORSTATIC Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_NCMOUSEMOVE: | |
| TRACE_EDIT_MSG32("WM_NCMOUSEMOVE Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_CLEAR: | |
| TRACE_EDIT_MSG32("WM_CLEAR Passed to default"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| /* | |
| * used by IE in the EULA box | |
| */ | |
| case WM_ALTTABACTIVE: | |
| TRACE_EDIT_MSG32("WM_ALTTABACTIVE"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_GETDLGCODE: | |
| TRACE_EDIT_MSG32("WM_GETDLGCODE"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| case WM_SETFONT: | |
| TRACE_EDIT_MSG32("WM_SETFONT"); | |
| return CallWindowProcA(lpfnEditWndProc, hwnd, uMsg, wParam, lParam); | |
| } | |
| if ((uMsg >= WM_USER) && (uMsg < WM_APP)) { | |
| FIXME("Unknown message 0x%x Passed to default hwnd=%p, wParam=%08x, lParam=%08x\n", | |
| uMsg, hwnd, (UINT)wParam, (UINT)lParam); | |
| } | |
| return CallWindowProcA(lpfnEditWndProc, 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 = RTFInfoOffset + sizeof(RTFControl_Info*); | |
| wndClass.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); | |
| 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, NULL); | |
| } | |
| /*** | |
| * DESCRIPTION: | |
| * Initialize edit control class info | |
| */ | |
| VOID RICHEDIT_InitEditControlInfo(void) | |
| { | |
| WNDCLASSA wcEdit; | |
| if (GetClassInfoA(0, "edit", &wcEdit)) | |
| { | |
| lpfnEditWndProc = wcEdit.lpfnWndProc; | |
| RTFInfoOffset = wcEdit.cbWndExtra; | |
| } | |
| else | |
| ERR("Failed to retrieve edit control class info\n"); | |
| } | |
| INT RICHEDIT_GetTextRange(HWND hwnd,TEXTRANGEA *tr) | |
| { | |
| UINT alloc_size, text_size, range_size; | |
| char *text; | |
| TRACE("start: 0x%x stop: 0x%x\n",(INT)tr->chrg.cpMin,(INT)tr->chrg.cpMax); | |
| if (!(alloc_size = SendMessageA(hwnd,WM_GETTEXTLENGTH,0,0))) return FALSE; | |
| if (!(text = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (alloc_size+1)))) | |
| return FALSE; | |
| text_size = SendMessageA(hwnd,WM_GETTEXT,alloc_size,(INT)text); | |
| if (text_size > tr->chrg.cpMin) | |
| { | |
| range_size = (text_size> tr->chrg.cpMax) ? (tr->chrg.cpMax - tr->chrg.cpMin) : (text_size - tr->chrg.cpMin); | |
| TRACE("EditText: %.30s ...\n",text+tr->chrg.cpMin); | |
| memcpy(tr->lpstrText,text+tr->chrg.cpMin,range_size); | |
| } | |
| else range_size = 0; | |
| HeapFree(GetProcessHeap(), 0, text); | |
| return range_size; | |
| } | |
| INT RICHEDIT_GetSelText(HWND hwnd,LPSTR lpstrBuffer) | |
| { | |
| TEXTRANGEA textrange; | |
| textrange.lpstrText = lpstrBuffer; | |
| SendMessageA(hwnd,EM_GETSEL,(INT)&textrange.chrg.cpMin,(INT)&textrange.chrg.cpMax); | |
| return RICHEDIT_GetTextRange(hwnd,&textrange); | |
| } |