1 /* 2 * RichEdit - structures and constant 3 * 4 * Copyright 2004 by Krzysztof Foltman 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 */ 20 21 #ifndef __EDITSTR_H 22 #define __EDITSTR_H 23 24 #include <assert.h> 25 #include <stdarg.h> 26 #include <stdio.h> 27 #include <stdlib.h> 28 #include <limits.h> 29 30 #define COBJMACROS 31 32 #include <windef.h> 33 #include <winbase.h> 34 #include <winnls.h> 35 #include <winnt.h> 36 #include <wingdi.h> 37 #include <winuser.h> 38 #include <richedit.h> 39 #include <commctrl.h> 40 #include <ole2.h> 41 #include <richole.h> 42 #include "imm.h" 43 #include <textserv.h> 44 #include "usp10.h" 45 46 #include "wine/debug.h" 47 #include "wine/heap.h" 48 #include "wine/list.h" 49 50 #if defined(__i386__) && !defined(__MINGW32__) 51 extern const struct ITextHostVtbl itextHostStdcallVtbl DECLSPEC_HIDDEN; 52 #endif /* __i386__ */ 53 54 typedef struct tagME_String 55 { 56 WCHAR *szData; 57 int nLen, nBuffer; 58 void (*free)(struct tagME_String *); 59 } ME_String; 60 61 typedef struct tagME_FontCacheItem 62 { 63 LOGFONTW lfSpecs; 64 HFONT hFont; 65 int nRefs; 66 int nAge; 67 } ME_FontCacheItem; 68 69 #define HFONT_CACHE_SIZE 10 70 71 typedef struct tagME_Style 72 { 73 CHARFORMAT2W fmt; 74 75 ME_FontCacheItem *font_cache; /* cached font for the style */ 76 TEXTMETRICW tm; /* cached font metrics for the style */ 77 int nRefs; /* reference count */ 78 SCRIPT_CACHE script_cache; 79 struct list entry; 80 } ME_Style; 81 82 typedef enum { 83 diInvalid, 84 diTextStart, /* start of the text buffer */ 85 diParagraph, /* paragraph start */ 86 diCell, /* cell start */ 87 diRun, /* run (sequence of chars with the same character format) */ 88 diStartRow, /* start of the row (line of text on the screen) */ 89 diTextEnd, /* end of the text buffer */ 90 91 /********************* these below are meant for finding only *********************/ 92 diStartRowOrParagraph, /* 7 */ 93 diStartRowOrParagraphOrEnd, 94 diRunOrParagraph, 95 diRunOrStartRow, 96 diParagraphOrEnd, 97 diRunOrParagraphOrEnd, /* 12 */ 98 } ME_DIType; 99 100 #define SELECTIONBAR_WIDTH 8 101 102 /******************************** run flags *************************/ 103 #define MERF_STYLEFLAGS 0x0FFF 104 /* run contains non-text content, which has its own rules for wrapping, sizing etc */ 105 #define MERF_GRAPHICS 0x001 106 /* run is a tab (or, in future, any kind of content whose size is dependent on run position) */ 107 #define MERF_TAB 0x002 108 /* run is a cell boundary */ 109 #define MERF_ENDCELL 0x004 /* v4.1 */ 110 111 #define MERF_NONTEXT (MERF_GRAPHICS | MERF_TAB | MERF_ENDCELL) 112 113 /* run is splittable (contains white spaces in the middle or end) */ 114 #define MERF_SPLITTABLE 0x001000 115 /* run starts with whitespaces */ 116 #define MERF_STARTWHITE 0x002000 117 /* run ends with whitespaces */ 118 #define MERF_ENDWHITE 0x004000 119 /* run is completely made of whitespaces */ 120 #define MERF_WHITESPACE 0x008000 121 /* the "end of paragraph" run, contains 1 character */ 122 #define MERF_ENDPARA 0x100000 123 /* forcing the "end of row" run, contains 1 character */ 124 #define MERF_ENDROW 0x200000 125 /* run is hidden */ 126 #define MERF_HIDDEN 0x400000 127 /* start of a table row has an empty paragraph that should be skipped over. */ 128 #define MERF_TABLESTART 0x800000 /* v4.1 */ 129 130 /* runs with any of these flags set cannot be joined */ 131 #define MERF_NOJOIN (MERF_GRAPHICS|MERF_TAB|MERF_ENDPARA|MERF_ENDROW) 132 /* runs that don't contain real text */ 133 #define MERF_NOTEXT (MERF_GRAPHICS|MERF_TAB|MERF_ENDPARA|MERF_ENDROW) 134 135 /* those flags are kept when the row is split */ 136 #define MERF_SPLITMASK (~(0)) 137 138 /******************************** para flags *************************/ 139 140 /* this paragraph was already wrapped and hasn't changed, every change resets that flag */ 141 #define MEPF_REWRAP 0x01 142 /* v4.1 */ 143 #define MEPF_CELL 0x04 /* The paragraph is nested in a cell */ 144 #define MEPF_ROWSTART 0x08 /* Hidden empty paragraph at the start of the row */ 145 #define MEPF_ROWEND 0x10 /* Visible empty paragraph at the end of the row */ 146 #define MEPF_COMPLEX 0x20 /* Use uniscribe */ 147 148 /******************************** structures *************************/ 149 150 struct tagME_DisplayItem; 151 152 struct re_object 153 { 154 struct list entry; 155 REOBJECT obj; 156 }; 157 158 typedef struct tagME_Run 159 { 160 ME_Style *style; 161 struct tagME_Paragraph *para; /* ptr to the run's paragraph */ 162 int nCharOfs; /* relative to para's offset */ 163 int len; /* length of run's text */ 164 int nWidth; /* width of full run, width of leading&trailing ws */ 165 int nFlags; 166 int nAscent, nDescent; /* pixels above/below baseline */ 167 POINT pt; /* relative to para's position */ 168 struct re_object *reobj; /* FIXME: should be a union with strText (at least) */ 169 170 SCRIPT_ANALYSIS script_analysis; 171 int num_glyphs, max_glyphs; 172 WORD *glyphs; 173 SCRIPT_VISATTR *vis_attrs; 174 int *advances; 175 GOFFSET *offsets; 176 int max_clusters; 177 WORD *clusters; 178 } ME_Run; 179 180 typedef struct tagME_Border 181 { 182 int width; 183 COLORREF colorRef; 184 } ME_Border; 185 186 typedef struct tagME_BorderRect 187 { 188 ME_Border top; 189 ME_Border left; 190 ME_Border bottom; 191 ME_Border right; 192 } ME_BorderRect; 193 194 struct para_num 195 { 196 ME_Style *style; 197 ME_String *text; 198 INT width; 199 POINT pt; 200 }; 201 202 typedef struct tagME_Paragraph 203 { 204 PARAFORMAT2 fmt; 205 ME_String *text; 206 207 struct tagME_DisplayItem *pCell; /* v4.1 */ 208 ME_BorderRect border; 209 210 int nCharOfs; 211 int nFlags; 212 POINT pt; 213 int nHeight, nWidth; 214 int nRows; 215 struct para_num para_num; 216 ME_Run *eop_run; /* ptr to the end-of-para run */ 217 struct tagME_DisplayItem *prev_para, *next_para; 218 struct tagME_DisplayItem *prev_marked, *next_marked; 219 } ME_Paragraph; 220 221 typedef struct tagME_Cell /* v4.1 */ 222 { 223 int nNestingLevel; /* 0 for normal cells, and greater for nested cells */ 224 int nRightBoundary; 225 ME_BorderRect border; 226 POINT pt; 227 int nHeight, nWidth; 228 int yTextOffset; /* The text offset is caused by the largest top border. */ 229 struct tagME_DisplayItem *prev_cell, *next_cell, *parent_cell; 230 } ME_Cell; 231 232 typedef struct tagME_Row 233 { 234 int nHeight; 235 int nBaseline; 236 int nWidth; 237 int nLMargin; 238 int nRMargin; 239 POINT pt; 240 } ME_Row; 241 242 /* the display item list layout is like this: 243 * - the document consists of paragraphs 244 * - each paragraph contains at least one run, the last run in the paragraph 245 * is an end-of-paragraph run 246 * - each formatted paragraph contains at least one row, which corresponds 247 * to a screen line (that's why there are no rows in an unformatted 248 * paragraph 249 * - the paragraphs contain "shortcut" pointers to the previous and the next 250 * paragraph, that makes iteration over paragraphs faster 251 * - the list starts with diTextStart and ends with diTextEnd 252 */ 253 254 typedef struct tagME_DisplayItem 255 { 256 ME_DIType type; 257 struct tagME_DisplayItem *prev, *next; 258 union { 259 ME_Run run; 260 ME_Row row; 261 ME_Cell cell; 262 ME_Paragraph para; 263 } member; 264 } ME_DisplayItem; 265 266 typedef struct tagME_TextBuffer 267 { 268 ME_DisplayItem *pFirst, *pLast; 269 ME_Style *pCharStyle; 270 ME_Style *pDefaultStyle; 271 } ME_TextBuffer; 272 273 typedef struct tagME_Cursor 274 { 275 ME_DisplayItem *pPara; 276 ME_DisplayItem *pRun; 277 int nOffset; 278 } ME_Cursor; 279 280 typedef enum { 281 umAddToUndo, 282 umAddToRedo, 283 umIgnore, 284 umAddBackToUndo 285 } ME_UndoMode; 286 287 enum undo_type 288 { 289 undo_insert_run, 290 undo_delete_run, 291 undo_join_paras, 292 undo_split_para, 293 undo_set_para_fmt, 294 undo_set_char_fmt, 295 undo_end_transaction, /* marks the end of a group of changes for undo */ 296 undo_potential_end_transaction /* allows grouping typed chars for undo */ 297 }; 298 299 struct insert_run_item 300 { 301 int pos, len; 302 WCHAR *str; 303 ME_Style *style; 304 DWORD flags; 305 }; 306 307 struct delete_run_item 308 { 309 int pos, len; 310 }; 311 312 struct join_paras_item 313 { 314 int pos; 315 }; 316 317 struct split_para_item 318 { 319 int pos; 320 PARAFORMAT2 fmt; 321 ME_BorderRect border; 322 ME_String *eol_str; 323 DWORD flags; 324 ME_BorderRect cell_border; 325 int cell_right_boundary; 326 }; 327 328 struct set_para_fmt_item 329 { 330 int pos; 331 PARAFORMAT2 fmt; 332 ME_BorderRect border; 333 }; 334 335 struct set_char_fmt_item 336 { 337 int pos, len; 338 CHARFORMAT2W fmt; 339 }; 340 341 struct undo_item 342 { 343 struct list entry; 344 enum undo_type type; 345 union 346 { 347 struct insert_run_item insert_run; 348 struct delete_run_item delete_run; 349 struct join_paras_item join_paras; 350 struct split_para_item split_para; 351 struct set_para_fmt_item set_para_fmt; 352 struct set_char_fmt_item set_char_fmt; 353 } u; 354 }; 355 356 typedef enum { 357 stPosition = 0, 358 stWord, 359 stLine, 360 stParagraph, 361 stDocument 362 } ME_SelectionType; 363 364 typedef struct tagME_FontTableItem { 365 BYTE bCharSet; 366 WCHAR *szFaceName; 367 } ME_FontTableItem; 368 369 370 #define STREAMIN_BUFFER_SIZE 4096 /* M$ compatibility */ 371 372 struct tagME_InStream { 373 EDITSTREAM *editstream; 374 DWORD dwSize; 375 DWORD dwUsed; 376 char buffer[STREAMIN_BUFFER_SIZE]; 377 }; 378 typedef struct tagME_InStream ME_InStream; 379 380 typedef struct tagME_TextEditor 381 { 382 HWND hWnd, hwndParent; 383 ITextHost *texthost; 384 IUnknown *reOle; 385 BOOL bEmulateVersion10; 386 ME_TextBuffer *pBuffer; 387 ME_Cursor *pCursors; 388 DWORD styleFlags; 389 DWORD exStyleFlags; 390 int nCursors; 391 SIZE sizeWindow; 392 int nTotalLength, nLastTotalLength; 393 int nTotalWidth, nLastTotalWidth; 394 int nAvailWidth; /* 0 = wrap to client area, else wrap width in twips */ 395 int nUDArrowX; 396 int total_rows; 397 COLORREF rgbBackColor; 398 HBRUSH hbrBackground; 399 BOOL bCaretAtEnd; 400 int nEventMask; 401 int nModifyStep; 402 struct list undo_stack; 403 struct list redo_stack; 404 int nUndoStackSize; 405 int nUndoLimit; 406 ME_UndoMode nUndoMode; 407 int nParagraphs; 408 int nLastSelStart, nLastSelEnd; 409 ME_DisplayItem *pLastSelStartPara, *pLastSelEndPara; 410 ME_FontCacheItem pFontCache[HFONT_CACHE_SIZE]; 411 int nZoomNumerator, nZoomDenominator; 412 RECT prevClientRect; 413 RECT rcFormat; 414 BOOL bDefaultFormatRect; 415 BOOL bWordWrap; 416 int nTextLimit; 417 EDITWORDBREAKPROCW pfnWordBreak; 418 LPRICHEDITOLECALLBACK lpOleCallback; 419 /*TEXTMODE variable; contains only one of each of the following options: 420 *TM_RICHTEXT or TM_PLAINTEXT 421 *TM_SINGLELEVELUNDO or TM_MULTILEVELUNDO 422 *TM_SINGLECODEPAGE or TM_MULTICODEPAGE*/ 423 int mode; 424 BOOL bHideSelection; 425 BOOL AutoURLDetect_bEnable; 426 WCHAR cPasswordMask; 427 BOOL bHaveFocus; 428 BOOL bDialogMode; /* Indicates that we are inside a dialog window */ 429 #ifndef __REACTOS__ 430 /*for IME */ 431 int imeStartIndex; 432 #endif 433 DWORD selofs; /* The size of the selection bar on the left side of control */ 434 ME_SelectionType nSelectionType; 435 ME_DisplayItem *first_marked_para; 436 437 /* Track previous notified selection */ 438 CHARRANGE notified_cr; 439 440 /* Cache previously set scrollbar info */ 441 SCROLLINFO vert_si, horz_si; 442 443 int caret_height; 444 BOOL caret_hidden; 445 BOOL bMouseCaptured; 446 int wheel_remain; 447 struct list style_list; 448 struct list reobj_list; 449 } ME_TextEditor; 450 451 typedef struct tagME_Context 452 { 453 HDC hDC; 454 POINT pt; 455 RECT rcView; 456 SIZE dpi; 457 int nAvailWidth; 458 ME_Style *current_style; 459 HFONT orig_font; 460 461 /* those are valid inside ME_WrapTextParagraph and related */ 462 ME_TextEditor *editor; 463 } ME_Context; 464 465 #endif 466