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