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