/**
 * Windows API header module
 *
 * Translated from MinGW Windows headers
 *
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
 * Source: $(DRUNTIMESRC src/core/sys/windows/_richedit.d)
 */
module core.sys.windows.richedit;
version (Windows):
@system:

version (ANSI) {} else version = Unicode;

import core.sys.windows.windef, core.sys.windows.winuser;
import core.sys.windows.wingdi; // for LF_FACESIZE

align(4):

version (Unicode) {
const wchar[] RICHEDIT_CLASS = "RichEdit20W";
} else {
const char[] RICHEDIT_CLASS  = "RichEdit20A";
}

enum RICHEDIT_CLASS10A = "RICHEDIT";

const TCHAR[]
    CF_RTF       = "Rich Text Format",
    CF_RTFNOOBJS = "Rich Text Format Without Objects",
    CF_RETEXTOBJ = "RichEdit Text and Objects";

enum DWORD
    CFM_BOLD        = 1,
    CFM_ITALIC      = 2,
    CFM_UNDERLINE   = 4,
    CFM_STRIKEOUT   = 8,
    CFM_PROTECTED   = 16,
    CFM_LINK        = 32,
    CFM_SIZE        = 0x80000000,
    CFM_COLOR       = 0x40000000,
    CFM_FACE        = 0x20000000,
    CFM_OFFSET      = 0x10000000,
    CFM_CHARSET     = 0x08000000,
    CFM_SUBSCRIPT   = 0x00030000,
    CFM_SUPERSCRIPT = 0x00030000;

enum DWORD
    CFE_BOLD        = 1,
    CFE_ITALIC      = 2,
    CFE_UNDERLINE   = 4,
    CFE_STRIKEOUT   = 8,
    CFE_PROTECTED   = 16,
    CFE_SUBSCRIPT   = 0x00010000,
    CFE_SUPERSCRIPT = 0x00020000,
    CFE_AUTOCOLOR   = 0x40000000;

enum CFM_EFFECTS = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_COLOR
  | CFM_STRIKEOUT | CFE_PROTECTED | CFM_LINK;

// flags for EM_SETIMEOPTIONS
enum LPARAM
    IMF_FORCENONE         = 1,
    IMF_FORCEENABLE       = 2,
    IMF_FORCEDISABLE      = 4,
    IMF_CLOSESTATUSWINDOW = 8,
    IMF_VERTICAL          = 32,
    IMF_FORCEACTIVE       = 64,
    IMF_FORCEINACTIVE     = 128,
    IMF_FORCEREMEMBER     = 256;

enum SEL_EMPTY=0;
enum SEL_TEXT=1;
enum SEL_OBJECT=2;
enum SEL_MULTICHAR=4;
enum SEL_MULTIOBJECT=8;

enum MAX_TAB_STOPS=32;

enum PFM_ALIGNMENT=8;
enum PFM_NUMBERING=32;
enum PFM_OFFSET=4;
enum PFM_OFFSETINDENT=0x80000000;
enum PFM_RIGHTINDENT=2;
enum PFM_STARTINDENT=1;
enum PFM_TABSTOPS=16;
enum PFM_BORDER=2048;
enum PFM_LINESPACING=256;
enum PFM_NUMBERINGSTART=32768;
enum PFM_NUMBERINGSTYLE=8192;
enum PFM_NUMBERINGTAB=16384;
enum PFM_SHADING=4096;
enum PFM_SPACEAFTER=128;
enum PFM_SPACEBEFORE=64;
enum PFM_STYLE=1024;
enum PFM_DONOTHYPHEN=4194304;
enum PFM_KEEP=131072;
enum PFM_KEEPNEXT=262144;
enum PFM_NOLINENUMBER=1048576;
enum PFM_NOWIDOWCONTROL=2097152;
enum PFM_PAGEBREAKBEFORE=524288;
enum PFM_RTLPARA=65536;
enum PFM_SIDEBYSIDE=8388608;
enum PFM_TABLE=1073741824;
enum PFN_BULLET=1;

enum PFE_DONOTHYPHEN=64;
enum PFE_KEEP=2;
enum PFE_KEEPNEXT=4;
enum PFE_NOLINENUMBER=16;
enum PFE_NOWIDOWCONTROL=32;
enum PFE_PAGEBREAKBEFORE=8;
enum PFE_RTLPARA=1;
enum PFE_SIDEBYSIDE=128;
enum PFE_TABLE=16384;
enum PFA_LEFT=1;
enum PFA_RIGHT=2;
enum PFA_CENTER=3;
enum PFA_JUSTIFY=4;
enum PFA_FULL_INTERWORD=4;

enum SF_TEXT=1;
enum SF_RTF=2;
enum SF_RTFNOOBJS=3;
enum SF_TEXTIZED=4;
enum SF_UNICODE=16;
enum SF_USECODEPAGE=32;
enum SF_NCRFORNONASCII=64;
enum SF_RTFVAL=0x0700;

enum SFF_PWD=0x0800;
enum SFF_KEEPDOCINFO=0x1000;
enum SFF_PERSISTVIEWSCALE=0x2000;
enum SFF_PLAINRTF=0x4000;
enum SFF_SELECTION=0x8000;

enum WB_CLASSIFY      = 3;
enum WB_MOVEWORDLEFT  = 4;
enum WB_MOVEWORDRIGHT = 5;
enum WB_LEFTBREAK     = 6;
enum WB_RIGHTBREAK    = 7;
enum WB_MOVEWORDPREV  = 4;
enum WB_MOVEWORDNEXT  = 5;
enum WB_PREVBREAK     = 6;
enum WB_NEXTBREAK     = 7;

enum WBF_WORDWRAP  = 16;
enum WBF_WORDBREAK = 32;
enum WBF_OVERFLOW  = 64;
enum WBF_LEVEL1    = 128;
enum WBF_LEVEL2    = 256;
enum WBF_CUSTOM    = 512;

enum ES_DISABLENOSCROLL  = 8192;
enum ES_SUNKEN           = 16384;
enum ES_SAVESEL          = 32768;
enum ES_EX_NOCALLOLEINIT = 16777216;
enum ES_NOIME            = 524288;
enum ES_NOOLEDRAGDROP    = 8;
enum ES_SELECTIONBAR     = 16777216;
enum ES_SELFIME          = 262144;
enum ES_VERTICAL         = 4194304;

enum EM_CANPASTE = WM_USER+50;
enum EM_DISPLAYBAND = WM_USER+51;
enum EM_EXGETSEL = WM_USER+52;
enum EM_EXLIMITTEXT = WM_USER+53;
enum EM_EXLINEFROMCHAR = WM_USER+54;
enum EM_EXSETSEL = WM_USER+55;
enum EM_FINDTEXT = WM_USER+56;
enum EM_FORMATRANGE = WM_USER+57;
enum EM_GETCHARFORMAT = WM_USER+58;
enum EM_GETEVENTMASK = WM_USER+59;
enum EM_GETOLEINTERFACE = WM_USER+60;
enum EM_GETPARAFORMAT = WM_USER+61;
enum EM_GETSELTEXT = WM_USER+62;
enum EM_HIDESELECTION = WM_USER+63;
enum EM_PASTESPECIAL = WM_USER+64;
enum EM_REQUESTRESIZE = WM_USER+65;
enum EM_SELECTIONTYPE = WM_USER+66;
enum EM_SETBKGNDCOLOR = WM_USER+67;
enum EM_SETCHARFORMAT = WM_USER+68;
enum EM_SETEVENTMASK = WM_USER+69;
enum EM_SETOLECALLBACK = WM_USER+70;
enum EM_SETPARAFORMAT = WM_USER+71;
enum EM_SETTARGETDEVICE = WM_USER+72;
enum EM_STREAMIN = WM_USER+73;
enum EM_STREAMOUT = WM_USER+74;
enum EM_GETTEXTRANGE = WM_USER+75;
enum EM_FINDWORDBREAK = WM_USER+76;
enum EM_SETOPTIONS = WM_USER+77;
enum EM_GETOPTIONS = WM_USER+78;
enum EM_FINDTEXTEX = WM_USER+79;
enum EM_GETWORDBREAKPROCEX = WM_USER+80;
enum EM_SETWORDBREAKPROCEX = WM_USER+81;
/* RichEdit 2.0 messages */
enum EM_SETUNDOLIMIT = WM_USER+82;
enum EM_REDO = WM_USER+84;
enum EM_CANREDO = WM_USER+85;
enum EM_GETUNDONAME = WM_USER+86;
enum EM_GETREDONAME = WM_USER+87;
enum EM_STOPGROUPTYPING = WM_USER+88;
enum EM_SETTEXTMODE = WM_USER+89;
enum EM_GETTEXTMODE = WM_USER+90;
enum EM_AUTOURLDETECT = WM_USER+91;
enum EM_GETAUTOURLDETECT = WM_USER + 92;
enum EM_SETPALETTE = WM_USER + 93;
enum EM_GETTEXTEX = WM_USER+94;
enum EM_GETTEXTLENGTHEX = WM_USER+95;
enum EM_SHOWSCROLLBAR = WM_USER+96;
enum EM_SETTEXTEX = WM_USER + 97;
enum EM_SETPUNCTUATION = WM_USER + 100;
enum EM_GETPUNCTUATION = WM_USER + 101;
enum EM_SETWORDWRAPMODE = WM_USER + 102;
enum EM_GETWORDWRAPMODE = WM_USER + 103;
enum EM_SETIMECOLOR = WM_USER + 104;
enum EM_GETIMECOLOR = WM_USER + 105;
enum EM_SETIMEOPTIONS = WM_USER + 106;
enum EM_GETIMEOPTIONS = WM_USER + 107;
enum EM_SETLANGOPTIONS = WM_USER+120;
enum EM_GETLANGOPTIONS = WM_USER+121;
enum EM_GETIMECOMPMODE = WM_USER+122;
enum EM_FINDTEXTW = WM_USER + 123;
enum EM_FINDTEXTEXW = WM_USER + 124;
enum EM_RECONVERSION = WM_USER + 125;
enum EM_SETBIDIOPTIONS = WM_USER + 200;
enum EM_GETBIDIOPTIONS = WM_USER + 201;
enum EM_SETTYPOGRAPHYOPTIONS = WM_USER+202;
enum EM_GETTYPOGRAPHYOPTIONS = WM_USER+203;
enum EM_SETEDITSTYLE = WM_USER + 204;
enum EM_GETEDITSTYLE = WM_USER + 205;
enum EM_GETSCROLLPOS = WM_USER+221;
enum EM_SETSCROLLPOS = WM_USER+222;
enum EM_SETFONTSIZE = WM_USER+223;
enum EM_GETZOOM = WM_USER+224;
enum EM_SETZOOM = WM_USER+225;

enum EN_MSGFILTER     = 1792;
enum EN_REQUESTRESIZE = 1793;
enum EN_SELCHANGE     = 1794;
enum EN_DROPFILES     = 1795;
enum EN_PROTECTED     = 1796;
enum EN_CORRECTTEXT   = 1797;
enum EN_STOPNOUNDO    = 1798;
enum EN_IMECHANGE     = 1799;
enum EN_SAVECLIPBOARD = 1800;
enum EN_OLEOPFAILED   = 1801;
enum EN_LINK          = 1803;

enum ENM_NONE            = 0;
enum ENM_CHANGE          = 1;
enum ENM_UPDATE          = 2;
enum ENM_SCROLL          = 4;
enum ENM_SCROLLEVENTS    = 8;
enum ENM_DRAGDROPDONE    = 16;
enum ENM_KEYEVENTS       = 65536;
enum ENM_MOUSEEVENTS     = 131072;
enum ENM_REQUESTRESIZE   = 262144;
enum ENM_SELCHANGE       = 524288;
enum ENM_DROPFILES       = 1048576;
enum ENM_PROTECTED       = 2097152;
enum ENM_CORRECTTEXT     = 4194304;
enum ENM_IMECHANGE       = 8388608;
enum ENM_LANGCHANGE      = 16777216;
enum ENM_OBJECTPOSITIONS = 33554432;
enum ENM_LINK            = 67108864;

enum ECO_AUTOWORDSELECTION=1;
enum ECO_AUTOVSCROLL=64;
enum ECO_AUTOHSCROLL=128;
enum ECO_NOHIDESEL=256;
enum ECO_READONLY=2048;
enum ECO_WANTRETURN=4096;
enum ECO_SAVESEL=0x8000;
enum ECO_SELECTIONBAR=0x1000000;
enum ECO_VERTICAL=0x400000;

enum {
    ECOOP_SET = 1,
    ECOOP_OR,
    ECOOP_AND,
    ECOOP_XOR
}

enum SCF_DEFAULT    = 0;
enum SCF_SELECTION  = 1;
enum SCF_WORD       = 2;
enum SCF_ALL        = 4;
enum SCF_USEUIRULES = 8;

alias DWORD TEXTMODE;
enum TM_PLAINTEXT=1;
enum TM_RICHTEXT=2;
enum TM_SINGLELEVELUNDO=4;
enum TM_MULTILEVELUNDO=8;
enum TM_SINGLECODEPAGE=16;
enum TM_MULTICODEPAGE=32;

enum GT_DEFAULT=0;
enum GT_USECRLF=1;

enum yHeightCharPtsMost=1638;
enum lDefaultTab=720;

alias DWORD UNDONAMEID;
enum UID_UNKNOWN    = 0;
enum UID_TYPING     = 1;
enum UID_DELETE     = 2;
enum UID_DRAGDROP   = 3;
enum UID_CUT        = 4;
enum UID_PASTE      = 5;

struct CHARFORMATA {
    UINT cbSize = this.sizeof;
    DWORD dwMask;
    DWORD dwEffects;
    LONG yHeight;
    LONG yOffset;
    COLORREF crTextColor;
    BYTE bCharSet;
    BYTE bPitchAndFamily;
    char[LF_FACESIZE] szFaceName = 0;
}
struct CHARFORMATW {
    UINT cbSize = this.sizeof;
    DWORD dwMask;
    DWORD dwEffects;
    LONG yHeight;
    LONG yOffset;
    COLORREF crTextColor;
    BYTE bCharSet;
    BYTE bPitchAndFamily;
    WCHAR[LF_FACESIZE] szFaceName = 0;
}

struct CHARFORMAT2A {
    UINT cbSize = this.sizeof;
    DWORD dwMask;
    DWORD dwEffects;
    LONG yHeight;
    LONG yOffset;
    COLORREF crTextColor;
    BYTE bCharSet;
    BYTE bPitchAndFamily;
    char[LF_FACESIZE] szFaceName = 0;
    WORD wWeight;
    SHORT sSpacing;
    COLORREF crBackColor;
    LCID lcid;
    DWORD dwReserved;
    SHORT sStyle;
    WORD wKerning;
    BYTE bUnderlineType;
    BYTE bAnimation;
    BYTE bRevAuthor;
}

struct CHARFORMAT2W {
    UINT cbSize = this.sizeof;
    DWORD dwMask;
    DWORD dwEffects;
    LONG yHeight;
    LONG yOffset;
    COLORREF crTextColor;
    BYTE bCharSet;
    BYTE bPitchAndFamily;
    WCHAR[LF_FACESIZE] szFaceName = 0;
    WORD wWeight;
    SHORT sSpacing;
    COLORREF crBackColor;
    LCID lcid;
    DWORD dwReserved;
    SHORT sStyle;
    WORD wKerning;
    BYTE bUnderlineType;
    BYTE bAnimation;
    BYTE bRevAuthor;
}

struct CHARRANGE {
    LONG cpMin;
    LONG cpMax;
}

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

extern (Windows) {
    alias DWORD function(DWORD_PTR,PBYTE,LONG,LONG*) EDITSTREAMCALLBACK;
}

struct EDITSTREAM {
align(4):
    DWORD_PTR dwCookie;
    DWORD dwError;
    EDITSTREAMCALLBACK pfnCallback;
}

struct ENCORRECTTEXT {
align(4):
    NMHDR nmhdr;
    CHARRANGE chrg;
    WORD seltyp;
}

struct ENDROPFILES {
align(4):
    NMHDR nmhdr;
    HANDLE hDrop;
    LONG cp;
    BOOL fProtected;
}

struct ENLINK {
align(4):
    NMHDR nmhdr;
    UINT msg;
    WPARAM wParam;
    LPARAM lParam;
    CHARRANGE chrg;
}

struct ENOLEOPFAILED {
align(4):
    NMHDR nmhdr;
    LONG iob;
    LONG lOper;
    HRESULT hr;
}

struct ENPROTECTED {
align(4):
    NMHDR nmhdr;
    UINT msg;
    WPARAM wParam;
    LPARAM lParam;
    CHARRANGE chrg;
}
alias ENPROTECTED* LPENPROTECTED;

struct ENSAVECLIPBOARD {
align(4):
    NMHDR nmhdr;
    LONG cObjectCount;
    LONG cch;
}

struct FINDTEXTA {
    CHARRANGE chrg;
    LPSTR lpstrText;
}

struct FINDTEXTW {
    CHARRANGE chrg;
    LPWSTR lpstrText;
}

struct FINDTEXTEXA {
    CHARRANGE chrg;
    LPSTR lpstrText;
    CHARRANGE chrgText;
}

struct FINDTEXTEXW {
    CHARRANGE chrg;
    LPWSTR lpstrText;
    CHARRANGE chrgText;
}

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

struct MSGFILTER {
align(4):
    NMHDR nmhdr;
    UINT msg;
    WPARAM wParam;
    LPARAM lParam;
}

struct PARAFORMAT {
    UINT cbSize = this.sizeof;
    DWORD dwMask;
    WORD wNumbering;
    WORD wReserved;
    LONG dxStartIndent;
    LONG dxRightIndent;
    LONG dxOffset;
    WORD wAlignment;
    SHORT cTabCount;
    LONG[MAX_TAB_STOPS] rgxTabs;
}

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

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

struct TEXTRANGEA {
    CHARRANGE chrg;
    LPSTR lpstrText;
}

struct TEXTRANGEW {
    CHARRANGE chrg;
    LPWSTR lpstrText;
}

struct REQRESIZE {
    NMHDR nmhdr;
    RECT rc;
}

struct REPASTESPECIAL {
align(4):
    DWORD dwAspect;
    DWORD_PTR dwParam;
}

struct PUNCTUATION {
align(4):
    UINT iSize;
    LPSTR szPunctuation;
}

struct GETTEXTEX {
align(4):
    DWORD cb;
    DWORD flags;
    UINT codepage;
    LPCSTR lpDefaultChar;
    LPBOOL lpUsedDefChar;
}

extern (Windows) {
alias LONG function(char*,LONG,BYTE,INT) EDITWORDBREAKPROCEX;
}

/* Defines for EM_SETTYPOGRAPHYOPTIONS */
enum TO_ADVANCEDTYPOGRAPHY = 1;
enum TO_SIMPLELINEBREAK    = 2;

/* Defines for GETTEXTLENGTHEX */
enum GTL_DEFAULT  = 0;
enum GTL_USECRLF  = 1;
enum GTL_PRECISE  = 2;
enum GTL_CLOSE    = 4;
enum GTL_NUMCHARS = 8;
enum GTL_NUMBYTES = 16;

struct GETTEXTLENGTHEX {
align(4):
    DWORD flags;
    UINT codepage;
}

version (Unicode) {
    alias CHARFORMATW CHARFORMAT;
    alias CHARFORMAT2W CHARFORMAT2;
    alias FINDTEXTW FINDTEXT;
    alias FINDTEXTEXW FINDTEXTEX;
    alias TEXTRANGEW TEXTRANGE;
} else {
    alias CHARFORMATA CHARFORMAT;
    alias CHARFORMAT2A CHARFORMAT2;
    alias FINDTEXTA FINDTEXT;
    alias FINDTEXTEXA FINDTEXTEX;
    alias TEXTRANGEA TEXTRANGE;
}
