/* * RichEdit - structures and constant * * Copyright 2004 by Krzysztof Foltman * * 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 __EDITSTR_H #define __EDITSTR_H #ifndef _WIN32_IE #define _WIN32_IE 0x0400 #endif #include #include #include #include #define COBJMACROS #define NONAMELESSUNION #define NONAMELESSSTRUCT #include #include #include #include #include #include #include #include #include #include #include "wine/debug.h" typedef struct tagME_String { WCHAR *szData; int nLen, nBuffer; } ME_String; typedef struct tagME_Style { CHARFORMAT2W fmt; HFONT hFont; /* cached font for the style */ TEXTMETRICW tm; /* cached font metrics for the style */ int nRefs; /* reference count */ int nSequence; /* incremented when cache needs to be rebuilt, ie. every screen redraw */ } ME_Style; typedef enum { diInvalid, diTextStart, /* start of the text buffer */ diParagraph, /* paragraph start */ diRun, /* run (sequence of chars with the same character format) */ diStartRow, /* start of the row (line of text on the screen) */ diTextEnd, /* end of the text buffer */ /********************* these below are meant for finding only *********************/ diStartRowOrParagraph, /* 5 */ diStartRowOrParagraphOrEnd, diRunOrParagraph, diRunOrStartRow, diParagraphOrEnd, diRunOrParagraphOrEnd, /* 10 */ diUndoInsertRun, /* 11 */ diUndoDeleteRun, /* 12 */ diUndoJoinParagraphs, /* 13 */ diUndoSplitParagraph, /* 14 */ diUndoSetParagraphFormat, /* 15 */ diUndoSetCharFormat, /* 16 */ diUndoEndTransaction, /* 17 */ diUndoSetDefaultCharFormat, /* 18 */ } ME_DIType; /******************************** run flags *************************/ #define MERF_STYLEFLAGS 0x0FFF /* run contains non-text content, which has its own rules for wrapping, sizing etc */ #define MERF_GRAPHICS 1 /* run is a tab (or, in future, any kind of content whose size is dependent on run position) */ #define MERF_TAB 2 /* run is a cell boundary */ #define MERF_CELL 4 #define MERF_NONTEXT (MERF_GRAPHICS | MERF_TAB | MERF_CELL) /* run is splittable (contains white spaces in the middle or end) */ #define MERF_SPLITTABLE 0x001000 /* run starts with whitespaces */ #define MERF_STARTWHITE 0x002000 /* run ends with whitespaces */ #define MERF_ENDWHITE 0x004000 /* run is completely made of whitespaces */ #define MERF_WHITESPACE 0x008000 /* run is a last (dummy) run in the paragraph */ #define MERF_SKIPPED 0x010000 /* flags that are calculated during text wrapping */ #define MERF_CALCBYWRAP 0x0F0000 /* the "end of paragraph" run, contains 1 character */ #define MERF_ENDPARA 0x100000 /* run is hidden */ #define MERF_HIDDEN 0x200000 /* runs with any of these flags set cannot be joined */ #define MERF_NOJOIN (MERF_GRAPHICS|MERF_TAB|MERF_ENDPARA) /* runs that don't contain real text */ #define MERF_NOTEXT (MERF_GRAPHICS|MERF_TAB|MERF_ENDPARA) /* those flags are kept when the row is split */ #define MERF_SPLITMASK (~(0)) /******************************** para flags *************************/ /* this paragraph was already wrapped and hasn't changed, every change resets that flag */ #define MEPF_REWRAP 1 #define MEPF_REPAINT 2 /******************************** structures *************************/ struct tagME_DisplayItem; typedef struct tagME_Run { ME_String *strText; ME_Style *style; int nCharOfs; /* relative to para's offset */ int nWidth; /* width of full run, width of leading&trailing ws */ int nFlags; int nAscent, nDescent; /* pixels above/below baseline */ POINT pt; /* relative to para's position */ struct tagME_TableCell *pCell; /* for MERF_CELL: points to respective cell in ME_Paragraph */ } ME_Run; typedef struct tagME_Document { struct tagME_DisplayItem *def_char_style; struct tagME_DisplayItem *def_para_style; int last_wrapped_line; } ME_Document; typedef struct tagME_TableCell { int nRightBoundary; struct tagME_TableCell *next; } ME_TableCell; typedef struct tagME_Paragraph { PARAFORMAT2 *pFmt; BOOL bTable; /* this paragraph is a table row */ struct tagME_TableCell *pCells; /* list of cells and their properties */ struct tagME_TableCell *pLastCell; /* points to the last cell in the list */ int nLeftMargin, nRightMargin, nFirstMargin; int nCharOfs; int nFlags; int nYPos, nHeight; int nLastPaintYPos, nLastPaintHeight; int nRows; struct tagME_DisplayItem *prev_para, *next_para, *document; } ME_Paragraph; typedef struct tagME_Row { int nHeight; int nBaseline; int nWidth; int nLMargin; int nRMargin; int nYPos; } ME_Row; /* the display item list layout is like this: * - the document consists of paragraphs * - each paragraph contains at least one run, the last run in the paragraph * is an end-of-paragraph run * - each formatted paragraph contains at least one row, which corresponds * to a screen line (that's why there are no rows in an unformatted * paragraph * - the paragraphs contain "shortcut" pointers to the previous and the next * paragraph, that makes iteration over paragraphs faster * - the list starts with diTextStart and ends with diTextEnd */ typedef struct tagME_DisplayItem { ME_DIType type; struct tagME_DisplayItem *prev, *next; union { ME_Run run; ME_Row row; ME_Paragraph para; ME_Document doc; /* not used */ ME_Style *ustyle; /* used by diUndoSetCharFormat */ } member; } ME_DisplayItem; typedef struct tagME_UndoItem { ME_DisplayItem di; int nStart, nLen; } ME_UndoItem; typedef struct tagME_TextBuffer { ME_DisplayItem *pFirst, *pLast; ME_Style *pCharStyle; ME_Style *pDefaultStyle; } ME_TextBuffer; typedef struct tagME_Cursor { ME_DisplayItem *pRun; int nOffset; } ME_Cursor; typedef enum { umAddToUndo, umAddToRedo, umIgnore, umAddBackToUndo } ME_UndoMode; typedef struct tagME_FontTableItem { BYTE bCharSet; WCHAR *szFaceName; } ME_FontTableItem; #define STREAMIN_BUFFER_SIZE 4096 /* M$ compatibility */ struct tagME_InStream { EDITSTREAM *editstream; DWORD dwSize; DWORD dwUsed; char buffer[STREAMIN_BUFFER_SIZE]; }; typedef struct tagME_InStream ME_InStream; #define STREAMOUT_BUFFER_SIZE 4096 #define STREAMOUT_FONTTBL_SIZE 8192 #define STREAMOUT_COLORTBL_SIZE 1024 typedef struct tagME_OutStream { EDITSTREAM *stream; char buffer[STREAMOUT_BUFFER_SIZE]; UINT pos, written; UINT nCodePage; UINT nFontTblLen; ME_FontTableItem fonttbl[STREAMOUT_FONTTBL_SIZE]; UINT nColorTblLen; COLORREF colortbl[STREAMOUT_COLORTBL_SIZE]; UINT nDefaultFont; UINT nDefaultCodePage; } ME_OutStream; typedef struct tagME_FontCacheItem { LOGFONTW lfSpecs; HFONT hFont; int nRefs; int nAge; } ME_FontCacheItem; #define HFONT_CACHE_SIZE 10 typedef struct tagME_TextEditor { HWND hWnd; BOOL bEmulateVersion10; BOOL bCaretShown; ME_TextBuffer *pBuffer; ME_Cursor *pCursors; int nCursors; SIZE sizeWindow; int nTotalLength, nLastTotalLength; int nUDArrowX; int nSequence; COLORREF rgbBackColor; HBRUSH hbrBackground; BOOL bCaretAtEnd; int nEventMask; int nModifyStep; ME_DisplayItem *pUndoStack, *pRedoStack, *pUndoStackBottom; int nUndoStackSize; int nUndoLimit; ME_UndoMode nUndoMode; int nParagraphs; int nLastSelStart, nLastSelEnd; ME_DisplayItem *pLastSelStartPara, *pLastSelEndPara; ME_FontCacheItem pFontCache[HFONT_CACHE_SIZE]; int nZoomNumerator, nZoomDenominator; RECT rcFormat; BOOL bRedraw; int nInvalidOfs; int nTextLimit; EDITWORDBREAKPROCW pfnWordBreak; LPRICHEDITOLECALLBACK lpOleCallback; /*TEXTMODE variable; contains only one of each of the following options: *TM_RICHTEXT or TM_PLAINTEXT *TM_SINGLELEVELUNDO or TM_MULTILEVELUNDO *TM_SINGLECODEPAGE or TM_MULTICODEPAGE*/ int mode; BOOL bHideSelection; BOOL AutoURLDetect_bEnable; WCHAR cPasswordMask; } ME_TextEditor; typedef struct tagME_Context { HDC hDC; POINT pt; POINT ptRowOffset; RECT rcView; HBRUSH hbrMargin; /* those are valid inside ME_WrapTextParagraph and related */ POINT ptFirstRun; ME_TextEditor *editor; int nSequence; } ME_Context; typedef struct tagME_WrapContext { ME_Style *style; ME_Context *context; int nLeftMargin, nRightMargin, nFirstMargin; int nTotalWidth, nAvailWidth; int nRow; POINT pt; BOOL bOverflown; ME_DisplayItem *pRowStart; ME_DisplayItem *pLastSplittableRun; POINT ptLastSplittableRun; } ME_WrapContext; #endif