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