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