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