/*
 * Copyright (C) 2000 Jean-Claude Batista
 * Copyright (C) 2002 Andriy Palamarchuk
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef __WINE_RICHEDIT_H
#define __WINE_RICHEDIT_H

#include <pshpack4.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _RICHEDIT_VER
#define _RICHEDIT_VER   0x0210
#endif /* _RICHEDIT_VER */

#define cchTextLimitDefault 0x7fff

#if defined(__GNUC__)
# define MSFTEDIT_CLASS (const WCHAR []){ 'R','i','c','h','E','d','i','t','5','0','W',0 }
#elif defined(_MSC_VER)
# define MSFTEDIT_CLASS L"RichEdit50W"
#else
static const WCHAR MSFTEDIT_CLASS[] = { 'R','i','c','h','E','d','i','t','5','0','W',0 };
#endif

#define RICHEDIT_CLASS20A	"RichEdit20A"
#if defined(__GNUC__)
# define RICHEDIT_CLASS20W (const WCHAR []){ 'R','i','c','h','E','d','i','t','2','0','W',0 }
#elif defined(_MSC_VER)
# define RICHEDIT_CLASS20W      L"RichEdit20W"
#else
static const WCHAR RICHEDIT_CLASS20W[] = { 'R','i','c','h','E','d','i','t','2','0','W',0 };
#endif
#define RICHEDIT_CLASS10A	"RICHEDIT"

#if (_RICHEDIT_VER >= 0x0200 )
#define RICHEDIT_CLASS		WINELIB_NAME_AW(RICHEDIT_CLASS20)
#else
#define RICHEDIT_CLASS		RICHEDIT_CLASS10A
#endif

#ifndef WM_NOTIFY
#define WM_NOTIFY               0x004e
#endif
#ifndef WM_CONTEXTMENU
#define WM_CONTEXTMENU          0x007b
#endif
#ifndef WM_UNICHAR
#define WM_UNICHAR              0x0109
#endif
#ifndef WM_PRINTCLIENT
#define WM_PRINTCLIENT          0x0318
#endif

#ifndef EM_GETLIMITTEXT
#define EM_GETLIMITTEXT         (WM_USER + 37)
#endif
#ifndef EM_POSFROMCHAR
#define EM_POSFROMCHAR          (WM_USER + 38)
#define EM_CHARFROMPOS          (WM_USER + 39)
#endif
#ifndef EM_SCROLLCARET
#define EM_SCROLLCARET		(WM_USER + 49)
#endif
#define EM_CANPASTE		(WM_USER + 50)
#define EM_DISPLAYBAND		(WM_USER + 51)
#define EM_EXGETSEL		(WM_USER + 52)
#define EM_EXLIMITTEXT		(WM_USER + 53)
#define EM_EXLINEFROMCHAR	(WM_USER + 54)
#define EM_EXSETSEL		(WM_USER + 55)
#define EM_FINDTEXT		(WM_USER + 56)
#define EM_FORMATRANGE		(WM_USER + 57)
#define EM_GETCHARFORMAT	(WM_USER + 58)
#define EM_GETEVENTMASK		(WM_USER + 59)
#define EM_GETOLEINTERFACE	(WM_USER + 60)
#define EM_GETPARAFORMAT	(WM_USER + 61)
#define EM_GETSELTEXT		(WM_USER + 62)
#define EM_HIDESELECTION	(WM_USER + 63)
#define EM_PASTESPECIAL		(WM_USER + 64)
#define EM_REQUESTRESIZE	(WM_USER + 65)
#define EM_SELECTIONTYPE	(WM_USER + 66)
#define EM_SETBKGNDCOLOR	(WM_USER + 67)
#define EM_SETCHARFORMAT	(WM_USER + 68)
#define EM_SETEVENTMASK		(WM_USER + 69)
#define EM_SETOLECALLBACK	(WM_USER + 70)
#define EM_SETPARAFORMAT	(WM_USER + 71)
#define EM_SETTARGETDEVICE	(WM_USER + 72)
#define EM_STREAMIN		(WM_USER + 73)
#define EM_STREAMOUT		(WM_USER + 74)
#define EM_GETTEXTRANGE		(WM_USER + 75)
#define EM_FINDWORDBREAK	(WM_USER + 76)
#define EM_SETOPTIONS		(WM_USER + 77)
#define EM_GETOPTIONS		(WM_USER + 78)
#define EM_FINDTEXTEX		(WM_USER + 79)
#define EM_GETWORDBREAKPROCEX	(WM_USER + 80)
#define EM_SETWORDBREAKPROCEX	(WM_USER + 81)

#define EM_SETUNDOLIMIT		(WM_USER + 82)
#define EM_REDO			(WM_USER + 84)
#define EM_CANREDO		(WM_USER + 85)
#define EM_GETUNDONAME		(WM_USER + 86)
#define EM_GETREDONAME		(WM_USER + 87)
#define EM_STOPGROUPTYPING	(WM_USER + 88)

#define EM_SETTEXTMODE		(WM_USER + 89)
#define EM_GETTEXTMODE		(WM_USER + 90)
#define EM_AUTOURLDETECT	(WM_USER + 91)
#define EM_GETAUTOURLDETECT	(WM_USER + 92)
#define EM_SETPALETTE		(WM_USER + 93)
#define EM_GETTEXTEX		(WM_USER + 94)
#define EM_GETTEXTLENGTHEX	(WM_USER + 95)
#define EM_SHOWSCROLLBAR	(WM_USER + 96)
#define EM_SETTEXTEX		(WM_USER + 97)

#define EM_SETPUNCTUATION	(WM_USER + 100)
#define EM_GETPUNCTUATION	(WM_USER + 101)
#define EM_SETWORDWRAPMODE	(WM_USER + 102)
#define EM_GETWORDWRAPMODE	(WM_USER + 103)
#define EM_SETIMECOLOR		(WM_USER + 104)
#define EM_GETIMECOLOR		(WM_USER + 105)
#define EM_SETIMEOPTIONS	(WM_USER + 106)
#define EM_GETIMEOPTIONS	(WM_USER + 107)
#define EM_CONVPOSITION		(WM_USER + 108)

#define EM_SETLANGOPTIONS	(WM_USER + 120)
#define EM_GETLANGOPTIONS	(WM_USER + 121)
#define EM_GETIMECOMPMODE	(WM_USER + 122)

#define EM_FINDTEXTW		(WM_USER + 123)
#define EM_FINDTEXTEXW		(WM_USER + 124)

#define EM_RECONVERSION		(WM_USER + 125)
#define EM_SETIMEMODEBIAS	(WM_USER + 126)
#define EM_GETIMEMODEBIAS	(WM_USER + 127)

#define EM_SETBIDIOPTIONS	(WM_USER + 200)
#define EM_GETBIDIOPTIONS	(WM_USER + 201)

#define EM_SETTYPOGRAPHYOPTIONS (WM_USER + 202)
#define EM_GETTYPOGRAPHYOPTIONS (WM_USER + 203)

#define EM_SETEDITSTYLE		(WM_USER + 204)
#define EM_GETEDITSTYLE		(WM_USER + 205)

#define EM_OUTLINE              (WM_USER + 220)

#define EM_GETSCROLLPOS         (WM_USER + 221)
#define EM_SETSCROLLPOS         (WM_USER + 222)

#define EM_SETFONTSIZE          (WM_USER + 223)
#define EM_GETZOOM		(WM_USER + 224)
#define EM_SETZOOM		(WM_USER + 225)
#define EM_GETVIEWKIND          (WM_USER + 226)
#define EM_SETVIEWKIND          (WM_USER + 227)

#define EM_GETPAGE              (WM_USER + 228)
#define EM_SETPAGE              (WM_USER + 229)
#define EM_GETHYPHENATEINFO     (WM_USER + 230)
#define EM_SETHYPHENATEINFO     (WM_USER + 231)
#define EM_GETPAGEROTATE        (WM_USER + 235)
#define EM_SETPAGEROTATE        (WM_USER + 236)
#define EM_GETCTFMODEBIAS       (WM_USER + 237)
#define EM_SETCTFMODEBIAS       (WM_USER + 238)
#define EM_GETCTFOPENSTATUS     (WM_USER + 240)
#define EM_SETCTFOPENSTATUS     (WM_USER + 241)
#define EM_GETIMECOMPTEXT       (WM_USER + 242)
#define EM_ISIME                (WM_USER + 243)
#define EM_GETIMEPROPERTY       (WM_USER + 244)
#define EM_GETQUERYRTFOBJ       (WM_USER + 269)
#define EM_SETQUERYRTFOBJ       (WM_USER + 270)

/* New notifications */
#define EN_MSGFILTER                    0x0700
#define EN_REQUESTRESIZE                0x0701
#define EN_SELCHANGE                    0x0702
#define EN_DROPFILES                    0x0703
#define EN_PROTECTED                    0x0704
#define EN_CORRECTTEXT                  0x0705
#define EN_STOPNOUNDO                   0x0706
#define EN_IMECHANGE                    0x0707
#define EN_SAVECLIPBOARD                0x0708
#define EN_OLEOPFAILED                  0x0709
#define EN_OBJECTPOSITIONS              0x070a
#define EN_LINK				0x070b
#define EN_DRAGDROPDONE                 0x070c
#define EN_PARAGRAPHEXPANDED		0x070d
#define EN_PAGECHANGE                   0x070e
#define EN_LOWFIRTF                     0x070f
#define EN_ALIGNLTR			0x0710
#define EN_ALIGNRTL			0x0711


typedef DWORD (CALLBACK * EDITSTREAMCALLBACK)( DWORD_PTR, LPBYTE, LONG, LONG * );


#define yHeightCharPtsMost    1638
#define lDefaultTab           720

/* tab stops number limit */
#define MAX_TAB_STOPS         0x00000020

#define MAX_TABLE_CELLS       63

/* Rich edit control styles */
#define ES_NOOLEDRAGDROP      0x00000008
#define ES_DISABLENOSCROLL    0x00002000
#define ES_SUNKEN             0x00004000
#define ES_SAVESEL            0x00008000
#define ES_SELFIME            0x00040000
#define ES_NOIME              0x00080000
#define ES_VERTICAL           0x00400000
#define ES_SELECTIONBAR       0x01000000
#define ES_EX_NOCALLOLEINIT   0x01000000

/* the character formatting options */
#define SCF_DEFAULT           0x00000000
#define SCF_SELECTION         0x00000001
#define SCF_WORD              0x00000002
#define SCF_ALL               0x00000004
#define SCF_USEUIRULES        0x00000008
#define SCF_ASSOCIATEFONT     0x00000010
#define SCF_NOKBUPDATE        0x00000020
#define SCF_ASSOCIATEFONT2    0x00000040

#ifndef WM_NOTIFY
typedef struct _nmhdr
{
    HWND       hwndFrom;
    UINT       idFrom;
    UINT       code;
} NMHDR;
#endif

/* CHARFORMAT structure */
typedef struct _charformat
{
    UINT       cbSize;
    DWORD      dwMask;
    DWORD      dwEffects;
    LONG       yHeight;
    LONG       yOffset;
    COLORREF   crTextColor;
    BYTE       bCharSet;
    BYTE       bPitchAndFamily;
    char       szFaceName[LF_FACESIZE];
} CHARFORMATA;

typedef struct _charformatw
{
    UINT       cbSize;
    DWORD      dwMask;
    DWORD      dwEffects;
    LONG       yHeight;
    LONG       yOffset;
    COLORREF   crTextColor;
    BYTE       bCharSet;
    BYTE       bPitchAndFamily;
    WCHAR      szFaceName[LF_FACESIZE];
} CHARFORMATW;

DECL_WINELIB_TYPE_AW(CHARFORMAT)

typedef struct _charformat2a {
    UINT       cbSize;
    DWORD      dwMask;
    DWORD      dwEffects;
    LONG       yHeight;
    LONG       yOffset;
    COLORREF   crTextColor;
    BYTE       bCharSet;
    BYTE       bPitchAndFamily;
    char       szFaceName[LF_FACESIZE];
    WORD       pad; /* Not in MS's C version, but needed to ensure that wWeight is at the correct offset to match the C++ version */
    WORD       wWeight;
    SHORT      sSpacing;
    COLORREF   crBackColor;
    LCID       lcid;
    DWORD      dwReserved;
    SHORT      sStyle;
    WORD       wKerning;
    BYTE       bUnderlineType;
    BYTE       bAnimation;
    BYTE       bRevAuthor;
} CHARFORMAT2A;

typedef struct _charformat2w {
    UINT       cbSize;
    DWORD      dwMask;
    DWORD      dwEffects;
    LONG       yHeight;
    LONG       yOffset;
    COLORREF   crTextColor;
    BYTE       bCharSet;
    BYTE       bPitchAndFamily;
    WCHAR      szFaceName[LF_FACESIZE];
    WORD       pad; /* Not in MS's C version, but needed to ensure that wWeight is at the correct offset to match the C++ version */
    WORD       wWeight;
    SHORT      sSpacing;
    COLORREF   crBackColor;
    LCID       lcid;
    DWORD      dwReserved;
    SHORT      sStyle;
    WORD       wKerning;
    BYTE       bUnderlineType;
    BYTE       bAnimation;
    BYTE       bRevAuthor;
} CHARFORMAT2W;

DECL_WINELIB_TYPE_AW(CHARFORMAT2)

#define CHARFORMATDELTA       (sizeof(CHARFORMAT2) - sizeof(CHARFORMAT))

/* CHARFORMAT masks */
#define CFM_BOLD              0x00000001
#define CFM_ITALIC            0x00000002
#define CFM_UNDERLINE         0x00000004
#define CFM_STRIKEOUT         0x00000008
#define CFM_PROTECTED         0x00000010
#define CFM_LINK              0x00000020
#define CFM_SMALLCAPS         0x00000040
#define CFM_ALLCAPS           0x00000080
#define CFM_HIDDEN            0x00000100
#define CFM_OUTLINE           0x00000200
#define CFM_SHADOW            0x00000400
#define CFM_EMBOSS            0x00000800
#define CFM_IMPRINT           0x00001000
#define CFM_DISABLED          0x00002000
#define CFM_REVISED           0x00004000
#define CFM_REVAUTHOR         0x00008000
#define CFM_SUBSCRIPT         0x00030000
#define CFM_SUPERSCRIPT       0x00030000
#define CFM_ANIMATION         0x00040000
#define CFM_STYLE             0x00080000
#define CFM_KERNING           0x00100000
#define CFM_SPACING           0x00200000
#define CFM_WEIGHT            0x00400000
#define CFM_UNDERLINETYPE     0x00800000
#define CFM_LCID              0x02000000
#define CFM_BACKCOLOR         0x04000000
#define CFM_CHARSET           0x08000000
#define CFM_OFFSET            0x10000000
#define CFM_FACE              0x20000000
#define CFM_COLOR             0x40000000
#define CFM_SIZE              0x80000000

#define CFM_EFFECTS           (CFM_BOLD | \
                               CFM_ITALIC | \
                               CFM_UNDERLINE | \
                               CFM_COLOR | \
                               CFM_STRIKEOUT | \
                               CFE_PROTECTED | \
                               CFM_LINK)

#define CFM_EFFECTS2          (CFM_EFFECTS | \
                               CFM_DISABLED | \
                               CFM_SMALLCAPS | \
                               CFM_ALLCAPS | \
                               CFM_HIDDEN | \
                               CFM_OUTLINE | \
                               CFM_SHADOW | \
                               CFM_EMBOSS | \
                               CFM_IMPRINT | \
                               CFM_DISABLED | \
                               CFM_REVISED | \
                               CFM_SUBSCRIPT | \
                               CFM_SUPERSCRIPT | \
                               CFM_BACKCOLOR)

#define CFM_ALL               (CFM_EFFECTS | \
                               CFM_SIZE | \
                               CFM_FACE | \
                               CFM_OFFSET | \
                               CFM_CHARSET)

#define CFM_ALL2              (CFM_ALL | \
                               CFM_EFFECTS2 | \
                               CFM_BACKCOLOR | \
                               CFM_LCID | \
                               CFM_UNDERLINETYPE | \
                               CFM_WEIGHT | \
                               CFM_REVAUTHOR | \
                               CFM_SPACING | \
                               CFM_KERNING | \
                               CFM_STYLE | \
                               CFM_ANIMATION)

/* CHARFORMAT effects */
#define CFE_BOLD              0x00000001
#define CFE_ITALIC            0x00000002
#define CFE_UNDERLINE         0x00000004
#define CFE_STRIKEOUT         0x00000008
#define CFE_PROTECTED         0x00000010
#define CFE_LINK              0x00000020
#define CFE_SUBSCRIPT         0x00010000
#define CFE_SUPERSCRIPT       0x00020000
#define CFE_AUTOCOLOR         0x40000000

#define CFE_SMALLCAPS         CFM_SMALLCAPS
#define CFE_ALLCAPS           CFM_ALLCAPS
#define CFE_HIDDEN            CFM_HIDDEN
#define CFE_OUTLINE           CFM_OUTLINE
#define CFE_SHADOW            CFM_SHADOW
#define CFE_EMBOSS            CFM_EMBOSS
#define CFE_IMPRINT           CFM_IMPRINT
#define CFE_DISABLED          CFM_DISABLED
#define CFE_REVISED           CFM_REVISED
#define CFE_AUTOBACKCOLOR     CFM_BACKCOLOR

#define CFU_UNDERLINENONE             0x00
#define CFU_UNDERLINE                 0x01
#define CFU_UNDERLINEWORD             0x02
#define CFU_UNDERLINEDOUBLE           0x03
#define CFU_UNDERLINEDOTTED           0x04
#define CFU_UNDERLINEDASH             0x05
#define CFU_UNDERLINEDASHDOT          0x06
#define CFU_UNDERLINEDASHDOTDOT       0x07
#define CFU_UNDERLINEWAVE             0x08
#define CFU_UNDERLINETHICK            0x09
#define CFU_UNDERLINEHAIRLINE         0x0a
#define CFU_UNDERLINEDOUBLEWAVE       0x0b
#define CFU_UNDERLINEHEAVYWAVE        0x0c
#define CFU_UNDERLINELONGDASH         0x0d
#define CFU_UNDERLINETHICKDASH        0x0e
#define CFU_UNDERLINETHICKDASHDOT     0x0f
#define CFU_UNDERLINETHICKDASHDOTDOT  0x10
#define CFU_UNDERLINETHICKDOTTED      0x11
#define CFU_UNDERLINETHICKLONGDASH    0x12
#define CFU_INVERT                    0xFE
#define CFU_CF1UNDERLINE              0xFF

/* ECO operations */
#define ECOOP_SET             0x0001
#define ECOOP_OR              0x0002
#define ECOOP_AND             0x0003
#define ECOOP_XOR             0x0004

/* edit control options */
#define ECO_AUTOWORDSELECTION 0x00000001
#define ECO_AUTOVSCROLL       0x00000040
#define ECO_AUTOHSCROLL       0x00000080
#define ECO_NOHIDESEL         0x00000100
#define ECO_READONLY          0x00000800
#define ECO_WANTRETURN        0x00001000
#define ECO_SAVESEL           0x00008000
#define ECO_SELECTIONBAR      0x01000000
#define ECO_VERTICAL          0x00400000

/* Event notification masks */
#define ENM_NONE              0x00000000
#define ENM_CHANGE            0x00000001
#define ENM_UPDATE            0x00000002
#define ENM_SCROLL            0x00000004
#define ENM_SCROLLEVENTS      0x00000008
#define ENM_DRAGDROPDONE      0x00000010
#define ENM_PARAGRAPHEXPANDED 0x00000020
#define ENM_PAGECHANGE        0x00000040
#define ENM_KEYEVENTS         0x00010000
#define ENM_MOUSEEVENTS       0x00020000
#define ENM_REQUESTRESIZE     0x00040000
#define ENM_SELCHANGE         0x00080000
#define ENM_DROPFILES         0x00100000
#define ENM_PROTECTED         0x00200000
#define ENM_CORRECTTEXT       0x00400000
#define ENM_IMECHANGE         0x00800000
#define ENM_LANGCHANGE        0x01000000
#define ENM_OBJECTPOSITIONS   0x02000000
#define ENM_LINK              0x04000000
#define ENM_LOWFIRTF          0x08000000

typedef struct _bidioptions
{
    UINT    cbSize;
    WORD    wMask;
    WORD    wEffects;
} BIDIOPTIONS;

#ifndef __RICHEDIT_CHARRANGE_DEFINED
#define __RICHEDIT_CHARRANGE_DEFINED

typedef struct _charrange
{
    LONG    cpMin;
    LONG    cpMax;
} CHARRANGE;

#endif /* __RICHEDIT_CHARRANGE_DEFINED */

typedef struct _textrange
{
    CHARRANGE chrg;
    LPSTR     lpstrText;
} TEXTRANGEA;

typedef struct _textrangew
{
    CHARRANGE chrg;
    LPWSTR     lpstrText;
} TEXTRANGEW;

DECL_WINELIB_TYPE_AW(TEXTRANGE)

typedef struct _editstream
{
    DWORD_PTR		dwCookie;
    DWORD		dwError;
    EDITSTREAMCALLBACK	pfnCallback;
} EDITSTREAM;

typedef struct _compcolor {
    COLORREF   crText;
    COLORREF   crBackground;
    DWORD      dwEffects;
} COMPCOLOR;

typedef struct _encorrecttext {
    NMHDR      nmhdr;
    CHARRANGE  chrg;
    WORD       seltyp;
} ENCORRECTTEXT;

typedef struct _endropfiles {
    NMHDR      nmhdr;
    HANDLE     hDrop;
    LONG       cp;
    BOOL       fProtected;
} ENDROPFILES;

typedef struct _enlink {
    NMHDR      nmhdr;
    UINT       msg;
    WPARAM     wParam;
    LPARAM     lParam;
    CHARRANGE  chrg;
} ENLINK;

typedef struct _enlowfirtf {
    NMHDR      nmhdr;
    char       *szControl;
} ENLOWFIRTF;

typedef struct {
    NMHDR      nmhdr;
    LONG       iob;
    LONG       lOper;
    HRESULT    hr;
} ENOLEOPFAILED;

typedef struct _enprotected {
    NMHDR      nmhdr;
    UINT       msg;
    WPARAM     wParam;
    LPARAM     lParam;
    CHARRANGE  chrg;
} ENPROTECTED, *LPENPROTECTED;

typedef struct _ensaveclipboard {
    NMHDR      nmhdr;
    LONG       cObjectCount;
    LONG       cch;
} ENSAVECLIPBOARD;

typedef struct _findtextA {
    CHARRANGE  chrg;
    LPCSTR     lpstrText;
} FINDTEXTA;

typedef struct _findtextW {
    CHARRANGE  chrg;
    LPCWSTR    lpstrText;
} FINDTEXTW;

DECL_WINELIB_TYPE_AW(FINDTEXT)

typedef struct _findtextexA {
    CHARRANGE  chrg;
    LPCSTR     lpstrText;
    CHARRANGE  chrgText;
} FINDTEXTEXA;

typedef struct _findtextexW {
    CHARRANGE  chrg;
    LPCWSTR    lpstrText;
    CHARRANGE  chrgText;
} FINDTEXTEXW;

DECL_WINELIB_TYPE_AW(FINDTEXTEX)

typedef struct _formatrange {
    HDC        hdc;
    HDC        hdcTarget;
    RECT       rc;
    RECT       rcPage;
    CHARRANGE  chrg;
} FORMATRANGE;

typedef enum tagKHYPH
{
    khyphNil           = 0,
    khyphNormal        = 1,
    khyphAddBefore     = 2,
    khyphChangeBefore  = 3,
    khyphDeleteBefore  = 4,
    khyphChangeAfter   = 5,
    khyphDelAndChange  = 6
} KHYPH;

typedef struct hyphresult
{
    KHYPH      khyph;
    LONG       ichHyph;
    WCHAR      chHyph;
} HYPHRESULT;

typedef struct tagHyphenateInfo
{
    SHORT      cbSize;
    SHORT      dxHyphenateZone;
    void       (WINAPI* pfnHyphenate)(WCHAR*, LANGID, LONG, HYPHRESULT*);
} HYPHENATEINFO;

typedef struct _msgfilter {
    NMHDR      nmhdr;
    UINT       msg;
    WPARAM     wParam;
    LPARAM     lParam;
} MSGFILTER;

typedef struct _objectpositions {
    NMHDR      nmhdr;
    LONG       cObjectCount;
    LONG       *pcpPositions;
} OBJECTPOSITIONS;

typedef struct _paraformat {
    UINT       cbSize;
    DWORD      dwMask;
    WORD       wNumbering;
    WORD       wReserved;
    LONG       dxStartIndent;
    LONG       dxRightIndent;
    LONG       dxOffset;
    WORD       wAlignment;
    SHORT      cTabCount;
    LONG       rgxTabs[MAX_TAB_STOPS];
} PARAFORMAT;

typedef struct _paraformat2 {
    UINT       cbSize;
    DWORD      dwMask;
    WORD       wNumbering;
    WORD       wEffects;
    LONG       dxStartIndent;
    LONG       dxRightIndent;
    LONG       dxOffset;
    WORD       wAlignment;
    SHORT      cTabCount;
    LONG       rgxTabs[MAX_TAB_STOPS];
    LONG       dySpaceBefore, dySpaceAfter, dyLineSpacing;
    SHORT      sStyle;
    BYTE       bLineSpacingRule, bOutlineLevel;
    WORD       wShadingWeight, wShadingStyle;
    WORD       wNumberingStart, wNumberingStyle, wNumberingTab;
    WORD       wBorderSpace, wBorderWidth, wBorders;
} PARAFORMAT2;

typedef struct _selchange {
    NMHDR      nmhdr;
    CHARRANGE  chrg;
    WORD       seltyp;
} SELCHANGE;

typedef struct _reqresize {
    NMHDR      nmhdr;
    RECT       rc;
} REQRESIZE;

typedef struct _repastespecial {
    DWORD      dwAspect;
    DWORD_PTR  dwParam;
} REPASTESPECIAL;

typedef struct _punctuation {
    UINT       iSize;
    LPSTR      szPunctuation;
} PUNCTUATION;

typedef struct _gettextex {
    DWORD      cb;
    DWORD      flags;
    UINT       codepage;
    LPCSTR     lpDefaultChar;
    LPBOOL     lpUsedDefChar;
} GETTEXTEX;

typedef struct _imecomptext {
    LONG       cb;
    DWORD      flags;
} IMECOMPTEXT;

void WINAPI HyphenateProc(WCHAR*, LANGID, LONG, HYPHRESULT*);

#define SF_TEXT		      0x00000001
#define SF_RTF		      0x00000002
#define SF_RTFNOOBJS	      0x00000003
#define SF_TEXTIZED	      0x00000004
#define SF_UNICODE            0x00000010
#define SF_USECODEPAGE        0x00000020
#define SF_NCRFORNONASCII     0x00000040
#define SF_RTFVAL             0x00000700

/* BIDIOPTIONS.wMask flag values */
#define BOM_DEFPARADIR        0x00000001
#define BOM_PLAINTEXT         0x00000002
#define BOM_NEUTRALOVERRIDE   0x00000004
#define BOM_CONTEXTREADING    0x00000008
#define BOM_CONTEXTALIGNMENT  0x00000010
#define BOM_LEGACYBIDICLASS   0x00000040

/* BIDIOPTIONS.wEffects flag values */
#define BOE_RTLDIR            0x00000001
#define BOE_PLAINTEXT         0x00000002
#define BOE_NEUTRALOVERRIDE   0x00000004
#define BOE_CONTEXTREADING    0x00000008
#define BOE_CONTEXTALIGNMENT  0x00000010
#define BOE_LEGACYBIDICLASS   0x00000040

/* Clipboard formats */
#define CF_RTF          TEXT("Rich Text Format")
#define CF_RTFNOOBJS    TEXT("Rich Text Format Without Objects")
#define CF_RETEXTOBJ    TEXT("RichEdit Text and Objects")

/* Mode bias wParam values for EM_SETCTFMODEBIAS message */
#define CTFMODEBIAS_DEFAULT                0x00000000
#define CTFMODEBIAS_FILENAME               0x00000001
#define CTFMODEBIAS_NAME                   0x00000002
#define CTFMODEBIAS_READING                0x00000003
#define CTFMODEBIAS_DATETIME               0x00000004
#define CTFMODEBIAS_CONVERSATION           0x00000005
#define CTFMODEBIAS_NUMERIC                0x00000006
#define CTFMODEBIAS_HIRAGANA               0x00000007
#define CTFMODEBIAS_KATAKANA               0x00000008
#define CTFMODEBIAS_HANGUL                 0x00000009
#define CTFMODEBIAS_HALFWIDTHKATAKANA      0x0000000a
#define CTFMODEBIAS_FULLWIDTHALPHANUMERIC  0x0000000b
#define CTFMODEBIAS_HALFWIDTHALPHANUMERIC  0x0000000c

#define EMO_EXIT              0x00000000
#define EMO_ENTER             0x00000001
#define EMO_PROMOTE           0x00000002
#define EMO_EXPAND            0x00000003
#define EMO_MOVESELECTION     0x00000004
#define EMO_GETVIEWMODE       0x00000005

#define EMO_EXPANDSELECTION   0x00000000
#define EMO_EXPANDDOCUMENT    0x00000001

/* Page Rotate values used in wParam of EM_SETPAGEROTATE message */
#define EPR_0                 0x00000000
#define EPR_270               0x00000001
#define EPR_180               0x00000002
#define EPR_90                0x00000003

/* Find flags for wParam of EM_FINDTEXT message */
#define FR_MATCHDIAC          0x20000000
#define FR_MATCHKASHIDA       0x40000000
#define FR_MATCHALEFHAMZA     0x80000000

/* IME Compatibility Mode return values for EM_GETIMECOMPMODE message */
#define ICM_NOTOPEN           0x00000000
#define ICM_LEVEL3            0x00000001
#define ICM_LEVEL2            0x00000002
#define ICM_LEVEL2_5          0x00000003
#define ICM_LEVEL2_SUI        0x00000004
#define ICM_CTF               0x00000005

/* Flags value for IMECOMPTEXT structure */
#define ICT_RESULTREADSTR     0x00000001

/* Input Method Flags used in EM_SETLANGOPTIONS message */
#define IMF_AUTOKEYBOARD        0x00000001
#define IMF_AUTOFONT            0x00000002
#define IMF_IMECANCELCOMPLETE   0x00000004
#define IMF_IMEALWAYSSENDNOTIFY 0x00000008
#define IMF_AUTOFONTSIZEADJUST  0x00000010
#define IMF_UIFONTS             0x00000020
#define IMF_DUALFONT            0x00000080

/* Parameters values for the EM_SETIMEMODEBIAS message */
#define IMF_SMODE_PLAURALCLAUSE 0x00000001
#define IMF_SMODE_NONE          0x00000002

/* Parameters of the EM_SETIMEOPTIONS message */
#define IMF_FORCENONE         0x00000001
#define IMF_FORCEENABLE       0x00000002
#define IMF_FORCEDISABLE      0x00000004
#define IMF_CLOSESTATUSWINDOW 0x00000008
#define IMF_VERTICAL          0x00000020
#define IMF_FORCEACTIVE       0x00000040
#define IMF_FORCEINACTIVE     0x00000080
#define IMF_FORCEREMEMBER     0x00000100
#define IMF_MULTIPLEEDIT      0x00000400

/* return values of the EM_SELECTION_TYPE message */
#define SEL_EMPTY             0x00000000
#define SEL_TEXT              0x00000001
#define SEL_OBJECT            0x00000002
#define SEL_MULTICHAR         0x00000004
#define SEL_MULTIOBJECT       0x00000008

/* ENOLEOPFAILED.lOper value that indicates operation failure */
#define OLEOP_DOVERB          0x00000001

/* punctionation type values for wParam of EM_SETPUNCTUATION message */
#define PC_FOLLOWING          0x00000001
#define PC_LEADING            0x00000002
#define PC_OVERFLOW           0x00000003
#define PC_DELIMITER          0x00000004

/* mask values in the PARAFORMAT structure */
#define PFM_STARTINDENT       0x00000001
#define PFM_RIGHTINDENT       0x00000002
#define PFM_OFFSET            0x00000004
#define PFM_ALIGNMENT         0x00000008
#define PFM_TABSTOPS          0x00000010
#define PFM_NUMBERING         0x00000020
#define PFM_OFFSETINDENT      0x80000000

/* mask values in the PARAFORMAT2 structure */
#define PFM_SPACEBEFORE       0x00000040
#define PFM_SPACEAFTER        0x00000080
#define PFM_LINESPACING       0x00000100
#define PFM_STYLE             0x00000400
#define PFM_BORDER            0x00000800
#define PFM_SHADING           0x00001000
#define PFM_NUMBERINGSTYLE    0x00002000
#define PFM_NUMBERINGTAB      0x00004000
#define PFM_NUMBERINGSTART    0x00008000
#define PFM_RTLPARA           0x00010000
#define PFM_KEEP              0x00020000
#define PFM_KEEPNEXT          0x00040000
#define PFM_PAGEBREAKBEFORE   0x00080000
#define PFM_NOLINENUMBER      0x00100000
#define PFM_NOWIDOWCONTROL    0x00200000
#define PFM_DONOTHYPHEN       0x00400000
#define PFM_SIDEBYSIDE        0x00800000
#define PFM_COLLAPSED         0x01000000
#define PFM_OUTLINELEVEL      0x02000000
#define PFM_BOX               0x04000000
#define PFM_RESERVED2         0x08000000
#define PFM_TABLEROWDELIMITER 0x10000000
#define PFM_TEXTWRAPPINGBREAK 0x20000000
#define PFM_TABLE             0x40000000

#define PFM_ALL               (PFM_STARTINDENT | \
                               PFM_RIGHTINDENT | \
                               PFM_OFFSET | \
                               PFM_ALIGNMENT | \
                               PFM_TABSTOPS | \
                               PFM_NUMBERING | \
                               PFM_OFFSETINDENT | \
                               PFM_RTLPARA)

#define PFM_EFFECTS           (PFM_RTLPARA | \
                               PFM_KEEP | \
                               PFM_KEEPNEXT | \
                               PFM_PAGEBREAKBEFORE | \
                               PFM_NOLINENUMBER | \
                               PFM_NOWIDOWCONTROL | \
                               PFM_DONOTHYPHEN | \
                               PFM_SIDEBYSIDE | \
                               PFM_TABLEROWDELIMITER | \
                               PFM_TABLE)

#define PFM_ALL2              (PFM_ALL | \
                               PFM_EFFECTS | \
                               PFM_SPACEBEFORE | \
                               PFM_SPACEAFTER | \
                               PFM_LINESPACING | \
                               PFM_STYLE | \
                               PFM_BORDER | \
                               PFM_SHADING | \
                               PFM_NUMBERINGSTYLE | \
                               PFM_NUMBERINGTAB | \
                               PFM_NUMBERINGSTART)

/* numbering option */
#define PFN_BULLET            0x00000001
#define PFN_ARABIC            0x00000002
#define PFN_LCLETTER          0x00000003
#define PFN_UCLETTER          0x00000004
#define PFN_LCROMAN           0x00000005
#define PFN_UCROMAN           0x00000006

/* paragraph format numbering styles */
#define PFNS_PAREN            0x00000000
#define PFNS_PARENS           0x00000100
#define PFNS_PERIOD           0x00000200
#define PFNS_PLAIN            0x00000300
#define PFNS_NONUMBER         0x00000400
#define PFNS_NEWNUMBER        0x00008000

/* paragraph alignment */
#define PFA_LEFT              0x00000001
#define PFA_RIGHT             0x00000002
#define PFA_CENTER            0x00000003
#define PFA_JUSTIFY           0x00000004
#define PFA_FULL_INTERWORD    0x00000004
#define PFA_FULL_INTERLETTER  0x00000005
#define PFA_FULL_SCALED       0x00000006
#define PFA_FULL_GLYPHS       0x00000007
#define PFA_SNAP_GRID         0x00000008

/* paragraph effects */
#define PFE_RTLPARA           0x00000001
#define PFE_KEEP              0x00000002
#define PFE_KEEPNEXT          0x00000004
#define PFE_PAGEBREAKBEFORE   0x00000008
#define PFE_NOLINENUMBER      0x00000010
#define PFE_NOWIDOWCONTROL    0x00000020
#define PFE_DONOTHYPHEN       0x00000040
#define PFE_SIDEBYSIDE        0x00000080
#define PFE_COLLAPSED         0x00000100
#define PFE_BOX               0x00000400
#define PFE_TABLEROWDELIMITER 0x00001000
#define PFE_TEXTWRAPPINGBREAK 0x00002000
#define PFE_TABLE             0x00004000

/* Set Edit Style flags for EM_SETEDITSTYLE message */
#define SES_EMULATESYSEDIT      0x00000001
#define SES_BEEPONMAXTEXT       0x00000002
#define SES_EXTENDBACKCOLOR     0x00000004
#define SES_MAPCPS              0x00000008
#define SES_EMULATE10           0x00000010
#define SES_USECRLF             0x00000020
#define SES_NOXLTSYMBOLRANGE    0x00000020
#define SES_USEAIMM             0x00000040
#define SES_NOIME               0x00000080
#define SES_ALLOWBEEPS          0x00000100
#define SES_UPPERCASE           0x00000200
#define SES_LOWERCASE           0x00000400
#define SES_NOINPUTSEQUENCECHK  0x00000800
#define SES_BIDI                0x00001000
#define SES_SCROLLONKILLFOCUS   0x00002000
#define SES_XLTCRCRLFTOCR       0x00004000
#define SES_DRAFTMODE           0x00008000
#define SES_USECTF              0x00010000
#define SES_HIDEGRIDLINES       0x00020000
#define SES_USEATFONT           0x00040000
#define SES_CUSTOMLOOK          0x00080000
#define SES_LBSCROLLNOTIFY      0x00100000
#define SES_CTFALLOWEMBED       0x00200000
#define SES_CTFALLOWSMARTTAG    0x00400000
#define SES_CTFALLOWPROOFING    0x00800000

/* streaming flags */
#define SFF_WRITEXTRAPAR      0x00000080
#define SFF_PWD               0x00000800
#define SFF_KEEPDOCINFO       0x00001000
#define SFF_PERSISTVIEWSCALE  0x00002000
#define SFF_PLAINRTF          0x00004000
#define SFF_SELECTION         0x00008000

typedef enum _undonameid
{
    UID_UNKNOWN     = 0,
    UID_TYPING      = 1,
    UID_DELETE      = 2,
    UID_DRAGDROP    = 3,
    UID_CUT         = 4,
    UID_PASTE       = 5,
    UID_AUTOCORRECT = 6
} UNDONAMEID;

typedef LONG (*EDITWORDBREAKPROCEX)(char*,LONG,BYTE,INT);

#define VM_OUTLINE            0x00000002
#define VM_NORMAL             0x00000004
#define VM_PAGE               0x00000009

/* options of the EM_FINDWORDBREAK message */
#define WB_CLASSIFY           0x00000003
#define WB_MOVEWORDLEFT       0x00000004
#define WB_MOVEWORDPREV       0x00000004
#define WB_MOVEWORDRIGHT      0x00000005
#define WB_MOVEWORDNEXT       0x00000005
#define WB_LEFTBREAK          0x00000006
#define WB_PREVBREAK          0x00000006
#define WB_RIGHTBREAK         0x00000007
#define WB_NEXTBREAK          0x00000007

/* options of the EM_SETWORDWRAPMODE message */
#define WBF_WORDWRAP          0x00000010
#define WBF_WORDBREAK         0x00000020
#define WBF_OVERFLOW          0x00000040
#define WBF_LEVEL1            0x00000080
#define WBF_LEVEL2            0x00000100
#define WBF_CUSTOM            0x00000200

#define WBF_CLASS             ((BYTE) 0x0F)
#define WBF_ISWHITE           ((BYTE) 0x10)
#define WBF_BREAKLINE         ((BYTE) 0x20)
#define WBF_BREAKAFTER        ((BYTE) 0x40)

/* Placeholder unicode character for an embedded object */
#ifndef WCH_EMBEDDING
#define WCH_EMBEDDING         (WCHAR)0xFFFC
#endif

/* options of the EM_SETTEXTMODE message */
#define TM_PLAINTEXT          0x00000001
#define TM_RICHTEXT           0x00000002
#define TM_SINGLELEVELUNDO    0x00000004
#define TM_MULTILEVELUNDO     0x00000008
#define TM_SINGLECODEPAGE     0x00000010
#define TM_MULTICODEPAGE      0x00000020

/* GETTEXTEX structure flags */
#define GT_DEFAULT            0x00000000
#define GT_USECRLF            0x00000001
#define GT_SELECTION          0x00000002
#define GT_RAWTEXT            0x00000004
#define GT_NOHIDDENTEXT       0x00000008

/* Options of the EM_SETTYPOGRAPHYOPTIONS message */
#define TO_ADVANCEDTYPOGRAPHY   0x00000001
#define TO_SIMPLELINEBREAK      0x00000002
#define TO_DISABLECUSTOMTEXTOUT 0x00000004
#define TO_ADVANCEDLAYOUT       0x00000008

typedef struct _gettextlengthex {
    DWORD      flags;
    UINT       codepage;
} GETTEXTLENGTHEX;

/* Flags of the GETTEXTLENGTHEX structure */
#define GTL_DEFAULT           0x00000000
#define GTL_USECRLF           0x00000001
#define GTL_PRECISE           0x00000002
#define GTL_CLOSE             0x00000004
#define GTL_NUMCHARS          0x00000008
#define GTL_NUMBYTES          0x00000010

#define GCM_RIGHTMOUSEDROP    0x8000

/* Options of the EM_SETTEXTEX message */
typedef struct _settextex {
    DWORD	flags;
    UINT	codepage;
} SETTEXTEX;

/* Flags of the EM_SETTEXTEX message */
#define ST_DEFAULT	      0x00000000	
#define ST_KEEPUNDO           0x00000001
#define ST_SELECTION          0x00000002
#define ST_NEWCHARS           0x00000004
#define ST_UNICODE            0x00000008

/* Flags for EM_AUTOURLDETECT message */
#define AURL_ENABLEURL            0x00000001
#define AURL_ENABLEMAILADDR       0x00000002
#define AURL_ENABLETELNO          0x00000004
#define AURL_ENABLEEAURLS         0x00000008
#define AURL_ENABLEDRIVELETTERS   0x00000010
#define AURL_DISABLEMIXEDLGC      0x00000020

#ifdef __cplusplus
}
#endif

#include <poppack.h>

#endif /* __WINE_RICHEDIT_H */