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