]> git.saurik.com Git - wxWidgets.git/blame - interface/wx/richtext/richtextbuffer.h
enum wxWebViewBackend has been removed.
[wxWidgets.git] / interface / wx / richtext / richtextbuffer.h
CommitLineData
23324ae1 1/////////////////////////////////////////////////////////////////////////////
7afd2b58
JS
2// Name: wx/richtext/richtextbuffer.h
3// Purpose: Buffer for wxRichTextCtrl
4// Author: Julian Smart
5// Modified by:
6// Created: 2005-09-30
23324ae1 7// RCS-ID: $Id$
7afd2b58 8// Copyright: (c) Julian Smart
526954c5 9// Licence: wxWindows licence
23324ae1
FM
10/////////////////////////////////////////////////////////////////////////////
11
7afd2b58
JS
12/**
13 The line break character that can be embedded in content.
14 */
15
16extern WXDLLIMPEXP_RICHTEXT const wxChar wxRichTextLineBreakChar;
17
18/**
19 File types in wxRichText context.
9e7ad1ca
FM
20 */
21enum wxRichTextFileType
22{
23 wxRICHTEXT_TYPE_ANY = 0,
24 wxRICHTEXT_TYPE_TEXT,
25 wxRICHTEXT_TYPE_XML,
26 wxRICHTEXT_TYPE_HTML,
27 wxRICHTEXT_TYPE_RTF,
28 wxRICHTEXT_TYPE_PDF
29};
30
7afd2b58
JS
31/**
32 Flags determining the available space, passed to Layout.
9e7ad1ca
FM
33 */
34
35#define wxRICHTEXT_FIXED_WIDTH 0x01
36#define wxRICHTEXT_FIXED_HEIGHT 0x02
37#define wxRICHTEXT_VARIABLE_WIDTH 0x04
38#define wxRICHTEXT_VARIABLE_HEIGHT 0x08
39
40// Only lay out the part of the buffer that lies within
41// the rect passed to Layout.
42#define wxRICHTEXT_LAYOUT_SPECIFIED_RECT 0x10
43
7afd2b58
JS
44/**
45 Flags to pass to Draw
9e7ad1ca
FM
46 */
47
48// Ignore paragraph cache optimization, e.g. for printing purposes
49// where one line may be drawn higher (on the next page) compared
50// with the previous line
51#define wxRICHTEXT_DRAW_IGNORE_CACHE 0x01
7afd2b58
JS
52#define wxRICHTEXT_DRAW_SELECTED 0x02
53#define wxRICHTEXT_DRAW_PRINT 0x04
54#define wxRICHTEXT_DRAW_GUIDELINES 0x08
9e7ad1ca 55
7afd2b58
JS
56/**
57 Flags returned from hit-testing, or passed to hit-test function.
9e7ad1ca
FM
58 */
59enum wxRichTextHitTestFlags
60{
7afd2b58 61 // The point was not on this object
9e7ad1ca
FM
62 wxRICHTEXT_HITTEST_NONE = 0x01,
63
7afd2b58 64 // The point was before the position returned from HitTest
9e7ad1ca
FM
65 wxRICHTEXT_HITTEST_BEFORE = 0x02,
66
7afd2b58 67 // The point was after the position returned from HitTest
9e7ad1ca
FM
68 wxRICHTEXT_HITTEST_AFTER = 0x04,
69
7afd2b58 70 // The point was on the position returned from HitTest
9e7ad1ca
FM
71 wxRICHTEXT_HITTEST_ON = 0x08,
72
7afd2b58
JS
73 // The point was on space outside content
74 wxRICHTEXT_HITTEST_OUTSIDE = 0x10,
75
76 // Only do hit-testing at the current level (don't traverse into top-level objects)
77 wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS = 0x20,
78
79 // Ignore floating objects
7c9fdebe
JS
80 wxRICHTEXT_HITTEST_NO_FLOATING_OBJECTS = 0x40,
81
82 // Don't recurse into objects marked as atomic
83 wxRICHTEXT_HITTEST_HONOUR_ATOMIC = 0x80
9e7ad1ca
FM
84};
85
7afd2b58
JS
86/**
87 Flags for GetRangeSize.
9e7ad1ca
FM
88 */
89
90#define wxRICHTEXT_FORMATTED 0x01
91#define wxRICHTEXT_UNFORMATTED 0x02
92#define wxRICHTEXT_CACHE_SIZE 0x04
93#define wxRICHTEXT_HEIGHT_ONLY 0x08
94
7afd2b58
JS
95/**
96 Flags for SetStyle/SetListStyle.
9e7ad1ca
FM
97 */
98
99#define wxRICHTEXT_SETSTYLE_NONE 0x00
100
101// Specifies that this operation should be undoable
102#define wxRICHTEXT_SETSTYLE_WITH_UNDO 0x01
103
104// Specifies that the style should not be applied if the
105// combined style at this point is already the style in question.
106#define wxRICHTEXT_SETSTYLE_OPTIMIZE 0x02
107
108// Specifies that the style should only be applied to paragraphs,
109// and not the content. This allows content styling to be
110// preserved independently from that of e.g. a named paragraph style.
111#define wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY 0x04
112
113// Specifies that the style should only be applied to characters,
114// and not the paragraph. This allows content styling to be
115// preserved independently from that of e.g. a named paragraph style.
116#define wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY 0x08
117
118// For SetListStyle only: specifies starting from the given number, otherwise
119// deduces number from existing attributes
120#define wxRICHTEXT_SETSTYLE_RENUMBER 0x10
121
122// For SetListStyle only: specifies the list level for all paragraphs, otherwise
123// the current indentation will be used
124#define wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL 0x20
125
126// Resets the existing style before applying the new style
127#define wxRICHTEXT_SETSTYLE_RESET 0x40
128
129// Removes the given style instead of applying it
130#define wxRICHTEXT_SETSTYLE_REMOVE 0x80
131
590a0f8b
JS
132/**
133 Flags for SetProperties.
134 */
135
136#define wxRICHTEXT_SETPROPERTIES_NONE 0x00
137
138// Specifies that this operation should be undoable
139#define wxRICHTEXT_SETPROPERTIES_WITH_UNDO 0x01
140
141// Specifies that the properties should only be applied to paragraphs,
142// and not the content.
143#define wxRICHTEXT_SETPROPERTIES_PARAGRAPHS_ONLY 0x02
144
145// Specifies that the properties should only be applied to characters,
146// and not the paragraph.
147#define wxRICHTEXT_SETPROPERTIES_CHARACTERS_ONLY 0x04
148
149// Resets the existing properties before applying the new properties.
150#define wxRICHTEXT_SETPROPERTIES_RESET 0x08
151
152// Removes the given properties instead of applying them.
153#define wxRICHTEXT_SETPROPERTIES_REMOVE 0x10
154
7afd2b58
JS
155/**
156 Flags for object insertion.
9e7ad1ca
FM
157 */
158
159#define wxRICHTEXT_INSERT_NONE 0x00
160#define wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE 0x01
161#define wxRICHTEXT_INSERT_INTERACTIVE 0x02
162
163// A special flag telling the buffer to keep the first paragraph style
164// as-is, when deleting a paragraph marker. In future we might pass a
165// flag to InsertFragment and DeleteRange to indicate the appropriate mode.
166#define wxTEXT_ATTR_KEEP_FIRST_PARA_STYLE 0x10000000
167
7afd2b58
JS
168/**
169 Default superscript/subscript font multiplication factor.
9e7ad1ca
FM
170 */
171
172#define wxSCRIPT_MUL_FACTOR 1.5
173
7afd2b58
JS
174/**
175 The type for wxTextAttrDimension flags.
176 */
177typedef unsigned short wxTextAttrDimensionFlags;
9e7ad1ca 178
23324ae1 179/**
7afd2b58
JS
180 Miscellaneous text box flags
181 */
182enum wxTextBoxAttrFlags
183{
184 wxTEXT_BOX_ATTR_FLOAT = 0x00000001,
185 wxTEXT_BOX_ATTR_CLEAR = 0x00000002,
186 wxTEXT_BOX_ATTR_COLLAPSE_BORDERS = 0x00000004,
187 wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT = 0x00000008
188};
189
190/**
191 Whether a value is present, used in dimension flags.
192 */
193enum wxTextAttrValueFlags
194{
195 wxTEXT_ATTR_VALUE_VALID = 0x1000,
196 wxTEXT_ATTR_VALUE_VALID_MASK = 0x1000
197};
198
199/**
200 Units, included in the dimension value.
201 */
202enum wxTextAttrUnits
203{
204 wxTEXT_ATTR_UNITS_TENTHS_MM = 0x0001,
205 wxTEXT_ATTR_UNITS_PIXELS = 0x0002,
206 wxTEXT_ATTR_UNITS_PERCENTAGE = 0x0004,
207 wxTEXT_ATTR_UNITS_POINTS = 0x0008,
208
209 wxTEXT_ATTR_UNITS_MASK = 0x000F
210};
211
212/**
213 Position alternatives, included in the dimension flags.
214 */
215enum wxTextBoxAttrPosition
216{
217 wxTEXT_BOX_ATTR_POSITION_STATIC = 0x0000, // Default is static, i.e. as per normal layout
218 wxTEXT_BOX_ATTR_POSITION_RELATIVE = 0x0010, // Relative to the relevant edge
d87098c0
JS
219 wxTEXT_BOX_ATTR_POSITION_ABSOLUTE = 0x0020, // Relative to the parent
220 wxTEXT_BOX_ATTR_POSITION_FIXED = 0x0040, // Relative to the top-level window
7afd2b58
JS
221
222 wxTEXT_BOX_ATTR_POSITION_MASK = 0x00F0
223};
7c913512 224
7afd2b58
JS
225/**
226 @class wxTextAttrDimension
227
228 A class representing a rich text dimension, including units and position.
7c913512 229
23324ae1 230 @library{wxrichtext}
21b447dc 231 @category{richtext}
7c913512 232
7afd2b58 233 @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimensions
23324ae1 234*/
7afd2b58
JS
235
236class WXDLLIMPEXP_RICHTEXT wxTextAttrDimension
23324ae1
FM
237{
238public:
23324ae1 239 /**
9e7ad1ca 240 Default constructor.
23324ae1 241 */
7afd2b58 242 wxTextAttrDimension() { Reset(); }
9e7ad1ca 243 /**
7afd2b58 244 Constructor taking value and units flag.
9e7ad1ca 245 */
7afd2b58 246 wxTextAttrDimension(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { m_value = value; m_flags = units|wxTEXT_ATTR_VALUE_VALID; }
23324ae1
FM
247
248 /**
7afd2b58 249 Resets the dimension value and flags.
23324ae1 250 */
7afd2b58 251 void Reset() { m_value = 0; m_flags = 0; }
23324ae1
FM
252
253 /**
32423dd8
JS
254 Partial equality test. If @a weakTest is @true, attributes of this object do not
255 have to be present if those attributes of @a dim are present. If @a weakTest is
256 @false, the function will fail if an attribute is present in @a dim but not
257 in this object.
23324ae1 258 */
32423dd8 259 bool EqPartial(const wxTextAttrDimension& dim, bool weakTest = true) const;
23324ae1 260
7afd2b58 261 /** Apply the dimension, but not those identical to @a compareWith if present.
23324ae1 262 */
7afd2b58 263 bool Apply(const wxTextAttrDimension& dim, const wxTextAttrDimension* compareWith = NULL);
23324ae1 264
7afd2b58
JS
265 /** Collects the attributes that are common to a range of content, building up a note of
266 which attributes are absent in some objects and which clash in some objects.
23324ae1 267 */
7afd2b58 268 void CollectCommonAttributes(const wxTextAttrDimension& attr, wxTextAttrDimension& clashingAttr, wxTextAttrDimension& absentAttr);
23324ae1
FM
269
270 /**
7afd2b58 271 Equality operator.
23324ae1 272 */
7afd2b58 273 bool operator==(const wxTextAttrDimension& dim) const { return m_value == dim.m_value && m_flags == dim.m_flags; }
23324ae1
FM
274
275 /**
7afd2b58 276 Returns the integer value of the dimension.
23324ae1 277 */
7afd2b58 278 int GetValue() const { return m_value; }
23324ae1
FM
279
280 /**
7afd2b58 281 Returns the floating-pointing value of the dimension in mm.
23324ae1 282
23324ae1 283 */
7afd2b58 284 float GetValueMM() const { return float(m_value) / 10.0; }
23324ae1
FM
285
286 /**
7afd2b58 287 Sets the value of the dimension in mm.
23324ae1 288 */
7afd2b58 289 void SetValueMM(float value) { m_value = (int) ((value * 10.0) + 0.5); m_flags |= wxTEXT_ATTR_VALUE_VALID; }
23324ae1
FM
290
291 /**
7afd2b58 292 Sets the integer value of the dimension.
23324ae1 293 */
7afd2b58 294 void SetValue(int value) { m_value = value; m_flags |= wxTEXT_ATTR_VALUE_VALID; }
23324ae1
FM
295
296 /**
7afd2b58 297 Sets the integer value of the dimension, passing dimension flags.
23324ae1 298 */
7afd2b58 299 void SetValue(int value, wxTextAttrDimensionFlags flags) { SetValue(value); m_flags = flags; }
23324ae1
FM
300
301 /**
7afd2b58 302 Sets the integer value and units.
23324ae1 303 */
7afd2b58 304 void SetValue(int value, wxTextAttrUnits units) { m_value = value; m_flags = units | wxTEXT_ATTR_VALUE_VALID; }
23324ae1
FM
305
306 /**
7afd2b58 307 Sets the dimension.
23324ae1 308 */
7afd2b58 309 void SetValue(const wxTextAttrDimension& dim) { (*this) = dim; }
23324ae1
FM
310
311 /**
7afd2b58 312 Gets the units of the dimension.
23324ae1 313 */
7afd2b58 314 wxTextAttrUnits GetUnits() const { return (wxTextAttrUnits) (m_flags & wxTEXT_ATTR_UNITS_MASK); }
23324ae1
FM
315
316 /**
7afd2b58 317 Sets the units of the dimension.
23324ae1 318 */
7afd2b58 319 void SetUnits(wxTextAttrUnits units) { m_flags &= ~wxTEXT_ATTR_UNITS_MASK; m_flags |= units; }
23324ae1
FM
320
321 /**
7afd2b58 322 Gets the position flags.
23324ae1 323 */
7afd2b58 324 wxTextBoxAttrPosition GetPosition() const { return (wxTextBoxAttrPosition) (m_flags & wxTEXT_BOX_ATTR_POSITION_MASK); }
23324ae1
FM
325
326 /**
7afd2b58 327 Sets the position flags.
23324ae1 328 */
7afd2b58 329 void SetPosition(wxTextBoxAttrPosition pos) { m_flags &= ~wxTEXT_BOX_ATTR_POSITION_MASK; m_flags |= pos; }
23324ae1
FM
330
331 /**
7afd2b58 332 Returns @true if the dimension is valid.
23324ae1 333 */
7afd2b58 334 bool IsValid() const { return (m_flags & wxTEXT_ATTR_VALUE_VALID) != 0; }
23324ae1
FM
335
336 /**
7afd2b58 337 Sets the valid flag.
23324ae1 338 */
7afd2b58 339 void SetValid(bool b) { m_flags &= ~wxTEXT_ATTR_VALUE_VALID_MASK; m_flags |= (b ? wxTEXT_ATTR_VALUE_VALID : 0); }
23324ae1
FM
340
341 /**
7afd2b58 342 Gets the dimension flags.
23324ae1 343 */
7afd2b58 344 wxTextAttrDimensionFlags GetFlags() const { return m_flags; }
23324ae1
FM
345
346 /**
7afd2b58 347 Sets the dimension flags.
23324ae1 348 */
7afd2b58 349 void SetFlags(wxTextAttrDimensionFlags flags) { m_flags = flags; }
23324ae1 350
7afd2b58
JS
351 int m_value;
352 wxTextAttrDimensionFlags m_flags;
353};
23324ae1 354
7afd2b58
JS
355/**
356 @class wxTextAttrDimensions
357 A class for left, right, top and bottom dimensions.
9e7ad1ca 358
7afd2b58
JS
359 @library{wxrichtext}
360 @category{richtext}
23324ae1 361
7afd2b58
JS
362 @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension
363*/
23324ae1 364
7afd2b58
JS
365class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensions
366{
367public:
23324ae1 368 /**
7afd2b58 369 Default constructor.
23324ae1 370 */
7afd2b58 371 wxTextAttrDimensions() {}
23324ae1
FM
372
373 /**
7afd2b58 374 Resets the value and flags for all dimensions.
23324ae1 375 */
7afd2b58 376 void Reset() { m_left.Reset(); m_top.Reset(); m_right.Reset(); m_bottom.Reset(); }
23324ae1
FM
377
378 /**
7afd2b58 379 Equality operator.
23324ae1 380 */
7afd2b58 381 bool operator==(const wxTextAttrDimensions& dims) const { return m_left == dims.m_left && m_top == dims.m_top && m_right == dims.m_right && m_bottom == dims.m_bottom; }
23324ae1
FM
382
383 /**
32423dd8
JS
384 Partial equality test. If @a weakTest is @true, attributes of this object do not
385 have to be present if those attributes of @a dim sare present. If @a weakTest is
386 @false, the function will fail if an attribute is present in @a dims but not
387 in this object.
23324ae1 388
23324ae1 389 */
32423dd8 390 bool EqPartial(const wxTextAttrDimensions& dims, bool weakTest = true) const;
23324ae1 391
23324ae1 392 /**
d87098c0 393 Apply to 'this', but not if the same as @a compareWith.
23324ae1 394
23324ae1 395 */
7afd2b58 396 bool Apply(const wxTextAttrDimensions& dims, const wxTextAttrDimensions* compareWith = NULL);
23324ae1
FM
397
398 /**
7afd2b58
JS
399 Collects the attributes that are common to a range of content, building up a note of
400 which attributes are absent in some objects and which clash in some objects.
23324ae1 401
23324ae1 402 */
7afd2b58 403 void CollectCommonAttributes(const wxTextAttrDimensions& attr, wxTextAttrDimensions& clashingAttr, wxTextAttrDimensions& absentAttr);
23324ae1
FM
404
405 /**
7afd2b58 406 Remove specified attributes from this object.
23324ae1 407 */
7afd2b58 408 bool RemoveStyle(const wxTextAttrDimensions& attr);
23324ae1
FM
409
410 /**
7afd2b58 411 Gets the left dimension.
23324ae1 412 */
7afd2b58
JS
413 const wxTextAttrDimension& GetLeft() const { return m_left; }
414 wxTextAttrDimension& GetLeft() { return m_left; }
23324ae1 415
23324ae1 416 /**
7afd2b58 417 Gets the right dimension.
23324ae1 418
23324ae1 419 */
7afd2b58
JS
420 const wxTextAttrDimension& GetRight() const { return m_right; }
421 wxTextAttrDimension& GetRight() { return m_right; }
23324ae1
FM
422
423 /**
7afd2b58 424 Gets the top dimension.
23324ae1 425
23324ae1 426 */
7afd2b58
JS
427 const wxTextAttrDimension& GetTop() const { return m_top; }
428 wxTextAttrDimension& GetTop() { return m_top; }
23324ae1
FM
429
430 /**
7afd2b58 431 Gets the bottom dimension.
23324ae1 432
23324ae1 433 */
7afd2b58
JS
434 const wxTextAttrDimension& GetBottom() const { return m_bottom; }
435 wxTextAttrDimension& GetBottom() { return m_bottom; }
23324ae1 436
eb3d8a33
JS
437 /**
438 Are all dimensions valid?
439
440 */
441 bool IsValid() const { return m_left.IsValid() && m_top.IsValid() && m_right.IsValid() && m_bottom.IsValid(); }
442
7afd2b58
JS
443 wxTextAttrDimension m_left;
444 wxTextAttrDimension m_top;
445 wxTextAttrDimension m_right;
446 wxTextAttrDimension m_bottom;
447};
23324ae1 448
7afd2b58
JS
449/**
450 @class wxTextAttrSize
451 A class for representing width and height.
23324ae1 452
7afd2b58
JS
453 @library{wxrichtext}
454 @category{richtext}
23324ae1 455
7afd2b58
JS
456 @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension
457*/
23324ae1 458
7afd2b58
JS
459class WXDLLIMPEXP_RICHTEXT wxTextAttrSize
460{
461public:
23324ae1 462 /**
7afd2b58 463 Default constructor.
23324ae1 464 */
7afd2b58 465 wxTextAttrSize() {}
23324ae1
FM
466
467 /**
7afd2b58 468 Resets the width and height dimensions.
23324ae1 469 */
7afd2b58 470 void Reset() { m_width.Reset(); m_height.Reset(); }
23324ae1
FM
471
472 /**
7afd2b58 473 Equality operator.
23324ae1 474 */
7afd2b58 475 bool operator==(const wxTextAttrSize& size) const { return m_width == size.m_width && m_height == size.m_height ; }
23324ae1
FM
476
477 /**
32423dd8
JS
478 Partial equality test. If @a weakTest is @true, attributes of this object do not
479 have to be present if those attributes of @a size are present. If @a weakTest is
480 @false, the function will fail if an attribute is present in @a size but not
481 in this object.
23324ae1 482 */
32423dd8 483 bool EqPartial(const wxTextAttrSize& size, bool weakTest = true) const;
23324ae1
FM
484
485 /**
d87098c0 486 Apply to this object, but not if the same as @a compareWith.
23324ae1 487 */
7afd2b58 488 bool Apply(const wxTextAttrSize& dims, const wxTextAttrSize* compareWith = NULL);
23324ae1
FM
489
490 /**
7afd2b58
JS
491 Collects the attributes that are common to a range of content, building up a note of
492 which attributes are absent in some objects and which clash in some objects.
23324ae1 493 */
7afd2b58 494 void CollectCommonAttributes(const wxTextAttrSize& attr, wxTextAttrSize& clashingAttr, wxTextAttrSize& absentAttr);
23324ae1
FM
495
496 /**
7afd2b58 497 Removes the specified attributes from this object.
23324ae1 498 */
7afd2b58 499 bool RemoveStyle(const wxTextAttrSize& attr);
23324ae1
FM
500
501 /**
7afd2b58 502 Returns the width.
23324ae1 503 */
7afd2b58
JS
504 wxTextAttrDimension& GetWidth() { return m_width; }
505 const wxTextAttrDimension& GetWidth() const { return m_width; }
23324ae1
FM
506
507 /**
7afd2b58 508 Sets the width.
23324ae1 509 */
7afd2b58 510 void SetWidth(int value, wxTextAttrDimensionFlags flags) { m_width.SetValue(value, flags); }
303f0be7 511
23324ae1 512 /**
7afd2b58 513 Sets the width.
23324ae1 514 */
7afd2b58 515 void SetWidth(int value, wxTextAttrUnits units) { m_width.SetValue(value, units); }
303f0be7 516
23324ae1 517 /**
7afd2b58 518 Sets the width.
23324ae1 519 */
7afd2b58 520 void SetWidth(const wxTextAttrDimension& dim) { m_width.SetValue(dim); }
23324ae1
FM
521
522 /**
7afd2b58 523 Gets the height.
23324ae1 524 */
7afd2b58
JS
525 wxTextAttrDimension& GetHeight() { return m_height; }
526 const wxTextAttrDimension& GetHeight() const { return m_height; }
23324ae1
FM
527
528 /**
7afd2b58 529 Sets the height.
23324ae1 530 */
7afd2b58 531 void SetHeight(int value, wxTextAttrDimensionFlags flags) { m_height.SetValue(value, flags); }
303f0be7 532
23324ae1 533 /**
7afd2b58 534 Sets the height.
23324ae1 535 */
7afd2b58 536 void SetHeight(int value, wxTextAttrUnits units) { m_height.SetValue(value, units); }
303f0be7 537
9e7ad1ca 538 /**
7afd2b58 539 Sets the height.
9e7ad1ca 540 */
7afd2b58 541 void SetHeight(const wxTextAttrDimension& dim) { m_height.SetValue(dim); }
9e7ad1ca 542
303f0be7
JS
543 /**
544 Is the size valid?
545 */
546 bool IsValid() const { return m_width.IsValid() && m_height.IsValid(); }
547
7afd2b58
JS
548 wxTextAttrDimension m_width;
549 wxTextAttrDimension m_height;
550};
23324ae1 551
7afd2b58
JS
552/**
553 @class wxTextAttrDimensionConverter
554 A class to make it easier to convert dimensions.
23324ae1 555
7afd2b58
JS
556 @library{wxrichtext}
557 @category{richtext}
9e7ad1ca 558
7afd2b58
JS
559 @see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension
560*/
23324ae1 561
7afd2b58
JS
562class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensionConverter
563{
564public:
23324ae1 565 /**
7afd2b58 566 Constructor.
23324ae1 567 */
7afd2b58 568 wxTextAttrDimensionConverter(wxDC& dc, double scale = 1.0, const wxSize& parentSize = wxDefaultSize);
23324ae1 569 /**
7afd2b58 570 Constructor.
23324ae1 571 */
7afd2b58 572 wxTextAttrDimensionConverter(int ppi, double scale = 1.0, const wxSize& parentSize = wxDefaultSize);
23324ae1
FM
573
574 /**
7afd2b58 575 Gets the pixel size for the given dimension.
23324ae1 576 */
7afd2b58 577 int GetPixels(const wxTextAttrDimension& dim, int direction = wxHORIZONTAL) const;
23324ae1 578 /**
7afd2b58 579 Gets the mm size for the given dimension.
23324ae1 580 */
7afd2b58 581 int GetTenthsMM(const wxTextAttrDimension& dim) const;
23324ae1
FM
582
583 /**
7afd2b58 584 Converts tenths of a mm to pixels.
23324ae1 585 */
7afd2b58 586 int ConvertTenthsMMToPixels(int units) const;
23324ae1 587 /**
7afd2b58 588 Converts pixels to tenths of a mm.
23324ae1 589 */
7afd2b58 590 int ConvertPixelsToTenthsMM(int pixels) const;
9e7ad1ca 591
7afd2b58
JS
592 int m_ppi;
593 double m_scale;
594 wxSize m_parentSize;
595};
23324ae1 596
7afd2b58
JS
597/**
598 Border styles, used with wxTextAttrBorder.
599 */
600enum wxTextAttrBorderStyle
601{
602 wxTEXT_BOX_ATTR_BORDER_NONE = 0,
603 wxTEXT_BOX_ATTR_BORDER_SOLID = 1,
604 wxTEXT_BOX_ATTR_BORDER_DOTTED = 2,
605 wxTEXT_BOX_ATTR_BORDER_DASHED = 3,
606 wxTEXT_BOX_ATTR_BORDER_DOUBLE = 4,
607 wxTEXT_BOX_ATTR_BORDER_GROOVE = 5,
608 wxTEXT_BOX_ATTR_BORDER_RIDGE = 6,
609 wxTEXT_BOX_ATTR_BORDER_INSET = 7,
610 wxTEXT_BOX_ATTR_BORDER_OUTSET = 8
611};
612
613/**
614 Border style presence flags, used with wxTextAttrBorder.
615 */
616enum wxTextAttrBorderFlags
617{
618 wxTEXT_BOX_ATTR_BORDER_STYLE = 0x0001,
619 wxTEXT_BOX_ATTR_BORDER_COLOUR = 0x0002
620};
621
622/**
623 Border width symbols for qualitative widths, used with wxTextAttrBorder.
624 */
625enum wxTextAttrBorderWidth
626{
627 wxTEXT_BOX_ATTR_BORDER_THIN = -1,
628 wxTEXT_BOX_ATTR_BORDER_MEDIUM = -2,
629 wxTEXT_BOX_ATTR_BORDER_THICK = -3
630};
631
632/**
633 Float styles.
634 */
635enum wxTextBoxAttrFloatStyle
636{
637 wxTEXT_BOX_ATTR_FLOAT_NONE = 0,
638 wxTEXT_BOX_ATTR_FLOAT_LEFT = 1,
639 wxTEXT_BOX_ATTR_FLOAT_RIGHT = 2
640};
641
642/**
643 Clear styles.
644 */
645enum wxTextBoxAttrClearStyle
646{
647 wxTEXT_BOX_ATTR_CLEAR_NONE = 0,
648 wxTEXT_BOX_ATTR_CLEAR_LEFT = 1,
649 wxTEXT_BOX_ATTR_CLEAR_RIGHT = 2,
650 wxTEXT_BOX_ATTR_CLEAR_BOTH = 3
651};
652
653/**
654 Collapse mode styles. TODO: can they be switched on per side?
655 */
656enum wxTextBoxAttrCollapseMode
657{
658 wxTEXT_BOX_ATTR_COLLAPSE_NONE = 0,
659 wxTEXT_BOX_ATTR_COLLAPSE_FULL = 1
660};
661
662/**
663 Vertical alignment values.
664 */
665enum wxTextBoxAttrVerticalAlignment
666{
667 wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_NONE = 0,
668 wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_TOP = 1,
669 wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_CENTRE = 2,
670 wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_BOTTOM = 3
671};
672
673/**
674 @class wxTextAttrBorder
675 A class representing a rich text object border.
676
677 @library{wxrichtext}
678 @category{richtext}
679
680 @see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorders
681*/
682
683class WXDLLIMPEXP_RICHTEXT wxTextAttrBorder
684{
685public:
686 /**
687 Default constructor.
688 */
689 wxTextAttrBorder() { Reset(); }
690
691 /**
692 Equality operator.
693 */
694 bool operator==(const wxTextAttrBorder& border) const
695 {
696 return m_flags == border.m_flags && m_borderStyle == border.m_borderStyle &&
697 m_borderColour == border.m_borderColour && m_borderWidth == border.m_borderWidth;
698 }
699
700 /**
701 Resets the border style, colour, width and flags.
702 */
703 void Reset() { m_borderStyle = 0; m_borderColour = 0; m_flags = 0; m_borderWidth.Reset(); }
704
705 /**
32423dd8
JS
706 Partial equality test. If @a weakTest is @true, attributes of this object do not
707 have to be present if those attributes of @a border are present. If @a weakTest is
708 @false, the function will fail if an attribute is present in @a border but not
709 in this object.
7afd2b58 710 */
32423dd8 711 bool EqPartial(const wxTextAttrBorder& border, bool weakTest = true) const;
7afd2b58
JS
712
713 /**
714 Applies the border to this object, but not if the same as @a compareWith.
715
716 */
717 bool Apply(const wxTextAttrBorder& border, const wxTextAttrBorder* compareWith = NULL);
718
719 /**
720 Removes the specified attributes from this object.
721 */
722 bool RemoveStyle(const wxTextAttrBorder& attr);
723
724 /**
725 Collects the attributes that are common to a range of content, building up a note of
726 which attributes are absent in some objects and which clash in some objects.
727 */
728 void CollectCommonAttributes(const wxTextAttrBorder& attr, wxTextAttrBorder& clashingAttr, wxTextAttrBorder& absentAttr);
729
730 /**
731 Sets the border style.
732 */
733 void SetStyle(int style) { m_borderStyle = style; m_flags |= wxTEXT_BOX_ATTR_BORDER_STYLE; }
734
735 /**
736 Gets the border style.
737
738 */
739 int GetStyle() const { return m_borderStyle; }
740
741 /**
742 Sets the border colour.
743 */
744 void SetColour(unsigned long colour) { m_borderColour = colour; m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; }
745
746 /**
747 Sets the border colour.
748 */
749 void SetColour(const wxColour& colour) { m_borderColour = colour.GetRGB(); m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; }
750
751 /**
752 Gets the colour as a long.
753 */
754 unsigned long GetColourLong() const { return m_borderColour; }
755
756 /**
757 Gets the colour.
758 */
759 wxColour GetColour() const { return wxColour(m_borderColour); }
760
761 /**
762 Gets the border width.
763 */
764 wxTextAttrDimension& GetWidth() { return m_borderWidth; }
765 const wxTextAttrDimension& GetWidth() const { return m_borderWidth; }
766
767 /**
768 Sets the border width.
769 */
770 void SetWidth(const wxTextAttrDimension& width) { m_borderWidth = width; }
771 /**
772 Sets the border width.
773 */
774 void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); }
775
776 /**
777 True if the border has a valid style.
778 */
779 bool HasStyle() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_STYLE) != 0; }
780
781 /**
782 True if the border has a valid colour.
783 */
784 bool HasColour() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_COLOUR) != 0; }
785
786 /**
787 True if the border has a valid width.
788 */
789 bool HasWidth() const { return m_borderWidth.IsValid(); }
790
791 /**
792 True if the border is valid.
793 */
794 bool IsValid() const { return HasWidth(); }
795
796 /**
797 Set the valid flag for this border.
798 */
799 void MakeValid() { m_borderWidth.SetValid(true); }
800
801 /**
802 Returns the border flags.
803 */
804 int GetFlags() const { return m_flags; }
805
806 /**
807 Sets the border flags.
808 */
809 void SetFlags(int flags) { m_flags = flags; }
810
811 /**
812 Adds a border flag.
813 */
814 void AddFlag(int flag) { m_flags |= flag; }
815
816 /**
817 Removes a border flag.
818 */
819 void RemoveFlag(int flag) { m_flags &= ~flag; }
820
821 int m_borderStyle;
822 unsigned long m_borderColour;
823 wxTextAttrDimension m_borderWidth;
824 int m_flags;
825};
826
827/**
828 @class wxTextAttrBorders
829 A class representing a rich text object's borders.
830
831 @library{wxrichtext}
832 @category{richtext}
833
834 @see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorder
835*/
836
837class WXDLLIMPEXP_RICHTEXT wxTextAttrBorders
838{
839public:
840 /**
841 Default constructor.
842 */
843 wxTextAttrBorders() { }
844
845 /**
846 Equality operator.
847 */
848 bool operator==(const wxTextAttrBorders& borders) const
849 {
850 return m_left == borders.m_left && m_right == borders.m_right &&
851 m_top == borders.m_top && m_bottom == borders.m_bottom;
852 }
853
854 /**
855 Sets the style of all borders.
856 */
857 void SetStyle(int style);
858
859 /**
860 Sets colour of all borders.
861 */
862 void SetColour(unsigned long colour);
863
864 /**
865 Sets the colour for all borders.
866 */
867 void SetColour(const wxColour& colour);
868
869 /**
870 Sets the width of all borders.
871 */
872 void SetWidth(const wxTextAttrDimension& width);
873
874 /**
875 Sets the width of all borders.
876 */
877 void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); }
878
879 /**
880 Resets all borders.
881 */
882 void Reset() { m_left.Reset(); m_right.Reset(); m_top.Reset(); m_bottom.Reset(); }
883
884 /**
32423dd8
JS
885 Partial equality test. If @a weakTest is @true, attributes of this object do not
886 have to be present if those attributes of @a borders are present. If @a weakTest is
887 @false, the function will fail if an attribute is present in @a borders but not
888 in this object.
7afd2b58 889 */
32423dd8 890 bool EqPartial(const wxTextAttrBorders& borders, bool weakTest = true) const;
7afd2b58
JS
891
892 /**
893 Applies border to this object, but not if the same as @a compareWith.
894 */
895 bool Apply(const wxTextAttrBorders& borders, const wxTextAttrBorders* compareWith = NULL);
896
897 /**
898 Removes the specified attributes from this object.
899 */
900 bool RemoveStyle(const wxTextAttrBorders& attr);
901
902 /**
903 Collects the attributes that are common to a range of content, building up a note of
904 which attributes are absent in some objects and which clash in some objects.
905 */
906 void CollectCommonAttributes(const wxTextAttrBorders& attr, wxTextAttrBorders& clashingAttr, wxTextAttrBorders& absentAttr);
907
908 /**
909 Returns @true if all borders are valid.
910 */
911 bool IsValid() const { return m_left.IsValid() || m_right.IsValid() || m_top.IsValid() || m_bottom.IsValid(); }
912
913 /**
914 Returns the left border.
915 */
916 const wxTextAttrBorder& GetLeft() const { return m_left; }
917 wxTextAttrBorder& GetLeft() { return m_left; }
918
919 /**
920 Returns the right border.
921 */
922 const wxTextAttrBorder& GetRight() const { return m_right; }
923 wxTextAttrBorder& GetRight() { return m_right; }
924
925 /**
926 Returns the top border.
927 */
928 const wxTextAttrBorder& GetTop() const { return m_top; }
929 wxTextAttrBorder& GetTop() { return m_top; }
930
931 /**
932 Returns the bottom border.
933 */
934 const wxTextAttrBorder& GetBottom() const { return m_bottom; }
935 wxTextAttrBorder& GetBottom() { return m_bottom; }
936
937 wxTextAttrBorder m_left, m_right, m_top, m_bottom;
938
939};
940
941/**
942 @class wxTextBoxAttr
943 A class representing the box attributes of a rich text object.
944
945 @library{wxrichtext}
946 @category{richtext}
947
948 @see wxRichTextAttr, wxRichTextCtrl
949*/
950
951class WXDLLIMPEXP_RICHTEXT wxTextBoxAttr
952{
953public:
954 /**
955 Default constructor.
956 */
957 wxTextBoxAttr() { Init(); }
958
959 /**
960 Copy constructor.
961 */
962 wxTextBoxAttr(const wxTextBoxAttr& attr) { Init(); (*this) = attr; }
963
964 /**
965 Initialises this object.
966 */
967 void Init() { Reset(); }
968
969 /**
970 Resets this object.
971 */
972 void Reset();
973
974 // Copy. Unnecessary since we let it do a binary copy
975 //void Copy(const wxTextBoxAttr& attr);
976
977 // Assignment
978 //void operator= (const wxTextBoxAttr& attr);
979
980 /**
981 Equality test.
982 */
983 bool operator== (const wxTextBoxAttr& attr) const;
984
985 /**
32423dd8
JS
986 Partial equality test, ignoring unset attributes. If @a weakTest is @true, attributes of this object do not
987 have to be present if those attributes of @a attr are present. If @a weakTest is
988 @false, the function will fail if an attribute is present in @a attr but not
989 in this object.
7afd2b58
JS
990
991 */
32423dd8 992 bool EqPartial(const wxTextBoxAttr& attr, bool weakTest = true) const;
7afd2b58
JS
993
994 /**
995 Merges the given attributes. If @a compareWith is non-NULL, then it will be used
996 to mask out those attributes that are the same in style and @a compareWith, for
997 situations where we don't want to explicitly set inherited attributes.
998 */
999 bool Apply(const wxTextBoxAttr& style, const wxTextBoxAttr* compareWith = NULL);
1000
1001 /**
1002 Collects the attributes that are common to a range of content, building up a note of
1003 which attributes are absent in some objects and which clash in some objects.
1004 */
1005 void CollectCommonAttributes(const wxTextBoxAttr& attr, wxTextBoxAttr& clashingAttr, wxTextBoxAttr& absentAttr);
1006
1007 /**
1008 Removes the specified attributes from this object.
1009 */
1010 bool RemoveStyle(const wxTextBoxAttr& attr);
1011
1012 /**
1013 Sets the flags.
1014 */
1015 void SetFlags(int flags) { m_flags = flags; }
1016
1017 /**
1018 Returns the flags.
1019 */
1020 int GetFlags() const { return m_flags; }
1021
1022 /**
1023 Is this flag present?
1024 */
1025 bool HasFlag(wxTextBoxAttrFlags flag) const { return (m_flags & flag) != 0; }
1026
1027 /**
1028 Removes this flag.
1029 */
1030 void RemoveFlag(wxTextBoxAttrFlags flag) { m_flags &= ~flag; }
1031
1032 /**
1033 Adds this flag.
1034 */
1035 void AddFlag(wxTextBoxAttrFlags flag) { m_flags |= flag; }
1036
1037 /**
1038 Returns @true if no attributes are set.
1039 */
1040 bool IsDefault() const;
1041
1042 /**
1043 Returns the float mode.
1044 */
1045 wxTextBoxAttrFloatStyle GetFloatMode() const { return m_floatMode; }
1046
1047 /**
1048 Sets the float mode.
1049 */
1050 void SetFloatMode(wxTextBoxAttrFloatStyle mode) { m_floatMode = mode; m_flags |= wxTEXT_BOX_ATTR_FLOAT; }
1051
1052 /**
1053 Returns @true if float mode is active.
1054 */
1055 bool HasFloatMode() const { return HasFlag(wxTEXT_BOX_ATTR_FLOAT); }
1056
1057 /**
1058 Returns @true if this object is floating.
1059 */
1060 bool IsFloating() const { return HasFloatMode() && GetFloatMode() != wxTEXT_BOX_ATTR_FLOAT_NONE; }
1061
1062 /**
1063 Returns the clear mode - whether to wrap text after object. Currently unimplemented.
1064 */
1065 wxTextBoxAttrClearStyle GetClearMode() const { return m_clearMode; }
1066
1067 /**
1068 Set the clear mode. Currently unimplemented.
1069 */
1070 void SetClearMode(wxTextBoxAttrClearStyle mode) { m_clearMode = mode; m_flags |= wxTEXT_BOX_ATTR_CLEAR; }
1071
1072 /**
1073 Returns @true if we have a clear flag.
1074 */
1075 bool HasClearMode() const { return HasFlag(wxTEXT_BOX_ATTR_CLEAR); }
1076
1077 /**
1078 Returns the collapse mode - whether to collapse borders. Currently unimplemented.
1079 */
1080 wxTextBoxAttrCollapseMode GetCollapseBorders() const { return m_collapseMode; }
1081
1082 /**
1083 Sets the collapse mode - whether to collapse borders. Currently unimplemented.
1084 */
1085 void SetCollapseBorders(wxTextBoxAttrCollapseMode collapse) { m_collapseMode = collapse; m_flags |= wxTEXT_BOX_ATTR_COLLAPSE_BORDERS; }
1086
1087 /**
1088 Returns @true if the collapse borders flag is present.
1089 */
1090 bool HasCollapseBorders() const { return HasFlag(wxTEXT_BOX_ATTR_COLLAPSE_BORDERS); }
1091
1092 /**
1093 Returns the vertical alignment.
1094 */
1095 wxTextBoxAttrVerticalAlignment GetVerticalAlignment() const { return m_verticalAlignment; }
1096
1097 /**
1098 Sets the vertical alignment.
1099 */
1100 void SetVerticalAlignment(wxTextBoxAttrVerticalAlignment verticalAlignment) { m_verticalAlignment = verticalAlignment; m_flags |= wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT; }
1101
1102 /**
1103 Returns @true if a vertical alignment flag is present.
1104 */
1105 bool HasVerticalAlignment() const { return HasFlag(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT); }
1106
1107 /**
1108 Returns the margin values.
1109 */
1110 wxTextAttrDimensions& GetMargins() { return m_margins; }
1111 const wxTextAttrDimensions& GetMargins() const { return m_margins; }
1112
1113 /**
1114 Returns the left margin.
1115 */
1116 wxTextAttrDimension& GetLeftMargin() { return m_margins.m_left; }
1117 const wxTextAttrDimension& GetLeftMargin() const { return m_margins.m_left; }
1118
1119 /**
1120 Returns the right margin.
1121 */
1122 wxTextAttrDimension& GetRightMargin() { return m_margins.m_right; }
1123 const wxTextAttrDimension& GetRightMargin() const { return m_margins.m_right; }
1124
1125 /**
1126 Returns the top margin.
1127 */
1128 wxTextAttrDimension& GetTopMargin() { return m_margins.m_top; }
1129 const wxTextAttrDimension& GetTopMargin() const { return m_margins.m_top; }
1130
1131 /**
1132 Returns the bottom margin.
1133 */
1134 wxTextAttrDimension& GetBottomMargin() { return m_margins.m_bottom; }
1135 const wxTextAttrDimension& GetBottomMargin() const { return m_margins.m_bottom; }
1136
1137 /**
1138 Returns the position.
1139 */
1140 wxTextAttrDimensions& GetPosition() { return m_position; }
1141 const wxTextAttrDimensions& GetPosition() const { return m_position; }
1142
1143 /**
1144 Returns the left position.
1145 */
1146 wxTextAttrDimension& GetLeft() { return m_position.m_left; }
1147 const wxTextAttrDimension& GetLeft() const { return m_position.m_left; }
1148
1149 /**
1150 Returns the right position.
1151 */
1152 wxTextAttrDimension& GetRight() { return m_position.m_right; }
1153 const wxTextAttrDimension& GetRight() const { return m_position.m_right; }
1154
1155 /**
1156 Returns the top position.
1157 */
1158 wxTextAttrDimension& GetTop() { return m_position.m_top; }
1159 const wxTextAttrDimension& GetTop() const { return m_position.m_top; }
1160
1161 /**
1162 Returns the bottom position.
1163 */
1164 wxTextAttrDimension& GetBottom() { return m_position.m_bottom; }
1165 const wxTextAttrDimension& GetBottom() const { return m_position.m_bottom; }
1166
1167 /**
1168 Returns the padding values.
1169 */
1170 wxTextAttrDimensions& GetPadding() { return m_padding; }
1171 const wxTextAttrDimensions& GetPadding() const { return m_padding; }
1172
1173 /**
1174 Returns the left padding value.
1175 */
1176 wxTextAttrDimension& GetLeftPadding() { return m_padding.m_left; }
1177 const wxTextAttrDimension& GetLeftPadding() const { return m_padding.m_left; }
1178
1179 /**
1180 Returns the right padding value.
1181 */
1182 wxTextAttrDimension& GetRightPadding() { return m_padding.m_right; }
1183 const wxTextAttrDimension& GetRightPadding() const { return m_padding.m_right; }
1184
1185 /**
1186 Returns the top padding value.
1187 */
1188 wxTextAttrDimension& GetTopPadding() { return m_padding.m_top; }
1189 const wxTextAttrDimension& GetTopPadding() const { return m_padding.m_top; }
1190
1191 /**
1192 Returns the bottom padding value.
1193 */
1194 wxTextAttrDimension& GetBottomPadding() { return m_padding.m_bottom; }
1195 const wxTextAttrDimension& GetBottomPadding() const { return m_padding.m_bottom; }
1196
1197 /**
1198 Returns the borders.
1199 */
1200 wxTextAttrBorders& GetBorder() { return m_border; }
1201 const wxTextAttrBorders& GetBorder() const { return m_border; }
1202
1203 /**
1204 Returns the left border.
1205 */
1206 wxTextAttrBorder& GetLeftBorder() { return m_border.m_left; }
1207 const wxTextAttrBorder& GetLeftBorder() const { return m_border.m_left; }
1208
1209 /**
1210 Returns the top border.
1211 */
1212 wxTextAttrBorder& GetTopBorder() { return m_border.m_top; }
1213 const wxTextAttrBorder& GetTopBorder() const { return m_border.m_top; }
1214
1215 /**
1216 Returns the right border.
1217 */
1218 wxTextAttrBorder& GetRightBorder() { return m_border.m_right; }
1219 const wxTextAttrBorder& GetRightBorder() const { return m_border.m_right; }
1220
1221 /**
1222 Returns the bottom border.
1223 */
1224 wxTextAttrBorder& GetBottomBorder() { return m_border.m_bottom; }
1225 const wxTextAttrBorder& GetBottomBorder() const { return m_border.m_bottom; }
1226
1227 /**
1228 Returns the outline.
1229 */
1230 wxTextAttrBorders& GetOutline() { return m_outline; }
1231 const wxTextAttrBorders& GetOutline() const { return m_outline; }
1232
1233 /**
1234 Returns the left outline.
1235 */
1236 wxTextAttrBorder& GetLeftOutline() { return m_outline.m_left; }
1237 const wxTextAttrBorder& GetLeftOutline() const { return m_outline.m_left; }
1238
1239 /**
1240 Returns the top outline.
1241 */
1242 wxTextAttrBorder& GetTopOutline() { return m_outline.m_top; }
1243 const wxTextAttrBorder& GetTopOutline() const { return m_outline.m_top; }
1244
1245 /**
1246 Returns the right outline.
1247 */
1248 wxTextAttrBorder& GetRightOutline() { return m_outline.m_right; }
1249 const wxTextAttrBorder& GetRightOutline() const { return m_outline.m_right; }
1250
1251 /**
1252 Returns the bottom outline.
1253 */
1254 wxTextAttrBorder& GetBottomOutline() { return m_outline.m_bottom; }
1255 const wxTextAttrBorder& GetBottomOutline() const { return m_outline.m_bottom; }
1256
1257 /**
1258 Returns the object size.
1259 */
1260 wxTextAttrSize& GetSize() { return m_size; }
1261 const wxTextAttrSize& GetSize() const { return m_size; }
1262
303f0be7
JS
1263 /**
1264 Returns the object minimum size.
1265 */
1266
1267 wxTextAttrSize& GetMinSize() { return m_minSize; }
1268 const wxTextAttrSize& GetMinSize() const { return m_minSize; }
1269
1270 /**
1271 Returns the object maximum size.
1272 */
1273
1274 wxTextAttrSize& GetMaxSize() { return m_maxSize; }
1275 const wxTextAttrSize& GetMaxSize() const { return m_maxSize; }
1276
7afd2b58
JS
1277 /**
1278 Sets the object size.
1279 */
1280 void SetSize(const wxTextAttrSize& sz) { m_size = sz; }
1281
303f0be7
JS
1282 /**
1283 Sets the object minimum size.
1284 */
1285 void SetMinSize(const wxTextAttrSize& sz) { m_minSize = sz; }
1286
1287 /**
1288 Sets the object maximum size.
1289 */
1290 void SetMaxSize(const wxTextAttrSize& sz) { m_maxSize = sz; }
1291
7afd2b58
JS
1292 /**
1293 Returns the object width.
1294 */
1295 wxTextAttrDimension& GetWidth() { return m_size.m_width; }
1296 const wxTextAttrDimension& GetWidth() const { return m_size.m_width; }
1297
1298 /**
1299 Returns the object height.
1300 */
1301 wxTextAttrDimension& GetHeight() { return m_size.m_height; }
1302 const wxTextAttrDimension& GetHeight() const { return m_size.m_height; }
1303
2f987d83
JS
1304 /**
1305 Returns the box style name.
1306 */
1307 const wxString& GetBoxStyleName() const { return m_boxStyleName; }
1308
1309 /**
1310 Sets the box style name.
1311 */
1312 void SetBoxStyleName(const wxString& name) { m_boxStyleName = name; AddFlag(wxTEXT_BOX_ATTR_BOX_STYLE_NAME); }
1313
1314 /**
1315 Returns @true if the box style name is present.
1316 */
1317 bool HasBoxStyleName() const { return HasFlag(wxTEXT_BOX_ATTR_BOX_STYLE_NAME); }
1318
7afd2b58
JS
1319public:
1320
1321 int m_flags;
1322
1323 wxTextAttrDimensions m_margins;
1324 wxTextAttrDimensions m_padding;
1325 wxTextAttrDimensions m_position;
1326
1327 wxTextAttrSize m_size;
303f0be7
JS
1328 wxTextAttrSize m_minSize;
1329 wxTextAttrSize m_maxSize;
7afd2b58
JS
1330
1331 wxTextAttrBorders m_border;
1332 wxTextAttrBorders m_outline;
1333
1334 wxTextBoxAttrFloatStyle m_floatMode;
1335 wxTextBoxAttrClearStyle m_clearMode;
1336 wxTextBoxAttrCollapseMode m_collapseMode;
1337 wxTextBoxAttrVerticalAlignment m_verticalAlignment;
2f987d83 1338 wxString m_boxStyleName;
7afd2b58
JS
1339};
1340
1341/**
1342 @class wxRichTextAttr
1343 A class representing enhanced attributes for rich text objects.
1344 This adds a wxTextBoxAttr member to the basic wxTextAttr class.
1345
1346 @library{wxrichtext}
1347 @category{richtext}
1348
1349 @see wxRichTextAttr, wxTextBoxAttr, wxRichTextCtrl
1350*/
1351
1352class WXDLLIMPEXP_RICHTEXT wxRichTextAttr: public wxTextAttr
1353{
1354public:
1355 /**
1356 Constructor taking a wxTextAttr.
1357 */
1358 wxRichTextAttr(const wxTextAttr& attr) { wxTextAttr::Copy(attr); }
1359
1360 /**
1361 Copy constructor.
1362 */
1363 wxRichTextAttr(const wxRichTextAttr& attr): wxTextAttr() { Copy(attr); }
1364
1365 /**
1366 Default constructor.
1367 */
1368 wxRichTextAttr() {}
1369
1370 /**
1371 Copy function.
1372 */
1373 void Copy(const wxRichTextAttr& attr);
1374
1375 /**
1376 Assignment operator.
1377 */
1378 void operator=(const wxRichTextAttr& attr) { Copy(attr); }
1379
1380 /**
1381 Assignment operator.
1382 */
1383 void operator=(const wxTextAttr& attr) { wxTextAttr::Copy(attr); }
1384
1385 /**
1386 Equality test.
1387 */
1388 bool operator==(const wxRichTextAttr& attr) const;
1389
1390 /**
32423dd8
JS
1391 Partial equality test. If @a weakTest is @true, attributes of this object do not
1392 have to be present if those attributes of @a attr are present. If @a weakTest is
1393 @false, the function will fail if an attribute is present in @a attr but not
1394 in this object.
7afd2b58 1395 */
32423dd8 1396 bool EqPartial(const wxRichTextAttr& attr, bool weakTest = true) const;
7afd2b58
JS
1397
1398 /**
1399 Merges the given attributes. If @a compareWith
1400 is non-NULL, then it will be used to mask out those attributes that are the same in style
1401 and @a compareWith, for situations where we don't want to explicitly set inherited attributes.
1402 */
1403 bool Apply(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL);
1404
1405 /**
1406 Collects the attributes that are common to a range of content, building up a note of
1407 which attributes are absent in some objects and which clash in some objects.
1408 */
1409 void CollectCommonAttributes(const wxRichTextAttr& attr, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr);
1410
1411 /**
1412 Removes the specified attributes from this object.
1413 */
1414 bool RemoveStyle(const wxRichTextAttr& attr);
1415
1416 /**
1417 Returns the text box attributes.
1418 */
1419 wxTextBoxAttr& GetTextBoxAttr() { return m_textBoxAttr; }
1420 const wxTextBoxAttr& GetTextBoxAttr() const { return m_textBoxAttr; }
1421
1422 /**
1423 Set the text box attributes.
1424 */
1425 void SetTextBoxAttr(const wxTextBoxAttr& attr) { m_textBoxAttr = attr; }
1426
1427 wxTextBoxAttr m_textBoxAttr;
1428};
1429
1430WX_DECLARE_USER_EXPORTED_OBJARRAY(wxVariant, wxRichTextVariantArray, WXDLLIMPEXP_RICHTEXT);
1431
1432/**
1433 @class wxRichTextProperties
1434 A simple property class using wxVariants. This is used to give each rich text object the
1435 ability to store custom properties that can be used by the application.
1436
1437 @library{wxrichtext}
1438 @category{richtext}
1439
1440 @see wxRichTextBuffer, wxRichTextObject, wxRichTextCtrl
1441*/
1442
1443class WXDLLIMPEXP_RICHTEXT wxRichTextProperties: public wxObject
1444{
1445DECLARE_DYNAMIC_CLASS(wxRichTextProperties)
1446public:
1447
1448 /**
1449 Default constructor.
1450 */
1451 wxRichTextProperties() {}
1452
1453 /**
1454 Copy constructor.
1455 */
1456 wxRichTextProperties(const wxRichTextProperties& props): wxObject() { Copy(props); }
1457
1458 /**
1459 Assignment operator.
1460 */
1461 void operator=(const wxRichTextProperties& props) { Copy(props); }
1462
1463 /**
1464 Equality operator.
1465 */
1466 bool operator==(const wxRichTextProperties& props) const;
1467
1468 /**
1469 Copies from @a props.
1470 */
1471 void Copy(const wxRichTextProperties& props) { m_properties = props.m_properties; }
1472
1473 /**
1474 Returns the variant at the given index.
1475 */
1476 const wxVariant& operator[](size_t idx) const { return m_properties[idx]; }
1477
1478 /**
1479 Returns the variant at the given index.
1480 */
1481 wxVariant& operator[](size_t idx) { return m_properties[idx]; }
1482
1483 /**
1484 Clears the properties.
1485 */
1486 void Clear() { m_properties.Clear(); }
1487
1488 /**
1489 Returns the array of variants implementing the properties.
1490 */
1491 const wxRichTextVariantArray& GetProperties() const { return m_properties; }
1492
1493 /**
1494 Returns the array of variants implementing the properties.
1495 */
1496 wxRichTextVariantArray& GetProperties() { return m_properties; }
1497
1498 /**
1499 Sets the array of variants.
1500 */
1501 void SetProperties(const wxRichTextVariantArray& props) { m_properties = props; }
1502
1503 /**
1504 Returns all the property names.
1505 */
1506 wxArrayString GetPropertyNames() const;
1507
1508 /**
1509 Returns a count of the properties.
1510 */
1511 size_t GetCount() const { return m_properties.GetCount(); }
1512
1513 /**
1514 Returns @true if the given property is found.
1515 */
1516 bool HasProperty(const wxString& name) const { return Find(name) != -1; }
1517
1518 /**
1519 Finds the given property.
1520 */
1521 int Find(const wxString& name) const;
1522
590a0f8b
JS
1523 /**
1524 Removes the given property.
1525 */
1526 bool Remove(const wxString& name);
1527
7afd2b58
JS
1528 /**
1529 Gets the property variant by name.
1530 */
1531 const wxVariant& GetProperty(const wxString& name) const;
1532
1533 /**
1534 Finds or creates a property with the given name, returning a pointer to the variant.
1535 */
1536 wxVariant* FindOrCreateProperty(const wxString& name);
1537
1538 /**
1539 Gets the value of the named property as a string.
1540 */
1541 wxString GetPropertyString(const wxString& name) const;
1542
1543 /**
1544 Gets the value of the named property as a long integer.
1545 */
1546 long GetPropertyLong(const wxString& name) const;
1547
1548 /**
1549 Gets the value of the named property as a boolean.
1550 */
1551 bool GetPropertyBool(const wxString& name) const;
1552
1553 /**
1554 Gets the value of the named property as a double.
1555 */
1556 double GetPropertyDouble(const wxString& name) const;
1557
1558 /**
1559 Sets the property by passing a variant which contains a name and value.
1560 */
1561 void SetProperty(const wxVariant& variant);
1562
1563 /**
1564 Sets a property by name and variant.
1565 */
1566 void SetProperty(const wxString& name, const wxVariant& variant);
1567
1568 /**
1569 Sets a property by name and string value.
1570 */
1571 void SetProperty(const wxString& name, const wxString& value);
1572
1573 /**
1574 Sets property by name and long integer value.
1575 */
1576 void SetProperty(const wxString& name, long value);
1577
1578 /**
1579 Sets property by name and double value.
1580 */
1581 void SetProperty(const wxString& name, double value);
1582
1583 /**
1584 Sets property by name and boolean value.
1585 */
1586 void SetProperty(const wxString& name, bool value);
1587
590a0f8b
JS
1588 /**
1589 Removes the given properties from these properties.
1590 */
1591 void RemoveProperties(const wxRichTextProperties& properties);
1592
1593 /**
1594 Merges the given properties with these properties.
1595 */
1596 void MergeProperties(const wxRichTextProperties& properties);
1597
7afd2b58
JS
1598protected:
1599 wxRichTextVariantArray m_properties;
1600};
1601
1602
1603/**
1604 @class wxRichTextFontTable
1605 Manages quick access to a pool of fonts for rendering rich text.
1606
1607 @library{wxrichtext}
1608 @category{richtext}
1609
1610 @see wxRichTextBuffer, wxRichTextCtrl
1611*/
1612
1613class WXDLLIMPEXP_RICHTEXT wxRichTextFontTable: public wxObject
1614{
1615public:
1616 /**
1617 Default constructor.
1618 */
1619 wxRichTextFontTable();
1620
1621 /**
1622 Copy constructor.
1623 */
1624 wxRichTextFontTable(const wxRichTextFontTable& table);
1625 virtual ~wxRichTextFontTable();
1626
1627 /**
1628 Returns @true if the font table is valid.
1629 */
1630 bool IsOk() const { return m_refData != NULL; }
1631
1632 /**
1633 Finds a font for the given attribute object.
1634 */
1635 wxFont FindFont(const wxRichTextAttr& fontSpec);
1636
1637 /**
1638 Clears the font table.
1639 */
1640 void Clear();
1641
1642 /**
1643 Assignment operator.
1644 */
1645 void operator= (const wxRichTextFontTable& table);
1646
1647 /**
1648 Equality operator.
1649 */
1650 bool operator == (const wxRichTextFontTable& table) const;
1651
1652 /**
1653 Inequality operator.
1654 */
1655 bool operator != (const wxRichTextFontTable& table) const { return !(*this == table); }
1656
32423dd8
JS
1657 /**
1658 Set the font scale factor.
1659 */
1660 void SetFontScale(double fontScale);
1661
7afd2b58
JS
1662protected:
1663
32423dd8
JS
1664 double m_fontScale;
1665
7afd2b58
JS
1666 DECLARE_DYNAMIC_CLASS(wxRichTextFontTable)
1667};
1668
1669/**
1670 @class wxRichTextRange
1671
1672 This stores beginning and end positions for a range of data.
1673
1674 @library{wxrichtext}
1675 @category{richtext}
1676
1677 @see wxRichTextBuffer, wxRichTextCtrl
1678*/
1679
1680class WXDLLIMPEXP_RICHTEXT wxRichTextRange
1681{
1682public:
1683// Constructors
1684
1685 /**
1686 Default constructor.
1687 */
1688 wxRichTextRange() { m_start = 0; m_end = 0; }
1689
1690 /**
1691 Constructor taking start and end positions.
1692 */
1693 wxRichTextRange(long start, long end) { m_start = start; m_end = end; }
1694
1695 /**
1696 Copy constructor.
1697 */
1698 wxRichTextRange(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; }
1699 ~wxRichTextRange() {}
1700
1701 /**
1702 Assigns @a range to this range.
1703 */
1704 void operator =(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; }
1705
1706 /**
1707 Equality operator. Returns @true if @a range is the same as this range.
1708 */
1709 bool operator ==(const wxRichTextRange& range) const { return (m_start == range.m_start && m_end == range.m_end); }
1710
1711 /**
1712 Inequality operator.
1713 */
1714 bool operator !=(const wxRichTextRange& range) const { return (m_start != range.m_start || m_end != range.m_end); }
1715
1716 /**
1717 Subtracts a range from this range.
1718 */
1719 wxRichTextRange operator -(const wxRichTextRange& range) const { return wxRichTextRange(m_start - range.m_start, m_end - range.m_end); }
1720
1721 /**
1722 Adds a range to this range.
1723 */
1724 wxRichTextRange operator +(const wxRichTextRange& range) const { return wxRichTextRange(m_start + range.m_start, m_end + range.m_end); }
1725
1726 /**
1727 Sets the range start and end positions.
1728 */
1729 void SetRange(long start, long end) { m_start = start; m_end = end; }
1730
1731 /**
1732 Sets the start position.
1733 */
1734 void SetStart(long start) { m_start = start; }
1735
1736 /**
1737 Returns the start position.
1738 */
1739 long GetStart() const { return m_start; }
1740
1741 /**
1742 Sets the end position.
1743 */
1744 void SetEnd(long end) { m_end = end; }
1745
1746 /**
1747 Gets the end position.
1748 */
1749 long GetEnd() const { return m_end; }
1750
1751 /**
1752 Returns true if this range is completely outside @a range.
1753 */
1754 bool IsOutside(const wxRichTextRange& range) const { return range.m_start > m_end || range.m_end < m_start; }
1755
1756 /**
1757 Returns true if this range is completely within @a range.
1758 */
1759 bool IsWithin(const wxRichTextRange& range) const { return m_start >= range.m_start && m_end <= range.m_end; }
1760
1761 /**
1762 Returns true if @a pos was within the range. Does not match if the range is empty.
1763 */
1764 bool Contains(long pos) const { return pos >= m_start && pos <= m_end ; }
1765
1766 /**
1767 Limit this range to be within @a range.
1768 */
1769 bool LimitTo(const wxRichTextRange& range) ;
1770
1771 /**
1772 Gets the length of the range.
1773 */
1774 long GetLength() const { return m_end - m_start + 1; }
1775
1776 /**
1777 Swaps the start and end.
1778 */
1779 void Swap() { long tmp = m_start; m_start = m_end; m_end = tmp; }
1780
1781 /**
1782 Converts the API-standard range, whose end is one past the last character in
1783 the range, to the internal form, which uses the first and last character
1784 positions of the range. In other words, one is subtracted from the end position.
1785 (n, n) is the range of a single character.
1786 */
1787 wxRichTextRange ToInternal() const { return wxRichTextRange(m_start, m_end-1); }
1788
1789 /**
1790 Converts the internal range, which uses the first and last character positions
1791 of the range, to the API-standard range, whose end is one past the last
1792 character in the range. In other words, one is added to the end position.
1793 (n, n+1) is the range of a single character.
1794 */
1795 wxRichTextRange FromInternal() const { return wxRichTextRange(m_start, m_end+1); }
1796
1797protected:
1798 long m_start;
1799 long m_end;
1800};
1801
1802WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextRange, wxRichTextRangeArray, WXDLLIMPEXP_RICHTEXT);
1803
1804#define wxRICHTEXT_ALL wxRichTextRange(-2, -2)
1805#define wxRICHTEXT_NONE wxRichTextRange(-1, -1)
1806
1807#define wxRICHTEXT_NO_SELECTION wxRichTextRange(-2, -2)
1808
1809/**
1810 @class wxRichTextSelection
1811
1812 Stores selection information. The selection does not have to be contiguous, though currently non-contiguous
1813 selections are only supported for a range of table cells (a geometric block of cells can consist
1814 of a set of non-contiguous positions).
1815
1816 The selection consists of an array of ranges, and the container that is the context for the selection. It
1817 follows that a single selection object can only represent ranges with the same parent container.
1818
1819 @library{wxrichtext}
1820 @category{richtext}
1821
1822 @see wxRichTextBuffer, wxRichTextCtrl
1823*/
1824
1825class WXDLLIMPEXP_RICHTEXT wxRichTextSelection
1826{
1827public:
1828 /**
1829 Copy constructor.
1830 */
1831 wxRichTextSelection(const wxRichTextSelection& sel) { Copy(sel); }
1832
1833 /**
1834 Creates a selection from a range and a container.
1835 */
1836 wxRichTextSelection(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container) { m_ranges.Add(range); m_container = container; }
1837
1838 /**
1839 Default constructor.
1840 */
1841 wxRichTextSelection() { Reset(); }
1842
1843 /**
1844 Resets the selection.
1845 */
1846 void Reset() { m_ranges.Clear(); m_container = NULL; }
1847
1848 /**
1849 Sets the selection.
1850 */
1851
1852 void Set(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container)
1853 { m_ranges.Clear(); m_ranges.Add(range); m_container = container; }
1854
1855 /**
1856 Adds a range to the selection.
1857 */
1858 void Add(const wxRichTextRange& range)
1859 { m_ranges.Add(range); }
1860
1861 /**
1862 Sets the selections from an array of ranges and a container object.
1863 */
1864 void Set(const wxRichTextRangeArray& ranges, wxRichTextParagraphLayoutBox* container)
1865 { m_ranges = ranges; m_container = container; }
1866
1867 /**
1868 Copies from @a sel.
1869 */
1870 void Copy(const wxRichTextSelection& sel)
1871 { m_ranges = sel.m_ranges; m_container = sel.m_container; }
1872
1873 /**
1874 Assignment operator.
1875 */
1876 void operator=(const wxRichTextSelection& sel) { Copy(sel); }
1877
1878 /**
1879 Equality operator.
1880 */
1881 bool operator==(const wxRichTextSelection& sel) const;
1882
1883 /**
1884 Index operator.
1885 */
1886 wxRichTextRange operator[](size_t i) const { return GetRange(i); }
1887
1888 /**
1889 Returns the selection ranges.
1890 */
1891 wxRichTextRangeArray& GetRanges() { return m_ranges; }
1892
1893 /**
1894 Returns the selection ranges.
1895 */
1896 const wxRichTextRangeArray& GetRanges() const { return m_ranges; }
1897
1898 /**
1899 Sets the selection ranges.
1900 */
1901 void SetRanges(const wxRichTextRangeArray& ranges) { m_ranges = ranges; }
1902
1903 /**
1904 Returns the number of ranges in the selection.
1905 */
1906 size_t GetCount() const { return m_ranges.GetCount(); }
1907
1908 /**
1909 Returns the range at the given index.
1910
1911 */
1912 wxRichTextRange GetRange(size_t i) const { return m_ranges[i]; }
1913
1914 /**
1915 Returns the first range if there is one, otherwise wxRICHTEXT_NO_SELECTION.
1916 */
1917 wxRichTextRange GetRange() const { return (m_ranges.GetCount() > 0) ? (m_ranges[0]) : wxRICHTEXT_NO_SELECTION; }
1918
1919 /**
1920 Sets a single range.
1921 */
1922 void SetRange(const wxRichTextRange& range) { m_ranges.Clear(); m_ranges.Add(range); }
1923
1924 /**
1925 Returns the container for which the selection is valid.
1926 */
1927 wxRichTextParagraphLayoutBox* GetContainer() const { return m_container; }
1928
1929 /**
1930 Sets the container for which the selection is valid.
1931 */
1932 void SetContainer(wxRichTextParagraphLayoutBox* container) { m_container = container; }
1933
1934 /**
1935 Returns @true if the selection is valid.
1936 */
1937 bool IsValid() const { return m_ranges.GetCount() > 0 && GetContainer(); }
1938
1939 /**
1940 Returns the selection appropriate to the specified object, if any; returns an empty array if none
1941 at the level of the object's container.
1942 */
1943 wxRichTextRangeArray GetSelectionForObject(wxRichTextObject* obj) const;
1944
1945 /**
1946 Returns @true if the given position is within the selection.
1947 */
1948 bool WithinSelection(long pos, wxRichTextObject* obj) const;
1949
1950 /**
1951 Returns @true if the given position is within the selection.
1952
1953 */
1954 bool WithinSelection(long pos) const { return WithinSelection(pos, m_ranges); }
1955
1956 /**
1957 Returns @true if the given position is within the selection range.
1958 */
1959 static bool WithinSelection(long pos, const wxRichTextRangeArray& ranges);
1960
1961 /**
1962 Returns @true if the given range is within the selection range.
1963 */
1964 static bool WithinSelection(const wxRichTextRange& range, const wxRichTextRangeArray& ranges);
1965
1966 wxRichTextRangeArray m_ranges;
1967 wxRichTextParagraphLayoutBox* m_container;
1968};
1969
8db2e3ef
JS
1970/**
1971 @class wxRichTextDrawingContext
1972
1973 A class for passing information to drawing and measuring functions.
1974
1975 @library{wxrichtext}
1976 @category{richtext}
1977
1978 @see wxRichTextBuffer, wxRichTextCtrl
1979*/
1980
1981class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingContext: public wxObject
1982{
1983 DECLARE_CLASS(wxRichTextDrawingContext)
1984public:
1985
1986 /**
1987 Pass the buffer to the context so the context can retrieve information
1988 such as virtual attributes.
1989 */
1990 wxRichTextDrawingContext(wxRichTextBuffer* buffer) { Init(); m_buffer = buffer; }
1991
1992 void Init() { m_buffer = NULL; }
1993
1994 /**
1995 Does this object have virtual attributes?
1996 Virtual attributes can be provided for visual cues without
1997 affecting the actual styling.
1998 */
1999 bool HasVirtualAttributes(wxRichTextObject* obj) const;
2000
2001 /**
2002 Returns the virtual attributes for this object.
2003 Virtual attributes can be provided for visual cues without
2004 affecting the actual styling.
2005 */
2006 wxRichTextAttr GetVirtualAttributes(wxRichTextObject* obj) const;
2007
2008 /**
2009 Applies any virtual attributes relevant to this object.
2010 */
2011 bool ApplyVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const;
2012
2013 wxRichTextBuffer* m_buffer;
2014};
2015
7afd2b58
JS
2016/**
2017 @class wxRichTextObject
2018
2019 This is the base for drawable rich text objects.
2020
2021 @library{wxrichtext}
2022 @category{richtext}
2023
2024 @see wxRichTextBuffer, wxRichTextCtrl
2025*/
2026
2027class WXDLLIMPEXP_RICHTEXT wxRichTextObject: public wxObject
2028{
2029 DECLARE_CLASS(wxRichTextObject)
2030public:
2031 /**
2032 Constructor, taking an optional parent pointer.
2033 */
2034 wxRichTextObject(wxRichTextObject* parent = NULL);
2035
2036 virtual ~wxRichTextObject();
2037
2038// Overridables
2039
2040 /**
2041 Draw the item, within the given range. Some objects may ignore the range (for
2042 example paragraphs) while others must obey it (lines, to implement wrapping)
2043 */
8db2e3ef 2044 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0;
7afd2b58
JS
2045
2046 /**
2047 Lay the item out at the specified position with the given size constraint.
bb7bbd12
JS
2048 Layout must set the cached size. @rect is the available space for the object,
2049 and @a parentRect is the container that is used to determine a relative size
2050 or position (for example if a text box must be 50% of the parent text box).
7afd2b58 2051 */
8db2e3ef 2052 virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style) = 0;
7afd2b58
JS
2053
2054 /**
2055 Hit-testing: returns a flag indicating hit test details, plus
2056 information about position. @a contextObj is returned to specify what object
2057 position is relevant to, since otherwise there's an ambiguity.
2058 @ obj might not be a child of @a contextObj, since we may be referring to the container itself
2059 if we have no hit on a child - for example if we click outside an object.
2060
2061 The function puts the position in @a textPosition if one is found.
2062 @a pt is in logical units (a zero y position is at the beginning of the buffer).
2063
2064 @return One of the ::wxRichTextHitTestFlags values.
2065 */
2066
8db2e3ef 2067 virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
7afd2b58
JS
2068
2069 /**
2070 Finds the absolute position and row height for the given character position.
2071 */
8db2e3ef 2072 virtual bool FindPosition(wxDC& WXUNUSED(dc), wxRichTextDrawingContext& WXUNUSED(context), long WXUNUSED(index), wxPoint& WXUNUSED(pt), int* WXUNUSED(height), bool WXUNUSED(forceLineStart)) { return false; }
7afd2b58
JS
2073
2074 /**
2075 Returns the best size, i.e. the ideal starting size for this object irrespective
2076 of available space. For a short text string, it will be the size that exactly encloses
2077 the text. For a longer string, it might use the parent width for example.
2078 */
2079 virtual wxSize GetBestSize() const { return m_size; }
2080
2081 /**
2082 Returns the object size for the given range. Returns @false if the range
2083 is invalid for this object.
2084 */
2085
8db2e3ef 2086 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const = 0;
7afd2b58
JS
2087
2088 /**
2089 Do a split from @a pos, returning an object containing the second part, and setting
2090 the first part in 'this'.
2091 */
2092 virtual wxRichTextObject* DoSplit(long WXUNUSED(pos)) { return NULL; }
2093
2094 /**
2095 Calculates the range of the object. By default, guess that the object is 1 unit long.
2096 */
2097 virtual void CalculateRange(long start, long& end) { end = start ; m_range.SetRange(start, end); }
2098
2099 /**
2100 Deletes the given range.
2101 */
2102 virtual bool DeleteRange(const wxRichTextRange& WXUNUSED(range)) { return false; }
2103
2104 /**
2105 Returns @true if the object is empty.
2106 */
2107 virtual bool IsEmpty() const { return false; }
2108
2109 /**
2110 Returns @true if this class of object is floatable.
2111 */
2112 virtual bool IsFloatable() const { return false; }
2113
2114 /**
2115 Returns @true if this object is currently floating.
2116 */
2117 virtual bool IsFloating() const { return GetAttributes().GetTextBoxAttr().IsFloating(); }
2118
2119 /**
2120 Returns the floating direction.
2121 */
2122 virtual int GetFloatDirection() const { return GetAttributes().GetTextBoxAttr().GetFloatMode(); }
2123
2124 /**
2125 Returns any text in this object for the given range.
2126 */
2127 virtual wxString GetTextForRange(const wxRichTextRange& WXUNUSED(range)) const { return wxEmptyString; }
2128
2129 /**
2130 Returns @true if this object can merge itself with the given one.
2131 */
2132 virtual bool CanMerge(wxRichTextObject* WXUNUSED(object)) const { return false; }
2133
2134 /**
2135 Returns @true if this object merged itself with the given one.
2136 The calling code will then delete the given object.
2137 */
2138 virtual bool Merge(wxRichTextObject* WXUNUSED(object)) { return false; }
2139
2140 /**
2141 Dump object data to the given output stream for debugging.
2142 */
2143 virtual void Dump(wxTextOutputStream& stream);
2144
2145 /**
2146 Returns @true if we can edit the object's properties via a GUI.
2147 */
2148 virtual bool CanEditProperties() const { return false; }
2149
2150 /**
2151 Edits the object's properties via a GUI.
2152 */
2153 virtual bool EditProperties(wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; }
2154
2155 /**
2156 Returns the label to be used for the properties context menu item.
2157 */
2158 virtual wxString GetPropertiesMenuLabel() const { return wxEmptyString; }
2159
2160 /**
2161 Returns @true if objects of this class can accept the focus, i.e. a call to SetFocusObject
2162 is possible. For example, containers supporting text, such as a text box object, can accept the focus,
2163 but a table can't (set the focus to individual cells instead).
2164 */
2165 virtual bool AcceptsFocus() const { return false; }
2166
2167#if wxUSE_XML
2168 /**
2169 Imports this object from XML.
2170 */
2171 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
2172#endif
2173
2174#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
2175 /**
2176 Exports this object directly to the given stream, bypassing the creation of a wxXmlNode hierarchy.
2177 This method is considerably faster than creating a tree first. However, both versions of ExportXML must be
2178 implemented so that if the tree method is made efficient in the future, we can deprecate the
2179 more verbose direct output method. Compiled only if wxRICHTEXT_HAVE_DIRECT_OUTPUT is defined (on by default).
2180 */
2181 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
2182#endif
2183
2184#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
2185 /**
2186 Exports this object to the given parent node, usually creating at least one child node.
2187 This method is less efficient than the direct-to-stream method but is retained to allow for
2188 switching to this method if we make it more efficient. Compiled only if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT is defined
2189 (on by default).
2190 */
2191 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
2192#endif
2193
2194 /**
2195 Returns @true if this object takes note of paragraph attributes (text and image objects don't).
2196 */
2197 virtual bool UsesParagraphAttributes() const { return true; }
2198
2199 /**
2200 Returns the XML node name of this object. This must be overridden for wxXmlNode-base XML export to work.
2201 */
2202 virtual wxString GetXMLNodeName() const { return wxT("unknown"); }
2203
2204 /**
2205 Invalidates the object at the given range. With no argument, invalidates the whole object.
2206 */
2207 virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
2208
2209 /**
2210 Returns @true if this object can handle the selections of its children, fOr example a table.
2211 Required for composite selection handling to work.
2212 */
2213 virtual bool HandlesChildSelections() const { return false; }
2214
2215 /**
2216 Returns a selection object specifying the selections between start and end character positions.
2217 For example, a table would deduce what cells (of range length 1) are selected when dragging across the table.
2218 */
2219 virtual wxRichTextSelection GetSelection(long WXUNUSED(start), long WXUNUSED(end)) const { return wxRichTextSelection(); }
2220
2221// Accessors
2222
2223 /**
2224 Gets the cached object size as calculated by Layout.
2225 */
2226 virtual wxSize GetCachedSize() const { return m_size; }
2227
2228 /**
2229 Sets the cached object size as calculated by Layout.
2230 */
2231 virtual void SetCachedSize(const wxSize& sz) { m_size = sz; }
2232
2233 /**
2234 Gets the maximum object size as calculated by Layout. This allows
2235 us to fit an object to its contents or allocate extra space if required.
2236 */
2237 virtual wxSize GetMaxSize() const { return m_maxSize; }
2238
2239 /**
2240 Sets the maximum object size as calculated by Layout. This allows
2241 us to fit an object to its contents or allocate extra space if required.
2242 */
2243 virtual void SetMaxSize(const wxSize& sz) { m_maxSize = sz; }
2244
2245 /**
2246 Gets the minimum object size as calculated by Layout. This allows
2247 us to constrain an object to its absolute minimum size if necessary.
2248 */
2249 virtual wxSize GetMinSize() const { return m_minSize; }
2250
2251 /**
2252 Sets the minimum object size as calculated by Layout. This allows
2253 us to constrain an object to its absolute minimum size if necessary.
2254 */
2255 virtual void SetMinSize(const wxSize& sz) { m_minSize = sz; }
2256
2257 /**
2258 Gets the 'natural' size for an object. For an image, it would be the
2259 image size.
2260 */
2261 virtual wxTextAttrSize GetNaturalSize() const { return wxTextAttrSize(); }
2262
2263 /**
2264 Returns the object position in pixels.
2265 */
2266 virtual wxPoint GetPosition() const { return m_pos; }
2267
2268 /**
2269 Sets the object position in pixels.
2270 */
2271 virtual void SetPosition(const wxPoint& pos) { m_pos = pos; }
2272
2273 /**
2274 Returns the absolute object position, by traversing up the child/parent hierarchy.
2275 TODO: may not be needed, if all object positions are in fact relative to the
2276 top of the coordinate space.
2277 */
2278 virtual wxPoint GetAbsolutePosition() const;
2279
2280 /**
2281 Returns the rectangle enclosing the object.
2282 */
2283 virtual wxRect GetRect() const { return wxRect(GetPosition(), GetCachedSize()); }
2284
2285 /**
2286 Sets the object's range within its container.
2287 */
2288 void SetRange(const wxRichTextRange& range) { m_range = range; }
2289
2290 /**
2291 Returns the object's range.
2292 */
2293 const wxRichTextRange& GetRange() const { return m_range; }
2294
2295 /**
2296 Returns the object's range.
2297 */
2298 wxRichTextRange& GetRange() { return m_range; }
2299
2300 /**
2301 Set the object's own range, for a top-level object with its own position space.
2302 */
2303 void SetOwnRange(const wxRichTextRange& range) { m_ownRange = range; }
2304
2305 /**
2306 Returns the object's own range (valid if top-level).
2307 */
2308 const wxRichTextRange& GetOwnRange() const { return m_ownRange; }
2309
2310 /**
2311 Returns the object's own range (valid if top-level).
2312 */
2313 wxRichTextRange& GetOwnRange() { return m_ownRange; }
2314
2315 /**
2316 Returns the object's own range only if a top-level object.
2317 */
2318 wxRichTextRange GetOwnRangeIfTopLevel() const { return IsTopLevel() ? m_ownRange : m_range; }
2319
2320 /**
7c9fdebe 2321 Returns @true if this object is composite.
7afd2b58
JS
2322 */
2323 virtual bool IsComposite() const { return false; }
2324
7c9fdebe
JS
2325 /**
2326 Returns @true if no user editing can be done inside the object. This returns @true for simple objects,
2327 @false for most composite objects, but @true for fields, which if composite, should not be user-edited.
2328 */
2329 virtual bool IsAtomic() const { return true; }
2330
7afd2b58
JS
2331 /**
2332 Returns a pointer to the parent object.
2333 */
2334 virtual wxRichTextObject* GetParent() const { return m_parent; }
2335
2336 /**
2337 Sets the pointer to the parent object.
2338 */
2339 virtual void SetParent(wxRichTextObject* parent) { m_parent = parent; }
2340
2341 /**
2342 Returns the top-level container of this object.
2343 May return itself if it's a container; use GetParentContainer to return
2344 a different container.
2345 */
2346 virtual wxRichTextParagraphLayoutBox* GetContainer() const;
2347
2348 /**
2349 Returns the top-level container of this object.
2350 Returns a different container than itself, unless there's no parent, in which case it will return NULL.
2351 */
2352 virtual wxRichTextParagraphLayoutBox* GetParentContainer() const { return GetParent() ? GetParent()->GetContainer() : GetContainer(); }
2353
2354 /**
2355 Set the margin around the object, in pixels.
2356 */
2357 virtual void SetMargins(int margin);
2358
2359 /**
2360 Set the margin around the object, in pixels.
2361 */
2362 virtual void SetMargins(int leftMargin, int rightMargin, int topMargin, int bottomMargin);
2363
2364 /**
2365 Returns the left margin of the object, in pixels.
2366 */
2367 virtual int GetLeftMargin() const;
2368
2369 /**
2370 Returns the right margin of the object, in pixels.
2371 */
2372 virtual int GetRightMargin() const;
2373
2374 /**
2375 Returns the top margin of the object, in pixels.
2376 */
2377 virtual int GetTopMargin() const;
2378
2379 /**
2380 Returns the bottom margin of the object, in pixels.
2381 */
2382 virtual int GetBottomMargin() const;
2383
2384 /**
2385 Calculates the available content space in the given rectangle, given the
2386 margins, border and padding specified in the object's attributes.
2387 */
8db2e3ef 2388 virtual wxRect GetAvailableContentArea(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& outerRect) const;
7afd2b58
JS
2389
2390 /**
2391 Lays out the object first with a given amount of space, and then if no width was specified in attr,
bb7bbd12
JS
2392 lays out the object again using the minimum size. @a availableParentSpace is the maximum space
2393 for the object, whereas @a availableContainerSpace is the container with which relative positions and
2394 sizes should be computed. For example, a text box whose space has already been constrained
2395 in a previous layout pass to @a availableParentSpace, but should have a width of 50% of @a availableContainerSpace.
2396 (If these two rects were the same, a 2nd pass could see the object getting too small.)
7afd2b58 2397 */
8db2e3ef 2398 virtual bool LayoutToBestSize(wxDC& dc, wxRichTextDrawingContext& context, wxRichTextBuffer* buffer,
bb7bbd12
JS
2399 const wxRichTextAttr& parentAttr, const wxRichTextAttr& attr,
2400 const wxRect& availableParentSpace, const wxRect& availableContainerSpace, int style);
7afd2b58
JS
2401
2402 /**
2403 Sets the object's attributes.
2404 */
2405 void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; }
2406
2407 /**
2408 Returns the object's attributes.
2409 */
2410 const wxRichTextAttr& GetAttributes() const { return m_attributes; }
2411
2412 /**
2413 Returns the object's attributes.
2414 */
2415 wxRichTextAttr& GetAttributes() { return m_attributes; }
2416
2417 /**
c6182d48 2418 Returns the object's properties.
7afd2b58
JS
2419 */
2420 wxRichTextProperties& GetProperties() { return m_properties; }
2421
2422 /**
2423 Returns the object's properties.
2424 */
2425 const wxRichTextProperties& GetProperties() const { return m_properties; }
2426
2427 /**
c6182d48 2428 Sets the object's properties.
7afd2b58
JS
2429 */
2430 void SetProperties(const wxRichTextProperties& props) { m_properties = props; }
2431
2432 /**
2433 Sets the stored descent value.
2434 */
2435 void SetDescent(int descent) { m_descent = descent; }
2436
2437 /**
2438 Returns the stored descent value.
2439 */
2440 int GetDescent() const { return m_descent; }
2441
2442 /**
2443 Returns the containing buffer.
2444 */
2445 wxRichTextBuffer* GetBuffer() const;
2446
2447 /**
2448 Sets the identifying name for this object as a property using the "name" key.
2449 */
2450 void SetName(const wxString& name) { m_properties.SetProperty(wxT("name"), name); }
2451
2452 /**
2453 Returns the identifying name for this object from the properties, using the "name" key.
2454 */
2455 wxString GetName() const { return m_properties.GetPropertyString(wxT("name")); }
2456
2457 /**
2458 Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box.
2459 */
2460 virtual bool IsTopLevel() const { return false; }
2461
2462 /**
2463 Returns @true if the object will be shown, @false otherwise.
2464 */
2465 bool IsShown() const { return m_show; }
2466
2467// Operations
2468
2469 /**
2470 Call to show or hide this object. This function does not cause the content to be
2471 laid out or redrawn.
2472 */
2473 virtual void Show(bool show) { m_show = show; }
2474
2475 /**
2476 Clones the object.
2477 */
2478 virtual wxRichTextObject* Clone() const { return NULL; }
2479
2480 /**
2481 Copies the object.
2482 */
2483 void Copy(const wxRichTextObject& obj);
2484
2485 /**
2486 Reference-counting allows us to use the same object in multiple
2487 lists (not yet used).
2488 */
2489
2490 void Reference() { m_refCount ++; }
2491
2492 /**
2493 Reference-counting allows us to use the same object in multiple
2494 lists (not yet used).
2495 */
2496 void Dereference();
2497
2498 /**
2499 Moves the object recursively, by adding the offset from old to new.
2500 */
2501 virtual void Move(const wxPoint& pt);
2502
2503 /**
2504 Converts units in tenths of a millimetre to device units.
2505 */
2506 int ConvertTenthsMMToPixels(wxDC& dc, int units) const;
2507
2508 /**
2509 Converts units in tenths of a millimetre to device units.
2510 */
2511 static int ConvertTenthsMMToPixels(int ppi, int units, double scale = 1.0);
2512
2513 /**
2514 Convert units in pixels to tenths of a millimetre.
2515 */
2516 int ConvertPixelsToTenthsMM(wxDC& dc, int pixels) const;
2517
2518 /**
2519 Convert units in pixels to tenths of a millimetre.
2520 */
2521 static int ConvertPixelsToTenthsMM(int ppi, int pixels, double scale = 1.0);
2522
2523 /**
2524 Draws the borders and background for the given rectangle and attributes.
2525 @a boxRect is taken to be the outer margin box, not the box around the content.
2526 */
2527 static bool DrawBoxAttributes(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, const wxRect& boxRect, int flags = 0);
2528
2529 /**
2530 Draws a border.
2531 */
2532 static bool DrawBorder(wxDC& dc, wxRichTextBuffer* buffer, const wxTextAttrBorders& attr, const wxRect& rect, int flags = 0);
2533
2534 /**
2535 Returns the various rectangles of the box model in pixels. You can either specify @a contentRect (inner)
2536 or @a marginRect (outer), and the other must be the default rectangle (no width or height).
2537 Note that the outline doesn't affect the position of the rectangle, it's drawn in whatever space
2538 is available.
2539 */
2540 static bool GetBoxRects(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, wxRect& marginRect, wxRect& borderRect, wxRect& contentRect, wxRect& paddingRect, wxRect& outlineRect);
2541
2542 /**
2543 Returns the total margin for the object in pixels, taking into account margin, padding and border size.
2544 */
2545 static bool GetTotalMargin(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, int& leftMargin, int& rightMargin,
2546 int& topMargin, int& bottomMargin);
2547
2548 /**
2549 Returns the rectangle which the child has available to it given restrictions specified in the
2550 child attribute, e.g. 50% width of the parent, 400 pixels, x position 20% of the parent, etc.
bb7bbd12
JS
2551 availableContainerSpace might be a parent that the cell has to compute its width relative to.
2552 E.g. a cell that's 50% of its parent.
7afd2b58 2553 */
bb7bbd12
JS
2554 static wxRect AdjustAvailableSpace(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& parentAttr, const wxRichTextAttr& childAttr,
2555 const wxRect& availableParentSpace, const wxRect& availableContainerSpace);
7afd2b58
JS
2556
2557protected:
2558 wxSize m_size;
2559 wxSize m_maxSize;
2560 wxSize m_minSize;
2561 wxPoint m_pos;
2562 int m_descent; // Descent for this object (if any)
2563 int m_refCount;
2564 bool m_show;
2565 wxRichTextObject* m_parent;
2566
2567 // The range of this object (start position to end position)
2568 wxRichTextRange m_range;
2569
2570 // The internal range of this object, if it's a top-level object with its own range space
2571 wxRichTextRange m_ownRange;
2572
2573 // Attributes
2574 wxRichTextAttr m_attributes;
2575
2576 // Properties
2577 wxRichTextProperties m_properties;
2578};
2579
2580WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_RICHTEXT );
2581
2582/**
2583 @class wxRichTextCompositeObject
2584
2585 Objects of this class can contain other objects.
2586
2587 @library{wxrichtext}
2588 @category{richtext}
2589
2590 @see wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl
2591*/
2592
2593class WXDLLIMPEXP_RICHTEXT wxRichTextCompositeObject: public wxRichTextObject
2594{
2595 DECLARE_CLASS(wxRichTextCompositeObject)
2596public:
2597// Constructors
2598
2599 wxRichTextCompositeObject(wxRichTextObject* parent = NULL);
2600 virtual ~wxRichTextCompositeObject();
2601
2602// Overridables
2603
8db2e3ef 2604 virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
7afd2b58 2605
8db2e3ef 2606 virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart);
7afd2b58
JS
2607
2608 virtual void CalculateRange(long start, long& end);
2609
2610 virtual bool DeleteRange(const wxRichTextRange& range);
2611
2612 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
2613
8db2e3ef 2614 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
7afd2b58
JS
2615
2616 virtual void Dump(wxTextOutputStream& stream);
2617
2618 virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
2619
2620// Accessors
2621
2622 /**
2623 Returns the children.
2624 */
2625 wxRichTextObjectList& GetChildren() { return m_children; }
2626 /**
2627 Returns the children.
2628 */
2629 const wxRichTextObjectList& GetChildren() const { return m_children; }
2630
2631 /**
2632 Returns the number of children.
2633 */
2634 size_t GetChildCount() const ;
2635
2636 /**
2637 Returns the nth child.
2638 */
2639 wxRichTextObject* GetChild(size_t n) const ;
2640
2641 /**
2642 Returns @true if this object is composite.
2643 */
2644 virtual bool IsComposite() const { return true; }
2645
7c9fdebe
JS
2646 /**
2647 Returns @true if no user editing can be done inside the object. This returns @true for simple objects,
2648 @false for most composite objects, but @true for fields, which if composite, should not be user-edited.
2649 */
2650 virtual bool IsAtomic() const { return false; }
2651
7afd2b58
JS
2652 /**
2653 Returns true if the buffer is empty.
2654 */
2655 virtual bool IsEmpty() const { return GetChildCount() == 0; }
2656
2657 /**
2658 Returns the child object at the given character position.
2659 */
2660 virtual wxRichTextObject* GetChildAtPosition(long pos) const;
2661
2662// Operations
2663
2664 void Copy(const wxRichTextCompositeObject& obj);
2665
2666 void operator= (const wxRichTextCompositeObject& obj) { Copy(obj); }
2667
2668 /**
2669 Appends a child, returning the position.
2670 */
2671 size_t AppendChild(wxRichTextObject* child) ;
2672
2673 /**
2674 Inserts the child in front of the given object, or at the beginning.
2675 */
2676 bool InsertChild(wxRichTextObject* child, wxRichTextObject* inFrontOf) ;
2677
2678 /**
2679 Removes and optionally deletes the specified child.
2680 */
2681 bool RemoveChild(wxRichTextObject* child, bool deleteChild = false) ;
2682
2683 /**
2684 Deletes all the children.
2685 */
2686 bool DeleteChildren() ;
2687
2688 /**
2689 Recursively merges all pieces that can be merged.
2690 */
2691 bool Defragment(const wxRichTextRange& range = wxRICHTEXT_ALL);
2692
2693 /**
2694 Moves the object recursively, by adding the offset from old to new.
2695 */
2696 virtual void Move(const wxPoint& pt);
2697
2698protected:
2699 wxRichTextObjectList m_children;
2700};
2701
2702/**
2703 @class wxRichTextParagraphBox
2704
2705 This class knows how to lay out paragraphs.
2706
2707 @library{wxrichtext}
2708 @category{richtext}
2709
2710 @see wxRichTextCompositeObject, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl
2711*/
2712
2713class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphLayoutBox: public wxRichTextCompositeObject
2714{
2715 DECLARE_DYNAMIC_CLASS(wxRichTextParagraphLayoutBox)
2716public:
2717// Constructors
2718
2719 wxRichTextParagraphLayoutBox(wxRichTextObject* parent = NULL);
2720 wxRichTextParagraphLayoutBox(const wxRichTextParagraphLayoutBox& obj): wxRichTextCompositeObject() { Init(); Copy(obj); }
2721 ~wxRichTextParagraphLayoutBox();
2722
2723// Overridables
2724
8db2e3ef 2725 virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
7afd2b58 2726
8db2e3ef 2727 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58 2728
8db2e3ef 2729 virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
7afd2b58 2730
8db2e3ef 2731 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
7afd2b58
JS
2732
2733 virtual bool DeleteRange(const wxRichTextRange& range);
2734
2735 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
2736
2737#if wxUSE_XML
2738 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
2739#endif
2740
2741#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
2742 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
2743#endif
2744
2745#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
2746 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
2747#endif
2748
2749 virtual wxString GetXMLNodeName() const { return wxT("paragraphlayout"); }
2750
2751 virtual bool AcceptsFocus() const { return true; }
2752
2753// Accessors
2754
2755 /**
2756 Associates a control with the buffer, for operations that for example require refreshing the window.
2757 */
2758 void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_ctrl = ctrl; }
2759
2760 /**
2761 Returns the associated control.
2762 */
2763 wxRichTextCtrl* GetRichTextCtrl() const { return m_ctrl; }
2764
2765 /**
2766 Sets a flag indicating whether the last paragraph is partial or complete.
2767 */
2768 void SetPartialParagraph(bool partialPara) { m_partialParagraph = partialPara; }
2769
2770 /**
2771 Returns a flag indicating whether the last paragraph is partial or complete.
2772 */
2773 bool GetPartialParagraph() const { return m_partialParagraph; }
2774
2775 /**
2776 Returns the style sheet associated with the overall buffer.
2777 */
2778 virtual wxRichTextStyleSheet* GetStyleSheet() const;
2779
2780 virtual bool IsTopLevel() const { return true; }
2781
2782// Operations
2783
2784 /**
2785 Submits a command to insert paragraphs.
2786 */
4e63bfb9 2787 bool InsertParagraphsWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0);
7afd2b58
JS
2788
2789 /**
2790 Submits a command to insert the given text.
2791 */
4e63bfb9 2792 bool InsertTextWithUndo(wxRichTextBuffer* buffer, long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0);
7afd2b58
JS
2793
2794 /**
2795 Submits a command to insert the given text.
2796 */
4e63bfb9 2797 bool InsertNewlineWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextCtrl* ctrl, int flags = 0);
7afd2b58
JS
2798
2799 /**
2800 Submits a command to insert the given image.
2801 */
4e63bfb9
JS
2802 bool InsertImageWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextImageBlock& imageBlock,
2803 wxRichTextCtrl* ctrl, int flags,
7afd2b58
JS
2804 const wxRichTextAttr& textAttr);
2805
7c9fdebe
JS
2806 /**
2807 Submits a command to insert the given field. Field data can be included in properties.
2808
2809 @see wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
2810 */
2811 wxRichTextField* InsertFieldWithUndo(wxRichTextBuffer* buffer, long pos, const wxString& fieldType,
2812 const wxRichTextProperties& properties,
2813 wxRichTextCtrl* ctrl, int flags,
2814 const wxRichTextAttr& textAttr);
2815
7afd2b58
JS
2816 /**
2817 Returns the style that is appropriate for a new paragraph at this position.
2818 If the previous paragraph has a paragraph style name, looks up the next-paragraph
2819 style.
2820 */
2821 wxRichTextAttr GetStyleForNewParagraph(wxRichTextBuffer* buffer, long pos, bool caretPosition = false, bool lookUpNewParaStyle=false) const;
2822
2823 /**
2824 Inserts an object.
2825 */
4e63bfb9 2826 wxRichTextObject* InsertObjectWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags = 0);
7afd2b58
JS
2827
2828 /**
2829 Submits a command to delete this range.
2830 */
2831 bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl, wxRichTextBuffer* buffer);
2832
2833 /**
2834 Draws the floating objects in this buffer.
2835 */
8db2e3ef 2836 void DrawFloats(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58
JS
2837
2838 /**
2839 Moves an anchored object to another paragraph.
2840 */
2841 void MoveAnchoredObjectToParagraph(wxRichTextParagraph* from, wxRichTextParagraph* to, wxRichTextObject* obj);
2842
2843 /**
2844 Initializes the object.
2845 */
2846 void Init();
2847
2848 /**
2849 Clears all the children.
2850 */
2851 virtual void Clear();
2852
2853 /**
2854 Clears and initializes with one blank paragraph.
2855 */
2856 virtual void Reset();
2857
2858 /**
2859 Convenience function to add a paragraph of text.
2860 */
2861 virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL);
2862
2863 /**
2864 Convenience function to add an image.
2865 */
2866 virtual wxRichTextRange AddImage(const wxImage& image, wxRichTextAttr* paraStyle = NULL);
2867
2868 /**
2869 Adds multiple paragraphs, based on newlines.
2870 */
2871 virtual wxRichTextRange AddParagraphs(const wxString& text, wxRichTextAttr* paraStyle = NULL);
2872
2873 /**
2874 Returns the line at the given position. If @a caretPosition is true, the position is
2875 a caret position, which is normally a smaller number.
2876 */
2877 virtual wxRichTextLine* GetLineAtPosition(long pos, bool caretPosition = false) const;
2878
2879 /**
2880 Returns the line at the given y pixel position, or the last line.
2881 */
2882 virtual wxRichTextLine* GetLineAtYPosition(int y) const;
2883
2884 /**
2885 Returns the paragraph at the given character or caret position.
2886 */
2887 virtual wxRichTextParagraph* GetParagraphAtPosition(long pos, bool caretPosition = false) const;
2888
2889 /**
2890 Returns the line size at the given position.
2891 */
2892 virtual wxSize GetLineSizeAtPosition(long pos, bool caretPosition = false) const;
2893
2894 /**
2895 Given a position, returns the number of the visible line (potentially many to a paragraph),
2896 starting from zero at the start of the buffer. We also have to pass a bool (@a startOfLine)
2897 that indicates whether the caret is being shown at the end of the previous line or at the start
2898 of the next, since the caret can be shown at two visible positions for the same underlying
2899 position.
2900 */
2901 virtual long GetVisibleLineNumber(long pos, bool caretPosition = false, bool startOfLine = false) const;
2902
2903 /**
2904 Given a line number, returns the corresponding wxRichTextLine object.
2905 */
2906 virtual wxRichTextLine* GetLineForVisibleLineNumber(long lineNumber) const;
2907
2908 /**
2909 Returns the leaf object in a paragraph at this position.
2910 */
2911 virtual wxRichTextObject* GetLeafObjectAtPosition(long position) const;
2912
2913 /**
2914 Returns the paragraph by number.
2915 */
2916 virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const;
2917
2918 /**
2919 Returns the paragraph for a given line.
2920 */
2921 virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const;
2922
2923 /**
2924 Returns the length of the paragraph.
2925 */
2926 virtual int GetParagraphLength(long paragraphNumber) const;
2927
2928 /**
2929 Returns the number of paragraphs.
2930 */
2931 virtual int GetParagraphCount() const { return static_cast<int>(GetChildCount()); }
2932
2933 /**
2934 Returns the number of visible lines.
2935 */
2936 virtual int GetLineCount() const;
2937
2938 /**
2939 Returns the text of the paragraph.
2940 */
2941 virtual wxString GetParagraphText(long paragraphNumber) const;
2942
2943 /**
2944 Converts zero-based line column and paragraph number to a position.
2945 */
2946 virtual long XYToPosition(long x, long y) const;
2947
2948 /**
2949 Converts a zero-based position to line column and paragraph number.
2950 */
2951 virtual bool PositionToXY(long pos, long* x, long* y) const;
2952
2953 /**
2954 Sets the attributes for the given range. Pass flags to determine how the
2955 attributes are set.
2956
2957 The end point of range is specified as the last character position of the span
2958 of text. So, for example, to set the style for a character at position 5,
2959 use the range (5,5).
2960 This differs from the wxRichTextCtrl API, where you would specify (5,6).
2961
2962 @a flags may contain a bit list of the following values:
2963 - wxRICHTEXT_SETSTYLE_NONE: no style flag.
2964 - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this operation should be
2965 undoable.
2966 - wxRICHTEXT_SETSTYLE_OPTIMIZE: specifies that the style should not be applied
2967 if the combined style at this point is already the style in question.
2968 - wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY: specifies that the style should only be
2969 applied to paragraphs, and not the content.
2970 This allows content styling to be preserved independently from that
2971 of e.g. a named paragraph style.
2972 - wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY: specifies that the style should only be
2973 applied to characters, and not the paragraph.
2974 This allows content styling to be preserved independently from that
2975 of e.g. a named paragraph style.
2976 - wxRICHTEXT_SETSTYLE_RESET: resets (clears) the existing style before applying
2977 the new style.
2978 - wxRICHTEXT_SETSTYLE_REMOVE: removes the specified style.
2979 Only the style flags are used in this operation.
2980 */
2981 virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
2982
2983 /**
2984 Sets the attributes for the given object only, for example the box attributes for a text box.
2985 */
2986 virtual void SetStyle(wxRichTextObject *obj, const wxRichTextAttr& textAttr, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
2987
2988 /**
2989 Returns the combined text attributes for this position.
2990
2991 This function gets the @e uncombined style - that is, the attributes associated
2992 with the paragraph or character content, and not necessarily the combined
2993 attributes you see on the screen. To get the combined attributes, use GetStyle().
2994 If you specify (any) paragraph attribute in @e style's flags, this function
2995 will fetch the paragraph attributes.
2996 Otherwise, it will return the character attributes.
2997 */
2998 virtual bool GetStyle(long position, wxRichTextAttr& style);
2999
3000 /**
3001 Returns the content (uncombined) attributes for this position.
3002 */
3003 virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style);
3004
3005 /**
3006 Implementation helper for GetStyle. If combineStyles is true, combine base, paragraph and
3007 context attributes.
3008 */
3009 virtual bool DoGetStyle(long position, wxRichTextAttr& style, bool combineStyles = true);
3010
3011 /**
3012 This function gets a style representing the common, combined attributes in the
23324ae1
FM
3013 given range.
3014 Attributes which have different values within the specified range will not be
9e7ad1ca
FM
3015 included the style flags.
3016
7afd2b58
JS
3017 The function is used to get the attributes to display in the formatting dialog:
3018 the user can edit the attributes common to the selection, and optionally specify the
3019 values of further attributes to be applied uniformly.
3020
3021 To apply the edited attributes, you can use SetStyle() specifying
3022 the wxRICHTEXT_SETSTYLE_OPTIMIZE flag, which will only apply attributes that
3023 are different from the @e combined attributes within the range.
3024 So, the user edits the effective, displayed attributes for the range,
3025 but his choice won't be applied unnecessarily to content. As an example,
3026 say the style for a paragraph specifies bold, but the paragraph text doesn't
3027 specify a weight.
3028 The combined style is bold, and this is what the user will see on-screen and
3029 in the formatting dialog. The user now specifies red text, in addition to bold.
3030 When applying with SetStyle(), the content font weight attributes won't be
3031 changed to bold because this is already specified by the paragraph.
3032 However the text colour attributes @e will be changed to show red.
3033 */
3034 virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style);
3035
3036 /**
3037 Combines @a style with @a currentStyle for the purpose of summarising the attributes of a range of
3038 content.
3039 */
3040 bool CollectStyle(wxRichTextAttr& currentStyle, const wxRichTextAttr& style, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr);
3041
3042 //@{
3043 /**
3044 Sets the list attributes for the given range, passing flags to determine how
3045 the attributes are set.
3046 Either the style definition or the name of the style definition (in the current
3047 sheet) can be passed.
3048
3049 @a flags is a bit list of the following:
3050 - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
3051 - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
3052 @a startFrom, otherwise existing attributes are used.
3053 - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
3054 as the level for all paragraphs, otherwise the current indentation will be used.
3055
3056 @see NumberList(), PromoteList(), ClearListStyle().
3057 */
3058 virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
3059 virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
3060 //@}
3061
3062 /**
3063 Clears the list style from the given range, clearing list-related attributes
3064 and applying any named paragraph style associated with each paragraph.
3065
3066 @a flags is a bit list of the following:
3067 - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
3068
3069 @see SetListStyle(), PromoteList(), NumberList()
3070 */
3071 virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
3072
3073 //@{
3074 /**
3075 Numbers the paragraphs in the given range.
3076
3077 Pass flags to determine how the attributes are set.
3078 Either the style definition or the name of the style definition (in the current
3079 sheet) can be passed.
3080
3081 @a flags is a bit list of the following:
3082 - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
3083 - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
3084 @a startFrom, otherwise existing attributes are used.
3085 - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
3086 as the level for all paragraphs, otherwise the current indentation will be used.
3087
3088 @a def can be NULL to indicate that the existing list style should be used.
3089
3090 @see SetListStyle(), PromoteList(), ClearListStyle()
3091 */
3092 virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
3093 virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
3094 //@}
3095
3096 //@{
3097 /**
3098 Promotes the list items within the given range.
3099 A positive @a promoteBy produces a smaller indent, and a negative number
3100 produces a larger indent. Pass flags to determine how the attributes are set.
3101 Either the style definition or the name of the style definition (in the current
3102 sheet) can be passed.
3103
3104 @a flags is a bit list of the following:
3105 - wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
3106 - wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
3107 @a startFrom, otherwise existing attributes are used.
3108 - wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
3109 as the level for all paragraphs, otherwise the current indentation will be used.
3110
3111 @see SetListStyle(), SetListStyle(), ClearListStyle()
3112 */
3113 virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
3114 virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
3115 //@}
3116
3117 /**
3118 Helper for NumberList and PromoteList, that does renumbering and promotion simultaneously
3119 @a def can be NULL/empty to indicate that the existing list style should be used.
3120 */
3121 virtual bool DoNumberList(const wxRichTextRange& range, const wxRichTextRange& promotionRange, int promoteBy, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
3122
3123 /**
3124 Fills in the attributes for numbering a paragraph after previousParagraph.
3125 */
3126 virtual bool FindNextParagraphNumber(wxRichTextParagraph* previousParagraph, wxRichTextAttr& attr) const;
3127
590a0f8b
JS
3128 /**
3129 Sets the properties for the given range, passing flags to determine how the
3130 attributes are set. You can merge properties or replace them.
3131
3132 The end point of range is specified as the last character position of the span
3133 of text, plus one. So, for example, to set the properties for a character at
3134 position 5, use the range (5,6).
3135
3136 @a flags may contain a bit list of the following values:
3137 - wxRICHTEXT_SETPROPERTIES_NONE: no flag.
3138 - wxRICHTEXT_SETPROPERTIES_WITH_UNDO: specifies that this operation should be
3139 undoable.
3140 - wxRICHTEXT_SETPROPERTIES_PARAGRAPHS_ONLY: specifies that the properties should only be
3141 applied to paragraphs, and not the content.
3142 - wxRICHTEXT_SETPROPERTIES_CHARACTERS_ONLY: specifies that the properties should only be
3143 applied to characters, and not the paragraph.
3144 - wxRICHTEXT_SETPROPERTIES_RESET: resets (clears) the existing properties before applying
3145 the new properties.
3146 - wxRICHTEXT_SETPROPERTIES_REMOVE: removes the specified properties.
3147 */
3148 virtual bool SetProperties(const wxRichTextRange& range, const wxRichTextProperties& properties, int flags = wxRICHTEXT_SETPROPERTIES_WITH_UNDO);
3149
7afd2b58
JS
3150 /**
3151 Test if this whole range has character attributes of the specified kind. If any
3152 of the attributes are different within the range, the test fails. You
3153 can use this to implement, for example, bold button updating. style must have
3154 flags indicating which attributes are of interest.
3155 */
3156 virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const;
3157
3158 /**
3159 Test if this whole range has paragraph attributes of the specified kind. If any
3160 of the attributes are different within the range, the test fails. You
3161 can use this to implement, for example, centering button updating. style must have
3162 flags indicating which attributes are of interest.
3163 */
3164 virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const;
3165
3166 virtual wxRichTextObject* Clone() const { return new wxRichTextParagraphLayoutBox(*this); }
3167
cc2aecde
JS
3168 /**
3169 Prepares the content just before insertion (or after buffer reset).
3170 Currently is only called if undo mode is on.
3171 */
3172 virtual void PrepareContent(wxRichTextParagraphLayoutBox& container);
3173
7afd2b58
JS
3174 /**
3175 Insert fragment into this box at the given position. If partialParagraph is true,
3176 it is assumed that the last (or only) paragraph is just a piece of data with no paragraph
3177 marker.
3178 */
3179 virtual bool InsertFragment(long position, wxRichTextParagraphLayoutBox& fragment);
3180
3181 /**
3182 Make a copy of the fragment corresponding to the given range, putting it in @a fragment.
3183 */
3184 virtual bool CopyFragment(const wxRichTextRange& range, wxRichTextParagraphLayoutBox& fragment);
3185
3186 /**
3187 Apply the style sheet to the buffer, for example if the styles have changed.
3188 */
3189 virtual bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet);
3190
3191 void Copy(const wxRichTextParagraphLayoutBox& obj);
3192
3193 void operator= (const wxRichTextParagraphLayoutBox& obj) { Copy(obj); }
3194
3195 /**
3196 Calculate ranges.
3197 */
3198 virtual void UpdateRanges();
3199
3200 /**
3201 Get all the text.
3202 */
3203 virtual wxString GetText() const;
3204
3205 /**
3206 Sets the default style, affecting the style currently being applied
3207 (for example, setting the default style to bold will cause subsequently
3208 inserted text to be bold).
3209
3210 This is not cumulative - setting the default style will replace the previous
3211 default style.
3212
3213 Setting it to a default attribute object makes new content take on the 'basic' style.
3214 */
3215 virtual bool SetDefaultStyle(const wxRichTextAttr& style);
3216
3217 /**
3218 Returns the current default style, affecting the style currently being applied
3219 (for example, setting the default style to bold will cause subsequently
3220 inserted text to be bold).
3221 */
3222 virtual const wxRichTextAttr& GetDefaultStyle() const { return m_defaultAttributes; }
3223
3224 /**
3225 Sets the basic (overall) style. This is the style of the whole
3226 buffer before further styles are applied, unlike the default style, which
3227 only affects the style currently being applied (for example, setting the default
3228 style to bold will cause subsequently inserted text to be bold).
3229 */
3230 virtual void SetBasicStyle(const wxRichTextAttr& style) { m_attributes = style; }
3231
3232 /**
3233 Returns the basic (overall) style.
3234
3235 This is the style of the whole buffer before further styles are applied,
3236 unlike the default style, which only affects the style currently being
3237 applied (for example, setting the default style to bold will cause
3238 subsequently inserted text to be bold).
3239 */
3240 virtual const wxRichTextAttr& GetBasicStyle() const { return m_attributes; }
3241
3242 /**
3243 Invalidates the buffer. With no argument, invalidates whole buffer.
3244 */
3245 virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
3246
3247 /**
3248 Do the (in)validation for this object only.
3249 */
3250 virtual void DoInvalidate(const wxRichTextRange& invalidRange);
3251
3252 /**
3253 Do the (in)validation both up and down the hierarchy.
3254 */
3255 virtual void InvalidateHierarchy(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
3256
3257 /**
3258 Gather information about floating objects. If untilObj is non-NULL,
3259 will stop getting information if the current object is this, since we
3260 will collect the rest later.
3261 */
3262 virtual bool UpdateFloatingObjects(const wxRect& availableRect, wxRichTextObject* untilObj = NULL);
3263
3264 /**
3265 Get invalid range, rounding to entire paragraphs if argument is true.
3266 */
3267 wxRichTextRange GetInvalidRange(bool wholeParagraphs = false) const;
3268
3269 /**
3270 Returns @true if this object needs layout.
3271 */
3272 bool IsDirty() const { return m_invalidRange != wxRICHTEXT_NONE; }
3273
3274 /**
3275 Returns the wxRichTextFloatCollector of this object.
3276 */
3277 wxRichTextFloatCollector* GetFloatCollector() { return m_floatCollector; }
3278
3279 /**
3280 Returns the number of floating objects at this level.
3281 */
3282 int GetFloatingObjectCount() const;
3283
3284 /**
3285 Returns a list of floating objects.
3286 */
3287 bool GetFloatingObjects(wxRichTextObjectList& objects) const;
3288
3289protected:
3290 wxRichTextCtrl* m_ctrl;
3291 wxRichTextAttr m_defaultAttributes;
3292
3293 // The invalidated range that will need full layout
3294 wxRichTextRange m_invalidRange;
3295
3296 // Is the last paragraph partial or complete?
3297 bool m_partialParagraph;
3298
3299 // The floating layout state
3300 wxRichTextFloatCollector* m_floatCollector;
3301};
3302
3303/**
3304 @class wxRichTextBox
3305
3306 This class implements a floating or inline text box, containing paragraphs.
3307
3308 @library{wxrichtext}
3309 @category{richtext}
3310
3311 @see wxRichTextParagraphLayoutBox, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl
3312*/
3313
3314class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextParagraphLayoutBox
3315{
3316 DECLARE_DYNAMIC_CLASS(wxRichTextBox)
3317public:
3318// Constructors
3319
3320 /**
3321 Default constructor; optionally pass the parent object.
3322 */
3323
3324 wxRichTextBox(wxRichTextObject* parent = NULL);
3325
3326 /**
3327 Copy constructor.
3328 */
3329
3330 wxRichTextBox(const wxRichTextBox& obj): wxRichTextParagraphLayoutBox() { Copy(obj); }
3331
3332// Overridables
3333
8db2e3ef 3334 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58
JS
3335
3336 virtual wxString GetXMLNodeName() const { return wxT("textbox"); }
3337
3338 virtual bool CanEditProperties() const { return true; }
3339
3340 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
3341
3342 virtual wxString GetPropertiesMenuLabel() const { return _("&Box"); }
3343
3344// Accessors
3345
3346// Operations
3347
3348 virtual wxRichTextObject* Clone() const { return new wxRichTextBox(*this); }
3349
3350 void Copy(const wxRichTextBox& obj);
3351
3352protected:
3353};
3354
7c9fdebe
JS
3355/**
3356 @class wxRichTextField
3357
3358 This class implements the general concept of a field, an object that represents
3359 additional functionality such as a footnote, a bookmark, a page number, a table
3360 of contents, and so on. Extra information (such as a bookmark name) can be stored
3361 in the object properties.
3362
3363 Drawing, layout, and property editing is delegated to classes derived
3364 from wxRichTextFieldType, such as instances of wxRichTextFieldTypeStandard; this makes
3365 the use of fields an efficient method of introducing extra functionality, since
3366 most of the information required to draw a field (such as a bitmap) is kept centrally
3367 in a single field type definition.
3368
3369 The FieldType property, accessed by SetFieldType/GetFieldType, is used to retrieve
3370 the field type definition. So be careful not to overwrite this property.
3371
3372 wxRichTextField is derived from wxRichTextParagraphLayoutBox, which means that it
3373 can contain its own read-only content, refreshed when the application calls the UpdateField
3374 function. Whether a field is treated as a composite or a single graphic is determined
3375 by the field type definition. If using wxRichTextFieldTypeStandard, passing the display
3376 type wxRICHTEXT_FIELD_STYLE_COMPOSITE to the field type definition causes the field
3377 to behave like a composite; the other display styles display a simple graphic.
3378 When implementing a composite field, you will still need to derive from wxRichTextFieldTypeStandard
3379 or wxRichTextFieldType, if only to implement UpdateField to refresh the field content
3380 appropriately. wxRichTextFieldTypeStandard is only one possible implementation, but
3381 covers common needs especially for simple, static fields using text or a bitmap.
3382
3383 Register field types on application initialisation with the static function
3384 wxRichTextParagraphLayoutBox::AddFieldType. They will be deleted automatically
3385 on application exit.
3386
3387 An application can write a field to a control with wxRichTextCtrl::WriteField,
3388 taking a field type, the properties for the field, and optional attributes.
3389
3390 @library{wxrichtext}
3391 @category{richtext}
3392
3393 @see wxRichTextFieldTypeStandard, wxRichTextFieldType, wxRichTextParagraphLayoutBox, wxRichTextProperties, wxRichTextCtrl
3394*/
3395
3396class WXDLLIMPEXP_RICHTEXT wxRichTextField: public wxRichTextParagraphLayoutBox
3397{
3398 DECLARE_DYNAMIC_CLASS(wxRichTextField)
3399public:
3400// Constructors
3401
3402 /**
3403 Default constructor; optionally pass the parent object.
3404 */
3405
3406 wxRichTextField(const wxString& fieldType = wxEmptyString, wxRichTextObject* parent = NULL);
3407
3408 /**
3409 Copy constructor.
3410 */
3411
3412 wxRichTextField(const wxRichTextField& obj): wxRichTextParagraphLayoutBox() { Copy(obj); }
3413
3414// Overridables
3415
3416 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
3417
3418 virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
3419
3420 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
3421
3422 virtual wxString GetXMLNodeName() const { return wxT("field"); }
3423
3424 virtual bool CanEditProperties() const;
3425
3426 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
3427
3428 virtual wxString GetPropertiesMenuLabel() const;
3429
3430 virtual bool AcceptsFocus() const { return false; }
3431
3432 virtual void CalculateRange(long start, long& end);
3433
3434 /**
3435 If a field has children, we don't want the user to be able to edit it.
3436 */
3437 virtual bool IsAtomic() const { return true; }
3438
3439 virtual bool IsEmpty() const { return false; }
3440
3441 virtual bool IsTopLevel() const;
3442
3443// Accessors
3444
3445 void SetFieldType(const wxString& fieldType) { GetProperties().SetProperty(wxT("FieldType"), fieldType); }
3446 wxString GetFieldType() const { return GetProperties().GetPropertyString(wxT("FieldType")); }
3447
3448// Operations
3449
3450 /**
3451 Update the field; delegated to the associated field type. This would typically expand the field to its value,
3452 if this is a dynamically changing and/or composite field.
3453 */
32423dd8 3454 virtual bool UpdateField(wxRichTextBuffer* buffer);
7c9fdebe
JS
3455
3456 virtual wxRichTextObject* Clone() const { return new wxRichTextField(*this); }
3457
3458 void Copy(const wxRichTextField& obj);
3459
3460protected:
3461};
3462
3463/**
3464 @class wxRichTextFieldType
3465
3466 The base class for custom field types. Each type definition handles one
3467 field type. Override functions to provide drawing, layout, updating and
3468 property editing functionality for a field.
3469
3470 Register field types on application initialisation with the static function
3471 wxRichTextParagraphLayoutBox::AddFieldType. They will be deleted automatically
3472 on application exit.
3473
3474 @library{wxrichtext}
3475 @category{richtext}
3476
3477 @see wxRichTextFieldTypeStandard, wxRichTextField, wxRichTextCtrl
3478*/
3479
3480class WXDLLIMPEXP_RICHTEXT wxRichTextFieldType: public wxObject
3481{
3482 DECLARE_CLASS(wxRichTextFieldType)
3483public:
3484 /**
3485 Creates a field type definition.
3486 */
3487 wxRichTextFieldType(const wxString& name = wxEmptyString)
3488 : m_name(name)
3489 { }
3490
3491 /**
3492 Copy constructor.
3493 */
3494 wxRichTextFieldType(const wxRichTextFieldType& fieldType) { Copy(fieldType); }
3495
3496 void Copy(const wxRichTextFieldType& fieldType) { m_name = fieldType.m_name; }
3497
3498 /**
3499 Draw the item, within the given range. Some objects may ignore the range (for
3500 example paragraphs) while others must obey it (lines, to implement wrapping)
3501 */
3502 virtual bool Draw(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0;
3503
3504 /**
3505 Lay the item out at the specified position with the given size constraint.
3506 Layout must set the cached size. @rect is the available space for the object,
3507 and @a parentRect is the container that is used to determine a relative size
3508 or position (for example if a text box must be 50% of the parent text box).
3509 */
3510 virtual bool Layout(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style) = 0;
3511
3512 /**
3513 Returns the object size for the given range. Returns @false if the range
3514 is invalid for this object.
3515 */
3516 virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const = 0;
3517
3518 /**
3519 Returns @true if we can edit the object's properties via a GUI.
3520 */
3521 virtual bool CanEditProperties(wxRichTextField* WXUNUSED(obj)) const { return false; }
3522
3523 /**
3524 Edits the object's properties via a GUI.
3525 */
3526 virtual bool EditProperties(wxRichTextField* WXUNUSED(obj), wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; }
3527
3528 /**
3529 Returns the label to be used for the properties context menu item.
3530 */
3531 virtual wxString GetPropertiesMenuLabel(wxRichTextField* WXUNUSED(obj)) const { return wxEmptyString; }
3532
3533 /**
3534 Update the field. This would typically expand the field to its value,
3535 if this is a dynamically changing and/or composite field.
3536 */
32423dd8 3537 virtual bool UpdateField(wxRichTextBuffer* buffer, wxRichTextField* obj) { return false; }
7c9fdebe
JS
3538
3539 /**
3540 Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box.
3541 */
3542 virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return true; }
3543
3544 /**
3545 Sets the field type name. There should be a unique name per field type object.
3546 */
3547 void SetName(const wxString& name) { m_name = name; }
3548
3549 /**
3550 Returns the field type name. There should be a unique name per field type object.
3551 */
3552 wxString GetName() const { return m_name; }
3553
3554protected:
3555
3556 wxString m_name;
3557};
3558
3559WX_DECLARE_STRING_HASH_MAP(wxRichTextFieldType*, wxRichTextFieldTypeHashMap);
3560
3561/**
3562 @class wxRichTextFieldTypeStandard
3563
3564 A field type that can handle fields with text or bitmap labels, with a small range
3565 of styles for implementing rectangular fields and fields that can be used for start
3566 and end tags.
3567
3568 The border, text and background colours can be customised; the default is
3569 white text on a black background.
3570
3571 The following display styles can be used.
3572
3573 @beginStyleTable
3574 @style{wxRICHTEXT_FIELD_STYLE_COMPOSITE}
3575 Creates a composite field; you will probably need to derive a new class to implement UpdateField.
3576 @style{wxRICHTEXT_FIELD_STYLE_RECTANGLE}
3577 Shows a rounded rectangle background.
3578 @style{wxRICHTEXT_FIELD_STYLE_NO_BORDER}
3579 Suppresses the background and border; mostly used with a bitmap label.
3580 @style{wxRICHTEXT_FIELD_STYLE_START_TAG}
3581 Shows a start tag background, with the pointy end facing right.
3582 @style{wxRICHTEXT_FIELD_STYLE_END_TAG}
3583 Shows an end tag background, with the pointy end facing left.
3584 @endStyleTable
3585
3586 @library{wxrichtext}
3587 @category{richtext}
3588
3589 @see wxRichTextFieldType, wxRichTextField, wxRichTextBuffer, wxRichTextCtrl
3590*/
3591
3592class WXDLLIMPEXP_RICHTEXT wxRichTextFieldTypeStandard: public wxRichTextFieldType
3593{
3594 DECLARE_CLASS(wxRichTextFieldTypeStandard)
3595public:
3596
3597 // Display style types
3598 enum { wxRICHTEXT_FIELD_STYLE_COMPOSITE = 0x01,
3599 wxRICHTEXT_FIELD_STYLE_RECTANGLE = 0x02,
3600 wxRICHTEXT_FIELD_STYLE_NO_BORDER = 0x04,
3601 wxRICHTEXT_FIELD_STYLE_START_TAG = 0x08,
3602 wxRICHTEXT_FIELD_STYLE_END_TAG = 0x10
3603 };
3604
3605 /**
3606 Constructor, creating a field type definition with a text label.
3607
3608 @param parent
3609 The name of the type definition. This must be unique, and is the type
3610 name used when adding a field to a control.
3611 @param label
3612 The text label to be shown on the field.
3613 @param displayStyle
3614 The display style: one of wxRICHTEXT_FIELD_STYLE_RECTANGLE,
3615 wxRICHTEXT_FIELD_STYLE_NO_BORDER, wxRICHTEXT_FIELD_STYLE_START_TAG,
3616 wxRICHTEXT_FIELD_STYLE_END_TAG.
3617
3618 */
3619 wxRichTextFieldTypeStandard(const wxString& name, const wxString& label, int displayStyle = wxRICHTEXT_FIELD_STYLE_RECTANGLE);
3620
3621 /**
3622 Constructor, creating a field type definition with a bitmap label.
3623
3624 @param parent
3625 The name of the type definition. This must be unique, and is the type
3626 name used when adding a field to a control.
3627 @param label
3628 The bitmap label to be shown on the field.
3629 @param displayStyle
3630 The display style: one of wxRICHTEXT_FIELD_STYLE_RECTANGLE,
3631 wxRICHTEXT_FIELD_STYLE_NO_BORDER, wxRICHTEXT_FIELD_STYLE_START_TAG,
3632 wxRICHTEXT_FIELD_STYLE_END_TAG.
3633
3634 */
3635 wxRichTextFieldTypeStandard(const wxString& name, const wxBitmap& bitmap, int displayStyle = wxRICHTEXT_FIELD_STYLE_NO_BORDER);
3636
3637 /**
3638 The default constructor.
3639
3640 */
3641 wxRichTextFieldTypeStandard() { Init(); }
3642
3643 /**
3644 The copy constructor.
3645
3646 */
3647 wxRichTextFieldTypeStandard(const wxRichTextFieldTypeStandard& field) { Copy(field); }
3648
3649 /**
3650 Initialises the object.
3651 */
3652 void Init();
3653
3654 /**
3655 Copies the object.
3656 */
3657 void Copy(const wxRichTextFieldTypeStandard& field);
3658
3659 /**
3660 The assignment operator.
3661 */
3662 void operator=(const wxRichTextFieldTypeStandard& field) { Copy(field); }
3663
3664 /**
3665 Draw the item, within the given range. Some objects may ignore the range (for
3666 example paragraphs) while others must obey it (lines, to implement wrapping)
3667 */
3668 virtual bool Draw(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
3669
3670 /**
3671 Lay the item out at the specified position with the given size constraint.
3672 Layout must set the cached size. @rect is the available space for the object,
3673 and @a parentRect is the container that is used to determine a relative size
3674 or position (for example if a text box must be 50% of the parent text box).
3675 */
3676 virtual bool Layout(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
3677
3678 /**
3679 Returns the object size for the given range. Returns @false if the range
3680 is invalid for this object.
3681 */
3682 virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
3683
3684 /**
3685 Get the size of the field, given the label, font size, and so on.
3686 */
3687 wxSize GetSize(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, int style) const;
3688
3689 /**
3690 Returns @true if the display type is wxRICHTEXT_FIELD_STYLE_COMPOSITE, @false otherwise.
3691 */
3692 virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return (GetDisplayStyle() & wxRICHTEXT_FIELD_STYLE_COMPOSITE) != 0; }
3693
3694 /**
3695 Sets the text label for fields of this type.
3696 */
3697 void SetLabel(const wxString& label) { m_label = label; }
3698
3699 /**
3700 Returns the text label for fields of this type.
3701 */
3702 const wxString& GetLabel() const { return m_label; }
3703
3704 /**
3705 Sets the bitmap label for fields of this type.
3706 */
3707 void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; }
3708
3709 /**
3710 Gets the bitmap label for fields of this type.
3711 */
3712 const wxBitmap& GetBitmap() const { return m_bitmap; }
3713
3714 /**
3715 Gets the display style for fields of this type.
3716 */
3717 int GetDisplayStyle() const { return m_displayStyle; }
3718
3719 /**
3720 Sets the display style for fields of this type.
3721 */
3722 void SetDisplayStyle(int displayStyle) { m_displayStyle = displayStyle; }
3723
3724 /**
3725 Gets the font used for drawing the text label.
3726 */
3727 const wxFont& GetFont() const { return m_font; }
3728
3729 /**
3730 Sets the font used for drawing the text label.
3731 */
3732 void SetFont(const wxFont& font) { m_font = font; }
3733
3734 /**
3735 Gets the colour used for drawing the text label.
3736 */
3737 const wxColour& GetTextColour() const { return m_textColour; }
3738
3739 /**
3740 Sets the colour used for drawing the text label.
3741 */
3742 void SetTextColour(const wxColour& colour) { m_textColour = colour; }
3743
3744 /**
3745 Gets the colour used for drawing the field border.
3746 */
3747 const wxColour& GetBorderColour() const { return m_borderColour; }
3748
3749 /**
3750 Sets the colour used for drawing the field border.
3751 */
3752 void SetBorderColour(const wxColour& colour) { m_borderColour = colour; }
3753
3754 /**
3755 Gets the colour used for drawing the field background.
3756 */
3757 const wxColour& GetBackgroundColour() const { return m_backgroundColour; }
3758
3759 /**
3760 Sets the colour used for drawing the field background.
3761 */
3762 void SetBackgroundColour(const wxColour& colour) { m_backgroundColour = colour; }
3763
3764 /**
3765 Sets the vertical padding (the distance between the border and the text).
3766 */
3767 void SetVerticalPadding(int padding) { m_verticalPadding = padding; }
3768
3769 /**
3770 Gets the vertical padding (the distance between the border and the text).
3771 */
3772 int GetVerticalPadding() const { return m_verticalPadding; }
3773
3774 /**
3775 Sets the horizontal padding (the distance between the border and the text).
3776 */
3777 void SetHorizontalPadding(int padding) { m_horizontalPadding = padding; }
3778
3779 /**
3780 Sets the horizontal padding (the distance between the border and the text).
3781 */
3782 int GetHorizontalPadding() const { return m_horizontalPadding; }
3783
3784 /**
3785 Sets the horizontal margin surrounding the field object.
3786 */
3787 void SetHorizontalMargin(int margin) { m_horizontalMargin = margin; }
3788
3789 /**
3790 Gets the horizontal margin surrounding the field object.
3791 */
3792 int GetHorizontalMargin() const { return m_horizontalMargin; }
3793
3794 /**
3795 Sets the vertical margin surrounding the field object.
3796 */
3797 void SetVerticalMargin(int margin) { m_verticalMargin = margin; }
3798
3799 /**
3800 Gets the vertical margin surrounding the field object.
3801 */
3802 int GetVerticalMargin() const { return m_verticalMargin; }
3803
3804protected:
3805
3806 wxString m_label;
3807 int m_displayStyle;
3808 wxFont m_font;
3809 wxColour m_textColour;
3810 wxColour m_borderColour;
3811 wxColour m_backgroundColour;
3812 int m_verticalPadding;
3813 int m_horizontalPadding;
3814 int m_horizontalMargin;
3815 int m_verticalMargin;
3816 wxBitmap m_bitmap;
3817};
3818
7afd2b58
JS
3819/**
3820 @class wxRichTextLine
3821
3822 This object represents a line in a paragraph, and stores
3823 offsets from the start of the paragraph representing the
3824 start and end positions of the line.
3825
3826 @library{wxrichtext}
3827 @category{richtext}
3828
3829 @see wxRichTextBuffer, wxRichTextCtrl
3830*/
3831
3832class WXDLLIMPEXP_RICHTEXT wxRichTextLine
3833{
3834public:
3835// Constructors
3836
3837 wxRichTextLine(wxRichTextParagraph* parent);
3838 wxRichTextLine(const wxRichTextLine& obj) { Init( NULL); Copy(obj); }
3839 virtual ~wxRichTextLine() {}
3840
3841// Overridables
3842
3843// Accessors
3844
3845 /**
3846 Sets the range associated with this line.
3847 */
3848 void SetRange(const wxRichTextRange& range) { m_range = range; }
3849 /**
3850 Sets the range associated with this line.
3851 */
3852 void SetRange(long from, long to) { m_range = wxRichTextRange(from, to); }
3853
3854 /**
3855 Returns the parent paragraph.
3856 */
3857 wxRichTextParagraph* GetParent() { return m_parent; }
3858
3859 /**
3860 Returns the range.
3861 */
3862 const wxRichTextRange& GetRange() const { return m_range; }
3863 /**
3864 Returns the range.
3865 */
3866 wxRichTextRange& GetRange() { return m_range; }
3867
3868 /**
3869 Returns the absolute range.
3870 */
3871 wxRichTextRange GetAbsoluteRange() const;
3872
3873 /**
3874 Returns the line size as calculated by Layout.
3875 */
3876 virtual wxSize GetSize() const { return m_size; }
3877
3878 /**
3879 Sets the line size as calculated by Layout.
3880 */
3881 virtual void SetSize(const wxSize& sz) { m_size = sz; }
3882
3883 /**
3884 Returns the object position relative to the parent.
3885 */
3886 virtual wxPoint GetPosition() const { return m_pos; }
3887
3888 /**
3889 Sets the object position relative to the parent.
3890 */
3891 virtual void SetPosition(const wxPoint& pos) { m_pos = pos; }
3892
3893 /**
3894 Returns the absolute object position.
3895 */
3896 virtual wxPoint GetAbsolutePosition() const;
3897
3898 /**
3899 Returns the rectangle enclosing the line.
3900 */
3901 virtual wxRect GetRect() const { return wxRect(GetAbsolutePosition(), GetSize()); }
3902
3903 /**
3904 Sets the stored descent.
3905 */
3906 void SetDescent(int descent) { m_descent = descent; }
3907
3908 /**
3909 Returns the stored descent.
3910 */
3911 int GetDescent() const { return m_descent; }
3912
3913#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING
3914 wxArrayInt& GetObjectSizes() { return m_objectSizes; }
3915 const wxArrayInt& GetObjectSizes() const { return m_objectSizes; }
3916#endif
3917
3918// Operations
3919
3920 /**
3921 Initialises the object.
3922 */
3923 void Init(wxRichTextParagraph* parent);
3924
3925 /**
3926 Copies from @a obj.
3927 */
3928 void Copy(const wxRichTextLine& obj);
3929
3930 virtual wxRichTextLine* Clone() const { return new wxRichTextLine(*this); }
3931
3932protected:
3933
3934 // The range of the line (start position to end position)
3935 // This is relative to the parent paragraph.
3936 wxRichTextRange m_range;
3937
3938 // Size and position measured relative to top of paragraph
3939 wxPoint m_pos;
3940 wxSize m_size;
3941
3942 // Maximum descent for this line (location of text baseline)
3943 int m_descent;
3944
3945 // The parent object
3946 wxRichTextParagraph* m_parent;
3947
3948#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING
3949 wxArrayInt m_objectSizes;
3950#endif
3951};
3952
3953WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_RICHTEXT );
3954
3955/**
3956 @class wxRichTextParagraph
3957
3958 This object represents a single paragraph containing various objects such as text content, images, and further paragraph layout objects.
3959
3960 @library{wxrichtext}
3961 @category{richtext}
3962
3963 @see wxRichTextBuffer, wxRichTextCtrl
3964*/
3965
3966class WXDLLIMPEXP_RICHTEXT wxRichTextParagraph: public wxRichTextCompositeObject
3967{
3968 DECLARE_DYNAMIC_CLASS(wxRichTextParagraph)
3969public:
3970// Constructors
3971
3972 /**
3973 Constructor taking a parent and style.
3974 */
3975 wxRichTextParagraph(wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL);
3976 /**
3977 Constructor taking a text string, a parent and paragraph and character attributes.
3978 */
3979 wxRichTextParagraph(const wxString& text, wxRichTextObject* parent = NULL, wxRichTextAttr* paraStyle = NULL, wxRichTextAttr* charStyle = NULL);
3980 virtual ~wxRichTextParagraph();
3981 wxRichTextParagraph(const wxRichTextParagraph& obj): wxRichTextCompositeObject() { Copy(obj); }
3982
3983// Overridables
3984
8db2e3ef 3985 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58 3986
8db2e3ef 3987 virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
7afd2b58 3988
8db2e3ef 3989 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
7afd2b58 3990
8db2e3ef 3991 virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart);
7afd2b58 3992
8db2e3ef 3993 virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
7afd2b58
JS
3994
3995 virtual void CalculateRange(long start, long& end);
3996
3997 virtual wxString GetXMLNodeName() const { return wxT("paragraph"); }
3998
3999// Accessors
4000
4001 /**
4002 Returns the cached lines.
4003 */
4004 wxRichTextLineList& GetLines() { return m_cachedLines; }
4005
4006// Operations
4007
4008 /**
4009 Copies the object.
4010 */
4011 void Copy(const wxRichTextParagraph& obj);
4012
4013 virtual wxRichTextObject* Clone() const { return new wxRichTextParagraph(*this); }
4014
4015 /**
4016 Clears the cached lines.
4017 */
4018 void ClearLines();
4019
4020// Implementation
4021
4022 /**
4023 Applies paragraph styles such as centering to the wrapped lines.
4024 */
4025 virtual void ApplyParagraphStyle(wxRichTextLine* line, const wxRichTextAttr& attr, const wxRect& rect, wxDC& dc);
4026
4027 /**
4028 Inserts text at the given position.
4029 */
4030 virtual bool InsertText(long pos, const wxString& text);
4031
4032 /**
4033 Splits an object at this position if necessary, and returns
4034 the previous object, or NULL if inserting at the beginning.
4035 */
4036 virtual wxRichTextObject* SplitAt(long pos, wxRichTextObject** previousObject = NULL);
4037
4038 /**
4039 Moves content to a list from this point.
4040 */
4041 virtual void MoveToList(wxRichTextObject* obj, wxList& list);
4042
4043 /**
4044 Adds content back from a list.
4045 */
4046 virtual void MoveFromList(wxList& list);
4047
4048 /**
4049 Returns the plain text searching from the start or end of the range.
4050 The resulting string may be shorter than the range given.
4051 */
4052 bool GetContiguousPlainText(wxString& text, const wxRichTextRange& range, bool fromStart = true);
4053
4054 /**
4055 Finds a suitable wrap position. @a wrapPosition is the last position in the line to the left
4056 of the split.
4057 */
8db2e3ef 4058 bool FindWrapPosition(const wxRichTextRange& range, wxDC& dc, wxRichTextDrawingContext& context, int availableSpace, long& wrapPosition, wxArrayInt* partialExtents);
7afd2b58
JS
4059
4060 /**
4061 Finds the object at the given position.
4062 */
4063 wxRichTextObject* FindObjectAtPosition(long position);
4064
4065 /**
4066 Returns the bullet text for this paragraph.
4067 */
4068 wxString GetBulletText();
4069
4070 /**
4071 Allocates or reuses a line object.
4072 */
4073 wxRichTextLine* AllocateLine(int pos);
4074
4075 /**
4076 Clears remaining unused line objects, if any.
4077 */
4078 bool ClearUnusedLines(int lineCount);
4079
4080 /**
4081 Returns combined attributes of the base style, paragraph style and character style. We use this to dynamically
4082 retrieve the actual style.
4083 */
4084 wxRichTextAttr GetCombinedAttributes(const wxRichTextAttr& contentStyle, bool includingBoxAttr = false) const;
4085
4086 /**
4087 Returns the combined attributes of the base style and paragraph style.
4088 */
4089 wxRichTextAttr GetCombinedAttributes(bool includingBoxAttr = false) const;
4090
4091 /**
4092 Returns the first position from pos that has a line break character.
4093 */
4094 long GetFirstLineBreakPosition(long pos);
4095
4096 /**
4097 Creates a default tabstop array.
4098 */
4099 static void InitDefaultTabs();
4100
4101 /**
4102 Clears the default tabstop array.
4103 */
4104 static void ClearDefaultTabs();
4105
4106 /**
4107 Returns the default tabstop array.
4108 */
4109 static const wxArrayInt& GetDefaultTabs() { return sm_defaultTabs; }
4110
4111 /**
4112 Lays out the floating objects.
4113 */
8db2e3ef 4114 void LayoutFloat(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, int style, wxRichTextFloatCollector* floatCollector);
7afd2b58
JS
4115
4116protected:
4117
4118 // The lines that make up the wrapped paragraph
4119 wxRichTextLineList m_cachedLines;
4120
4121 // Default tabstops
4122 static wxArrayInt sm_defaultTabs;
4123
4124friend class wxRichTextFloatCollector;
4125};
4126
4127/**
4128 @class wxRichTextPlainText
4129
4130 This object represents a single piece of text.
4131
4132 @library{wxrichtext}
4133 @category{richtext}
4134
4135 @see wxRichTextBuffer, wxRichTextCtrl
4136*/
4137
4138class WXDLLIMPEXP_RICHTEXT wxRichTextPlainText: public wxRichTextObject
4139{
4140 DECLARE_DYNAMIC_CLASS(wxRichTextPlainText)
4141public:
4142// Constructors
4143
4144 /**
4145 Constructor.
4146 */
4147 wxRichTextPlainText(const wxString& text = wxEmptyString, wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL);
4148
4149 /**
4150 Copy constructor.
4151 */
4152 wxRichTextPlainText(const wxRichTextPlainText& obj): wxRichTextObject() { Copy(obj); }
4153
4154// Overridables
4155
8db2e3ef 4156 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58 4157
8db2e3ef 4158 virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
7afd2b58 4159
8db2e3ef 4160 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
7afd2b58
JS
4161
4162 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
4163
4164 virtual wxRichTextObject* DoSplit(long pos);
4165
4166 virtual void CalculateRange(long start, long& end);
4167
4168 virtual bool DeleteRange(const wxRichTextRange& range);
4169
4170 virtual bool IsEmpty() const { return m_text.empty(); }
4171
4172 virtual bool CanMerge(wxRichTextObject* object) const;
4173
4174 virtual bool Merge(wxRichTextObject* object);
4175
4176 virtual void Dump(wxTextOutputStream& stream);
4177
4178 /**
4179 Get the first position from pos that has a line break character.
4180 */
4181 long GetFirstLineBreakPosition(long pos);
4182
4183 /// Does this object take note of paragraph attributes? Text and image objects don't.
4184 virtual bool UsesParagraphAttributes() const { return false; }
4185
4186#if wxUSE_XML
4187 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
4188#endif
4189
4190#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
4191 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
4192#endif
4193
4194#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
4195 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
4196#endif
4197
4198 virtual wxString GetXMLNodeName() const { return wxT("text"); }
4199
4200// Accessors
4201
4202 /**
4203 Returns the text.
4204 */
4205 const wxString& GetText() const { return m_text; }
4206
4207 /**
4208 Sets the text.
4209 */
4210 void SetText(const wxString& text) { m_text = text; }
4211
4212// Operations
4213
4214 // Copies the text object,
4215 void Copy(const wxRichTextPlainText& obj);
4216
4217 // Clones the text object.
4218 virtual wxRichTextObject* Clone() const { return new wxRichTextPlainText(*this); }
4219
4220private:
4221 bool DrawTabbedString(wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, wxString& str, wxCoord& x, wxCoord& y, bool selected);
4222
4223protected:
4224 wxString m_text;
4225};
4226
4227/**
4228 @class wxRichTextImageBlock
4229
4230 This class stores information about an image, in binary in-memory form.
4231
4232 @library{wxrichtext}
4233 @category{richtext}
4234
4235 @see wxRichTextBuffer, wxRichTextCtrl
4236*/
4237
4238class WXDLLIMPEXP_RICHTEXT wxRichTextImageBlock: public wxObject
4239{
4240public:
4241 /**
4242 Constructor.
4243 */
4244 wxRichTextImageBlock();
4245
4246 /**
4247 Copy constructor.
4248 */
4249 wxRichTextImageBlock(const wxRichTextImageBlock& block);
4250 virtual ~wxRichTextImageBlock();
4251
4252 /**
4253 Initialises the block.
4254 */
4255 void Init();
4256
4257 /**
4258 Clears the block.
4259 */
4260
4261 void Clear();
4262
4263 /**
4264 Load the original image into a memory block.
4265 If the image is not a JPEG, we must convert it into a JPEG
4266 to conserve space.
4267 If it's not a JPEG we can make use of @a image, already scaled, so we don't have to
4268 load the image a second time.
4269 */
4270 virtual bool MakeImageBlock(const wxString& filename, wxBitmapType imageType,
4271 wxImage& image, bool convertToJPEG = true);
4272
4273 /**
4274 Make an image block from the wxImage in the given
4275 format.
4276 */
4277 virtual bool MakeImageBlock(wxImage& image, wxBitmapType imageType, int quality = 80);
4278
4279 /**
4280 Uses a const wxImage for efficiency, but can't set quality (only relevant for JPEG)
4281 */
4282 virtual bool MakeImageBlockDefaultQuality(const wxImage& image, wxBitmapType imageType);
4283
4284 /**
4285 Makes the image block.
4286 */
4287 virtual bool DoMakeImageBlock(const wxImage& image, wxBitmapType imageType);
4288
4289 /**
4290 Writes the block to a file.
4291 */
4292 bool Write(const wxString& filename);
4293
4294 /**
4295 Writes the data in hex to a stream.
4296 */
4297 bool WriteHex(wxOutputStream& stream);
4298
4299 /**
4300 Reads the data in hex from a stream.
4301 */
4302 bool ReadHex(wxInputStream& stream, int length, wxBitmapType imageType);
4303
4304 /**
4305 Copy from @a block.
4306 */
4307 void Copy(const wxRichTextImageBlock& block);
4308
4309 // Load a wxImage from the block
4310 /**
4311 */
4312 bool Load(wxImage& image);
4313
4314// Operators
4315
4316 /**
4317 Assignment operation.
4318 */
4319 void operator=(const wxRichTextImageBlock& block);
4320
4321// Accessors
4322
4323 /**
4324 Returns the raw data.
4325 */
4326 unsigned char* GetData() const { return m_data; }
4327
4328 /**
4329 Returns the data size in bytes.
4330 */
4331 size_t GetDataSize() const { return m_dataSize; }
4332
4333 /**
4334 Returns the image type.
4335 */
4336 wxBitmapType GetImageType() const { return m_imageType; }
4337
4338 /**
4339 */
4340 void SetData(unsigned char* image) { m_data = image; }
4341
4342 /**
4343 Sets the data size.
4344 */
4345 void SetDataSize(size_t size) { m_dataSize = size; }
4346
4347 /**
4348 Sets the image type.
4349 */
4350 void SetImageType(wxBitmapType imageType) { m_imageType = imageType; }
4351
4352 /**
4353 Returns @true if the data is non-NULL.
4354 */
4355 bool IsOk() const { return GetData() != NULL; }
4356 bool Ok() const { return IsOk(); }
4357
4358 /**
4359 Gets the extension for the block's type.
4360 */
4361 wxString GetExtension() const;
4362
4363/// Implementation
4364
4365 /**
4366 Allocates and reads from a stream as a block of memory.
4367 */
4368 static unsigned char* ReadBlock(wxInputStream& stream, size_t size);
4369
4370 /**
4371 Allocates and reads from a file as a block of memory.
4372 */
4373 static unsigned char* ReadBlock(const wxString& filename, size_t size);
4374
4375 /**
4376 Writes a memory block to stream.
4377 */
4378 static bool WriteBlock(wxOutputStream& stream, unsigned char* block, size_t size);
4379
4380 /**
4381 Writes a memory block to a file.
4382 */
4383 static bool WriteBlock(const wxString& filename, unsigned char* block, size_t size);
4384
4385protected:
4386 // Size in bytes of the image stored.
4387 // This is in the raw, original form such as a JPEG file.
4388 unsigned char* m_data;
4389 size_t m_dataSize;
4390 wxBitmapType m_imageType;
4391};
4392
4393/**
4394 @class wxRichTextImage
4395
4396 This class implements a graphic object.
4397
4398 @library{wxrichtext}
4399 @category{richtext}
4400
4401 @see wxRichTextBuffer, wxRichTextCtrl, wxRichTextImageBlock
4402*/
4403
4404class WXDLLIMPEXP_RICHTEXT wxRichTextImage: public wxRichTextObject
4405{
4406 DECLARE_DYNAMIC_CLASS(wxRichTextImage)
4407public:
4408// Constructors
4409
4410 /**
4411 Default constructor.
4412 */
4413 wxRichTextImage(wxRichTextObject* parent = NULL): wxRichTextObject(parent) { }
4414
4415 /**
4416 Creates a wxRichTextImage from a wxImage.
4417 */
4418 wxRichTextImage(const wxImage& image, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL);
4419
4420 /**
4421 Creates a wxRichTextImage from an image block.
4422 */
4423 wxRichTextImage(const wxRichTextImageBlock& imageBlock, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL);
4424
4425 /**
4426 Copy constructor.
4427 */
4428 wxRichTextImage(const wxRichTextImage& obj): wxRichTextObject(obj) { Copy(obj); }
4429
4430// Overridables
4431
8db2e3ef 4432 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58 4433
8db2e3ef 4434 virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
7afd2b58 4435
8db2e3ef 4436 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
7afd2b58
JS
4437
4438 /**
4439 Returns the 'natural' size for this object - the image size.
4440 */
4441 virtual wxTextAttrSize GetNaturalSize() const;
4442
4443 virtual bool IsEmpty() const { return false; /* !m_imageBlock.IsOk(); */ }
4444
4445 virtual bool CanEditProperties() const { return true; }
4446
4447 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
4448
4449 virtual wxString GetPropertiesMenuLabel() const { return _("&Picture"); }
4450
4451 virtual bool UsesParagraphAttributes() const { return false; }
4452
4453#if wxUSE_XML
4454 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
4455#endif
4456
4457#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
4458 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
4459#endif
4460
4461#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
4462 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
4463#endif
4464
4465 // Images can be floatable (optionally).
4466 virtual bool IsFloatable() const { return true; }
4467
4468 virtual wxString GetXMLNodeName() const { return wxT("image"); }
4469
4470// Accessors
4471
4472 /**
4473 Returns the image cache (a scaled bitmap).
4474 */
4475 const wxBitmap& GetImageCache() const { return m_imageCache; }
4476
4477 /**
4478 Sets the image cache.
4479 */
4480 void SetImageCache(const wxBitmap& bitmap) { m_imageCache = bitmap; }
4481
4482 /**
4483 Resets the image cache.
4484 */
4485 void ResetImageCache() { m_imageCache = wxNullBitmap; }
4486
4487 /**
4488 Returns the image block containing the raw data.
4489 */
4490 wxRichTextImageBlock& GetImageBlock() { return m_imageBlock; }
4491
23698b12
JS
4492 /**
4493 Gets the original image size.
4494 */
4495 wxSize GetOriginalImageSize() const;
4496
4497 /**
4498 Sets the original image size.
4499 */
4500 void SetOriginalImageSize(const wxSize& sz);
4501
7afd2b58
JS
4502// Operations
4503
4504 /**
4505 Copies the image object.
4506 */
4507 void Copy(const wxRichTextImage& obj);
4508
4509 /**
4510 Clones the image object.
4511 */
4512 virtual wxRichTextObject* Clone() const { return new wxRichTextImage(*this); }
4513
4514 /**
4515 Creates a cached image at the required size.
4516 */
4517 virtual bool LoadImageCache(wxDC& dc, bool resetCache = false);
4518
4519protected:
4520 wxRichTextImageBlock m_imageBlock;
4521 wxBitmap m_imageCache;
4522};
4523
4524class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCommand;
4525class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction;
4526
4527/**
4528 @class wxRichTextBuffer
4529
4530 This is a kind of paragraph layout box, used to represent the whole buffer.
4531
4532 @library{wxrichtext}
4533 @category{richtext}
4534
4535 @see wxRichTextParagraphLayoutBox, wxRichTextCtrl
4536*/
4537
4538class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer: public wxRichTextParagraphLayoutBox
4539{
4540 DECLARE_DYNAMIC_CLASS(wxRichTextBuffer)
4541public:
4542// Constructors
4543
4544 /**
4545 Default constructor.
4546 */
4547 wxRichTextBuffer() { Init(); }
4548
4549 /**
4550 Copy constructor.
4551 */
4552 wxRichTextBuffer(const wxRichTextBuffer& obj): wxRichTextParagraphLayoutBox() { Init(); Copy(obj); }
4553
4554 virtual ~wxRichTextBuffer() ;
4555
4556// Accessors
4557
4558 /**
4559 Returns the command processor.
4560 A text buffer always creates its own command processor when it is initialized.
4561 */
4562 wxCommandProcessor* GetCommandProcessor() const { return m_commandProcessor; }
4563
4564 /**
4565 Sets style sheet, if any. This will allow the application to use named character and paragraph
4566 styles found in the style sheet.
4567
4568 Neither the buffer nor the control owns the style sheet so must be deleted by the application.
4569 */
4570 void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; }
4571
4572 /**
4573 Returns the style sheet.
4574 */
4575 virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; }
4576
4577 /**
4578 Sets the style sheet and sends a notification of the change.
4579 */
4580 bool SetStyleSheetAndNotify(wxRichTextStyleSheet* sheet);
4581
4582 /**
4583 Pushes the style sheet to the top of the style sheet stack.
4584 */
4585 bool PushStyleSheet(wxRichTextStyleSheet* styleSheet);
4586
4587 /**
4588 Pops the style sheet from the top of the style sheet stack.
4589 */
4590 wxRichTextStyleSheet* PopStyleSheet();
4591
4592 /**
4593 Returns the table storing fonts, for quick access and font reuse.
4594 */
4595 wxRichTextFontTable& GetFontTable() { return m_fontTable; }
4596
4597 /**
4598 Returns the table storing fonts, for quick access and font reuse.
4599 */
4600 const wxRichTextFontTable& GetFontTable() const { return m_fontTable; }
4601
4602 /**
4603 Sets table storing fonts, for quick access and font reuse.
4604 */
4605 void SetFontTable(const wxRichTextFontTable& table) { m_fontTable = table; }
4606
32423dd8
JS
4607 /**
4608 Sets the scale factor for displaying fonts, for example for more comfortable
4609 editing.
4610 */
4611 void SetFontScale(double fontScale);
4612
4613 /**
4614 Returns the scale factor for displaying fonts, for example for more comfortable
4615 editing.
4616 */
4617 double GetFontScale() const { return m_fontScale; }
4618
4619 /**
4620 Sets the scale factor for displaying certain dimensions such as indentation and
4621 inter-paragraph spacing. This can be useful when editing in a small control
4622 where you still want legible text, but a minimum of wasted white space.
4623 */
4624 void SetDimensionScale(double dimScale);
4625
4626 /**
4627 Returns the scale factor for displaying certain dimensions such as indentation
4628 and inter-paragraph spacing.
4629 */
4630 double GetDimensionScale() const { return m_dimensionScale; }
4631
7afd2b58
JS
4632// Operations
4633
4634 /**
4635 Initialisation.
4636 */
4637 void Init();
4638
4639 /**
4640 Clears the buffer, adds an empty paragraph, and clears the command processor.
4641 */
4642 virtual void ResetAndClearCommands();
4643
4644 //@{
4645 /**
4646 Loads content from a stream or file.
4647 Not all handlers will implement file loading.
4648 */
4649 virtual bool LoadFile(const wxString& filename, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
4650 virtual bool LoadFile(wxInputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
4651 //@}
4652
4653 //@{
4654 /**
4655 Saves content to a stream or file.
4656 Not all handlers will implement file saving.
4657 */
4658 virtual bool SaveFile(const wxString& filename, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
4659 virtual bool SaveFile(wxOutputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
4660 //@}
4661
4662 /**
4663 Sets the handler flags, controlling loading and saving.
4664 */
4665 void SetHandlerFlags(int flags) { m_handlerFlags = flags; }
4666
4667 /**
4668 Gets the handler flags, controlling loading and saving.
4669 */
4670 int GetHandlerFlags() const { return m_handlerFlags; }
4671
4672 /**
4673 Convenience function to add a paragraph of text.
4674 */
4675 virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL) { Modify(); return wxRichTextParagraphLayoutBox::AddParagraph(text, paraStyle); }
4676
4677 /**
4678 Begin collapsing undo/redo commands. Note that this may not work properly
4679 if combining commands that delete or insert content, changing ranges for
4680 subsequent actions.
4681
4682 @a cmdName should be the name of the combined command that will appear
4683 next to Undo and Redo in the edit menu.
4684 */
4685 virtual bool BeginBatchUndo(const wxString& cmdName);
4686
4687 /**
4688 End collapsing undo/redo commands.
4689 */
4690 virtual bool EndBatchUndo();
4691
4692 /**
4693 Returns @true if we are collapsing commands.
4694 */
4695 virtual bool BatchingUndo() const { return m_batchedCommandDepth > 0; }
4696
4697 /**
4698 Submit the action immediately, or delay according to whether collapsing is on.
4699 */
4700 virtual bool SubmitAction(wxRichTextAction* action);
4701
4702 /**
4703 Returns the collapsed command.
4704 */
4705 virtual wxRichTextCommand* GetBatchedCommand() const { return m_batchedCommand; }
4706
4707 /**
4708 Begin suppressing undo/redo commands. The way undo is suppressed may be implemented
4709 differently by each command. If not dealt with by a command implementation, then
4710 it will be implemented automatically by not storing the command in the undo history
4711 when the action is submitted to the command processor.
4712 */
4713 virtual bool BeginSuppressUndo();
4714
4715 /**
4716 End suppressing undo/redo commands.
4717 */
4718 virtual bool EndSuppressUndo();
4719
4720 /**
4721 Are we suppressing undo??
4722 */
4723 virtual bool SuppressingUndo() const { return m_suppressUndo > 0; }
4724
4725 /**
4726 Copy the range to the clipboard.
4727 */
4728 virtual bool CopyToClipboard(const wxRichTextRange& range);
4729
4730 /**
4731 Paste the clipboard content to the buffer.
4732 */
4733 virtual bool PasteFromClipboard(long position);
4734
4735 /**
4736 Returns @true if we can paste from the clipboard.
4737 */
4738 virtual bool CanPasteFromClipboard() const;
4739
4740 /**
4741 Begin using a style.
4742 */
4743 virtual bool BeginStyle(const wxRichTextAttr& style);
4744
4745 /**
4746 End the style.
4747 */
4748 virtual bool EndStyle();
4749
4750 /**
4751 End all styles.
4752 */
4753 virtual bool EndAllStyles();
4754
4755 /**
4756 Clears the style stack.
4757 */
4758 virtual void ClearStyleStack();
4759
4760 /**
4761 Returns the size of the style stack, for example to check correct nesting.
4762 */
4763 virtual size_t GetStyleStackSize() const { return m_attributeStack.GetCount(); }
4764
4765 /**
4766 Begins using bold.
4767 */
4768 bool BeginBold();
4769
4770 /**
4771 Ends using bold.
4772 */
4773 bool EndBold() { return EndStyle(); }
4774
4775 /**
4776 Begins using italic.
4777 */
4778 bool BeginItalic();
4779
4780 /**
4781 Ends using italic.
4782 */
4783 bool EndItalic() { return EndStyle(); }
4784
4785 /**
4786 Begins using underline.
4787 */
4788 bool BeginUnderline();
4789
4790 /**
4791 Ends using underline.
4792 */
4793 bool EndUnderline() { return EndStyle(); }
4794
4795 /**
4796 Begins using point size.
4797 */
4798 bool BeginFontSize(int pointSize);
4799
4800 /**
4801 Ends using point size.
4802 */
4803 bool EndFontSize() { return EndStyle(); }
4804
4805 /**
4806 Begins using this font.
4807 */
4808 bool BeginFont(const wxFont& font);
4809
4810 /**
4811 Ends using a font.
4812 */
4813 bool EndFont() { return EndStyle(); }
4814
4815 /**
4816 Begins using this colour.
4817 */
4818 bool BeginTextColour(const wxColour& colour);
4819
4820 /**
4821 Ends using a colour.
4822 */
4823 bool EndTextColour() { return EndStyle(); }
4824
4825 /**
4826 Begins using alignment.
4827 */
4828 bool BeginAlignment(wxTextAttrAlignment alignment);
4829
4830 /**
4831 Ends alignment.
4832 */
4833 bool EndAlignment() { return EndStyle(); }
4834
4835 /**
4836 Begins using @a leftIndent for the left indent, and optionally @a leftSubIndent for
4837 the sub-indent. Both are expressed in tenths of a millimetre.
4838
4839 The sub-indent is an offset from the left of the paragraph, and is used for all
4840 but the first line in a paragraph. A positive value will cause the first line to appear
4841 to the left of the subsequent lines, and a negative value will cause the first line to be
4842 indented relative to the subsequent lines.
4843 */
4844 bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0);
4845
4846 /**
4847 Ends left indent.
4848 */
4849 bool EndLeftIndent() { return EndStyle(); }
4850
4851 /**
4852 Begins a right indent, specified in tenths of a millimetre.
4853 */
4854 bool BeginRightIndent(int rightIndent);
4855
4856 /**
4857 Ends right indent.
4858 */
4859 bool EndRightIndent() { return EndStyle(); }
4860
4861 /**
4862 Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing
4863 in tenths of a millimetre.
4864 */
4865 bool BeginParagraphSpacing(int before, int after);
4866
4867 /**
4868 Ends paragraph spacing.
4869 */
4870 bool EndParagraphSpacing() { return EndStyle(); }
4871
4872 /**
4873 Begins line spacing using the specified value. @e spacing is a multiple, where
4874 10 means single-spacing, 15 means 1.5 spacing, and 20 means double spacing.
4875
4876 The ::wxTextAttrLineSpacing enumeration values are defined for convenience.
4877 */
4878 bool BeginLineSpacing(int lineSpacing);
4879
4880 /**
4881 Ends line spacing.
4882 */
4883 bool EndLineSpacing() { return EndStyle(); }
4884
4885 /**
4886 Begins numbered bullet.
4887
4888 This call will be needed for each item in the list, and the
4889 application should take care of incrementing the numbering.
4890
4891 @a bulletNumber is a number, usually starting with 1.
4892 @a leftIndent and @a leftSubIndent are values in tenths of a millimetre.
4893 @a bulletStyle is a bitlist of the following values:
4894
4895 wxRichTextBuffer uses indentation to render a bulleted item.
4896 The left indent is the distance between the margin and the bullet.
4897 The content of the paragraph, including the first line, starts
4898 at leftMargin + leftSubIndent.
4899 So the distance between the left edge of the bullet and the
4900 left of the actual paragraph is leftSubIndent.
4901 */
4902 bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD);
4903
4904 /**
4905 Ends numbered bullet.
4906 */
4907 bool EndNumberedBullet() { return EndStyle(); }
4908
4909 /**
4910 Begins applying a symbol bullet, using a character from the current font.
4911
4912 See BeginNumberedBullet() for an explanation of how indentation is used
4913 to render the bulleted paragraph.
4914 */
4915 bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL);
4916
4917 /**
4918 Ends symbol bullet.
4919 */
4920 bool EndSymbolBullet() { return EndStyle(); }
4921
4922 /**
4923 Begins applying a standard bullet, using one of the standard bullet names
4924 (currently @c standard/circle or @c standard/square.
4925
4926 See BeginNumberedBullet() for an explanation of how indentation is used to
4927 render the bulleted paragraph.
4928 */
4929 bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD);
4930
4931 /**
4932 Ends standard bullet.
4933 */
4934 bool EndStandardBullet() { return EndStyle(); }
4935
4936 /**
4937 Begins named character style.
4938 */
4939 bool BeginCharacterStyle(const wxString& characterStyle);
4940
4941 /**
4942 Ends named character style.
4943 */
4944 bool EndCharacterStyle() { return EndStyle(); }
4945
4946 /**
4947 Begins named paragraph style.
4948 */
4949 bool BeginParagraphStyle(const wxString& paragraphStyle);
4950
4951 /**
4952 Ends named character style.
4953 */
4954 bool EndParagraphStyle() { return EndStyle(); }
4955
4956 /**
4957 Begins named list style.
4958
4959 Optionally, you can also pass a level and a number.
4960 */
4961 bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1);
4962
4963 /**
4964 Ends named character style.
4965 */
4966 bool EndListStyle() { return EndStyle(); }
4967
4968 /**
4969 Begins applying wxTEXT_ATTR_URL to the content.
4970
4971 Pass a URL and optionally, a character style to apply, since it is common
4972 to mark a URL with a familiar style such as blue text with underlining.
4973 */
4974 bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString);
4975
4976 /**
4977 Ends URL.
4978 */
4979 bool EndURL() { return EndStyle(); }
4980
4981// Event handling
4982
4983 /**
4984 Adds an event handler.
4985
4986 A buffer associated with a control has the control as the only event handler,
4987 but the application is free to add more if further notification is required.
4988 All handlers are notified of an event originating from the buffer, such as
4989 the replacement of a style sheet during loading.
4990
4991 The buffer never deletes any of the event handlers, unless RemoveEventHandler()
4992 is called with @true as the second argument.
4993 */
4994 bool AddEventHandler(wxEvtHandler* handler);
4995
4996 /**
4997 Removes an event handler from the buffer's list of handlers, deleting the
4998 object if @a deleteHandler is @true.
4999 */
5000 bool RemoveEventHandler(wxEvtHandler* handler, bool deleteHandler = false);
5001
5002 /**
5003 Clear event handlers.
5004 */
5005 void ClearEventHandlers();
5006
5007 /**
5008 Send event to event handlers. If sendToAll is true, will send to all event handlers,
5009 otherwise will stop at the first successful one.
5010 */
5011 bool SendEvent(wxEvent& event, bool sendToAll = true);
5012
5013// Implementation
5014
8db2e3ef 5015 virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
7afd2b58
JS
5016
5017 /**
5018 Copies the buffer.
5019 */
5020 void Copy(const wxRichTextBuffer& obj);
5021
5022 /**
5023 Assignment operator.
5024 */
5025 void operator= (const wxRichTextBuffer& obj) { Copy(obj); }
5026
5027 /**
5028 Clones the buffer.
5029 */
5030 virtual wxRichTextObject* Clone() const { return new wxRichTextBuffer(*this); }
5031
5032 /**
5033 Submits a command to insert paragraphs.
5034 */
0eb1fbf0 5035 bool InsertParagraphsWithUndo(long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0);
7afd2b58
JS
5036
5037 /**
5038 Submits a command to insert the given text.
5039 */
5040 bool InsertTextWithUndo(long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0);
5041
5042 /**
5043 Submits a command to insert a newline.
5044 */
5045 bool InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int flags = 0);
5046
5047 /**
5048 Submits a command to insert the given image.
5049 */
5050 bool InsertImageWithUndo(long pos, const wxRichTextImageBlock& imageBlock, wxRichTextCtrl* ctrl, int flags = 0,
5051 const wxRichTextAttr& textAttr = wxRichTextAttr());
5052
5053 /**
5054 Submits a command to insert an object.
5055 */
5056 wxRichTextObject* InsertObjectWithUndo(long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags);
5057
5058 /**
5059 Submits a command to delete this range.
5060 */
5061 bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl);
5062
5063 /**
5064 Mark modified.
5065 */
5066 void Modify(bool modify = true) { m_modified = modify; }
5067
5068 /**
5069 Returns @true if the buffer was modified.
5070 */
5071 bool IsModified() const { return m_modified; }
5072
5073 //@{
5074 /**
5075 Dumps contents of buffer for debugging purposes.
5076 */
5077 virtual void Dump();
5078 virtual void Dump(wxTextOutputStream& stream) { wxRichTextParagraphLayoutBox::Dump(stream); }
5079 //@}
5080
5081 /**
5082 Returns the file handlers.
5083 */
5084 static wxList& GetHandlers() { return sm_handlers; }
5085
5086 /**
5087 Adds a file handler to the end.
5088 */
5089 static void AddHandler(wxRichTextFileHandler *handler);
5090
5091 /**
5092 Inserts a file handler at the front.
5093 */
5094 static void InsertHandler(wxRichTextFileHandler *handler);
5095
5096 /**
5097 Removes a file handler.
5098 */
5099 static bool RemoveHandler(const wxString& name);
5100
5101 /**
5102 Finds a file handler by name.
5103 */
5104 static wxRichTextFileHandler *FindHandler(const wxString& name);
5105
5106 /**
5107 Finds a file handler by extension and type.
5108 */
5109 static wxRichTextFileHandler *FindHandler(const wxString& extension, wxRichTextFileType imageType);
5110
5111 /**
5112 Finds a handler by filename or, if supplied, type.
5113 */
5114 static wxRichTextFileHandler *FindHandlerFilenameOrType(const wxString& filename,
5115 wxRichTextFileType imageType);
5116
5117 /**
5118 Finds a handler by type.
5119 */
5120 static wxRichTextFileHandler *FindHandler(wxRichTextFileType imageType);
5121
5122 /**
5123 Gets a wildcard incorporating all visible handlers. If @a types is present,
5124 it will be filled with the file type corresponding to each filter. This can be
5125 used to determine the type to pass to LoadFile given a selected filter.
5126 */
5127 static wxString GetExtWildcard(bool combine = false, bool save = false, wxArrayInt* types = NULL);
5128
5129 /**
5130 Clean up file handlers.
5131 */
5132 static void CleanUpHandlers();
5133
5134 /**
5135 Initialise the standard file handlers.
5136 Currently, only the plain text loading/saving handler is initialised by default.
5137 */
5138 static void InitStandardHandlers();
5139
8db2e3ef
JS
5140 /**
5141 Returns the drawing handlers.
5142 */
5143 static wxList& GetDrawingHandlers() { return sm_drawingHandlers; }
5144
5145 /**
5146 Adds a drawing handler to the end.
5147 */
5148 static void AddDrawingHandler(wxRichTextDrawingHandler *handler);
5149
5150 /**
5151 Inserts a drawing handler at the front.
5152 */
5153 static void InsertDrawingHandler(wxRichTextDrawingHandler *handler);
5154
5155 /**
5156 Removes a drawing handler.
5157 */
5158 static bool RemoveDrawingHandler(const wxString& name);
5159
5160 /**
5161 Finds a drawing handler by name.
5162 */
5163 static wxRichTextDrawingHandler *FindDrawingHandler(const wxString& name);
5164
5165 /**
5166 Clean up drawing handlers.
5167 */
5168 static void CleanUpDrawingHandlers();
5169
7c9fdebe
JS
5170 /**
5171 Returns the field types.
5172 */
5173 static wxRichTextFieldTypeHashMap& GetFieldTypes() { return sm_fieldTypes; }
5174
5175 /**
5176 Adds a field type.
5177
5178 @see RemoveFieldType(), FindFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
5179
5180 */
5181 static void AddFieldType(wxRichTextFieldType *fieldType);
5182
5183 /**
5184 Removes a field type by name.
5185
5186 @see AddFieldType(), FindFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
5187 */
5188 static bool RemoveFieldType(const wxString& name);
5189
5190 /**
5191 Finds a field type by name.
5192
5193 @see RemoveFieldType(), AddFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
5194 */
5195 static wxRichTextFieldType *FindFieldType(const wxString& name);
5196
5197 /**
5198 Cleans up field types.
5199 */
5200 static void CleanUpFieldTypes();
5201
7afd2b58
JS
5202 /**
5203 Returns the renderer object.
5204 */
5205 static wxRichTextRenderer* GetRenderer() { return sm_renderer; }
5206
5207 /**
5208 Sets @a renderer as the object to be used to render certain aspects of the
5209 content, such as bullets.
5210
5211 You can override default rendering by deriving a new class from
5212 wxRichTextRenderer or wxRichTextStdRenderer, overriding one or more
5213 virtual functions, and setting an instance of the class using this function.
5214 */
5215 static void SetRenderer(wxRichTextRenderer* renderer);
5216
5217 /**
5218 Returns the minimum margin between bullet and paragraph in 10ths of a mm.
5219 */
5220 static int GetBulletRightMargin() { return sm_bulletRightMargin; }
5221
5222 /**
5223 Sets the minimum margin between bullet and paragraph in 10ths of a mm.
5224 */
5225 static void SetBulletRightMargin(int margin) { sm_bulletRightMargin = margin; }
5226
5227 /**
5228 Returns the factor to multiply by character height to get a reasonable bullet size.
5229 */
5230 static float GetBulletProportion() { return sm_bulletProportion; }
5231
5232 /**
5233 Sets the factor to multiply by character height to get a reasonable bullet size.
5234 */
5235 static void SetBulletProportion(float prop) { sm_bulletProportion = prop; }
9e7ad1ca 5236
7afd2b58
JS
5237 /**
5238 Returns the scale factor for calculating dimensions.
23324ae1 5239 */
7afd2b58 5240 double GetScale() const { return m_scale; }
23324ae1
FM
5241
5242 /**
7afd2b58 5243 Sets the scale factor for calculating dimensions.
23324ae1 5244 */
7afd2b58
JS
5245 void SetScale(double scale) { m_scale = scale; }
5246
5247protected:
5248
5249 /// Command processor
5250 wxCommandProcessor* m_commandProcessor;
5251
5252 /// Table storing fonts
5253 wxRichTextFontTable m_fontTable;
5254
5255 /// Has been modified?
5256 bool m_modified;
5257
5258 /// Collapsed command stack
5259 int m_batchedCommandDepth;
5260
5261 /// Name for collapsed command
5262 wxString m_batchedCommandsName;
5263
5264 /// Current collapsed command accumulating actions
5265 wxRichTextCommand* m_batchedCommand;
5266
5267 /// Whether to suppress undo
5268 int m_suppressUndo;
5269
5270 /// Style sheet, if any
5271 wxRichTextStyleSheet* m_styleSheet;
5272
5273 /// List of event handlers that will be notified of events
5274 wxList m_eventHandlers;
5275
5276 /// Stack of attributes for convenience functions
5277 wxList m_attributeStack;
5278
5279 /// Flags to be passed to handlers
5280 int m_handlerFlags;
5281
5282 /// File handlers
5283 static wxList sm_handlers;
5284
8db2e3ef
JS
5285 /// Drawing handlers
5286 static wxList sm_drawingHandlers;
5287
7c9fdebe
JS
5288 /// Field types
5289 static wxRichTextFieldTypeHashMap sm_fieldTypes;
5290
7afd2b58
JS
5291 /// Renderer
5292 static wxRichTextRenderer* sm_renderer;
5293
5294 /// Minimum margin between bullet and paragraph in 10ths of a mm
5295 static int sm_bulletRightMargin;
5296
5297 /// Factor to multiply by character height to get a reasonable bullet size
5298 static float sm_bulletProportion;
5299
5300 /// Scaling factor in use: needed to calculate correct dimensions when printing
5301 double m_scale;
5302};
5303
5304/**
5305 @class wxRichTextCell
5306
5307 wxRichTextCell is the cell in a table.
5308 */
5309
5310class WXDLLIMPEXP_RICHTEXT wxRichTextCell: public wxRichTextBox
5311{
5312 DECLARE_DYNAMIC_CLASS(wxRichTextCell)
5313public:
5314// Constructors
5315
5316 /**
5317 Default constructor; optionally pass the parent object.
5318 */
5319
5320 wxRichTextCell(wxRichTextObject* parent = NULL);
5321
5322 /**
5323 Copy constructor.
5324 */
5325
5326 wxRichTextCell(const wxRichTextCell& obj): wxRichTextBox() { Copy(obj); }
5327
5328// Overridables
5329
8db2e3ef 5330 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58
JS
5331
5332 virtual wxString GetXMLNodeName() const { return wxT("cell"); }
5333
5334 virtual bool CanEditProperties() const { return true; }
5335
5336 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
5337
5338 virtual wxString GetPropertiesMenuLabel() const { return _("&Cell"); }
5339
5340// Accessors
5341
5342// Operations
5343
5344 virtual wxRichTextObject* Clone() const { return new wxRichTextCell(*this); }
5345
5346 void Copy(const wxRichTextCell& obj);
5347
5348protected:
5349};
5350
5351/**
5352 @class wxRichTextTable
5353
5354 wxRichTextTable represents a table with arbitrary columns and rows.
5355 */
5356
5357WX_DEFINE_ARRAY_PTR(wxRichTextObject*, wxRichTextObjectPtrArray);
5358WX_DECLARE_OBJARRAY(wxRichTextObjectPtrArray, wxRichTextObjectPtrArrayArray);
5359
5360class WXDLLIMPEXP_RICHTEXT wxRichTextTable: public wxRichTextBox
5361{
5362 DECLARE_DYNAMIC_CLASS(wxRichTextTable)
5363public:
5364
5365// Constructors
5366
5367 /**
5368 Default constructor; optionally pass the parent object.
5369 */
5370
5371 wxRichTextTable(wxRichTextObject* parent = NULL);
5372
5373 /**
5374 Copy constructor.
5375 */
5376
5377 wxRichTextTable(const wxRichTextTable& obj): wxRichTextBox() { Copy(obj); }
5378
5379// Overridables
5380
8db2e3ef 5381 virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
7afd2b58
JS
5382
5383 virtual wxString GetXMLNodeName() const { return wxT("table"); }
5384
8db2e3ef 5385 virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
7afd2b58 5386
8db2e3ef 5387 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
7afd2b58
JS
5388
5389 virtual bool DeleteRange(const wxRichTextRange& range);
5390
5391 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
5392
5393#if wxUSE_XML
5394 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
5395#endif
5396
5397#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
5398 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
5399#endif
5400
5401#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
5402 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
5403#endif
5404
8db2e3ef 5405 virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart);
7afd2b58
JS
5406
5407 virtual void CalculateRange(long start, long& end);
5408
5409 // Can this object handle the selections of its children? FOr example, a table.
5410 virtual bool HandlesChildSelections() const { return true; }
5411
5412 /// Returns a selection object specifying the selections between start and end character positions.
5413 /// For example, a table would deduce what cells (of range length 1) are selected when dragging across the table.
5414 virtual wxRichTextSelection GetSelection(long start, long end) const;
5415
5416 virtual bool CanEditProperties() const { return true; }
5417
5418 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
5419
5420 virtual wxString GetPropertiesMenuLabel() const { return _("&Table"); }
5421
5422 // Returns true if objects of this class can accept the focus, i.e. a call to SetFocusObject
5423 // is possible. For example, containers supporting text, such as a text box object, can accept the focus,
5424 // but a table can't (set the focus to individual cells instead).
5425 virtual bool AcceptsFocus() const { return false; }
5426
5427// Accessors
5428
5429 /**
5430 Returns the cells array.
5431 */
5432 const wxRichTextObjectPtrArrayArray& GetCells() const { return m_cells; }
5433
5434 /**
5435 Returns the cells array.
5436 */
5437 wxRichTextObjectPtrArrayArray& GetCells() { return m_cells; }
5438
5439 /**
5440 Returns the row count.
5441 */
5442 int GetRowCount() const { return m_rowCount; }
5443
5444 /**
5445 Returns the column count.
5446 */
5447 int GetColumnCount() const { return m_colCount; }
5448
5449 /**
5450 Returns the cell at the given row/column position.
5451 */
5452 virtual wxRichTextCell* GetCell(int row, int col) const;
5453
5454 /**
5455 Returns the cell at the given character position (in the range of the table).
5456 */
5457 virtual wxRichTextCell* GetCell(long pos) const;
5458
5459 /**
5460 Returns the row/column for a given character position.
5461 */
5462 virtual bool GetCellRowColumnPosition(long pos, int& row, int& col) const;
5463
5464// Operations
5465
5466 /**
5467 Clears the table.
5468 */
5469
5470 virtual void ClearTable();
5471
5472 /**
5473 Creates a table of the given dimensions.
5474 */
5475
5476 virtual bool CreateTable(int rows, int cols);
5477
5478 /**
5479 Sets the attributes for the cells specified by the selection.
5480 */
5481
5482 virtual bool SetCellStyle(const wxRichTextSelection& selection, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
5483
5484 /**
5485 Deletes rows from the given row position.
5486 */
5487
5488 virtual bool DeleteRows(int startRow, int noRows = 1);
5489
5490 /**
5491 Deletes columns from the given column position.
5492 */
5493
5494 virtual bool DeleteColumns(int startCol, int noCols = 1);
5495
5496 /**
5497 Adds rows from the given row position.
5498 */
5499
5500 virtual bool AddRows(int startRow, int noRows = 1, const wxRichTextAttr& attr = wxRichTextAttr());
5501
5502 /**
5503 Adds columns from the given column position.
5504 */
5505
5506 virtual bool AddColumns(int startCol, int noCols = 1, const wxRichTextAttr& attr = wxRichTextAttr());
5507
5508 // Makes a clone of this object.
5509 virtual wxRichTextObject* Clone() const { return new wxRichTextTable(*this); }
5510
5511 // Copies this object.
5512 void Copy(const wxRichTextTable& obj);
5513
5514protected:
5515
5516 int m_rowCount;
5517 int m_colCount;
5518
5519 // An array of rows, each of which is a wxRichTextObjectPtrArray containing
5520 // the cell objects. The cell objects are also children of this object.
5521 // Problem: if boxes are immediate children of a box, this will cause problems
5522 // with wxRichTextParagraphLayoutBox functions (and functions elsewhere) that
5523 // expect to find just paragraphs. May have to adjust the way we handle the
5524 // hierarchy to accept non-paragraph objects in a paragraph layout box.
5525 // We'll be overriding much wxRichTextParagraphLayoutBox functionality so this
5526 // may not be such a problem. Perhaps the table should derive from a different
5527 // class?
5528 wxRichTextObjectPtrArrayArray m_cells;
5529};
5530
5531
5532/**
5533 The command identifiers for Do/Undo.
5534*/
5535
5536enum wxRichTextCommandId
5537{
5538 wxRICHTEXT_INSERT,
5539 wxRICHTEXT_DELETE,
5540 wxRICHTEXT_CHANGE_ATTRIBUTES,
5541 wxRICHTEXT_CHANGE_STYLE,
5542 wxRICHTEXT_CHANGE_OBJECT
5543};
5544
5545/**
5546 @class wxRichTextObjectAddress
5547
5548 A class for specifying an object anywhere in an object hierarchy,
5549 without using a pointer, necessary since wxRTC commands may delete
5550 and recreate sub-objects so physical object addresses change. An array
5551 of positions (one per hierarchy level) is used.
5552
5553 @library{wxrichtext}
5554 @category{richtext}
5555
5556 @see wxRichTextCommand
5557*/
5558
5559class WXDLLIMPEXP_RICHTEXT wxRichTextObjectAddress
5560{
5561public:
5562 /**
5563 Creates the address given a container and an object.
5564 */
5565 wxRichTextObjectAddress(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj) { Create(topLevelContainer, obj); }
5566 /**
5567 */
5568 wxRichTextObjectAddress() { Init(); }
5569 /**
5570 */
5571 wxRichTextObjectAddress(const wxRichTextObjectAddress& address) { Copy(address); }
5572
5573 void Init() {}
5574
5575 /**
5576 Copies the address.
5577 */
5578 void Copy(const wxRichTextObjectAddress& address) { m_address = address.m_address; }
5579
5580 /**
5581 Assignment operator.
5582 */
5583 void operator=(const wxRichTextObjectAddress& address) { Copy(address); }
5584
5585 /**
5586 Returns the object specified by the address, given a top level container.
5587 */
5588 wxRichTextObject* GetObject(wxRichTextParagraphLayoutBox* topLevelContainer) const;
5589
5590 /**
5591 Creates the address given a container and an object.
5592 */
5593 bool Create(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj);
5594
5595 /**
5596 Returns the array of integers representing the object address.
5597 */
5598 wxArrayInt& GetAddress() { return m_address; }
5599
5600 /**
5601 Returns the array of integers representing the object address.
5602 */
5603 const wxArrayInt& GetAddress() const { return m_address; }
5604
5605 /**
5606 Sets the address from an array of integers.
5607 */
5608 void SetAddress(const wxArrayInt& address) { m_address = address; }
5609
5610protected:
5611
5612 wxArrayInt m_address;
5613};
5614
5615class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction;
5616
5617/**
5618 @class wxRichTextCommand
5619
5620 Implements a command on the undo/redo stack. A wxRichTextCommand object contains one or more wxRichTextAction
5621 objects, allowing aggregation of a number of operations into one command.
5622
5623 @library{wxrichtext}
5624 @category{richtext}
5625
5626 @see wxRichTextAction
5627*/
5628
5629class WXDLLIMPEXP_RICHTEXT wxRichTextCommand: public wxCommand
5630{
5631public:
5632 /**
5633 Constructor for one action.
5634 */
5635 wxRichTextCommand(const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer,
5636 wxRichTextParagraphLayoutBox* container, wxRichTextCtrl* ctrl, bool ignoreFirstTime = false);
23324ae1
FM
5637
5638 /**
7afd2b58
JS
5639 Constructor for multiple actions.
5640 */
5641 wxRichTextCommand(const wxString& name);
5642
5643 virtual ~wxRichTextCommand();
5644
5645 /**
5646 Performs the command.
5647 */
5648 bool Do();
5649
5650 /**
5651 Undoes the command.
5652 */
5653 bool Undo();
5654
5655 /**
5656 Adds an action to the action list.
5657 */
5658 void AddAction(wxRichTextAction* action);
5659
5660 /**
5661 Clears the action list.
5662 */
5663 void ClearActions();
5664
5665 /**
5666 Returns the action list.
5667 */
5668 wxList& GetActions() { return m_actions; }
5669
5670protected:
5671
5672 wxList m_actions;
5673};
5674
5675/**
5676 @class wxRichTextAction
5677
5678 Implements a part of a command.
5679
5680 @library{wxrichtext}
5681 @category{richtext}
5682
5683 @see wxRichTextCommand
5684*/
5685
5686class WXDLLIMPEXP_RICHTEXT wxRichTextAction: public wxObject
5687{
5688public:
5689 /**
5690 Constructor. @a buffer is the top-level buffer, while @a container is the object within
5691 which the action is taking place. In the simplest case, they are the same.
23324ae1 5692 */
7afd2b58
JS
5693 wxRichTextAction(wxRichTextCommand* cmd, const wxString& name, wxRichTextCommandId id,
5694 wxRichTextBuffer* buffer, wxRichTextParagraphLayoutBox* container,
5695 wxRichTextCtrl* ctrl, bool ignoreFirstTime = false);
23324ae1 5696
7afd2b58 5697 virtual ~wxRichTextAction();
9e7ad1ca 5698
7afd2b58
JS
5699 /**
5700 Performs the action.
23324ae1 5701 */
7afd2b58 5702 bool Do();
23324ae1
FM
5703
5704 /**
7afd2b58 5705 Undoes the action.
23324ae1 5706 */
7afd2b58 5707 bool Undo();
23324ae1
FM
5708
5709 /**
7afd2b58 5710 Updates the control appearance, optimizing if possible given information from the call to Layout.
23324ae1 5711 */
7afd2b58
JS
5712 void UpdateAppearance(long caretPosition, bool sendUpdateEvent = false,
5713 wxArrayInt* optimizationLineCharPositions = NULL, wxArrayInt* optimizationLineYPositions = NULL, bool isDoCmd = true);
23324ae1
FM
5714
5715 /**
7afd2b58 5716 Replaces the buffer paragraphs with the given fragment.
23324ae1 5717 */
7afd2b58 5718 void ApplyParagraphs(const wxRichTextParagraphLayoutBox& fragment);
23324ae1
FM
5719
5720 /**
7afd2b58 5721 Returns the new fragments.
23324ae1 5722 */
7afd2b58 5723 wxRichTextParagraphLayoutBox& GetNewParagraphs() { return m_newParagraphs; }
23324ae1
FM
5724
5725 /**
7afd2b58 5726 Returns the old fragments.
23324ae1 5727 */
7afd2b58 5728 wxRichTextParagraphLayoutBox& GetOldParagraphs() { return m_oldParagraphs; }
23324ae1
FM
5729
5730 /**
7afd2b58 5731 Returns the attributes, for single-object commands.
23324ae1 5732 */
7afd2b58 5733 wxRichTextAttr& GetAttributes() { return m_attributes; }
23324ae1
FM
5734
5735 /**
7afd2b58
JS
5736 Returns the object to replace the one at the position defined by the container address
5737 and the action's range start position.
23324ae1 5738 */
7afd2b58 5739 wxRichTextObject* GetObject() const { return m_object; }
23324ae1
FM
5740
5741 /**
7afd2b58
JS
5742 Sets the object to replace the one at the position defined by the container address
5743 and the action's range start position.
23324ae1 5744 */
7afd2b58 5745 void SetObject(wxRichTextObject* obj) { m_object = obj; m_objectAddress.Create(m_buffer, m_object); }
23324ae1 5746
23324ae1 5747 /**
7afd2b58 5748 Makes an address from the given object.
23324ae1 5749 */
7afd2b58 5750 void MakeObject(wxRichTextObject* obj) { m_objectAddress.Create(m_buffer, obj); }
9e7ad1ca
FM
5751
5752 /**
7afd2b58 5753 Calculate arrays for refresh optimization.
9e7ad1ca 5754 */
7afd2b58 5755 void CalculateRefreshOptimizations(wxArrayInt& optimizationLineCharPositions, wxArrayInt& optimizationLineYPositions);
23324ae1
FM
5756
5757 /**
7afd2b58 5758 Sets the position used for e.g. insertion.
23324ae1 5759 */
7afd2b58 5760 void SetPosition(long pos) { m_position = pos; }
23324ae1 5761
23324ae1 5762 /**
7afd2b58 5763 Returns the position used for e.g. insertion.
23324ae1 5764 */
7afd2b58 5765 long GetPosition() const { return m_position; }
23324ae1
FM
5766
5767 /**
7afd2b58 5768 Sets the range for e.g. deletion.
23324ae1 5769 */
7afd2b58 5770 void SetRange(const wxRichTextRange& range) { m_range = range; }
23324ae1 5771
23324ae1 5772 /**
7afd2b58 5773 Returns the range for e.g. deletion.
23324ae1 5774 */
7afd2b58 5775 const wxRichTextRange& GetRange() const { return m_range; }
23324ae1
FM
5776
5777 /**
7afd2b58 5778 Returns the address (nested position) of the container within the buffer being manipulated.
23324ae1 5779 */
7afd2b58 5780 wxRichTextObjectAddress& GetContainerAddress() { return m_containerAddress; }
23324ae1
FM
5781
5782 /**
7afd2b58 5783 Returns the address (nested position) of the container within the buffer being manipulated.
23324ae1 5784 */
7afd2b58 5785 const wxRichTextObjectAddress& GetContainerAddress() const { return m_containerAddress; }
23324ae1
FM
5786
5787 /**
7afd2b58 5788 Sets the address (nested position) of the container within the buffer being manipulated.
23324ae1 5789 */
7afd2b58 5790 void SetContainerAddress(const wxRichTextObjectAddress& address) { m_containerAddress = address; }
23324ae1 5791
23324ae1 5792 /**
7afd2b58 5793 Sets the address (nested position) of the container within the buffer being manipulated.
23324ae1 5794 */
7afd2b58 5795 void SetContainerAddress(wxRichTextParagraphLayoutBox* container, wxRichTextObject* obj) { m_containerAddress.Create(container, obj); }
9e7ad1ca
FM
5796
5797 /**
7afd2b58 5798 Returns the container that this action refers to, using the container address and top-level buffer.
9e7ad1ca 5799 */
7afd2b58 5800 wxRichTextParagraphLayoutBox* GetContainer() const;
23324ae1
FM
5801
5802 /**
7afd2b58 5803 Returns the action name.
23324ae1 5804 */
7afd2b58 5805 const wxString& GetName() const { return m_name; }
23324ae1 5806
7afd2b58
JS
5807protected:
5808 // Action name
5809 wxString m_name;
9e7ad1ca 5810
7afd2b58
JS
5811 // Buffer
5812 wxRichTextBuffer* m_buffer;
23324ae1 5813
7afd2b58
JS
5814 // The address (nested position) of the container being manipulated.
5815 // This is necessary because objects are deleted, and we can't
5816 // therefore store actual pointers.
5817 wxRichTextObjectAddress m_containerAddress;
9e7ad1ca 5818
7afd2b58
JS
5819 // Control
5820 wxRichTextCtrl* m_ctrl;
9e7ad1ca 5821
7afd2b58
JS
5822 // Stores the new paragraphs
5823 wxRichTextParagraphLayoutBox m_newParagraphs;
23324ae1 5824
7afd2b58
JS
5825 // Stores the old paragraphs
5826 wxRichTextParagraphLayoutBox m_oldParagraphs;
9e7ad1ca 5827
7afd2b58
JS
5828 // Stores an object to replace the one at the position
5829 // defined by the container address and the action's range start position.
5830 wxRichTextObject* m_object;
23324ae1 5831
7afd2b58
JS
5832 // Stores the attributes
5833 wxRichTextAttr m_attributes;
9e7ad1ca 5834
7afd2b58
JS
5835 // The address of the object being manipulated (used for changing an individual object or its attributes)
5836 wxRichTextObjectAddress m_objectAddress;
9e7ad1ca 5837
7afd2b58
JS
5838 // Stores the old attributes
5839 // wxRichTextAttr m_oldAttributes;
23324ae1 5840
7afd2b58
JS
5841 // The affected range
5842 wxRichTextRange m_range;
9e7ad1ca 5843
7afd2b58
JS
5844 // The insertion point for this command
5845 long m_position;
23324ae1 5846
7afd2b58
JS
5847 // Ignore 1st 'Do' operation because we already did it
5848 bool m_ignoreThis;
23324ae1 5849
7afd2b58
JS
5850 // The command identifier
5851 wxRichTextCommandId m_cmdId;
23324ae1
FM
5852};
5853
7afd2b58
JS
5854/*!
5855 * Handler flags
5856 */
5857
5858// Include style sheet when loading and saving
5859#define wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET 0x0001
5860
5861// Save images to memory file system in HTML handler
5862#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY 0x0010
5863
5864// Save images to files in HTML handler
5865#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_FILES 0x0020
23324ae1 5866
7afd2b58
JS
5867// Save images as inline base64 data in HTML handler
5868#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_BASE64 0x0040
5869
5870// Don't write header and footer (or BODY), so we can include the fragment
5871// in a larger document
5872#define wxRICHTEXT_HANDLER_NO_HEADER_FOOTER 0x0080
5873
5874// Convert the more common face names to names that will work on the current platform
5875// in a larger document
5876#define wxRICHTEXT_HANDLER_CONVERT_FACENAMES 0x0100
e54c96f1 5877
23324ae1
FM
5878/**
5879 @class wxRichTextFileHandler
7c913512 5880
7afd2b58 5881 The base class for file handlers.
7c913512 5882
23324ae1 5883 @library{wxrichtext}
21b447dc 5884 @category{richtext}
7afd2b58
JS
5885
5886 @see wxRichTextBuffer, wxRichTextCtrl
23324ae1 5887*/
7afd2b58
JS
5888
5889class WXDLLIMPEXP_RICHTEXT wxRichTextFileHandler: public wxObject
23324ae1 5890{
7afd2b58 5891 DECLARE_CLASS(wxRichTextFileHandler)
23324ae1
FM
5892public:
5893 /**
7afd2b58 5894 Creates a file handler object.
23324ae1 5895 */
7afd2b58
JS
5896 wxRichTextFileHandler(const wxString& name = wxEmptyString, const wxString& ext = wxEmptyString, int type = 0)
5897 : m_name(name), m_extension(ext), m_type(type), m_flags(0), m_visible(true)
5898 { }
23324ae1 5899
7afd2b58 5900#if wxUSE_STREAMS
23324ae1 5901 /**
7afd2b58
JS
5902 Loads the buffer from a stream.
5903 Not all handlers will implement file loading.
5904 */
5905 bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream)
5906 { return DoLoadFile(buffer, stream); }
9e7ad1ca 5907
7afd2b58
JS
5908 /**
5909 Saves the buffer to a stream.
5910 Not all handlers will implement file saving.
23324ae1 5911 */
7afd2b58
JS
5912 bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream)
5913 { return DoSaveFile(buffer, stream); }
5914#endif
23324ae1 5915
7afd2b58 5916#if wxUSE_FFILE && wxUSE_STREAMS
23324ae1 5917 /**
7afd2b58 5918 Loads the buffer from a file.
23324ae1 5919 */
7afd2b58 5920 virtual bool LoadFile(wxRichTextBuffer *buffer, const wxString& filename);
23324ae1
FM
5921
5922 /**
7afd2b58 5923 Saves the buffer to a file.
23324ae1 5924 */
7afd2b58
JS
5925 virtual bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename);
5926#endif // wxUSE_STREAMS && wxUSE_STREAMS
23324ae1 5927
23324ae1 5928 /**
7afd2b58 5929 Returns @true if we handle this filename (if using files). By default, checks the extension.
23324ae1 5930 */
7afd2b58 5931 virtual bool CanHandle(const wxString& filename) const;
23324ae1
FM
5932
5933 /**
7afd2b58 5934 Returns @true if we can save using this handler.
23324ae1 5935 */
7afd2b58 5936 virtual bool CanSave() const { return false; }
23324ae1
FM
5937
5938 /**
7afd2b58
JS
5939 Returns @true if we can load using this handler.
5940 */
5941 virtual bool CanLoad() const { return false; }
9e7ad1ca 5942
7afd2b58
JS
5943 /**
5944 Returns @true if this handler should be visible to the user.
23324ae1 5945 */
7afd2b58 5946 virtual bool IsVisible() const { return m_visible; }
23324ae1
FM
5947
5948 /**
7afd2b58
JS
5949 Sets whether the handler should be visible to the user (via the application's
5950 load and save dialogs).
23324ae1 5951 */
7afd2b58 5952 virtual void SetVisible(bool visible) { m_visible = visible; }
23324ae1
FM
5953
5954 /**
7c9fdebe 5955 Sets the name of the handler.
23324ae1 5956 */
7afd2b58 5957 void SetName(const wxString& name) { m_name = name; }
23324ae1
FM
5958
5959 /**
7c9fdebe 5960 Returns the name of the handler.
23324ae1 5961 */
7afd2b58 5962 wxString GetName() const { return m_name; }
23324ae1 5963
23324ae1 5964 /**
7afd2b58 5965 Sets the default extension to recognise.
23324ae1 5966 */
7afd2b58 5967 void SetExtension(const wxString& ext) { m_extension = ext; }
23324ae1 5968
23324ae1 5969 /**
7afd2b58 5970 Returns the default extension to recognise.
23324ae1 5971 */
7afd2b58 5972 wxString GetExtension() const { return m_extension; }
23324ae1
FM
5973
5974 /**
7afd2b58 5975 Sets the handler type.
23324ae1 5976 */
7afd2b58 5977 void SetType(int type) { m_type = type; }
23324ae1
FM
5978
5979 /**
7afd2b58 5980 Returns the handler type.
23324ae1 5981 */
7afd2b58 5982 int GetType() const { return m_type; }
23324ae1
FM
5983
5984 /**
9e7ad1ca
FM
5985 Sets flags that change the behaviour of loading or saving.
5986 See the documentation for each handler class to see what flags are relevant
5987 for each handler.
5988
23324ae1 5989 You call this function directly if you are using a file handler explicitly
9e7ad1ca
FM
5990 (without going through the text control or buffer LoadFile/SaveFile API).
5991 Or, you can call the control or buffer's SetHandlerFlags function to set
5992 the flags that will be used for subsequent load and save operations.
23324ae1 5993 */
7afd2b58 5994 void SetFlags(int flags) { m_flags = flags; }
23324ae1
FM
5995
5996 /**
7afd2b58 5997 Returns flags controlling how loading and saving is done.
23324ae1 5998 */
7afd2b58 5999 int GetFlags() const { return m_flags; }
23324ae1
FM
6000
6001 /**
7afd2b58 6002 Sets the encoding to use when saving a file. If empty, a suitable encoding is chosen.
23324ae1 6003 */
7afd2b58 6004 void SetEncoding(const wxString& encoding) { m_encoding = encoding; }
23324ae1
FM
6005
6006 /**
7afd2b58 6007 Returns the encoding to use when saving a file. If empty, a suitable encoding is chosen.
23324ae1 6008 */
7afd2b58 6009 const wxString& GetEncoding() const { return m_encoding; }
551266a9
FM
6010
6011protected:
7afd2b58
JS
6012
6013#if wxUSE_STREAMS
551266a9
FM
6014 /**
6015 Override to load content from @a stream into @a buffer.
6016 */
7afd2b58 6017 virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) = 0;
551266a9
FM
6018
6019 /**
6020 Override to save content to @a stream from @a buffer.
6021 */
7afd2b58
JS
6022 virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0;
6023#endif
6024
6025 wxString m_name;
6026 wxString m_encoding;
6027 wxString m_extension;
6028 int m_type;
6029 int m_flags;
6030 bool m_visible;
23324ae1
FM
6031};
6032
7afd2b58
JS
6033/**
6034 @class wxRichTextPlainTextHandler
6035
6036 Implements saving a buffer to plain text.
6037
6038 @library{wxrichtext}
6039 @category{richtext}
6040
6041 @see wxRichTextFileHandler, wxRichTextBuffer, wxRichTextCtrl
6042*/
6043
6044class WXDLLIMPEXP_RICHTEXT wxRichTextPlainTextHandler: public wxRichTextFileHandler
6045{
6046 DECLARE_CLASS(wxRichTextPlainTextHandler)
6047public:
6048 wxRichTextPlainTextHandler(const wxString& name = wxT("Text"),
6049 const wxString& ext = wxT("txt"),
6050 wxRichTextFileType type = wxRICHTEXT_TYPE_TEXT)
6051 : wxRichTextFileHandler(name, ext, type)
6052 { }
6053
6054 // Can we save using this handler?
6055 virtual bool CanSave() const { return true; }
6056
6057 // Can we load using this handler?
6058 virtual bool CanLoad() const { return true; }
6059
6060protected:
6061
6062#if wxUSE_STREAMS
6063 virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream);
6064 virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream);
6065#endif
6066
6067};
23324ae1 6068
8db2e3ef
JS
6069/**
6070 @class wxRichTextDrawingHandler
6071
6072 The base class for custom drawing handlers.
7c9fdebe 6073 Currently, drawing handlers can provide virtual attributes.
8db2e3ef
JS
6074
6075 @library{wxrichtext}
6076 @category{richtext}
6077
6078 @see wxRichTextBuffer, wxRichTextCtrl
6079*/
6080
6081class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingHandler: public wxObject
6082{
6083 DECLARE_CLASS(wxRichTextDrawingHandler)
6084public:
6085 /**
6086 Creates a drawing handler object.
6087 */
6088 wxRichTextDrawingHandler(const wxString& name = wxEmptyString)
6089 : m_name(name)
6090 { }
6091
6092 /**
6093 Returns @true if this object has virtual attributes that we can provide.
6094 */
6095 virtual bool HasVirtualAttributes(wxRichTextObject* obj) const = 0;
6096
6097 /**
6098 Provides virtual attributes that we can provide.
6099 */
6100 virtual bool GetVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const = 0;
6101
6102 /**
7c9fdebe 6103 Sets the name of the handler.
8db2e3ef
JS
6104 */
6105 void SetName(const wxString& name) { m_name = name; }
6106
6107 /**
7c9fdebe 6108 Returns the name of the handler.
8db2e3ef
JS
6109 */
6110 wxString GetName() const { return m_name; }
6111
6112protected:
6113
6114 wxString m_name;
6115};
6116
7afd2b58 6117#if wxUSE_DATAOBJ
e54c96f1 6118
23324ae1 6119/**
7afd2b58 6120 @class wxRichTextBufferDataObject
7c913512 6121
7afd2b58 6122 Implements a rich text data object for clipboard transfer.
7c913512 6123
23324ae1 6124 @library{wxrichtext}
21b447dc 6125 @category{richtext}
7afd2b58
JS
6126
6127 @see wxDataObjectSimple, wxRichTextBuffer, wxRichTextCtrl
23324ae1 6128*/
7afd2b58
JS
6129
6130class WXDLLIMPEXP_RICHTEXT wxRichTextBufferDataObject: public wxDataObjectSimple
23324ae1
FM
6131{
6132public:
23324ae1 6133 /**
7afd2b58
JS
6134 The constructor doesn't copy the pointer, so it shouldn't go away while this object
6135 is alive.
23324ae1 6136 */
7afd2b58
JS
6137 wxRichTextBufferDataObject(wxRichTextBuffer* richTextBuffer = NULL);
6138 virtual ~wxRichTextBufferDataObject();
23324ae1
FM
6139
6140 /**
7afd2b58
JS
6141 After a call to this function, the buffer is owned by the caller and it
6142 is responsible for deleting it.
23324ae1 6143 */
7afd2b58 6144 wxRichTextBuffer* GetRichTextBuffer();
23324ae1
FM
6145
6146 /**
7afd2b58 6147 Returns the id for the new data format.
23324ae1 6148 */
7afd2b58 6149 static const wxChar* GetRichTextBufferFormatId() { return ms_richTextBufferFormatId; }
23324ae1 6150
7afd2b58 6151 // base class pure virtuals
23324ae1 6152
7afd2b58
JS
6153 virtual wxDataFormat GetPreferredFormat(Direction dir) const;
6154 virtual size_t GetDataSize() const;
6155 virtual bool GetDataHere(void *pBuf) const;
6156 virtual bool SetData(size_t len, const void *buf);
23324ae1 6157
7afd2b58 6158 // prevent warnings
23324ae1 6159
7afd2b58
JS
6160 virtual size_t GetDataSize(const wxDataFormat&) const { return GetDataSize(); }
6161 virtual bool GetDataHere(const wxDataFormat&, void *buf) const { return GetDataHere(buf); }
6162 virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) { return SetData(len, buf); }
23324ae1 6163
7afd2b58
JS
6164private:
6165 wxDataFormat m_formatRichTextBuffer; // our custom format
6166 wxRichTextBuffer* m_richTextBuffer; // our data
6167 static const wxChar* ms_richTextBufferFormatId; // our format id
6168};
23324ae1 6169
7afd2b58 6170#endif
23324ae1 6171
7afd2b58
JS
6172/**
6173 @class wxRichTextRenderer
23324ae1 6174
7afd2b58 6175 This class isolates some common drawing functionality.
23324ae1 6176
7afd2b58
JS
6177 @library{wxrichtext}
6178 @category{richtext}
23324ae1 6179
7afd2b58
JS
6180 @see wxRichTextBuffer, wxRichTextCtrl
6181*/
23324ae1 6182
7afd2b58
JS
6183class WXDLLIMPEXP_RICHTEXT wxRichTextRenderer: public wxObject
6184{
6185public:
23324ae1 6186 /**
7afd2b58 6187 Constructor.
23324ae1 6188 */
7afd2b58
JS
6189 wxRichTextRenderer() {}
6190 virtual ~wxRichTextRenderer() {}
23324ae1
FM
6191
6192 /**
7afd2b58 6193 Draws a standard bullet, as specified by the value of GetBulletName. This function should be overridden.
23324ae1 6194 */
7afd2b58 6195 virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0;
23324ae1
FM
6196
6197 /**
7afd2b58 6198 Draws a bullet that can be described by text, such as numbered or symbol bullets. This function should be overridden.
23324ae1 6199 */
7afd2b58 6200 virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text) = 0;
23324ae1
FM
6201
6202 /**
7afd2b58 6203 Draws a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName. This function should be overridden.
23324ae1 6204 */
7afd2b58 6205 virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0;
23324ae1
FM
6206
6207 /**
7afd2b58 6208 Enumerate the standard bullet names currently supported. This function should be overridden.
23324ae1 6209 */
7afd2b58
JS
6210 virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames) = 0;
6211};
6212
6213/**
6214 @class wxRichTextStdRenderer
6215
6216 The standard renderer for drawing bullets.
6217
6218 @library{wxrichtext}
6219 @category{richtext}
6220
6221 @see wxRichTextRenderer, wxRichTextBuffer, wxRichTextCtrl
6222*/
23324ae1 6223
7afd2b58
JS
6224class WXDLLIMPEXP_RICHTEXT wxRichTextStdRenderer: public wxRichTextRenderer
6225{
6226public:
23324ae1 6227 /**
7afd2b58 6228 Constructor.
23324ae1 6229 */
7afd2b58
JS
6230 wxRichTextStdRenderer() {}
6231
6232 // Draw a standard bullet, as specified by the value of GetBulletName
6233 virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect);
6234
6235 // Draw a bullet that can be described by text, such as numbered or symbol bullets
6236 virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text);
6237
6238 // Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName
6239 virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect);
6240
6241 // Enumerate the standard bullet names currently supported
6242 virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames);
23324ae1 6243};
e54c96f1 6244
7afd2b58
JS
6245/*!
6246 * Utilities
6247 *
6248 */
6249
6250inline bool wxRichTextHasStyle(int flags, int style)
6251{
6252 return ((flags & style) == style);
6253}
6254
6255/// Compare two attribute objects
6256WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2);
6257WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2);
6258
7afd2b58
JS
6259/// Apply one style to another
6260WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL);
6261
6262// Remove attributes
6263WXDLLIMPEXP_RICHTEXT bool wxRichTextRemoveStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style);
6264
6265/// Combine two bitlists
6266WXDLLIMPEXP_RICHTEXT bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB);
6267
6268/// Compare two bitlists
6269WXDLLIMPEXP_RICHTEXT bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags);
6270
6271/// Split into paragraph and character styles
6272WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxRichTextAttr& style, wxRichTextAttr& parStyle, wxRichTextAttr& charStyle);
6273
6274/// Compare tabs
6275WXDLLIMPEXP_RICHTEXT bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2);
6276
6277/// Convert a decimal to Roman numerals
6278WXDLLIMPEXP_RICHTEXT wxString wxRichTextDecimalToRoman(long n);
6279
6280// Collects the attributes that are common to a range of content, building up a note of
6281// which attributes are absent in some objects and which clash in some objects.
6282WXDLLIMPEXP_RICHTEXT void wxTextAttrCollectCommonAttributes(wxTextAttr& currentStyle, const wxTextAttr& attr, wxTextAttr& clashingAttr, wxTextAttr& absentAttr);
6283
6284WXDLLIMPEXP_RICHTEXT void wxRichTextModuleInit();