Sweden-Number/dlls/richedit/richedit.c

636 lines
16 KiB
C

/*
* 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);
}