Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / dll / win32 / riched20 / editstr.h
diff --git a/dll/win32/riched20/editstr.h b/dll/win32/riched20/editstr.h
new file mode 100644 (file)
index 0000000..ac7ca31
--- /dev/null
@@ -0,0 +1,423 @@
+/*
+ * 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
+
+#ifdef __i386__
+extern const struct ITextHostVtbl itextHostStdcallVtbl DECLSPEC_HIDDEN;
+#endif /* __i386__ */
+
+typedef struct tagME_String
+{
+  WCHAR *szData;
+  int nLen, nBuffer;
+  void (*free)(struct tagME_String *);
+} ME_String;
+
+typedef struct tagME_FontCacheItem
+{
+  LOGFONTW lfSpecs;
+  HFONT hFont;
+  int nRefs;
+  int nAge;
+} ME_FontCacheItem;
+
+#define HFONT_CACHE_SIZE 10
+
+typedef struct tagME_Style
+{
+  CHARFORMAT2W fmt;
+
+  ME_FontCacheItem *font_cache; /* cached font for the style */
+  TEXTMETRICW tm; /* cached font metrics for the style */
+  int nRefs; /* reference count */
+  SCRIPT_CACHE script_cache;
+  struct list entry;
+} ME_Style;
+
+typedef enum {
+  diInvalid,
+  diTextStart, /* start of the text buffer */
+  diParagraph, /* paragraph start */
+  diCell, /* cell 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, /* 7 */
+  diStartRowOrParagraphOrEnd,
+  diRunOrParagraph,
+  diRunOrStartRow,
+  diParagraphOrEnd,
+  diRunOrParagraphOrEnd, /* 12 */
+} ME_DIType;
+
+#define SELECTIONBAR_WIDTH 8
+
+/******************************** run flags *************************/
+#define MERF_STYLEFLAGS 0x0FFF
+/* run contains non-text content, which has its own rules for wrapping, sizing etc */
+#define MERF_GRAPHICS   0x001
+/* run is a tab (or, in future, any kind of content whose size is dependent on run position) */
+#define MERF_TAB        0x002
+/* run is a cell boundary */
+#define MERF_ENDCELL    0x004 /* v4.1 */
+
+#define MERF_NONTEXT (MERF_GRAPHICS | MERF_TAB | MERF_ENDCELL)
+
+/* 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
+/* the "end of paragraph" run, contains 1 character */
+#define MERF_ENDPARA    0x100000
+/* forcing the "end of row" run, contains 1 character */
+#define MERF_ENDROW     0x200000
+/* run is hidden */
+#define MERF_HIDDEN     0x400000
+/* start of a table row has an empty paragraph that should be skipped over. */
+#define MERF_TABLESTART 0x800000 /* v4.1 */
+
+/* runs with any of these flags set cannot be joined */
+#define MERF_NOJOIN (MERF_GRAPHICS|MERF_TAB|MERF_ENDPARA|MERF_ENDROW)
+/* runs that don't contain real text */
+#define MERF_NOTEXT (MERF_GRAPHICS|MERF_TAB|MERF_ENDPARA|MERF_ENDROW)
+
+/* 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   0x01
+/* v4.1 */
+#define MEPF_CELL     0x04 /* The paragraph is nested in a cell */
+#define MEPF_ROWSTART 0x08 /* Hidden empty paragraph at the start of the row */
+#define MEPF_ROWEND   0x10 /* Visible empty paragraph at the end of the row */
+#define MEPF_COMPLEX  0x20 /* Use uniscribe */
+
+/******************************** structures *************************/
+
+struct tagME_DisplayItem;
+
+typedef struct tagME_Run
+{
+  ME_Style *style;
+  struct tagME_Paragraph *para; /* ptr to the run's paragraph */
+  int nCharOfs; /* relative to para's offset */
+  int len;      /* length of run's text */
+  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 */
+  REOBJECT *ole_obj; /* FIXME: should be a union with strText (at least) */
+
+  SCRIPT_ANALYSIS script_analysis;
+  int num_glyphs, max_glyphs;
+  WORD *glyphs;
+  SCRIPT_VISATTR *vis_attrs;
+  int *advances;
+  GOFFSET *offsets;
+  int max_clusters;
+  WORD *clusters;
+} ME_Run;
+
+typedef struct tagME_Border
+{
+  int width;
+  COLORREF colorRef;
+} ME_Border;
+
+typedef struct tagME_BorderRect
+{
+  ME_Border top;
+  ME_Border left;
+  ME_Border bottom;
+  ME_Border right;
+} ME_BorderRect;
+
+struct para_num
+{
+    ME_Style *style;
+    ME_String *text;
+    INT width;
+    POINT pt;
+};
+
+typedef struct tagME_Paragraph
+{
+  PARAFORMAT2 fmt;
+  ME_String *text;
+
+  struct tagME_DisplayItem *pCell; /* v4.1 */
+  ME_BorderRect border;
+
+  int nCharOfs;
+  int nFlags;
+  POINT pt;
+  int nHeight, nWidth;
+  int nRows;
+  struct para_num para_num;
+  ME_Run *eop_run; /* ptr to the end-of-para run */
+  struct tagME_DisplayItem *prev_para, *next_para;
+} ME_Paragraph;
+
+typedef struct tagME_Cell /* v4.1 */
+{
+  int nNestingLevel; /* 0 for normal cells, and greater for nested cells */
+  int nRightBoundary;
+  ME_BorderRect border;
+  POINT pt;
+  int nHeight, nWidth;
+  int yTextOffset; /* The text offset is caused by the largest top border. */
+  struct tagME_DisplayItem *prev_cell, *next_cell, *parent_cell;
+} ME_Cell;
+
+typedef struct tagME_Row
+{
+  int nHeight;
+  int nBaseline;
+  int nWidth;
+  int nLMargin;
+  int nRMargin;
+  POINT pt;
+} 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_Cell cell;
+    ME_Paragraph para;
+  } member;
+} ME_DisplayItem;
+
+typedef struct tagME_TextBuffer
+{
+  ME_DisplayItem *pFirst, *pLast;
+  ME_Style *pCharStyle;
+  ME_Style *pDefaultStyle;
+} ME_TextBuffer;
+
+typedef struct tagME_Cursor
+{
+  ME_DisplayItem *pPara;
+  ME_DisplayItem *pRun;
+  int nOffset;
+} ME_Cursor;
+
+typedef enum {
+  umAddToUndo,
+  umAddToRedo,
+  umIgnore,
+  umAddBackToUndo
+} ME_UndoMode;
+
+enum undo_type
+{
+    undo_insert_run,
+    undo_delete_run,
+    undo_join_paras,
+    undo_split_para,
+    undo_set_para_fmt,
+    undo_set_char_fmt,
+    undo_end_transaction,          /* marks the end of a group of changes for undo */
+    undo_potential_end_transaction /* allows grouping typed chars for undo */
+};
+
+struct insert_run_item
+{
+    int pos, len;
+    WCHAR *str;
+    ME_Style *style;
+    DWORD flags;
+};
+
+struct delete_run_item
+{
+    int pos, len;
+};
+
+struct join_paras_item
+{
+    int pos;
+};
+
+struct split_para_item
+{
+    int pos;
+    PARAFORMAT2 fmt;
+    ME_BorderRect border;
+    ME_String *eol_str;
+    DWORD flags;
+    ME_BorderRect cell_border;
+    int cell_right_boundary;
+};
+
+struct set_para_fmt_item
+{
+    int pos;
+    PARAFORMAT2 fmt;
+    ME_BorderRect border;
+};
+
+struct set_char_fmt_item
+{
+    int pos, len;
+    CHARFORMAT2W fmt;
+};
+
+struct undo_item
+{
+    struct list entry;
+    enum undo_type type;
+    union
+    {
+        struct insert_run_item insert_run;
+        struct delete_run_item delete_run;
+        struct join_paras_item join_paras;
+        struct split_para_item split_para;
+        struct set_para_fmt_item set_para_fmt;
+        struct set_char_fmt_item set_char_fmt;
+    } u;
+};
+
+typedef enum {
+  stPosition = 0,
+  stWord,
+  stLine,
+  stParagraph,
+  stDocument
+} ME_SelectionType;
+
+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;
+
+typedef struct tagME_TextEditor
+{
+  HWND hWnd, hwndParent;
+  ITextHost *texthost;
+  IRichEditOle *reOle;
+  BOOL bEmulateVersion10;
+  ME_TextBuffer *pBuffer;
+  ME_Cursor *pCursors;
+  DWORD styleFlags;
+  DWORD exStyleFlags;
+  int nCursors;
+  SIZE sizeWindow;
+  int nTotalLength, nLastTotalLength;
+  int nTotalWidth, nLastTotalWidth;
+  int nAvailWidth; /* 0 = wrap to client area, else wrap width in twips */
+  int nUDArrowX;
+  COLORREF rgbBackColor;
+  HBRUSH hbrBackground;
+  BOOL bCaretAtEnd;
+  int nEventMask;
+  int nModifyStep;
+  struct list undo_stack;
+  struct list redo_stack;
+  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 prevClientRect;
+  RECT rcFormat;
+  BOOL bDefaultFormatRect;
+  BOOL bWordWrap;
+  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;
+  BOOL bHaveFocus;
+  BOOL bDialogMode; /* Indicates that we are inside a dialog window */
+  /*for IME */
+  int imeStartIndex;
+  DWORD selofs; /* The size of the selection bar on the left side of control */
+  ME_SelectionType nSelectionType;
+
+  /* Track previous notified selection */
+  CHARRANGE notified_cr;
+
+  /* Cache previously set scrollbar info */
+  SCROLLINFO vert_si, horz_si;
+
+  BOOL bMouseCaptured;
+  int wheel_remain;
+  struct list style_list;
+} ME_TextEditor;
+
+typedef struct tagME_Context
+{
+  HDC hDC;
+  POINT pt;
+  RECT rcView;
+  SIZE dpi;
+  int nAvailWidth;
+
+  /* those are valid inside ME_WrapTextParagraph and related */
+  ME_TextEditor *editor;
+} ME_Context;
+
+#endif