]> git.saurik.com Git - wxWidgets.git/blame - include/wx/richtext/richtextbuffer.h
Replace wxDataViewCtrl::StartEditor() with EditItem().
[wxWidgets.git] / include / wx / richtext / richtextbuffer.h
CommitLineData
5d7836c4 1/////////////////////////////////////////////////////////////////////////////
7fe8059f 2// Name: wx/richtext/richtextbuffer.h
5d7836c4
JS
3// Purpose: Buffer for wxRichTextCtrl
4// Author: Julian Smart
7fe8059f 5// Modified by:
5d7836c4 6// Created: 2005-09-30
7fe8059f 7// RCS-ID: $Id$
5d7836c4
JS
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
b01ca8b6
JS
12#ifndef _WX_RICHTEXTBUFFER_H_
13#define _WX_RICHTEXTBUFFER_H_
14
5d7836c4
JS
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
59509217
JS
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.
5d7836c4
JS
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
59509217
JS
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
5d7836c4
JS
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
5d7836c4
JS
52 */
53
5d7836c4
JS
54/*!
55 * Includes
56 */
57
b01ca8b6 58#include "wx/defs.h"
5d7836c4
JS
59
60#if wxUSE_RICHTEXT
61
b01ca8b6
JS
62#include "wx/list.h"
63#include "wx/textctrl.h"
64#include "wx/bitmap.h"
5d7836c4
JS
65#include "wx/image.h"
66#include "wx/cmdproc.h"
67#include "wx/txtstrm.h"
bec80f4f 68#include "wx/variant.h"
5d7836c4 69
0ca07313
JS
70#if wxUSE_DATAOBJ
71#include "wx/dataobj.h"
72#endif
73
44cc96a8 74// Compatibility
bec80f4f 75//#define wxRichTextAttr wxTextAttr
44cc96a8
JS
76#define wxTextAttrEx wxTextAttr
77
a188ac29 78// Setting wxRICHTEXT_USE_OWN_CARET to 1 implements a
749414f7 79// caret reliably without using wxClientDC in case there
1c13f06e 80// are platform-specific problems with the generic caret.
749414f7 81#if defined(__WXGTK__) || defined(__WXMAC__)
a188ac29
JS
82#define wxRICHTEXT_USE_OWN_CARET 1
83#else
1c13f06e 84#define wxRICHTEXT_USE_OWN_CARET 0
a188ac29 85#endif
1c13f06e
JS
86
87// Switch off for binary compatibility, on for faster drawing
5cb0b827
JS
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
1c13f06e 91
bec80f4f
JS
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
706465df
JS
102/**
103 The line break character that can be embedded in content.
ff76711f
JS
104 */
105
106extern WXDLLIMPEXP_RICHTEXT const wxChar wxRichTextLineBreakChar;
107
706465df
JS
108/**
109 File types in wxRichText context.
5d7836c4 110 */
d75a69e8
FM
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};
5d7836c4 120
603f702b 121/*
5d7836c4
JS
122 * Forward declarations
123 */
124
b5dbe15d
VS
125class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCtrl;
126class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextObject;
cdaed652 127class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextImage;
b5dbe15d
VS
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;
b5dbe15d
VS
134class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextListStyleDefinition;
135class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextEvent;
136class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextRenderer;
137class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextBuffer;
bec80f4f 138class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextXMLHandler;
603f702b
JS
139class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextParagraphLayoutBox;
140class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextImageBlock;
bec80f4f
JS
141class WXDLLIMPEXP_FWD_XML wxXmlNode;
142class wxRichTextFloatCollector;
706465df
JS
143class WXDLLIMPEXP_FWD_BASE wxDataInputStream;
144class WXDLLIMPEXP_FWD_BASE wxDataOutputStream;
5d7836c4 145
706465df
JS
146/**
147 Flags determining the available space, passed to Layout.
5d7836c4
JS
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
4d551ad5
JS
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
706465df
JS
159/**
160 Flags to pass to Draw
44219ff0
JS
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
603f702b
JS
167#define wxRICHTEXT_DRAW_SELECTED 0x02
168#define wxRICHTEXT_DRAW_PRINT 0x04
169#define wxRICHTEXT_DRAW_GUIDELINES 0x08
44219ff0 170
706465df
JS
171/**
172 Flags returned from hit-testing, or passed to hit-test function.
5d7836c4 173 */
f632e27b
FM
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,
5d7836c4 184
f632e27b
FM
185 // The point was on the position returned from HitTest
186 wxRICHTEXT_HITTEST_ON = 0x08,
187
188 // The point was on space outside content
603f702b
JS
189 wxRICHTEXT_HITTEST_OUTSIDE = 0x10,
190
191 // Only do hit-testing at the current level (don't traverse into top-level objects)
343ef639
JS
192 wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS = 0x20,
193
194 // Ignore floating objects
195 wxRICHTEXT_HITTEST_NO_FLOATING_OBJECTS = 0x40
f632e27b 196};
5d7836c4 197
706465df
JS
198/**
199 Flags for GetRangeSize.
5d7836c4
JS
200 */
201
202#define wxRICHTEXT_FORMATTED 0x01
203#define wxRICHTEXT_UNFORMATTED 0x02
2f45f554 204#define wxRICHTEXT_CACHE_SIZE 0x04
4f3d5bc0 205#define wxRICHTEXT_HEIGHT_ONLY 0x08
5d7836c4 206
706465df
JS
207/**
208 Flags for SetStyle/SetListStyle.
59509217
JS
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
38f833b1
JS
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
523d2f14
JS
238// Resets the existing style before applying the new style
239#define wxRICHTEXT_SETSTYLE_RESET 0x40
240
aeb6ebe2
JS
241// Removes the given style instead of applying it
242#define wxRICHTEXT_SETSTYLE_REMOVE 0x80
243
590a0f8b
JS
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
706465df
JS
267/**
268 Flags for object insertion.
fe5aa22c
JS
269 */
270
271#define wxRICHTEXT_INSERT_NONE 0x00
272#define wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE 0x01
c025e094 273#define wxRICHTEXT_INSERT_INTERACTIVE 0x02
fe5aa22c 274
6c0ea513
JS
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
706465df
JS
280/**
281 Default superscript/subscript font multiplication factor.
30bf7630
JS
282 */
283
284#define wxSCRIPT_MUL_FACTOR 1.5
285
706465df
JS
286/**
287 The type for wxTextAttrDimension flags.
288 */
24777478 289typedef unsigned short wxTextAttrDimensionFlags;
cdaed652 290
706465df
JS
291/**
292 Miscellaneous text box flags
293 */
24777478
JS
294enum wxTextBoxAttrFlags
295{
296 wxTEXT_BOX_ATTR_FLOAT = 0x00000001,
297 wxTEXT_BOX_ATTR_CLEAR = 0x00000002,
603f702b 298 wxTEXT_BOX_ATTR_COLLAPSE_BORDERS = 0x00000004,
2f987d83
JS
299 wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT = 0x00000008,
300 wxTEXT_BOX_ATTR_BOX_STYLE_NAME = 0x00000010
24777478 301};
cdaed652 302
706465df
JS
303/**
304 Whether a value is present, used in dimension flags.
305 */
24777478
JS
306enum wxTextAttrValueFlags
307{
603f702b
JS
308 wxTEXT_ATTR_VALUE_VALID = 0x1000,
309 wxTEXT_ATTR_VALUE_VALID_MASK = 0x1000
24777478 310};
cdaed652 311
706465df
JS
312/**
313 Units, included in the dimension value.
314 */
24777478
JS
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
706465df
JS
325/**
326 Position alternatives, included in the dimension flags.
327 */
24777478
JS
328enum wxTextBoxAttrPosition
329{
330 wxTEXT_BOX_ATTR_POSITION_STATIC = 0x0000, // Default is static, i.e. as per normal layout
603f702b 331 wxTEXT_BOX_ATTR_POSITION_RELATIVE = 0x0010, // Relative to the relevant edge
24777478
JS
332 wxTEXT_BOX_ATTR_POSITION_ABSOLUTE = 0x0020,
333
334 wxTEXT_BOX_ATTR_POSITION_MASK = 0x00F0
335};
336
23bdfeee
JS
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
6ffb5e91 348class WXDLLIMPEXP_RICHTEXT wxTextAttrDimension
cdaed652
VZ
349{
350public:
23bdfeee
JS
351 /**
352 Default constructor.
353 */
24777478 354 wxTextAttrDimension() { Reset(); }
23bdfeee
JS
355 /**
356 Constructor taking value and units flag.
357 */
603f702b
JS
358 wxTextAttrDimension(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { m_value = value; m_flags = units|wxTEXT_ATTR_VALUE_VALID; }
359
23bdfeee
JS
360 /**
361 Resets the dimension value and flags.
362 */
24777478
JS
363 void Reset() { m_value = 0; m_flags = 0; }
364
23bdfeee
JS
365 /**
366 Partial equality test.
367 */
24777478
JS
368 bool EqPartial(const wxTextAttrDimension& dim) const;
369
23bdfeee
JS
370 /** Apply the dimension, but not those identical to @a compareWith if present.
371 */
24777478
JS
372 bool Apply(const wxTextAttrDimension& dim, const wxTextAttrDimension* compareWith = NULL);
373
23bdfeee
JS
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 */
24777478
JS
377 void CollectCommonAttributes(const wxTextAttrDimension& attr, wxTextAttrDimension& clashingAttr, wxTextAttrDimension& absentAttr);
378
23bdfeee
JS
379 /**
380 Equality operator.
381 */
24777478 382 bool operator==(const wxTextAttrDimension& dim) const { return m_value == dim.m_value && m_flags == dim.m_flags; }
603f702b 383
23bdfeee
JS
384 /**
385 Returns the integer value of the dimension.
386 */
24777478 387 int GetValue() const { return m_value; }
23bdfeee
JS
388
389 /**
390 Returns the floating-pointing value of the dimension in mm.
391
392 */
24777478 393 float GetValueMM() const { return float(m_value) / 10.0; }
23bdfeee
JS
394
395 /**
396 Sets the value of the dimension in mm.
397 */
603f702b 398 void SetValueMM(float value) { m_value = (int) ((value * 10.0) + 0.5); m_flags |= wxTEXT_ATTR_VALUE_VALID; }
23bdfeee
JS
399
400 /**
401 Sets the integer value of the dimension.
402 */
603f702b 403 void SetValue(int value) { m_value = value; m_flags |= wxTEXT_ATTR_VALUE_VALID; }
23bdfeee
JS
404
405 /**
406 Sets the integer value of the dimension, passing dimension flags.
407 */
603f702b 408 void SetValue(int value, wxTextAttrDimensionFlags flags) { SetValue(value); m_flags = flags; }
23bdfeee
JS
409
410 /**
411 Sets the integer value and units.
412 */
603f702b 413 void SetValue(int value, wxTextAttrUnits units) { m_value = value; m_flags = units | wxTEXT_ATTR_VALUE_VALID; }
23bdfeee
JS
414
415 /**
416 Sets the dimension.
417 */
bec80f4f 418 void SetValue(const wxTextAttrDimension& dim) { (*this) = dim; }
603f702b 419
23bdfeee
JS
420 /**
421 Gets the units of the dimension.
422 */
24777478 423 wxTextAttrUnits GetUnits() const { return (wxTextAttrUnits) (m_flags & wxTEXT_ATTR_UNITS_MASK); }
23bdfeee
JS
424
425 /**
426 Sets the units of the dimension.
427 */
24777478 428 void SetUnits(wxTextAttrUnits units) { m_flags &= ~wxTEXT_ATTR_UNITS_MASK; m_flags |= units; }
603f702b 429
23bdfeee
JS
430 /**
431 Gets the position flags.
432 */
24777478 433 wxTextBoxAttrPosition GetPosition() const { return (wxTextBoxAttrPosition) (m_flags & wxTEXT_BOX_ATTR_POSITION_MASK); }
23bdfeee
JS
434
435 /**
436 Sets the position flags.
437 */
24777478 438 void SetPosition(wxTextBoxAttrPosition pos) { m_flags &= ~wxTEXT_BOX_ATTR_POSITION_MASK; m_flags |= pos; }
603f702b 439
23bdfeee
JS
440 /**
441 Returns @true if the dimension is valid.
442 */
603f702b 443 bool IsValid() const { return (m_flags & wxTEXT_ATTR_VALUE_VALID) != 0; }
23bdfeee
JS
444
445 /**
446 Sets the valid flag.
447 */
603f702b
JS
448 void SetValid(bool b) { m_flags &= ~wxTEXT_ATTR_VALUE_VALID_MASK; m_flags |= (b ? wxTEXT_ATTR_VALUE_VALID : 0); }
449
23bdfeee
JS
450 /**
451 Gets the dimension flags.
452 */
bec80f4f 453 wxTextAttrDimensionFlags GetFlags() const { return m_flags; }
23bdfeee
JS
454
455 /**
456 Sets the dimension flags.
457 */
bec80f4f 458 void SetFlags(wxTextAttrDimensionFlags flags) { m_flags = flags; }
603f702b 459
24777478
JS
460 int m_value;
461 wxTextAttrDimensionFlags m_flags;
462};
ce00f59b 463
23bdfeee
JS
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
bec80f4f 474class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensions
24777478
JS
475{
476public:
23bdfeee
JS
477 /**
478 Default constructor.
479 */
603f702b
JS
480 wxTextAttrDimensions() {}
481
23bdfeee
JS
482 /**
483 Resets the value and flags for all dimensions.
484 */
24777478 485 void Reset() { m_left.Reset(); m_top.Reset(); m_right.Reset(); m_bottom.Reset(); }
603f702b 486
23bdfeee
JS
487 /**
488 Equality operator.
489 */
bec80f4f 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; }
603f702b 491
23bdfeee
JS
492 /**
493 Partial equality test.
494
495 */
bec80f4f 496 bool EqPartial(const wxTextAttrDimensions& dims) const;
24777478 497
23bdfeee
JS
498 /**
499 Apply border to 'this', but not if the same as @a compareWith.
500
501 */
bec80f4f 502 bool Apply(const wxTextAttrDimensions& dims, const wxTextAttrDimensions* compareWith = NULL);
24777478 503
23bdfeee
JS
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 */
bec80f4f 509 void CollectCommonAttributes(const wxTextAttrDimensions& attr, wxTextAttrDimensions& clashingAttr, wxTextAttrDimensions& absentAttr);
24777478 510
23bdfeee
JS
511 /**
512 Remove specified attributes from this object.
513 */
bec80f4f
JS
514 bool RemoveStyle(const wxTextAttrDimensions& attr);
515
23bdfeee
JS
516 /**
517 Gets the left dimension.
518 */
bec80f4f
JS
519 const wxTextAttrDimension& GetLeft() const { return m_left; }
520 wxTextAttrDimension& GetLeft() { return m_left; }
521
23bdfeee
JS
522 /**
523 Gets the right dimension.
524
525 */
bec80f4f
JS
526 const wxTextAttrDimension& GetRight() const { return m_right; }
527 wxTextAttrDimension& GetRight() { return m_right; }
528
23bdfeee
JS
529 /**
530 Gets the top dimension.
531
532 */
bec80f4f
JS
533 const wxTextAttrDimension& GetTop() const { return m_top; }
534 wxTextAttrDimension& GetTop() { return m_top; }
535
23bdfeee
JS
536 /**
537 Gets the bottom dimension.
538
539 */
bec80f4f
JS
540 const wxTextAttrDimension& GetBottom() const { return m_bottom; }
541 wxTextAttrDimension& GetBottom() { return m_bottom; }
24777478 542
eb3d8a33
JS
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
24777478
JS
549 wxTextAttrDimension m_left;
550 wxTextAttrDimension m_top;
551 wxTextAttrDimension m_right;
552 wxTextAttrDimension m_bottom;
553};
554
23bdfeee
JS
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
603f702b
JS
565class WXDLLIMPEXP_RICHTEXT wxTextAttrSize
566{
567public:
23bdfeee
JS
568 /**
569 Default constructor.
570 */
603f702b
JS
571 wxTextAttrSize() {}
572
23bdfeee
JS
573 /**
574 Resets the width and height dimensions.
575 */
603f702b
JS
576 void Reset() { m_width.Reset(); m_height.Reset(); }
577
23bdfeee
JS
578 /**
579 Equality operator.
580 */
603f702b
JS
581 bool operator==(const wxTextAttrSize& size) const { return m_width == size.m_width && m_height == size.m_height ; }
582
23bdfeee
JS
583 /**
584 Partial equality test.
585 */
603f702b
JS
586 bool EqPartial(const wxTextAttrSize& dims) const;
587
23bdfeee
JS
588 /**
589 Apply border to this object, but not if the same as @a compareWith.
590 */
603f702b
JS
591 bool Apply(const wxTextAttrSize& dims, const wxTextAttrSize* compareWith = NULL);
592
23bdfeee
JS
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 */
603f702b
JS
597 void CollectCommonAttributes(const wxTextAttrSize& attr, wxTextAttrSize& clashingAttr, wxTextAttrSize& absentAttr);
598
23bdfeee
JS
599 /**
600 Removes the specified attributes from this object.
601 */
603f702b
JS
602 bool RemoveStyle(const wxTextAttrSize& attr);
603
23bdfeee
JS
604 /**
605 Returns the width.
606 */
603f702b
JS
607 wxTextAttrDimension& GetWidth() { return m_width; }
608 const wxTextAttrDimension& GetWidth() const { return m_width; }
609
23bdfeee
JS
610 /**
611 Sets the width.
612 */
603f702b 613 void SetWidth(int value, wxTextAttrDimensionFlags flags) { m_width.SetValue(value, flags); }
303f0be7 614
23bdfeee
JS
615 /**
616 Sets the width.
617 */
603f702b 618 void SetWidth(int value, wxTextAttrUnits units) { m_width.SetValue(value, units); }
303f0be7 619
23bdfeee
JS
620 /**
621 Sets the width.
622 */
603f702b
JS
623 void SetWidth(const wxTextAttrDimension& dim) { m_width.SetValue(dim); }
624
23bdfeee
JS
625 /**
626 Gets the height.
627 */
603f702b
JS
628 wxTextAttrDimension& GetHeight() { return m_height; }
629 const wxTextAttrDimension& GetHeight() const { return m_height; }
630
23bdfeee
JS
631 /**
632 Sets the height.
633 */
603f702b 634 void SetHeight(int value, wxTextAttrDimensionFlags flags) { m_height.SetValue(value, flags); }
303f0be7 635
23bdfeee
JS
636 /**
637 Sets the height.
638 */
603f702b 639 void SetHeight(int value, wxTextAttrUnits units) { m_height.SetValue(value, units); }
303f0be7 640
23bdfeee
JS
641 /**
642 Sets the height.
643 */
603f702b
JS
644 void SetHeight(const wxTextAttrDimension& dim) { m_height.SetValue(dim); }
645
303f0be7
JS
646 /**
647 Is the size valid?
648 */
649 bool IsValid() const { return m_width.IsValid() && m_height.IsValid(); }
650
603f702b
JS
651 wxTextAttrDimension m_width;
652 wxTextAttrDimension m_height;
653};
654
23bdfeee
JS
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
bec80f4f
JS
665class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensionConverter
666{
667public:
23bdfeee
JS
668 /**
669 Constructor.
670 */
8995db52 671 wxTextAttrDimensionConverter(wxDC& dc, double scale = 1.0, const wxSize& parentSize = wxDefaultSize);
23bdfeee
JS
672 /**
673 Constructor.
674 */
8995db52 675 wxTextAttrDimensionConverter(int ppi, double scale = 1.0, const wxSize& parentSize = wxDefaultSize);
603f702b 676
23bdfeee
JS
677 /**
678 Gets the pixel size for the given dimension.
679 */
bec80f4f 680 int GetPixels(const wxTextAttrDimension& dim, int direction = wxHORIZONTAL) const;
23bdfeee
JS
681 /**
682 Gets the mm size for the given dimension.
683 */
bec80f4f
JS
684 int GetTenthsMM(const wxTextAttrDimension& dim) const;
685
23bdfeee
JS
686 /**
687 Converts tenths of a mm to pixels.
688 */
bec80f4f 689 int ConvertTenthsMMToPixels(int units) const;
23bdfeee
JS
690 /**
691 Converts pixels to tenths of a mm.
692 */
bec80f4f
JS
693 int ConvertPixelsToTenthsMM(int pixels) const;
694
695 int m_ppi;
696 double m_scale;
697 wxSize m_parentSize;
698};
699
706465df
JS
700/**
701 Border styles, used with wxTextAttrBorder.
702 */
bec80f4f 703enum wxTextAttrBorderStyle
24777478
JS
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
706465df
JS
716/**
717 Border style presence flags, used with wxTextAttrBorder.
718 */
bec80f4f 719enum wxTextAttrBorderFlags
24777478
JS
720{
721 wxTEXT_BOX_ATTR_BORDER_STYLE = 0x0001,
722 wxTEXT_BOX_ATTR_BORDER_COLOUR = 0x0002
723};
724
706465df
JS
725/**
726 Border width symbols for qualitative widths, used with wxTextAttrBorder.
727 */
bec80f4f
JS
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
706465df
JS
735/**
736 Float styles.
737 */
24777478
JS
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
706465df
JS
745/**
746 Clear styles.
747 */
24777478
JS
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
706465df
JS
756/**
757 Collapse mode styles. TODO: can they be switched on per side?
758 */
24777478
JS
759enum wxTextBoxAttrCollapseMode
760{
761 wxTEXT_BOX_ATTR_COLLAPSE_NONE = 0,
762 wxTEXT_BOX_ATTR_COLLAPSE_FULL = 1
763};
764
706465df
JS
765/**
766 Vertical alignment values.
767 */
603f702b
JS
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
23bdfeee
JS
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
bec80f4f 786class WXDLLIMPEXP_RICHTEXT wxTextAttrBorder
24777478
JS
787{
788public:
23bdfeee
JS
789 /**
790 Default constructor.
791 */
bec80f4f 792 wxTextAttrBorder() { Reset(); }
603f702b 793
23bdfeee
JS
794 /**
795 Equality operator.
796 */
bec80f4f 797 bool operator==(const wxTextAttrBorder& border) const
24777478
JS
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
23bdfeee
JS
803 /**
804 Resets the border style, colour, width and flags.
805 */
24777478
JS
806 void Reset() { m_borderStyle = 0; m_borderColour = 0; m_flags = 0; m_borderWidth.Reset(); }
807
23bdfeee
JS
808 /**
809 Partial equality test.
810 */
bec80f4f 811 bool EqPartial(const wxTextAttrBorder& border) const;
cdaed652 812
23bdfeee
JS
813 /**
814 Applies the border to this object, but not if the same as @a compareWith.
815
816 */
bec80f4f 817 bool Apply(const wxTextAttrBorder& border, const wxTextAttrBorder* compareWith = NULL);
24777478 818
23bdfeee
JS
819 /**
820 Removes the specified attributes from this object.
821 */
bec80f4f 822 bool RemoveStyle(const wxTextAttrBorder& attr);
24777478 823
23bdfeee
JS
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 */
bec80f4f 828 void CollectCommonAttributes(const wxTextAttrBorder& attr, wxTextAttrBorder& clashingAttr, wxTextAttrBorder& absentAttr);
24777478 829
23bdfeee
JS
830 /**
831 Sets the border style.
832 */
24777478 833 void SetStyle(int style) { m_borderStyle = style; m_flags |= wxTEXT_BOX_ATTR_BORDER_STYLE; }
23bdfeee
JS
834
835 /**
836 Gets the border style.
837
838 */
24777478
JS
839 int GetStyle() const { return m_borderStyle; }
840
23bdfeee
JS
841 /**
842 Sets the border colour.
843 */
24777478 844 void SetColour(unsigned long colour) { m_borderColour = colour; m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; }
23bdfeee
JS
845
846 /**
847 Sets the border colour.
848 */
24777478 849 void SetColour(const wxColour& colour) { m_borderColour = colour.GetRGB(); m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; }
23bdfeee
JS
850
851 /**
852 Gets the colour as a long.
853 */
24777478 854 unsigned long GetColourLong() const { return m_borderColour; }
23bdfeee
JS
855
856 /**
857 Gets the colour.
858 */
24777478
JS
859 wxColour GetColour() const { return wxColour(m_borderColour); }
860
23bdfeee
JS
861 /**
862 Gets the border width.
863 */
24777478
JS
864 wxTextAttrDimension& GetWidth() { return m_borderWidth; }
865 const wxTextAttrDimension& GetWidth() const { return m_borderWidth; }
23bdfeee
JS
866
867 /**
868 Sets the border width.
869 */
24777478 870 void SetWidth(const wxTextAttrDimension& width) { m_borderWidth = width; }
23bdfeee
JS
871 /**
872 Sets the border width.
873 */
603f702b 874 void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); }
24777478 875
23bdfeee
JS
876 /**
877 True if the border has a valid style.
878 */
bec80f4f 879 bool HasStyle() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_STYLE) != 0; }
23bdfeee
JS
880
881 /**
882 True if the border has a valid colour.
883 */
bec80f4f 884 bool HasColour() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_COLOUR) != 0; }
23bdfeee
JS
885
886 /**
887 True if the border has a valid width.
888 */
603f702b
JS
889 bool HasWidth() const { return m_borderWidth.IsValid(); }
890
23bdfeee
JS
891 /**
892 True if the border is valid.
893 */
603f702b 894 bool IsValid() const { return HasWidth(); }
23bdfeee
JS
895
896 /**
897 Set the valid flag for this border.
898 */
603f702b
JS
899 void MakeValid() { m_borderWidth.SetValid(true); }
900
23bdfeee
JS
901 /**
902 Returns the border flags.
903 */
24777478 904 int GetFlags() const { return m_flags; }
23bdfeee
JS
905
906 /**
907 Sets the border flags.
908 */
24777478 909 void SetFlags(int flags) { m_flags = flags; }
23bdfeee
JS
910
911 /**
912 Adds a border flag.
913 */
24777478 914 void AddFlag(int flag) { m_flags |= flag; }
23bdfeee
JS
915
916 /**
917 Removes a border flag.
918 */
24777478
JS
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
23bdfeee
JS
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
bec80f4f 937class WXDLLIMPEXP_RICHTEXT wxTextAttrBorders
24777478
JS
938{
939public:
23bdfeee
JS
940 /**
941 Default constructor.
942 */
bec80f4f 943 wxTextAttrBorders() { }
ce00f59b 944
23bdfeee
JS
945 /**
946 Equality operator.
947 */
bec80f4f 948 bool operator==(const wxTextAttrBorders& borders) const
24777478
JS
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 }
cdaed652 953
23bdfeee
JS
954 /**
955 Sets the style of all borders.
956 */
24777478 957 void SetStyle(int style);
ce00f59b 958
23bdfeee
JS
959 /**
960 Sets colour of all borders.
961 */
24777478 962 void SetColour(unsigned long colour);
23bdfeee
JS
963
964 /**
965 Sets the colour for all borders.
966 */
24777478 967 void SetColour(const wxColour& colour);
cdaed652 968
23bdfeee
JS
969 /**
970 Sets the width of all borders.
971 */
24777478 972 void SetWidth(const wxTextAttrDimension& width);
23bdfeee
JS
973
974 /**
975 Sets the width of all borders.
976 */
603f702b
JS
977 void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); }
978
23bdfeee
JS
979 /**
980 Resets all borders.
981 */
24777478 982 void Reset() { m_left.Reset(); m_right.Reset(); m_top.Reset(); m_bottom.Reset(); }
cdaed652 983
23bdfeee
JS
984 /**
985 Partial equality test.
986 */
bec80f4f 987 bool EqPartial(const wxTextAttrBorders& borders) const;
cdaed652 988
23bdfeee
JS
989 /**
990 Applies border to this object, but not if the same as @a compareWith.
991 */
bec80f4f 992 bool Apply(const wxTextAttrBorders& borders, const wxTextAttrBorders* compareWith = NULL);
cdaed652 993
23bdfeee
JS
994 /**
995 Removes the specified attributes from this object.
996 */
bec80f4f 997 bool RemoveStyle(const wxTextAttrBorders& attr);
cdaed652 998
23bdfeee
JS
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 */
bec80f4f 1003 void CollectCommonAttributes(const wxTextAttrBorders& attr, wxTextAttrBorders& clashingAttr, wxTextAttrBorders& absentAttr);
603f702b 1004
23bdfeee
JS
1005 /**
1006 Returns @true if all borders are valid.
1007 */
603f702b 1008 bool IsValid() const { return m_left.IsValid() || m_right.IsValid() || m_top.IsValid() || m_bottom.IsValid(); }
cdaed652 1009
23bdfeee
JS
1010 /**
1011 Returns the left border.
1012 */
bec80f4f
JS
1013 const wxTextAttrBorder& GetLeft() const { return m_left; }
1014 wxTextAttrBorder& GetLeft() { return m_left; }
603f702b 1015
23bdfeee
JS
1016 /**
1017 Returns the right border.
1018 */
bec80f4f
JS
1019 const wxTextAttrBorder& GetRight() const { return m_right; }
1020 wxTextAttrBorder& GetRight() { return m_right; }
603f702b 1021
23bdfeee
JS
1022 /**
1023 Returns the top border.
1024 */
bec80f4f
JS
1025 const wxTextAttrBorder& GetTop() const { return m_top; }
1026 wxTextAttrBorder& GetTop() { return m_top; }
603f702b 1027
23bdfeee
JS
1028 /**
1029 Returns the bottom border.
1030 */
bec80f4f
JS
1031 const wxTextAttrBorder& GetBottom() const { return m_bottom; }
1032 wxTextAttrBorder& GetBottom() { return m_bottom; }
603f702b 1033
bec80f4f 1034 wxTextAttrBorder m_left, m_right, m_top, m_bottom;
cdaed652 1035
24777478
JS
1036};
1037
23bdfeee
JS
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*/
24777478 1047
6ffb5e91 1048class WXDLLIMPEXP_RICHTEXT wxTextBoxAttr
24777478
JS
1049{
1050public:
23bdfeee
JS
1051 /**
1052 Default constructor.
1053 */
24777478 1054 wxTextBoxAttr() { Init(); }
23bdfeee
JS
1055
1056 /**
1057 Copy constructor.
1058 */
24777478
JS
1059 wxTextBoxAttr(const wxTextBoxAttr& attr) { Init(); (*this) = attr; }
1060
23bdfeee
JS
1061 /**
1062 Initialises this object.
1063 */
24777478
JS
1064 void Init() { Reset(); }
1065
23bdfeee
JS
1066 /**
1067 Resets this object.
1068 */
24777478
JS
1069 void Reset();
1070
bec80f4f 1071 // Copy. Unnecessary since we let it do a binary copy
24777478
JS
1072 //void Copy(const wxTextBoxAttr& attr);
1073
1074 // Assignment
1075 //void operator= (const wxTextBoxAttr& attr);
1076
23bdfeee
JS
1077 /**
1078 Equality test.
1079 */
24777478
JS
1080 bool operator== (const wxTextBoxAttr& attr) const;
1081
23bdfeee
JS
1082 /**
1083 Partial equality test, ignoring unset attributes.
1084
1085 */
24777478
JS
1086 bool EqPartial(const wxTextBoxAttr& attr) const;
1087
23bdfeee
JS
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 */
24777478 1093 bool Apply(const wxTextBoxAttr& style, const wxTextBoxAttr* compareWith = NULL);
603f702b 1094
23bdfeee
JS
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 */
24777478
JS
1099 void CollectCommonAttributes(const wxTextBoxAttr& attr, wxTextBoxAttr& clashingAttr, wxTextBoxAttr& absentAttr);
1100
23bdfeee
JS
1101 /**
1102 Removes the specified attributes from this object.
1103 */
24777478
JS
1104 bool RemoveStyle(const wxTextBoxAttr& attr);
1105
23bdfeee
JS
1106 /**
1107 Sets the flags.
1108 */
24777478
JS
1109 void SetFlags(int flags) { m_flags = flags; }
1110
23bdfeee
JS
1111 /**
1112 Returns the flags.
1113 */
24777478
JS
1114 int GetFlags() const { return m_flags; }
1115
23bdfeee
JS
1116 /**
1117 Is this flag present?
1118 */
24777478
JS
1119 bool HasFlag(wxTextBoxAttrFlags flag) const { return (m_flags & flag) != 0; }
1120
23bdfeee
JS
1121 /**
1122 Removes this flag.
1123 */
24777478
JS
1124 void RemoveFlag(wxTextBoxAttrFlags flag) { m_flags &= ~flag; }
1125
23bdfeee
JS
1126 /**
1127 Adds this flag.
1128 */
24777478
JS
1129 void AddFlag(wxTextBoxAttrFlags flag) { m_flags |= flag; }
1130
23bdfeee
JS
1131 /**
1132 Returns @true if no attributes are set.
1133 */
24777478
JS
1134 bool IsDefault() const;
1135
23bdfeee
JS
1136 /**
1137 Returns the float mode.
1138 */
603f702b
JS
1139 wxTextBoxAttrFloatStyle GetFloatMode() const { return m_floatMode; }
1140
23bdfeee
JS
1141 /**
1142 Sets the float mode.
1143 */
603f702b
JS
1144 void SetFloatMode(wxTextBoxAttrFloatStyle mode) { m_floatMode = mode; m_flags |= wxTEXT_BOX_ATTR_FLOAT; }
1145
23bdfeee
JS
1146 /**
1147 Returns @true if float mode is active.
1148 */
24777478 1149 bool HasFloatMode() const { return HasFlag(wxTEXT_BOX_ATTR_FLOAT); }
603f702b 1150
23bdfeee 1151 /**
b3169c12 1152 Returns @true if this object is floating.
23bdfeee 1153 */
24777478
JS
1154 bool IsFloating() const { return HasFloatMode() && GetFloatMode() != wxTEXT_BOX_ATTR_FLOAT_NONE; }
1155
23bdfeee
JS
1156 /**
1157 Returns the clear mode - whether to wrap text after object. Currently unimplemented.
1158 */
603f702b
JS
1159 wxTextBoxAttrClearStyle GetClearMode() const { return m_clearMode; }
1160
23bdfeee
JS
1161 /**
1162 Set the clear mode. Currently unimplemented.
1163 */
603f702b
JS
1164 void SetClearMode(wxTextBoxAttrClearStyle mode) { m_clearMode = mode; m_flags |= wxTEXT_BOX_ATTR_CLEAR; }
1165
23bdfeee
JS
1166 /**
1167 Returns @true if we have a clear flag.
1168 */
24777478
JS
1169 bool HasClearMode() const { return HasFlag(wxTEXT_BOX_ATTR_CLEAR); }
1170
23bdfeee
JS
1171 /**
1172 Returns the collapse mode - whether to collapse borders. Currently unimplemented.
1173 */
603f702b
JS
1174 wxTextBoxAttrCollapseMode GetCollapseBorders() const { return m_collapseMode; }
1175
23bdfeee
JS
1176 /**
1177 Sets the collapse mode - whether to collapse borders. Currently unimplemented.
1178 */
603f702b
JS
1179 void SetCollapseBorders(wxTextBoxAttrCollapseMode collapse) { m_collapseMode = collapse; m_flags |= wxTEXT_BOX_ATTR_COLLAPSE_BORDERS; }
1180
23bdfeee
JS
1181 /**
1182 Returns @true if the collapse borders flag is present.
1183 */
24777478 1184 bool HasCollapseBorders() const { return HasFlag(wxTEXT_BOX_ATTR_COLLAPSE_BORDERS); }
603f702b 1185
23bdfeee
JS
1186 /**
1187 Returns the vertical alignment.
1188 */
603f702b
JS
1189 wxTextBoxAttrVerticalAlignment GetVerticalAlignment() const { return m_verticalAlignment; }
1190
23bdfeee
JS
1191 /**
1192 Sets the vertical alignment.
1193 */
603f702b
JS
1194 void SetVerticalAlignment(wxTextBoxAttrVerticalAlignment verticalAlignment) { m_verticalAlignment = verticalAlignment; m_flags |= wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT; }
1195
23bdfeee
JS
1196 /**
1197 Returns @true if a vertical alignment flag is present.
1198 */
603f702b
JS
1199 bool HasVerticalAlignment() const { return HasFlag(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT); }
1200
23bdfeee
JS
1201 /**
1202 Returns the margin values.
1203 */
bec80f4f
JS
1204 wxTextAttrDimensions& GetMargins() { return m_margins; }
1205 const wxTextAttrDimensions& GetMargins() const { return m_margins; }
1206
23bdfeee
JS
1207 /**
1208 Returns the left margin.
1209 */
24777478
JS
1210 wxTextAttrDimension& GetLeftMargin() { return m_margins.m_left; }
1211 const wxTextAttrDimension& GetLeftMargin() const { return m_margins.m_left; }
1212
23bdfeee
JS
1213 /**
1214 Returns the right margin.
1215 */
24777478
JS
1216 wxTextAttrDimension& GetRightMargin() { return m_margins.m_right; }
1217 const wxTextAttrDimension& GetRightMargin() const { return m_margins.m_right; }
1218
23bdfeee
JS
1219 /**
1220 Returns the top margin.
1221 */
24777478
JS
1222 wxTextAttrDimension& GetTopMargin() { return m_margins.m_top; }
1223 const wxTextAttrDimension& GetTopMargin() const { return m_margins.m_top; }
603f702b 1224
23bdfeee
JS
1225 /**
1226 Returns the bottom margin.
1227 */
24777478
JS
1228 wxTextAttrDimension& GetBottomMargin() { return m_margins.m_bottom; }
1229 const wxTextAttrDimension& GetBottomMargin() const { return m_margins.m_bottom; }
1230
23bdfeee
JS
1231 /**
1232 Returns the position.
1233 */
bec80f4f
JS
1234 wxTextAttrDimensions& GetPosition() { return m_position; }
1235 const wxTextAttrDimensions& GetPosition() const { return m_position; }
1236
23bdfeee
JS
1237 /**
1238 Returns the left position.
1239 */
24777478
JS
1240 wxTextAttrDimension& GetLeft() { return m_position.m_left; }
1241 const wxTextAttrDimension& GetLeft() const { return m_position.m_left; }
1242
23bdfeee
JS
1243 /**
1244 Returns the right position.
1245 */
24777478
JS
1246 wxTextAttrDimension& GetRight() { return m_position.m_right; }
1247 const wxTextAttrDimension& GetRight() const { return m_position.m_right; }
1248
23bdfeee
JS
1249 /**
1250 Returns the top position.
1251 */
24777478
JS
1252 wxTextAttrDimension& GetTop() { return m_position.m_top; }
1253 const wxTextAttrDimension& GetTop() const { return m_position.m_top; }
603f702b 1254
23bdfeee
JS
1255 /**
1256 Returns the bottom position.
1257 */
24777478
JS
1258 wxTextAttrDimension& GetBottom() { return m_position.m_bottom; }
1259 const wxTextAttrDimension& GetBottom() const { return m_position.m_bottom; }
1260
23bdfeee
JS
1261 /**
1262 Returns the padding values.
1263 */
bec80f4f
JS
1264 wxTextAttrDimensions& GetPadding() { return m_padding; }
1265 const wxTextAttrDimensions& GetPadding() const { return m_padding; }
1266
23bdfeee
JS
1267 /**
1268 Returns the left padding value.
1269 */
24777478
JS
1270 wxTextAttrDimension& GetLeftPadding() { return m_padding.m_left; }
1271 const wxTextAttrDimension& GetLeftPadding() const { return m_padding.m_left; }
603f702b 1272
23bdfeee
JS
1273 /**
1274 Returns the right padding value.
1275 */
24777478
JS
1276 wxTextAttrDimension& GetRightPadding() { return m_padding.m_right; }
1277 const wxTextAttrDimension& GetRightPadding() const { return m_padding.m_right; }
603f702b 1278
23bdfeee
JS
1279 /**
1280 Returns the top padding value.
1281 */
24777478
JS
1282 wxTextAttrDimension& GetTopPadding() { return m_padding.m_top; }
1283 const wxTextAttrDimension& GetTopPadding() const { return m_padding.m_top; }
1284
23bdfeee
JS
1285 /**
1286 Returns the bottom padding value.
1287 */
24777478
JS
1288 wxTextAttrDimension& GetBottomPadding() { return m_padding.m_bottom; }
1289 const wxTextAttrDimension& GetBottomPadding() const { return m_padding.m_bottom; }
24777478 1290
23bdfeee
JS
1291 /**
1292 Returns the borders.
1293 */
bec80f4f
JS
1294 wxTextAttrBorders& GetBorder() { return m_border; }
1295 const wxTextAttrBorders& GetBorder() const { return m_border; }
24777478 1296
23bdfeee
JS
1297 /**
1298 Returns the left border.
1299 */
bec80f4f
JS
1300 wxTextAttrBorder& GetLeftBorder() { return m_border.m_left; }
1301 const wxTextAttrBorder& GetLeftBorder() const { return m_border.m_left; }
24777478 1302
23bdfeee
JS
1303 /**
1304 Returns the top border.
1305 */
bec80f4f
JS
1306 wxTextAttrBorder& GetTopBorder() { return m_border.m_top; }
1307 const wxTextAttrBorder& GetTopBorder() const { return m_border.m_top; }
24777478 1308
23bdfeee
JS
1309 /**
1310 Returns the right border.
1311 */
bec80f4f
JS
1312 wxTextAttrBorder& GetRightBorder() { return m_border.m_right; }
1313 const wxTextAttrBorder& GetRightBorder() const { return m_border.m_right; }
24777478 1314
23bdfeee
JS
1315 /**
1316 Returns the bottom border.
1317 */
bec80f4f
JS
1318 wxTextAttrBorder& GetBottomBorder() { return m_border.m_bottom; }
1319 const wxTextAttrBorder& GetBottomBorder() const { return m_border.m_bottom; }
24777478 1320
23bdfeee
JS
1321 /**
1322 Returns the outline.
1323 */
bec80f4f
JS
1324 wxTextAttrBorders& GetOutline() { return m_outline; }
1325 const wxTextAttrBorders& GetOutline() const { return m_outline; }
24777478 1326
23bdfeee
JS
1327 /**
1328 Returns the left outline.
1329 */
bec80f4f
JS
1330 wxTextAttrBorder& GetLeftOutline() { return m_outline.m_left; }
1331 const wxTextAttrBorder& GetLeftOutline() const { return m_outline.m_left; }
24777478 1332
23bdfeee
JS
1333 /**
1334 Returns the top outline.
1335 */
bec80f4f
JS
1336 wxTextAttrBorder& GetTopOutline() { return m_outline.m_top; }
1337 const wxTextAttrBorder& GetTopOutline() const { return m_outline.m_top; }
24777478 1338
23bdfeee
JS
1339 /**
1340 Returns the right outline.
1341 */
bec80f4f
JS
1342 wxTextAttrBorder& GetRightOutline() { return m_outline.m_right; }
1343 const wxTextAttrBorder& GetRightOutline() const { return m_outline.m_right; }
24777478 1344
23bdfeee
JS
1345 /**
1346 Returns the bottom outline.
1347 */
bec80f4f
JS
1348 wxTextAttrBorder& GetBottomOutline() { return m_outline.m_bottom; }
1349 const wxTextAttrBorder& GetBottomOutline() const { return m_outline.m_bottom; }
24777478 1350
23bdfeee
JS
1351 /**
1352 Returns the object size.
1353 */
603f702b
JS
1354 wxTextAttrSize& GetSize() { return m_size; }
1355 const wxTextAttrSize& GetSize() const { return m_size; }
24777478 1356
303f0be7
JS
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
23bdfeee
JS
1371 /**
1372 Sets the object size.
1373 */
603f702b 1374 void SetSize(const wxTextAttrSize& sz) { m_size = sz; }
24777478 1375
303f0be7
JS
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
23bdfeee
JS
1386 /**
1387 Returns the object width.
1388 */
603f702b
JS
1389 wxTextAttrDimension& GetWidth() { return m_size.m_width; }
1390 const wxTextAttrDimension& GetWidth() const { return m_size.m_width; }
1391
23bdfeee
JS
1392 /**
1393 Returns the object height.
1394 */
603f702b
JS
1395 wxTextAttrDimension& GetHeight() { return m_size.m_height; }
1396 const wxTextAttrDimension& GetHeight() const { return m_size.m_height; }
24777478 1397
2f987d83
JS
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
24777478
JS
1413public:
1414
603f702b 1415 int m_flags;
24777478 1416
603f702b
JS
1417 wxTextAttrDimensions m_margins;
1418 wxTextAttrDimensions m_padding;
1419 wxTextAttrDimensions m_position;
24777478 1420
603f702b 1421 wxTextAttrSize m_size;
303f0be7
JS
1422 wxTextAttrSize m_minSize;
1423 wxTextAttrSize m_maxSize;
24777478 1424
603f702b
JS
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;
2f987d83 1432 wxString m_boxStyleName;
24777478
JS
1433};
1434
23bdfeee
JS
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*/
24777478
JS
1445
1446class WXDLLIMPEXP_RICHTEXT wxRichTextAttr: public wxTextAttr
1447{
1448public:
23bdfeee
JS
1449 /**
1450 Constructor taking a wxTextAttr.
1451 */
24777478 1452 wxRichTextAttr(const wxTextAttr& attr) { wxTextAttr::Copy(attr); }
23bdfeee
JS
1453
1454 /**
1455 Copy constructor.
1456 */
603f702b 1457 wxRichTextAttr(const wxRichTextAttr& attr): wxTextAttr() { Copy(attr); }
23bdfeee
JS
1458
1459 /**
1460 Default constructor.
1461 */
24777478 1462 wxRichTextAttr() {}
603f702b 1463
23bdfeee
JS
1464 /**
1465 Copy function.
1466 */
24777478 1467 void Copy(const wxRichTextAttr& attr);
603f702b 1468
23bdfeee
JS
1469 /**
1470 Assignment operator.
1471 */
24777478 1472 void operator=(const wxRichTextAttr& attr) { Copy(attr); }
23bdfeee
JS
1473
1474 /**
1475 Assignment operator.
1476 */
24777478 1477 void operator=(const wxTextAttr& attr) { wxTextAttr::Copy(attr); }
603f702b 1478
23bdfeee
JS
1479 /**
1480 Equality test.
1481 */
24777478
JS
1482 bool operator==(const wxRichTextAttr& attr) const;
1483
23bdfeee
JS
1484 /**
1485 Partial equality test taking comparison object into account.
1486 */
24777478
JS
1487 bool EqPartial(const wxRichTextAttr& attr) const;
1488
23bdfeee
JS
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 */
24777478
JS
1494 bool Apply(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL);
1495
23bdfeee
JS
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 */
24777478
JS
1500 void CollectCommonAttributes(const wxRichTextAttr& attr, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr);
1501
23bdfeee
JS
1502 /**
1503 Removes the specified attributes from this object.
1504 */
24777478
JS
1505 bool RemoveStyle(const wxRichTextAttr& attr);
1506
23bdfeee
JS
1507 /**
1508 Returns the text box attributes.
1509 */
24777478
JS
1510 wxTextBoxAttr& GetTextBoxAttr() { return m_textBoxAttr; }
1511 const wxTextBoxAttr& GetTextBoxAttr() const { return m_textBoxAttr; }
23bdfeee
JS
1512
1513 /**
1514 Set the text box attributes.
1515 */
24777478 1516 void SetTextBoxAttr(const wxTextBoxAttr& attr) { m_textBoxAttr = attr; }
603f702b 1517
24777478 1518 wxTextBoxAttr m_textBoxAttr;
cdaed652
VZ
1519};
1520
bec80f4f
JS
1521WX_DECLARE_USER_EXPORTED_OBJARRAY(wxVariant, wxRichTextVariantArray, WXDLLIMPEXP_RICHTEXT);
1522
343ef639
JS
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*/
bec80f4f
JS
1533
1534class WXDLLIMPEXP_RICHTEXT wxRichTextProperties: public wxObject
1535{
1536DECLARE_DYNAMIC_CLASS(wxRichTextProperties)
1537public:
343ef639
JS
1538
1539 /**
1540 Default constructor.
1541 */
bec80f4f 1542 wxRichTextProperties() {}
343ef639
JS
1543
1544 /**
1545 Copy constructor.
1546 */
603f702b 1547 wxRichTextProperties(const wxRichTextProperties& props): wxObject() { Copy(props); }
bec80f4f 1548
343ef639
JS
1549 /**
1550 Assignment operator.
1551 */
bec80f4f 1552 void operator=(const wxRichTextProperties& props) { Copy(props); }
343ef639
JS
1553
1554 /**
1555 Equality operator.
1556 */
bec80f4f 1557 bool operator==(const wxRichTextProperties& props) const;
343ef639
JS
1558
1559 /**
1560 Copies from @a props.
1561 */
bec80f4f 1562 void Copy(const wxRichTextProperties& props) { m_properties = props.m_properties; }
343ef639
JS
1563
1564 /**
1565 Returns the variant at the given index.
1566 */
bec80f4f 1567 const wxVariant& operator[](size_t idx) const { return m_properties[idx]; }
343ef639
JS
1568
1569 /**
1570 Returns the variant at the given index.
1571 */
bec80f4f 1572 wxVariant& operator[](size_t idx) { return m_properties[idx]; }
343ef639
JS
1573
1574 /**
1575 Clears the properties.
1576 */
bec80f4f
JS
1577 void Clear() { m_properties.Clear(); }
1578
343ef639
JS
1579 /**
1580 Returns the array of variants implementing the properties.
1581 */
bec80f4f 1582 const wxRichTextVariantArray& GetProperties() const { return m_properties; }
343ef639
JS
1583
1584 /**
1585 Returns the array of variants implementing the properties.
1586 */
bec80f4f 1587 wxRichTextVariantArray& GetProperties() { return m_properties; }
343ef639
JS
1588
1589 /**
1590 Sets the array of variants.
1591 */
bec80f4f
JS
1592 void SetProperties(const wxRichTextVariantArray& props) { m_properties = props; }
1593
343ef639
JS
1594 /**
1595 Returns all the property names.
1596 */
bec80f4f
JS
1597 wxArrayString GetPropertyNames() const;
1598
343ef639
JS
1599 /**
1600 Returns a count of the properties.
1601 */
bec80f4f
JS
1602 size_t GetCount() const { return m_properties.GetCount(); }
1603
343ef639
JS
1604 /**
1605 Returns @true if the given property is found.
1606 */
1607 bool HasProperty(const wxString& name) const { return Find(name) != -1; }
bec80f4f 1608
343ef639
JS
1609 /**
1610 Finds the given property.
1611 */
bec80f4f 1612 int Find(const wxString& name) const;
343ef639 1613
590a0f8b
JS
1614 /**
1615 Removes the given property.
1616 */
1617 bool Remove(const wxString& name);
1618
343ef639
JS
1619 /**
1620 Gets the property variant by name.
1621 */
bec80f4f 1622 const wxVariant& GetProperty(const wxString& name) const;
343ef639
JS
1623
1624 /**
1625 Finds or creates a property with the given name, returning a pointer to the variant.
1626 */
bec80f4f
JS
1627 wxVariant* FindOrCreateProperty(const wxString& name);
1628
343ef639
JS
1629 /**
1630 Gets the value of the named property as a string.
1631 */
bec80f4f 1632 wxString GetPropertyString(const wxString& name) const;
343ef639
JS
1633
1634 /**
1635 Gets the value of the named property as a long integer.
1636 */
bec80f4f 1637 long GetPropertyLong(const wxString& name) const;
343ef639
JS
1638
1639 /**
1640 Gets the value of the named property as a boolean.
1641 */
bec80f4f 1642 bool GetPropertyBool(const wxString& name) const;
343ef639
JS
1643
1644 /**
1645 Gets the value of the named property as a double.
1646 */
bec80f4f
JS
1647 double GetPropertyDouble(const wxString& name) const;
1648
343ef639
JS
1649 /**
1650 Sets the property by passing a variant which contains a name and value.
1651 */
bec80f4f 1652 void SetProperty(const wxVariant& variant);
343ef639
JS
1653
1654 /**
1655 Sets a property by name and variant.
1656 */
bec80f4f 1657 void SetProperty(const wxString& name, const wxVariant& variant);
343ef639
JS
1658
1659 /**
1660 Sets a property by name and string value.
1661 */
bec80f4f 1662 void SetProperty(const wxString& name, const wxString& value);
343ef639
JS
1663
1664 /**
1665 Sets property by name and long integer value.
1666 */
bec80f4f 1667 void SetProperty(const wxString& name, long value);
343ef639
JS
1668
1669 /**
1670 Sets property by name and double value.
1671 */
bec80f4f 1672 void SetProperty(const wxString& name, double value);
343ef639
JS
1673
1674 /**
1675 Sets property by name and boolean value.
1676 */
bec80f4f
JS
1677 void SetProperty(const wxString& name, bool value);
1678
590a0f8b
JS
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
bec80f4f
JS
1689protected:
1690 wxRichTextVariantArray m_properties;
1691};
1692
1693
343ef639
JS
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*/
5d7836c4 1703
44cc96a8
JS
1704class WXDLLIMPEXP_RICHTEXT wxRichTextFontTable: public wxObject
1705{
1706public:
343ef639
JS
1707 /**
1708 Default constructor.
1709 */
44cc96a8 1710 wxRichTextFontTable();
42688aea 1711
343ef639
JS
1712 /**
1713 Copy constructor.
1714 */
44cc96a8
JS
1715 wxRichTextFontTable(const wxRichTextFontTable& table);
1716 virtual ~wxRichTextFontTable();
5d7836c4 1717
343ef639
JS
1718 /**
1719 Returns @true if the font table is valid.
1720 */
44cc96a8 1721 bool IsOk() const { return m_refData != NULL; }
5d7836c4 1722
343ef639
JS
1723 /**
1724 Finds a font for the given attribute object.
1725 */
24777478 1726 wxFont FindFont(const wxRichTextAttr& fontSpec);
343ef639
JS
1727
1728 /**
1729 Clears the font table.
1730 */
44cc96a8 1731 void Clear();
d2d0adc7 1732
343ef639
JS
1733 /**
1734 Assignment operator.
1735 */
44cc96a8 1736 void operator= (const wxRichTextFontTable& table);
343ef639
JS
1737
1738 /**
1739 Equality operator.
1740 */
44cc96a8 1741 bool operator == (const wxRichTextFontTable& table) const;
343ef639
JS
1742
1743 /**
1744 Inequality operator.
1745 */
44cc96a8 1746 bool operator != (const wxRichTextFontTable& table) const { return !(*this == table); }
d2d0adc7 1747
44cc96a8 1748protected:
d2d0adc7 1749
44cc96a8
JS
1750 DECLARE_DYNAMIC_CLASS(wxRichTextFontTable)
1751};
d2d0adc7 1752
343ef639
JS
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*/
5d7836c4 1763
3b2cb431 1764class WXDLLIMPEXP_RICHTEXT wxRichTextRange
5d7836c4
JS
1765{
1766public:
1767// Constructors
1768
343ef639
JS
1769 /**
1770 Default constructor.
1771 */
5d7836c4 1772 wxRichTextRange() { m_start = 0; m_end = 0; }
343ef639
JS
1773
1774 /**
1775 Constructor taking start and end positions.
1776 */
5d7836c4 1777 wxRichTextRange(long start, long end) { m_start = start; m_end = end; }
343ef639
JS
1778
1779 /**
1780 Copy constructor.
1781 */
5d7836c4
JS
1782 wxRichTextRange(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; }
1783 ~wxRichTextRange() {}
1784
343ef639 1785 /**
706465df 1786 Assigns @a range to this range.
343ef639 1787 */
5d7836c4 1788 void operator =(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; }
343ef639
JS
1789
1790 /**
706465df 1791 Equality operator. Returns @true if @a range is the same as this range.
343ef639 1792 */
38113684 1793 bool operator ==(const wxRichTextRange& range) const { return (m_start == range.m_start && m_end == range.m_end); }
343ef639
JS
1794
1795 /**
1796 Inequality operator.
1797 */
e0983733 1798 bool operator !=(const wxRichTextRange& range) const { return (m_start != range.m_start || m_end != range.m_end); }
343ef639
JS
1799
1800 /**
1801 Subtracts a range from this range.
1802 */
5d7836c4 1803 wxRichTextRange operator -(const wxRichTextRange& range) const { return wxRichTextRange(m_start - range.m_start, m_end - range.m_end); }
343ef639
JS
1804
1805 /**
1806 Adds a range to this range.
1807 */
5d7836c4
JS
1808 wxRichTextRange operator +(const wxRichTextRange& range) const { return wxRichTextRange(m_start + range.m_start, m_end + range.m_end); }
1809
343ef639
JS
1810 /**
1811 Sets the range start and end positions.
1812 */
5d7836c4
JS
1813 void SetRange(long start, long end) { m_start = start; m_end = end; }
1814
343ef639
JS
1815 /**
1816 Sets the start position.
1817 */
5d7836c4 1818 void SetStart(long start) { m_start = start; }
343ef639
JS
1819
1820 /**
1821 Returns the start position.
1822 */
5d7836c4
JS
1823 long GetStart() const { return m_start; }
1824
343ef639
JS
1825 /**
1826 Sets the end position.
1827 */
5d7836c4 1828 void SetEnd(long end) { m_end = end; }
343ef639
JS
1829
1830 /**
1831 Gets the end position.
1832 */
5d7836c4
JS
1833 long GetEnd() const { return m_end; }
1834
343ef639
JS
1835 /**
1836 Returns true if this range is completely outside @a range.
1837 */
5d7836c4
JS
1838 bool IsOutside(const wxRichTextRange& range) const { return range.m_start > m_end || range.m_end < m_start; }
1839
343ef639
JS
1840 /**
1841 Returns true if this range is completely within @a range.
1842 */
5d7836c4
JS
1843 bool IsWithin(const wxRichTextRange& range) const { return m_start >= range.m_start && m_end <= range.m_end; }
1844
343ef639 1845 /**
706465df 1846 Returns true if @a pos was within the range. Does not match if the range is empty.
343ef639 1847 */
5d7836c4
JS
1848 bool Contains(long pos) const { return pos >= m_start && pos <= m_end ; }
1849
343ef639
JS
1850 /**
1851 Limit this range to be within @a range.
1852 */
5d7836c4
JS
1853 bool LimitTo(const wxRichTextRange& range) ;
1854
343ef639
JS
1855 /**
1856 Gets the length of the range.
1857 */
5d7836c4
JS
1858 long GetLength() const { return m_end - m_start + 1; }
1859
343ef639
JS
1860 /**
1861 Swaps the start and end.
1862 */
5d7836c4
JS
1863 void Swap() { long tmp = m_start; m_start = m_end; m_end = tmp; }
1864
343ef639 1865 /**
706465df
JS
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.
343ef639 1870 */
96c9f0f6
JS
1871 wxRichTextRange ToInternal() const { return wxRichTextRange(m_start, m_end-1); }
1872
343ef639 1873 /**
706465df
JS
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.
343ef639 1878 */
96c9f0f6
JS
1879 wxRichTextRange FromInternal() const { return wxRichTextRange(m_start, m_end+1); }
1880
5d7836c4
JS
1881protected:
1882 long m_start;
1883 long m_end;
1884};
1885
603f702b
JS
1886WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextRange, wxRichTextRangeArray, WXDLLIMPEXP_RICHTEXT);
1887
1e967276
JS
1888#define wxRICHTEXT_ALL wxRichTextRange(-2, -2)
1889#define wxRICHTEXT_NONE wxRichTextRange(-1, -1)
1890
603f702b
JS
1891#define wxRICHTEXT_NO_SELECTION wxRichTextRange(-2, -2)
1892
343ef639
JS
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
603f702b
JS
1909class WXDLLIMPEXP_RICHTEXT wxRichTextSelection
1910{
1911public:
343ef639
JS
1912 /**
1913 Copy constructor.
1914 */
603f702b 1915 wxRichTextSelection(const wxRichTextSelection& sel) { Copy(sel); }
343ef639
JS
1916
1917 /**
1918 Creates a selection from a range and a container.
1919 */
603f702b 1920 wxRichTextSelection(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container) { m_ranges.Add(range); m_container = container; }
343ef639
JS
1921
1922 /**
1923 Default constructor.
1924 */
603f702b
JS
1925 wxRichTextSelection() { Reset(); }
1926
343ef639
JS
1927 /**
1928 Resets the selection.
1929 */
603f702b
JS
1930 void Reset() { m_ranges.Clear(); m_container = NULL; }
1931
343ef639
JS
1932 /**
1933 Sets the selection.
1934 */
1935
603f702b
JS
1936 void Set(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container)
1937 { m_ranges.Clear(); m_ranges.Add(range); m_container = container; }
1938
343ef639 1939 /**
706465df 1940 Adds a range to the selection.
343ef639 1941 */
603f702b
JS
1942 void Add(const wxRichTextRange& range)
1943 { m_ranges.Add(range); }
1944
343ef639
JS
1945 /**
1946 Sets the selections from an array of ranges and a container object.
1947 */
603f702b
JS
1948 void Set(const wxRichTextRangeArray& ranges, wxRichTextParagraphLayoutBox* container)
1949 { m_ranges = ranges; m_container = container; }
1950
343ef639
JS
1951 /**
1952 Copies from @a sel.
1953 */
603f702b
JS
1954 void Copy(const wxRichTextSelection& sel)
1955 { m_ranges = sel.m_ranges; m_container = sel.m_container; }
1956
343ef639
JS
1957 /**
1958 Assignment operator.
1959 */
603f702b
JS
1960 void operator=(const wxRichTextSelection& sel) { Copy(sel); }
1961
343ef639
JS
1962 /**
1963 Equality operator.
1964 */
603f702b
JS
1965 bool operator==(const wxRichTextSelection& sel) const;
1966
343ef639
JS
1967 /**
1968 Index operator.
1969 */
603f702b
JS
1970 wxRichTextRange operator[](size_t i) const { return GetRange(i); }
1971
343ef639
JS
1972 /**
1973 Returns the selection ranges.
1974 */
603f702b 1975 wxRichTextRangeArray& GetRanges() { return m_ranges; }
343ef639
JS
1976
1977 /**
1978 Returns the selection ranges.
1979 */
603f702b
JS
1980 const wxRichTextRangeArray& GetRanges() const { return m_ranges; }
1981
343ef639
JS
1982 /**
1983 Sets the selection ranges.
1984 */
603f702b
JS
1985 void SetRanges(const wxRichTextRangeArray& ranges) { m_ranges = ranges; }
1986
343ef639
JS
1987 /**
1988 Returns the number of ranges in the selection.
1989 */
603f702b
JS
1990 size_t GetCount() const { return m_ranges.GetCount(); }
1991
343ef639
JS
1992 /**
1993 Returns the range at the given index.
1994
1995 */
603f702b
JS
1996 wxRichTextRange GetRange(size_t i) const { return m_ranges[i]; }
1997
343ef639
JS
1998 /**
1999 Returns the first range if there is one, otherwise wxRICHTEXT_NO_SELECTION.
2000 */
603f702b
JS
2001 wxRichTextRange GetRange() const { return (m_ranges.GetCount() > 0) ? (m_ranges[0]) : wxRICHTEXT_NO_SELECTION; }
2002
343ef639
JS
2003 /**
2004 Sets a single range.
2005 */
603f702b
JS
2006 void SetRange(const wxRichTextRange& range) { m_ranges.Clear(); m_ranges.Add(range); }
2007
343ef639
JS
2008 /**
2009 Returns the container for which the selection is valid.
2010 */
603f702b
JS
2011 wxRichTextParagraphLayoutBox* GetContainer() const { return m_container; }
2012
343ef639
JS
2013 /**
2014 Sets the container for which the selection is valid.
2015 */
603f702b
JS
2016 void SetContainer(wxRichTextParagraphLayoutBox* container) { m_container = container; }
2017
343ef639
JS
2018 /**
2019 Returns @true if the selection is valid.
2020 */
603f702b
JS
2021 bool IsValid() const { return m_ranges.GetCount() > 0 && GetContainer(); }
2022
343ef639
JS
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 */
603f702b
JS
2027 wxRichTextRangeArray GetSelectionForObject(wxRichTextObject* obj) const;
2028
343ef639
JS
2029 /**
2030 Returns @true if the given position is within the selection.
2031 */
603f702b
JS
2032 bool WithinSelection(long pos, wxRichTextObject* obj) const;
2033
343ef639
JS
2034 /**
2035 Returns @true if the given position is within the selection.
2036
2037 */
603f702b
JS
2038 bool WithinSelection(long pos) const { return WithinSelection(pos, m_ranges); }
2039
343ef639
JS
2040 /**
2041 Returns @true if the given position is within the selection range.
2042 */
603f702b
JS
2043 static bool WithinSelection(long pos, const wxRichTextRangeArray& ranges);
2044
343ef639
JS
2045 /**
2046 Returns @true if the given range is within the selection range.
2047 */
603f702b
JS
2048 static bool WithinSelection(const wxRichTextRange& range, const wxRichTextRangeArray& ranges);
2049
2050 wxRichTextRangeArray m_ranges;
2051 wxRichTextParagraphLayoutBox* m_container;
2052};
2053
706465df
JS
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*/
5d7836c4 2064
3b2cb431 2065class WXDLLIMPEXP_RICHTEXT wxRichTextObject: public wxObject
5d7836c4
JS
2066{
2067 DECLARE_CLASS(wxRichTextObject)
2068public:
706465df
JS
2069 /**
2070 Constructor, taking an optional parent pointer.
2071 */
5d7836c4 2072 wxRichTextObject(wxRichTextObject* parent = NULL);
706465df 2073
d3c7fc99 2074 virtual ~wxRichTextObject();
5d7836c4 2075
d13b34d3 2076// Overridables
5d7836c4 2077
706465df
JS
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 */
603f702b 2082 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0;
5d7836c4 2083
706465df
JS
2084 /**
2085 Lay the item out at the specified position with the given size constraint.
bb7bbd12
JS
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).
706465df 2089 */
bb7bbd12 2090 virtual bool Layout(wxDC& dc, const wxRect& rect, const wxRect& parentRect, int style) = 0;
5d7836c4 2091
706465df
JS
2092 /**
2093 Hit-testing: returns a flag indicating hit test details, plus
7afd2b58 2094 information about position. @a contextObj is returned to specify what object
706465df 2095 position is relevant to, since otherwise there's an ambiguity.
7afd2b58 2096 @ obj might not be a child of @a contextObj, since we may be referring to the container itself
706465df 2097 if we have no hit on a child - for example if we click outside an object.
7afd2b58
JS
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
71185527
JS
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
7afd2b58 2106 @return One of the ::wxRichTextHitTestFlags values.
706465df 2107 */
7afd2b58 2108
603f702b 2109 virtual int HitTest(wxDC& dc, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
5d7836c4 2110
706465df
JS
2111 /**
2112 Finds the absolute position and row height for the given character position.
2113 */
5d7836c4
JS
2114 virtual bool FindPosition(wxDC& WXUNUSED(dc), long WXUNUSED(index), wxPoint& WXUNUSED(pt), int* WXUNUSED(height), bool WXUNUSED(forceLineStart)) { return false; }
2115
706465df
JS
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 */
5d7836c4
JS
2121 virtual wxSize GetBestSize() const { return m_size; }
2122
603f702b 2123 /**
706465df 2124 Returns the object size for the given range. Returns @false if the range
603f702b
JS
2125 is invalid for this object.
2126 */
2127
31778480 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;
5d7836c4 2129
706465df
JS
2130 /**
2131 Do a split from @a pos, returning an object containing the second part, and setting
2132 the first part in 'this'.
2133 */
5d7836c4
JS
2134 virtual wxRichTextObject* DoSplit(long WXUNUSED(pos)) { return NULL; }
2135
706465df
JS
2136 /**
2137 Calculates the range of the object. By default, guess that the object is 1 unit long.
2138 */
5d7836c4
JS
2139 virtual void CalculateRange(long start, long& end) { end = start ; m_range.SetRange(start, end); }
2140
706465df
JS
2141 /**
2142 Deletes the given range.
2143 */
5d7836c4
JS
2144 virtual bool DeleteRange(const wxRichTextRange& WXUNUSED(range)) { return false; }
2145
706465df
JS
2146 /**
2147 Returns @true if the object is empty.
2148 */
5d7836c4
JS
2149 virtual bool IsEmpty() const { return false; }
2150
706465df
JS
2151 /**
2152 Returns @true if this class of object is floatable.
2153 */
cdaed652
VZ
2154 virtual bool IsFloatable() const { return false; }
2155
706465df
JS
2156 /**
2157 Returns @true if this object is currently floating.
2158 */
bec80f4f 2159 virtual bool IsFloating() const { return GetAttributes().GetTextBoxAttr().IsFloating(); }
cdaed652 2160
706465df
JS
2161 /**
2162 Returns the floating direction.
2163 */
bec80f4f 2164 virtual int GetFloatDirection() const { return GetAttributes().GetTextBoxAttr().GetFloatMode(); }
cdaed652 2165
706465df
JS
2166 /**
2167 Returns any text in this object for the given range.
2168 */
5d7836c4
JS
2169 virtual wxString GetTextForRange(const wxRichTextRange& WXUNUSED(range)) const { return wxEmptyString; }
2170
706465df
JS
2171 /**
2172 Returns @true if this object can merge itself with the given one.
2173 */
5d7836c4
JS
2174 virtual bool CanMerge(wxRichTextObject* WXUNUSED(object)) const { return false; }
2175
706465df
JS
2176 /**
2177 Returns @true if this object merged itself with the given one.
2178 The calling code will then delete the given object.
2179 */
5d7836c4
JS
2180 virtual bool Merge(wxRichTextObject* WXUNUSED(object)) { return false; }
2181
706465df
JS
2182 /**
2183 Dump object data to the given output stream for debugging.
2184 */
5d7836c4 2185 virtual void Dump(wxTextOutputStream& stream);
ce00f59b 2186
706465df
JS
2187 /**
2188 Returns @true if we can edit the object's properties via a GUI.
2189 */
cdaed652
VZ
2190 virtual bool CanEditProperties() const { return false; }
2191
706465df
JS
2192 /**
2193 Edits the object's properties via a GUI.
2194 */
cdaed652 2195 virtual bool EditProperties(wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; }
5d7836c4 2196
706465df
JS
2197 /**
2198 Returns the label to be used for the properties context menu item.
2199 */
603f702b
JS
2200 virtual wxString GetPropertiesMenuLabel() const { return wxEmptyString; }
2201
706465df
JS
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 */
603f702b
JS
2207 virtual bool AcceptsFocus() const { return false; }
2208
bec80f4f 2209#if wxUSE_XML
706465df
JS
2210 /**
2211 Imports this object from XML.
2212 */
603f702b 2213 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
bec80f4f
JS
2214#endif
2215
2216#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
706465df
JS
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 */
bec80f4f
JS
2223 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
2224#endif
2225
2226#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
706465df
JS
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 */
bec80f4f
JS
2233 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
2234#endif
2235
706465df
JS
2236 /**
2237 Returns @true if this object takes note of paragraph attributes (text and image objects don't).
2238 */
bec80f4f 2239 virtual bool UsesParagraphAttributes() const { return true; }
603f702b 2240
706465df
JS
2241 /**
2242 Returns the XML node name of this object. This must be overridden for wxXmlNode-base XML export to work.
2243 */
bec80f4f
JS
2244 virtual wxString GetXMLNodeName() const { return wxT("unknown"); }
2245
706465df
JS
2246 /**
2247 Invalidates the object at the given range. With no argument, invalidates the whole object.
2248 */
603f702b
JS
2249 virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
2250
706465df
JS
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 */
603f702b
JS
2255 virtual bool HandlesChildSelections() const { return false; }
2256
706465df
JS
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 */
603f702b
JS
2261 virtual wxRichTextSelection GetSelection(long WXUNUSED(start), long WXUNUSED(end)) const { return wxRichTextSelection(); }
2262
5d7836c4
JS
2263// Accessors
2264
706465df
JS
2265 /**
2266 Gets the cached object size as calculated by Layout.
2267 */
5d7836c4 2268 virtual wxSize GetCachedSize() const { return m_size; }
706465df
JS
2269
2270 /**
2271 Sets the cached object size as calculated by Layout.
2272 */
5d7836c4
JS
2273 virtual void SetCachedSize(const wxSize& sz) { m_size = sz; }
2274
706465df
JS
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 */
603f702b 2279 virtual wxSize GetMaxSize() const { return m_maxSize; }
706465df
JS
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 */
603f702b
JS
2285 virtual void SetMaxSize(const wxSize& sz) { m_maxSize = sz; }
2286
706465df
JS
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 */
603f702b 2291 virtual wxSize GetMinSize() const { return m_minSize; }
706465df
JS
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 */
603f702b
JS
2297 virtual void SetMinSize(const wxSize& sz) { m_minSize = sz; }
2298
706465df
JS
2299 /**
2300 Gets the 'natural' size for an object. For an image, it would be the
2301 image size.
2302 */
603f702b
JS
2303 virtual wxTextAttrSize GetNaturalSize() const { return wxTextAttrSize(); }
2304
706465df
JS
2305 /**
2306 Returns the object position in pixels.
2307 */
5d7836c4 2308 virtual wxPoint GetPosition() const { return m_pos; }
706465df
JS
2309
2310 /**
2311 Sets the object position in pixels.
2312 */
5d7836c4
JS
2313 virtual void SetPosition(const wxPoint& pos) { m_pos = pos; }
2314
706465df
JS
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 */
603f702b
JS
2320 virtual wxPoint GetAbsolutePosition() const;
2321
706465df
JS
2322 /**
2323 Returns the rectangle enclosing the object.
2324 */
5d7836c4
JS
2325 virtual wxRect GetRect() const { return wxRect(GetPosition(), GetCachedSize()); }
2326
706465df
JS
2327 /**
2328 Sets the object's range within its container.
2329 */
5d7836c4
JS
2330 void SetRange(const wxRichTextRange& range) { m_range = range; }
2331
706465df
JS
2332 /**
2333 Returns the object's range.
2334 */
5d7836c4 2335 const wxRichTextRange& GetRange() const { return m_range; }
706465df
JS
2336
2337 /**
2338 Returns the object's range.
2339 */
5d7836c4
JS
2340 wxRichTextRange& GetRange() { return m_range; }
2341
706465df
JS
2342 /**
2343 Set the object's own range, for a top-level object with its own position space.
2344 */
603f702b
JS
2345 void SetOwnRange(const wxRichTextRange& range) { m_ownRange = range; }
2346
706465df
JS
2347 /**
2348 Returns the object's own range (valid if top-level).
2349 */
603f702b 2350 const wxRichTextRange& GetOwnRange() const { return m_ownRange; }
706465df
JS
2351
2352 /**
2353 Returns the object's own range (valid if top-level).
2354 */
603f702b
JS
2355 wxRichTextRange& GetOwnRange() { return m_ownRange; }
2356
706465df
JS
2357 /**
2358 Returns the object's own range only if a top-level object.
2359 */
603f702b 2360 wxRichTextRange GetOwnRangeIfTopLevel() const { return IsTopLevel() ? m_ownRange : m_range; }
5d7836c4 2361
706465df
JS
2362 /**
2363 Returns @true if this object this composite.
2364 */
5d7836c4
JS
2365 virtual bool IsComposite() const { return false; }
2366
706465df
JS
2367 /**
2368 Returns a pointer to the parent object.
2369 */
5d7836c4 2370 virtual wxRichTextObject* GetParent() const { return m_parent; }
706465df
JS
2371
2372 /**
2373 Sets the pointer to the parent object.
2374 */
5d7836c4
JS
2375 virtual void SetParent(wxRichTextObject* parent) { m_parent = parent; }
2376
706465df
JS
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 */
603f702b
JS
2382 virtual wxRichTextParagraphLayoutBox* GetContainer() const;
2383
706465df
JS
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 */
603f702b
JS
2388 virtual wxRichTextParagraphLayoutBox* GetParentContainer() const { return GetParent() ? GetParent()->GetContainer() : GetContainer(); }
2389
706465df
JS
2390 /**
2391 Set the margin around the object, in pixels.
2392 */
5d7836c4 2393 virtual void SetMargins(int margin);
706465df
JS
2394
2395 /**
2396 Set the margin around the object, in pixels.
2397 */
5d7836c4 2398 virtual void SetMargins(int leftMargin, int rightMargin, int topMargin, int bottomMargin);
706465df
JS
2399
2400 /**
2401 Returns the left margin of the object, in pixels.
2402 */
603f702b 2403 virtual int GetLeftMargin() const;
706465df
JS
2404
2405 /**
2406 Returns the right margin of the object, in pixels.
2407 */
603f702b 2408 virtual int GetRightMargin() const;
706465df
JS
2409
2410 /**
2411 Returns the top margin of the object, in pixels.
2412 */
603f702b 2413 virtual int GetTopMargin() const;
706465df
JS
2414
2415 /**
2416 Returns the bottom margin of the object, in pixels.
2417 */
603f702b
JS
2418 virtual int GetBottomMargin() const;
2419
706465df
JS
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 */
603f702b
JS
2424 virtual wxRect GetAvailableContentArea(wxDC& dc, const wxRect& outerRect) const;
2425
706465df
JS
2426 /**
2427 Lays out the object first with a given amount of space, and then if no width was specified in attr,
bb7bbd12
JS
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.)
706465df 2433 */
603f702b 2434 virtual bool LayoutToBestSize(wxDC& dc, wxRichTextBuffer* buffer,
bb7bbd12
JS
2435 const wxRichTextAttr& parentAttr, const wxRichTextAttr& attr,
2436 const wxRect& availableParentSpace, const wxRect& availableContainerSpace, int style);
5d7836c4 2437
706465df
JS
2438 /**
2439 Sets the object's attributes.
2440 */
24777478 2441 void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; }
706465df
JS
2442
2443 /**
2444 Returns the object's attributes.
2445 */
24777478 2446 const wxRichTextAttr& GetAttributes() const { return m_attributes; }
706465df
JS
2447
2448 /**
2449 Returns the object's attributes.
2450 */
24777478 2451 wxRichTextAttr& GetAttributes() { return m_attributes; }
603f702b 2452
706465df
JS
2453 /**
2454 Sets the object's properties.
2455 */
bec80f4f 2456 wxRichTextProperties& GetProperties() { return m_properties; }
706465df
JS
2457
2458 /**
2459 Returns the object's properties.
2460 */
bec80f4f 2461 const wxRichTextProperties& GetProperties() const { return m_properties; }
706465df
JS
2462
2463 /**
2464 Returns the object's properties.
2465 */
bec80f4f 2466 void SetProperties(const wxRichTextProperties& props) { m_properties = props; }
5d7836c4 2467
706465df
JS
2468 /**
2469 Sets the stored descent value.
2470 */
5d7836c4 2471 void SetDescent(int descent) { m_descent = descent; }
706465df
JS
2472
2473 /**
2474 Returns the stored descent value.
2475 */
5d7836c4
JS
2476 int GetDescent() const { return m_descent; }
2477
706465df
JS
2478 /**
2479 Returns the containing buffer.
2480 */
44219ff0
JS
2481 wxRichTextBuffer* GetBuffer() const;
2482
706465df
JS
2483 /**
2484 Sets the identifying name for this object as a property using the "name" key.
2485 */
603f702b
JS
2486 void SetName(const wxString& name) { m_properties.SetProperty(wxT("name"), name); }
2487
706465df
JS
2488 /**
2489 Returns the identifying name for this object from the properties, using the "name" key.
2490 */
603f702b
JS
2491 wxString GetName() const { return m_properties.GetPropertyString(wxT("name")); }
2492
706465df
JS
2493 /**
2494 Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box.
2495 */
603f702b
JS
2496 virtual bool IsTopLevel() const { return false; }
2497
706465df
JS
2498 /**
2499 Returns @true if the object will be shown, @false otherwise.
2500 */
603f702b
JS
2501 bool IsShown() const { return m_show; }
2502
5d7836c4
JS
2503// Operations
2504
706465df
JS
2505 /**
2506 Call to show or hide this object. This function does not cause the content to be
2507 laid out or redrawn.
2508 */
603f702b
JS
2509 virtual void Show(bool show) { m_show = show; }
2510
706465df
JS
2511 /**
2512 Clones the object.
2513 */
5d7836c4
JS
2514 virtual wxRichTextObject* Clone() const { return NULL; }
2515
706465df
JS
2516 /**
2517 Copies the object.
2518 */
5d7836c4
JS
2519 void Copy(const wxRichTextObject& obj);
2520
706465df
JS
2521 /**
2522 Reference-counting allows us to use the same object in multiple
2523 lists (not yet used).
2524 */
2525
5d7836c4 2526 void Reference() { m_refCount ++; }
706465df
JS
2527
2528 /**
2529 Reference-counting allows us to use the same object in multiple
2530 lists (not yet used).
2531 */
5d7836c4
JS
2532 void Dereference();
2533
706465df
JS
2534 /**
2535 Moves the object recursively, by adding the offset from old to new.
2536 */
603f702b
JS
2537 virtual void Move(const wxPoint& pt);
2538
706465df
JS
2539 /**
2540 Converts units in tenths of a millimetre to device units.
2541 */
cdaed652 2542 int ConvertTenthsMMToPixels(wxDC& dc, int units) const;
706465df
JS
2543
2544 /**
2545 Converts units in tenths of a millimetre to device units.
2546 */
bec80f4f 2547 static int ConvertTenthsMMToPixels(int ppi, int units, double scale = 1.0);
5d7836c4 2548
706465df
JS
2549 /**
2550 Convert units in pixels to tenths of a millimetre.
2551 */
24777478 2552 int ConvertPixelsToTenthsMM(wxDC& dc, int pixels) const;
706465df
JS
2553
2554 /**
2555 Convert units in pixels to tenths of a millimetre.
2556 */
bec80f4f 2557 static int ConvertPixelsToTenthsMM(int ppi, int pixels, double scale = 1.0);
603f702b 2558
706465df
JS
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 */
603f702b 2563 static bool DrawBoxAttributes(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, const wxRect& boxRect, int flags = 0);
bec80f4f 2564
706465df
JS
2565 /**
2566 Draws a border.
2567 */
603f702b 2568 static bool DrawBorder(wxDC& dc, wxRichTextBuffer* buffer, const wxTextAttrBorders& attr, const wxRect& rect, int flags = 0);
bec80f4f 2569
706465df
JS
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 */
603f702b
JS
2576 static bool GetBoxRects(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, wxRect& marginRect, wxRect& borderRect, wxRect& contentRect, wxRect& paddingRect, wxRect& outlineRect);
2577
706465df
JS
2578 /**
2579 Returns the total margin for the object in pixels, taking into account margin, padding and border size.
2580 */
603f702b
JS
2581 static bool GetTotalMargin(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, int& leftMargin, int& rightMargin,
2582 int& topMargin, int& bottomMargin);
2583
706465df
JS
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.
bb7bbd12
JS
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.
706465df 2589 */
bb7bbd12
JS
2590 static wxRect AdjustAvailableSpace(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& parentAttr, const wxRichTextAttr& childAttr,
2591 const wxRect& availableParentSpace, const wxRect& availableContainerSpace);
24777478 2592
5d7836c4
JS
2593protected:
2594 wxSize m_size;
603f702b
JS
2595 wxSize m_maxSize;
2596 wxSize m_minSize;
5d7836c4
JS
2597 wxPoint m_pos;
2598 int m_descent; // Descent for this object (if any)
5d7836c4 2599 int m_refCount;
603f702b 2600 bool m_show;
5d7836c4
JS
2601 wxRichTextObject* m_parent;
2602
706465df 2603 // The range of this object (start position to end position)
5d7836c4
JS
2604 wxRichTextRange m_range;
2605
706465df 2606 // The internal range of this object, if it's a top-level object with its own range space
603f702b 2607 wxRichTextRange m_ownRange;
5d7836c4 2608
706465df 2609 // Attributes
24777478 2610 wxRichTextAttr m_attributes;
603f702b 2611
706465df 2612 // Properties
bec80f4f 2613 wxRichTextProperties m_properties;
5d7836c4
JS
2614};
2615
3b2cb431 2616WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_RICHTEXT );
5d7836c4 2617
706465df
JS
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*/
5d7836c4 2628
3b2cb431 2629class WXDLLIMPEXP_RICHTEXT wxRichTextCompositeObject: public wxRichTextObject
5d7836c4
JS
2630{
2631 DECLARE_CLASS(wxRichTextCompositeObject)
2632public:
2633// Constructors
2634
2635 wxRichTextCompositeObject(wxRichTextObject* parent = NULL);
d3c7fc99 2636 virtual ~wxRichTextCompositeObject();
5d7836c4 2637
d13b34d3 2638// Overridables
5d7836c4 2639
603f702b 2640 virtual int HitTest(wxDC& dc, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
5d7836c4 2641
5d7836c4
JS
2642 virtual bool FindPosition(wxDC& dc, long index, wxPoint& pt, int* height, bool forceLineStart);
2643
5d7836c4
JS
2644 virtual void CalculateRange(long start, long& end);
2645
5d7836c4
JS
2646 virtual bool DeleteRange(const wxRichTextRange& range);
2647
5d7836c4
JS
2648 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
2649
603f702b
JS
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
5d7836c4
JS
2652 virtual void Dump(wxTextOutputStream& stream);
2653
603f702b
JS
2654 virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
2655
5d7836c4
JS
2656// Accessors
2657
b3169c12
JS
2658 /**
2659 Returns the children.
2660 */
5d7836c4 2661 wxRichTextObjectList& GetChildren() { return m_children; }
b3169c12
JS
2662 /**
2663 Returns the children.
2664 */
5d7836c4
JS
2665 const wxRichTextObjectList& GetChildren() const { return m_children; }
2666
b3169c12
JS
2667 /**
2668 Returns the number of children.
2669 */
5d7836c4
JS
2670 size_t GetChildCount() const ;
2671
b3169c12
JS
2672 /**
2673 Returns the nth child.
2674 */
5d7836c4
JS
2675 wxRichTextObject* GetChild(size_t n) const ;
2676
b3169c12
JS
2677 /**
2678 Returns @true if this object is composite.
2679 */
5d7836c4
JS
2680 virtual bool IsComposite() const { return true; }
2681
b3169c12
JS
2682 /**
2683 Returns true if the buffer is empty.
2684 */
5d7836c4
JS
2685 virtual bool IsEmpty() const { return GetChildCount() == 0; }
2686
b3169c12
JS
2687 /**
2688 Returns the child object at the given character position.
2689 */
603f702b
JS
2690 virtual wxRichTextObject* GetChildAtPosition(long pos) const;
2691
5d7836c4
JS
2692// Operations
2693
5d7836c4
JS
2694 void Copy(const wxRichTextCompositeObject& obj);
2695
0ca07313
JS
2696 void operator= (const wxRichTextCompositeObject& obj) { Copy(obj); }
2697
b3169c12
JS
2698 /**
2699 Appends a child, returning the position.
2700 */
5d7836c4
JS
2701 size_t AppendChild(wxRichTextObject* child) ;
2702
b3169c12
JS
2703 /**
2704 Inserts the child in front of the given object, or at the beginning.
2705 */
5d7836c4
JS
2706 bool InsertChild(wxRichTextObject* child, wxRichTextObject* inFrontOf) ;
2707
b3169c12
JS
2708 /**
2709 Removes and optionally deletes the specified child.
2710 */
5d7836c4
JS
2711 bool RemoveChild(wxRichTextObject* child, bool deleteChild = false) ;
2712
b3169c12
JS
2713 /**
2714 Deletes all the children.
2715 */
5d7836c4
JS
2716 bool DeleteChildren() ;
2717
b3169c12
JS
2718 /**
2719 Recursively merges all pieces that can be merged.
2720 */
109bfc88 2721 bool Defragment(const wxRichTextRange& range = wxRICHTEXT_ALL);
5d7836c4 2722
b3169c12
JS
2723 /**
2724 Moves the object recursively, by adding the offset from old to new.
2725 */
603f702b
JS
2726 virtual void Move(const wxPoint& pt);
2727
5d7836c4
JS
2728protected:
2729 wxRichTextObjectList m_children;
2730};
2731
706465df
JS
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*/
5d7836c4 2742
bec80f4f 2743class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphLayoutBox: public wxRichTextCompositeObject
5d7836c4
JS
2744{
2745 DECLARE_DYNAMIC_CLASS(wxRichTextParagraphLayoutBox)
2746public:
2747// Constructors
2748
2749 wxRichTextParagraphLayoutBox(wxRichTextObject* parent = NULL);
bec80f4f 2750 wxRichTextParagraphLayoutBox(const wxRichTextParagraphLayoutBox& obj): wxRichTextCompositeObject() { Init(); Copy(obj); }
cdaed652 2751 ~wxRichTextParagraphLayoutBox();
5d7836c4 2752
d13b34d3 2753// Overridables
5d7836c4 2754
603f702b 2755 virtual int HitTest(wxDC& dc, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
cdaed652 2756
603f702b 2757 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
5d7836c4 2758
bb7bbd12 2759 virtual bool Layout(wxDC& dc, const wxRect& rect, const wxRect& parentRect, int style);
5d7836c4 2760
31778480 2761 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
5d7836c4 2762
5d7836c4
JS
2763 virtual bool DeleteRange(const wxRichTextRange& range);
2764
5d7836c4
JS
2765 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
2766
bec80f4f 2767#if wxUSE_XML
603f702b 2768 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
bec80f4f
JS
2769#endif
2770
2771#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
bec80f4f
JS
2772 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
2773#endif
2774
2775#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
bec80f4f
JS
2776 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
2777#endif
2778
bec80f4f
JS
2779 virtual wxString GetXMLNodeName() const { return wxT("paragraphlayout"); }
2780
603f702b
JS
2781 virtual bool AcceptsFocus() const { return true; }
2782
5d7836c4
JS
2783// Accessors
2784
b3169c12
JS
2785 /**
2786 Associates a control with the buffer, for operations that for example require refreshing the window.
2787 */
5d7836c4
JS
2788 void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_ctrl = ctrl; }
2789
b3169c12
JS
2790 /**
2791 Returns the associated control.
2792 */
5d7836c4
JS
2793 wxRichTextCtrl* GetRichTextCtrl() const { return m_ctrl; }
2794
b3169c12
JS
2795 /**
2796 Sets a flag indicating whether the last paragraph is partial or complete.
2797 */
0ca07313 2798 void SetPartialParagraph(bool partialPara) { m_partialParagraph = partialPara; }
b3169c12
JS
2799
2800 /**
2801 Returns a flag indicating whether the last paragraph is partial or complete.
2802 */
0ca07313
JS
2803 bool GetPartialParagraph() const { return m_partialParagraph; }
2804
b3169c12
JS
2805 /**
2806 Returns the style sheet associated with the overall buffer.
2807 */
603f702b
JS
2808 virtual wxRichTextStyleSheet* GetStyleSheet() const;
2809
603f702b 2810 virtual bool IsTopLevel() const { return true; }
38f833b1 2811
5d7836c4 2812// Operations
603f702b 2813
b3169c12
JS
2814 /**
2815 Submits a command to insert paragraphs.
2816 */
4e63bfb9 2817 bool InsertParagraphsWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0);
603f702b 2818
b3169c12
JS
2819 /**
2820 Submits a command to insert the given text.
2821 */
4e63bfb9 2822 bool InsertTextWithUndo(wxRichTextBuffer* buffer, long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0);
603f702b 2823
b3169c12
JS
2824 /**
2825 Submits a command to insert the given text.
2826 */
4e63bfb9 2827 bool InsertNewlineWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextCtrl* ctrl, int flags = 0);
603f702b 2828
b3169c12
JS
2829 /**
2830 Submits a command to insert the given image.
2831 */
4e63bfb9
JS
2832 bool InsertImageWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextImageBlock& imageBlock,
2833 wxRichTextCtrl* ctrl, int flags, const wxRichTextAttr& textAttr);
603f702b 2834
b3169c12
JS
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 */
603f702b
JS
2840 wxRichTextAttr GetStyleForNewParagraph(wxRichTextBuffer* buffer, long pos, bool caretPosition = false, bool lookUpNewParaStyle=false) const;
2841
b3169c12
JS
2842 /**
2843 Inserts an object.
2844 */
4e63bfb9 2845 wxRichTextObject* InsertObjectWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags = 0);
603f702b 2846
b3169c12
JS
2847 /**
2848 Submits a command to delete this range.
2849 */
603f702b
JS
2850 bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl, wxRichTextBuffer* buffer);
2851
b3169c12
JS
2852 /**
2853 Draws the floating objects in this buffer.
2854 */
603f702b 2855 void DrawFloats(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
cdaed652 2856
b3169c12
JS
2857 /**
2858 Moves an anchored object to another paragraph.
2859 */
bec80f4f 2860 void MoveAnchoredObjectToParagraph(wxRichTextParagraph* from, wxRichTextParagraph* to, wxRichTextObject* obj);
5d7836c4 2861
b3169c12
JS
2862 /**
2863 Initializes the object.
2864 */
5d7836c4
JS
2865 void Init();
2866
b3169c12
JS
2867 /**
2868 Clears all the children.
2869 */
5d7836c4
JS
2870 virtual void Clear();
2871
b3169c12
JS
2872 /**
2873 Clears and initializes with one blank paragraph.
2874 */
5d7836c4
JS
2875 virtual void Reset();
2876
b3169c12
JS
2877 /**
2878 Convenience function to add a paragraph of text.
2879 */
24777478 2880 virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL);
5d7836c4 2881
b3169c12
JS
2882 /**
2883 Convenience function to add an image.
2884 */
24777478 2885 virtual wxRichTextRange AddImage(const wxImage& image, wxRichTextAttr* paraStyle = NULL);
5d7836c4 2886
b3169c12
JS
2887 /**
2888 Adds multiple paragraphs, based on newlines.
2889 */
24777478 2890 virtual wxRichTextRange AddParagraphs(const wxString& text, wxRichTextAttr* paraStyle = NULL);
5d7836c4 2891
b3169c12
JS
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 */
5d7836c4
JS
2896 virtual wxRichTextLine* GetLineAtPosition(long pos, bool caretPosition = false) const;
2897
b3169c12
JS
2898 /**
2899 Returns the line at the given y pixel position, or the last line.
2900 */
5d7836c4
JS
2901 virtual wxRichTextLine* GetLineAtYPosition(int y) const;
2902
b3169c12
JS
2903 /**
2904 Returns the paragraph at the given character or caret position.
2905 */
5d7836c4
JS
2906 virtual wxRichTextParagraph* GetParagraphAtPosition(long pos, bool caretPosition = false) const;
2907
b3169c12
JS
2908 /**
2909 Returns the line size at the given position.
2910 */
5d7836c4
JS
2911 virtual wxSize GetLineSizeAtPosition(long pos, bool caretPosition = false) const;
2912
b3169c12
JS
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 */
5d7836c4
JS
2920 virtual long GetVisibleLineNumber(long pos, bool caretPosition = false, bool startOfLine = false) const;
2921
b3169c12
JS
2922 /**
2923 Given a line number, returns the corresponding wxRichTextLine object.
2924 */
5d7836c4
JS
2925 virtual wxRichTextLine* GetLineForVisibleLineNumber(long lineNumber) const;
2926
b3169c12
JS
2927 /**
2928 Returns the leaf object in a paragraph at this position.
2929 */
5d7836c4
JS
2930 virtual wxRichTextObject* GetLeafObjectAtPosition(long position) const;
2931
b3169c12
JS
2932 /**
2933 Returns the paragraph by number.
2934 */
7fe8059f 2935 virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const;
5d7836c4 2936
b3169c12
JS
2937 /**
2938 Returns the paragraph for a given line.
2939 */
7fe8059f 2940 virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const;
5d7836c4 2941
b3169c12
JS
2942 /**
2943 Returns the length of the paragraph.
2944 */
5d7836c4
JS
2945 virtual int GetParagraphLength(long paragraphNumber) const;
2946
b3169c12
JS
2947 /**
2948 Returns the number of paragraphs.
2949 */
42632bce 2950 virtual int GetParagraphCount() const { return static_cast<int>(GetChildCount()); }
5d7836c4 2951
b3169c12
JS
2952 /**
2953 Returns the number of visible lines.
2954 */
5d7836c4
JS
2955 virtual int GetLineCount() const;
2956
b3169c12
JS
2957 /**
2958 Returns the text of the paragraph.
2959 */
5d7836c4
JS
2960 virtual wxString GetParagraphText(long paragraphNumber) const;
2961
b3169c12
JS
2962 /**
2963 Converts zero-based line column and paragraph number to a position.
2964 */
5d7836c4
JS
2965 virtual long XYToPosition(long x, long y) const;
2966
b3169c12
JS
2967 /**
2968 Converts a zero-based position to line column and paragraph number.
2969 */
5d7836c4
JS
2970 virtual bool PositionToXY(long pos, long* x, long* y) const;
2971
b3169c12 2972 /**
7afd2b58
JS
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.
b3169c12 2999 */
24777478 3000 virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
5d7836c4 3001
b3169c12
JS
3002 /**
3003 Sets the attributes for the given object only, for example the box attributes for a text box.
3004 */
603f702b 3005 virtual void SetStyle(wxRichTextObject *obj, const wxRichTextAttr& textAttr, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
cdaed652 3006
b3169c12
JS
3007 /**
3008 Returns the combined text attributes for this position.
7afd2b58
JS
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.
b3169c12 3016 */
24777478 3017 virtual bool GetStyle(long position, wxRichTextAttr& style);
5d7836c4 3018
b3169c12
JS
3019 /**
3020 Returns the content (uncombined) attributes for this position.
3021 */
24777478 3022 virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style);
fe5aa22c 3023
b3169c12
JS
3024 /**
3025 Implementation helper for GetStyle. If combineStyles is true, combine base, paragraph and
3026 context attributes.
3027 */
24777478 3028 virtual bool DoGetStyle(long position, wxRichTextAttr& style, bool combineStyles = true);
fe5aa22c 3029
b3169c12 3030 /**
7afd2b58
JS
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.
b3169c12 3052 */
24777478 3053 virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style);
59509217 3054
b3169c12
JS
3055 /**
3056 Combines @a style with @a currentStyle for the purpose of summarising the attributes of a range of
3057 content.
3058 */
24777478 3059 bool CollectStyle(wxRichTextAttr& currentStyle, const wxRichTextAttr& style, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr);
59509217 3060
7afd2b58 3061 //@{
b3169c12 3062 /**
7afd2b58
JS
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.
b3169c12 3067
7afd2b58
JS
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().
b3169c12 3076 */
7afd2b58 3077 virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
38f833b1 3078 virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
7afd2b58 3079 //@}
38f833b1 3080
b3169c12 3081 /**
7afd2b58
JS
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()
b3169c12 3089 */
38f833b1
JS
3090 virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
3091
7afd2b58 3092 //@{
b3169c12 3093 /**
7afd2b58
JS
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
b3169c12 3107 @a def can be NULL to indicate that the existing list style should be used.
b3169c12 3108
7afd2b58 3109 @see SetListStyle(), PromoteList(), ClearListStyle()
b3169c12 3110 */
7afd2b58 3111 virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
38f833b1 3112 virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
7afd2b58 3113 //@}
38f833b1 3114
7afd2b58 3115 //@{
b3169c12 3116 /**
7afd2b58
JS
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.
b3169c12 3122
7afd2b58
JS
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()
b3169c12 3131 */
7afd2b58 3132 virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
38f833b1 3133 virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
7afd2b58 3134 //@}
38f833b1 3135
b3169c12
JS
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 */
38f833b1
JS
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
b3169c12
JS
3142 /**
3143 Fills in the attributes for numbering a paragraph after previousParagraph.
3144 */
24777478 3145 virtual bool FindNextParagraphNumber(wxRichTextParagraph* previousParagraph, wxRichTextAttr& attr) const;
d2d0adc7 3146
590a0f8b
JS
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
b3169c12
JS
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 */
24777478 3175 virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const;
5d7836c4 3176
b3169c12
JS
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 */
24777478 3183 virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const;
5d7836c4 3184
5d7836c4
JS
3185 virtual wxRichTextObject* Clone() const { return new wxRichTextParagraphLayoutBox(*this); }
3186
b3169c12
JS
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 */
0ca07313 3192 virtual bool InsertFragment(long position, wxRichTextParagraphLayoutBox& fragment);
5d7836c4 3193
b3169c12
JS
3194 /**
3195 Make a copy of the fragment corresponding to the given range, putting it in @a fragment.
3196 */
0ca07313 3197 virtual bool CopyFragment(const wxRichTextRange& range, wxRichTextParagraphLayoutBox& fragment);
5d7836c4 3198
b3169c12
JS
3199 /**
3200 Apply the style sheet to the buffer, for example if the styles have changed.
3201 */
fe5aa22c
JS
3202 virtual bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet);
3203
5d7836c4
JS
3204 void Copy(const wxRichTextParagraphLayoutBox& obj);
3205
0ca07313
JS
3206 void operator= (const wxRichTextParagraphLayoutBox& obj) { Copy(obj); }
3207
b3169c12
JS
3208 /**
3209 Calculate ranges.
3210 */
603f702b 3211 virtual void UpdateRanges();
5d7836c4 3212
b3169c12
JS
3213 /**
3214 Get all the text.
3215 */
5d7836c4
JS
3216 virtual wxString GetText() const;
3217
b3169c12 3218 /**
7afd2b58
JS
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.
b3169c12 3227 */
24777478 3228 virtual bool SetDefaultStyle(const wxRichTextAttr& style);
5d7836c4 3229
b3169c12 3230 /**
7afd2b58
JS
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).
b3169c12 3234 */
24777478 3235 virtual const wxRichTextAttr& GetDefaultStyle() const { return m_defaultAttributes; }
5d7836c4 3236
b3169c12 3237 /**
7afd2b58
JS
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).
b3169c12 3242 */
24777478 3243 virtual void SetBasicStyle(const wxRichTextAttr& style) { m_attributes = style; }
5d7836c4 3244
b3169c12
JS
3245 /**
3246 Returns the basic (overall) style.
7afd2b58
JS
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).
b3169c12 3252 */
24777478 3253 virtual const wxRichTextAttr& GetBasicStyle() const { return m_attributes; }
5d7836c4 3254
b3169c12
JS
3255 /**
3256 Invalidates the buffer. With no argument, invalidates whole buffer.
3257 */
603f702b
JS
3258 virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
3259
b3169c12
JS
3260 /**
3261 Do the (in)validation for this object only.
3262 */
603f702b
JS
3263 virtual void DoInvalidate(const wxRichTextRange& invalidRange);
3264
b3169c12
JS
3265 /**
3266 Do the (in)validation both up and down the hierarchy.
3267 */
603f702b 3268 virtual void InvalidateHierarchy(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
ce00f59b 3269
b3169c12
JS
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 */
603f702b 3275 virtual bool UpdateFloatingObjects(const wxRect& availableRect, wxRichTextObject* untilObj = NULL);
38113684 3276
b3169c12
JS
3277 /**
3278 Get invalid range, rounding to entire paragraphs if argument is true.
3279 */
38113684
JS
3280 wxRichTextRange GetInvalidRange(bool wholeParagraphs = false) const;
3281
b3169c12
JS
3282 /**
3283 Returns @true if this object needs layout.
3284 */
603f702b
JS
3285 bool IsDirty() const { return m_invalidRange != wxRICHTEXT_NONE; }
3286
b3169c12
JS
3287 /**
3288 Returns the wxRichTextFloatCollector of this object.
3289 */
cdaed652
VZ
3290 wxRichTextFloatCollector* GetFloatCollector() { return m_floatCollector; }
3291
b3169c12
JS
3292 /**
3293 Returns the number of floating objects at this level.
3294 */
603f702b
JS
3295 int GetFloatingObjectCount() const;
3296
b3169c12
JS
3297 /**
3298 Returns a list of floating objects.
3299 */
603f702b
JS
3300 bool GetFloatingObjects(wxRichTextObjectList& objects) const;
3301
5d7836c4
JS
3302protected:
3303 wxRichTextCtrl* m_ctrl;
24777478 3304 wxRichTextAttr m_defaultAttributes;
38113684 3305
b3169c12 3306 // The invalidated range that will need full layout
0ca07313 3307 wxRichTextRange m_invalidRange;
5d7836c4
JS
3308
3309 // Is the last paragraph partial or complete?
0ca07313 3310 bool m_partialParagraph;
cdaed652
VZ
3311
3312 // The floating layout state
3313 wxRichTextFloatCollector* m_floatCollector;
5d7836c4
JS
3314};
3315
603f702b
JS
3316/**
3317 @class wxRichTextBox
3318
706465df
JS
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*/
bec80f4f 3326
603f702b 3327class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextParagraphLayoutBox
bec80f4f
JS
3328{
3329 DECLARE_DYNAMIC_CLASS(wxRichTextBox)
3330public:
3331// Constructors
3332
603f702b
JS
3333 /**
3334 Default constructor; optionally pass the parent object.
3335 */
3336
bec80f4f 3337 wxRichTextBox(wxRichTextObject* parent = NULL);
603f702b
JS
3338
3339 /**
3340 Copy constructor.
3341 */
3342
3343 wxRichTextBox(const wxRichTextBox& obj): wxRichTextParagraphLayoutBox() { Copy(obj); }
bec80f4f 3344
d13b34d3 3345// Overridables
bec80f4f 3346
603f702b 3347 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
bec80f4f 3348
603f702b
JS
3349 virtual wxString GetXMLNodeName() const { return wxT("textbox"); }
3350
603f702b
JS
3351 virtual bool CanEditProperties() const { return true; }
3352
603f702b
JS
3353 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
3354
603f702b 3355 virtual wxString GetPropertiesMenuLabel() const { return _("&Box"); }
5ad9ae3a 3356
bec80f4f
JS
3357// Accessors
3358
3359// Operations
3360
bec80f4f
JS
3361 virtual wxRichTextObject* Clone() const { return new wxRichTextBox(*this); }
3362
bec80f4f
JS
3363 void Copy(const wxRichTextBox& obj);
3364
3365protected:
3366};
3367
706465df
JS
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*/
5d7836c4 3380
3b2cb431 3381class WXDLLIMPEXP_RICHTEXT wxRichTextLine
5d7836c4
JS
3382{
3383public:
3384// Constructors
3385
3386 wxRichTextLine(wxRichTextParagraph* parent);
1e967276 3387 wxRichTextLine(const wxRichTextLine& obj) { Init( NULL); Copy(obj); }
5d7836c4
JS
3388 virtual ~wxRichTextLine() {}
3389
d13b34d3 3390// Overridables
5d7836c4
JS
3391
3392// Accessors
3393
b3169c12
JS
3394 /**
3395 Sets the range associated with this line.
3396 */
5d7836c4 3397 void SetRange(const wxRichTextRange& range) { m_range = range; }
b3169c12
JS
3398 /**
3399 Sets the range associated with this line.
3400 */
5d7836c4
JS
3401 void SetRange(long from, long to) { m_range = wxRichTextRange(from, to); }
3402
b3169c12
JS
3403 /**
3404 Returns the parent paragraph.
3405 */
5d7836c4
JS
3406 wxRichTextParagraph* GetParent() { return m_parent; }
3407
b3169c12
JS
3408 /**
3409 Returns the range.
3410 */
5d7836c4 3411 const wxRichTextRange& GetRange() const { return m_range; }
b3169c12
JS
3412 /**
3413 Returns the range.
3414 */
5d7836c4
JS
3415 wxRichTextRange& GetRange() { return m_range; }
3416
b3169c12
JS
3417 /**
3418 Returns the absolute range.
3419 */
1e967276
JS
3420 wxRichTextRange GetAbsoluteRange() const;
3421
b3169c12
JS
3422 /**
3423 Returns the line size as calculated by Layout.
3424 */
5d7836c4 3425 virtual wxSize GetSize() const { return m_size; }
b3169c12
JS
3426
3427 /**
3428 Sets the line size as calculated by Layout.
3429 */
5d7836c4
JS
3430 virtual void SetSize(const wxSize& sz) { m_size = sz; }
3431
b3169c12
JS
3432 /**
3433 Returns the object position relative to the parent.
3434 */
5d7836c4 3435 virtual wxPoint GetPosition() const { return m_pos; }
b3169c12
JS
3436
3437 /**
3438 Sets the object position relative to the parent.
3439 */
5d7836c4
JS
3440 virtual void SetPosition(const wxPoint& pos) { m_pos = pos; }
3441
b3169c12
JS
3442 /**
3443 Returns the absolute object position.
3444 */
5d7836c4
JS
3445 virtual wxPoint GetAbsolutePosition() const;
3446
b3169c12
JS
3447 /**
3448 Returns the rectangle enclosing the line.
3449 */
5d7836c4
JS
3450 virtual wxRect GetRect() const { return wxRect(GetAbsolutePosition(), GetSize()); }
3451
b3169c12
JS
3452 /**
3453 Sets the stored descent.
3454 */
5d7836c4 3455 void SetDescent(int descent) { m_descent = descent; }
b3169c12
JS
3456
3457 /**
3458 Returns the stored descent.
3459 */
5d7836c4
JS
3460 int GetDescent() const { return m_descent; }
3461
2f45f554
JS
3462#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING
3463 wxArrayInt& GetObjectSizes() { return m_objectSizes; }
3464 const wxArrayInt& GetObjectSizes() const { return m_objectSizes; }
3465#endif
3466
5d7836c4
JS
3467// Operations
3468
b3169c12
JS
3469 /**
3470 Initialises the object.
3471 */
1e967276 3472 void Init(wxRichTextParagraph* parent);
5d7836c4 3473
b3169c12
JS
3474 /**
3475 Copies from @a obj.
3476 */
5d7836c4
JS
3477 void Copy(const wxRichTextLine& obj);
3478
5d7836c4
JS
3479 virtual wxRichTextLine* Clone() const { return new wxRichTextLine(*this); }
3480
3481protected:
3482
b3169c12
JS
3483 // The range of the line (start position to end position)
3484 // This is relative to the parent paragraph.
5d7836c4
JS
3485 wxRichTextRange m_range;
3486
b3169c12 3487 // Size and position measured relative to top of paragraph
5d7836c4
JS
3488 wxPoint m_pos;
3489 wxSize m_size;
3490
b3169c12 3491 // Maximum descent for this line (location of text baseline)
5d7836c4
JS
3492 int m_descent;
3493
3494 // The parent object
3495 wxRichTextParagraph* m_parent;
2f45f554
JS
3496
3497#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING
3498 wxArrayInt m_objectSizes;
3499#endif
5d7836c4
JS
3500};
3501
3b2cb431 3502WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_RICHTEXT );
5d7836c4 3503
706465df
JS
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*/
5d7836c4 3514
603f702b 3515class WXDLLIMPEXP_RICHTEXT wxRichTextParagraph: public wxRichTextCompositeObject
5d7836c4
JS
3516{
3517 DECLARE_DYNAMIC_CLASS(wxRichTextParagraph)
3518public:
3519// Constructors
3520
b3169c12
JS
3521 /**
3522 Constructor taking a parent and style.
3523 */
24777478 3524 wxRichTextParagraph(wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL);
b3169c12
JS
3525 /**
3526 Constructor taking a text string, a parent and paragraph and character attributes.
3527 */
24777478 3528 wxRichTextParagraph(const wxString& text, wxRichTextObject* parent = NULL, wxRichTextAttr* paraStyle = NULL, wxRichTextAttr* charStyle = NULL);
d3c7fc99 3529 virtual ~wxRichTextParagraph();
603f702b 3530 wxRichTextParagraph(const wxRichTextParagraph& obj): wxRichTextCompositeObject() { Copy(obj); }
5d7836c4 3531
d13b34d3 3532// Overridables
5d7836c4 3533
603f702b 3534 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
5d7836c4 3535
bb7bbd12 3536 virtual bool Layout(wxDC& dc, const wxRect& rect, const wxRect& parentRect, int style);
5d7836c4 3537
31778480 3538 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
5d7836c4 3539
5d7836c4
JS
3540 virtual bool FindPosition(wxDC& dc, long index, wxPoint& pt, int* height, bool forceLineStart);
3541
603f702b 3542 virtual int HitTest(wxDC& dc, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
5d7836c4 3543
5d7836c4
JS
3544 virtual void CalculateRange(long start, long& end);
3545
bec80f4f
JS
3546 virtual wxString GetXMLNodeName() const { return wxT("paragraph"); }
3547
5d7836c4
JS
3548// Accessors
3549
b3169c12
JS
3550 /**
3551 Returns the cached lines.
3552 */
5d7836c4
JS
3553 wxRichTextLineList& GetLines() { return m_cachedLines; }
3554
3555// Operations
3556
b3169c12
JS
3557 /**
3558 Copies the object.
3559 */
5d7836c4
JS
3560 void Copy(const wxRichTextParagraph& obj);
3561
5d7836c4
JS
3562 virtual wxRichTextObject* Clone() const { return new wxRichTextParagraph(*this); }
3563
b3169c12
JS
3564 /**
3565 Clears the cached lines.
3566 */
5d7836c4
JS
3567 void ClearLines();
3568
3569// Implementation
3570
b3169c12
JS
3571 /**
3572 Applies paragraph styles such as centering to the wrapped lines.
3573 */
603f702b 3574 virtual void ApplyParagraphStyle(wxRichTextLine* line, const wxRichTextAttr& attr, const wxRect& rect, wxDC& dc);
5d7836c4 3575
b3169c12
JS
3576 /**
3577 Inserts text at the given position.
3578 */
5d7836c4
JS
3579 virtual bool InsertText(long pos, const wxString& text);
3580
b3169c12
JS
3581 /**
3582 Splits an object at this position if necessary, and returns
3583 the previous object, or NULL if inserting at the beginning.
3584 */
5d7836c4
JS
3585 virtual wxRichTextObject* SplitAt(long pos, wxRichTextObject** previousObject = NULL);
3586
b3169c12
JS
3587 /**
3588 Moves content to a list from this point.
3589 */
5d7836c4
JS
3590 virtual void MoveToList(wxRichTextObject* obj, wxList& list);
3591
b3169c12
JS
3592 /**
3593 Adds content back from a list.
3594 */
5d7836c4
JS
3595 virtual void MoveFromList(wxList& list);
3596
b3169c12
JS
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 */
5d7836c4
JS
3601 bool GetContiguousPlainText(wxString& text, const wxRichTextRange& range, bool fromStart = true);
3602
b3169c12
JS
3603 /**
3604 Finds a suitable wrap position. @a wrapPosition is the last position in the line to the left
3605 of the split.
3606 */
31778480 3607 bool FindWrapPosition(const wxRichTextRange& range, wxDC& dc, int availableSpace, long& wrapPosition, wxArrayInt* partialExtents);
5d7836c4 3608
b3169c12
JS
3609 /**
3610 Finds the object at the given position.
3611 */
5d7836c4
JS
3612 wxRichTextObject* FindObjectAtPosition(long position);
3613
b3169c12
JS
3614 /**
3615 Returns the bullet text for this paragraph.
3616 */
5d7836c4
JS
3617 wxString GetBulletText();
3618
b3169c12
JS
3619 /**
3620 Allocates or reuses a line object.
3621 */
1e967276
JS
3622 wxRichTextLine* AllocateLine(int pos);
3623
b3169c12
JS
3624 /**
3625 Clears remaining unused line objects, if any.
3626 */
1e967276
JS
3627 bool ClearUnusedLines(int lineCount);
3628
b3169c12
JS
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 */
603f702b 3633 wxRichTextAttr GetCombinedAttributes(const wxRichTextAttr& contentStyle, bool includingBoxAttr = false) const;
fe5aa22c 3634
b3169c12
JS
3635 /**
3636 Returns the combined attributes of the base style and paragraph style.
3637 */
603f702b 3638 wxRichTextAttr GetCombinedAttributes(bool includingBoxAttr = false) const;
fe5aa22c 3639
b3169c12
JS
3640 /**
3641 Returns the first position from pos that has a line break character.
3642 */
ff76711f
JS
3643 long GetFirstLineBreakPosition(long pos);
3644
b3169c12
JS
3645 /**
3646 Creates a default tabstop array.
3647 */
cfa3b256
JS
3648 static void InitDefaultTabs();
3649
b3169c12
JS
3650 /**
3651 Clears the default tabstop array.
3652 */
cfa3b256
JS
3653 static void ClearDefaultTabs();
3654
b3169c12
JS
3655 /**
3656 Returns the default tabstop array.
3657 */
cfa3b256
JS
3658 static const wxArrayInt& GetDefaultTabs() { return sm_defaultTabs; }
3659
b3169c12
JS
3660 /**
3661 Lays out the floating objects.
3662 */
cdaed652
VZ
3663 void LayoutFloat(wxDC& dc, const wxRect& rect, int style, wxRichTextFloatCollector* floatCollector);
3664
5d7836c4 3665protected:
b3169c12
JS
3666
3667 // The lines that make up the wrapped paragraph
5d7836c4 3668 wxRichTextLineList m_cachedLines;
cfa3b256 3669
b3169c12 3670 // Default tabstops
cfa3b256 3671 static wxArrayInt sm_defaultTabs;
cdaed652
VZ
3672
3673friend class wxRichTextFloatCollector;
5d7836c4
JS
3674};
3675
706465df
JS
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*/
5d7836c4 3686
3b2cb431 3687class WXDLLIMPEXP_RICHTEXT wxRichTextPlainText: public wxRichTextObject
5d7836c4
JS
3688{
3689 DECLARE_DYNAMIC_CLASS(wxRichTextPlainText)
3690public:
3691// Constructors
3692
7afd2b58
JS
3693 /**
3694 Constructor.
3695 */
24777478 3696 wxRichTextPlainText(const wxString& text = wxEmptyString, wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL);
7afd2b58
JS
3697
3698 /**
3699 Copy constructor.
3700 */
0ca07313 3701 wxRichTextPlainText(const wxRichTextPlainText& obj): wxRichTextObject() { Copy(obj); }
5d7836c4 3702
d13b34d3 3703// Overridables
5d7836c4 3704
603f702b 3705 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
5d7836c4 3706
bb7bbd12 3707 virtual bool Layout(wxDC& dc, const wxRect& rect, const wxRect& parentRect, int style);
5d7836c4 3708
31778480 3709 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
5d7836c4 3710
5d7836c4
JS
3711 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
3712
5d7836c4
JS
3713 virtual wxRichTextObject* DoSplit(long pos);
3714
5d7836c4
JS
3715 virtual void CalculateRange(long start, long& end);
3716
5d7836c4
JS
3717 virtual bool DeleteRange(const wxRichTextRange& range);
3718
7fe8059f 3719 virtual bool IsEmpty() const { return m_text.empty(); }
5d7836c4 3720
5d7836c4
JS
3721 virtual bool CanMerge(wxRichTextObject* object) const;
3722
5d7836c4
JS
3723 virtual bool Merge(wxRichTextObject* object);
3724
5d7836c4
JS
3725 virtual void Dump(wxTextOutputStream& stream);
3726
7afd2b58
JS
3727 /**
3728 Get the first position from pos that has a line break character.
3729 */
ff76711f
JS
3730 long GetFirstLineBreakPosition(long pos);
3731
bec80f4f
JS
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
603f702b 3736 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
bec80f4f
JS
3737#endif
3738
3739#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
bec80f4f
JS
3740 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
3741#endif
3742
3743#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
bec80f4f
JS
3744 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
3745#endif
3746
bec80f4f
JS
3747 virtual wxString GetXMLNodeName() const { return wxT("text"); }
3748
5d7836c4
JS
3749// Accessors
3750
7afd2b58
JS
3751 /**
3752 Returns the text.
3753 */
5d7836c4
JS
3754 const wxString& GetText() const { return m_text; }
3755
7afd2b58
JS
3756 /**
3757 Sets the text.
3758 */
5d7836c4
JS
3759 void SetText(const wxString& text) { m_text = text; }
3760
3761// Operations
3762
7afd2b58 3763 // Copies the text object,
5d7836c4
JS
3764 void Copy(const wxRichTextPlainText& obj);
3765
7afd2b58 3766 // Clones the text object.
5d7836c4 3767 virtual wxRichTextObject* Clone() const { return new wxRichTextPlainText(*this); }
7afd2b58 3768
7f0d9d71 3769private:
24777478 3770 bool DrawTabbedString(wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, wxString& str, wxCoord& x, wxCoord& y, bool selected);
5d7836c4
JS
3771
3772protected:
3773 wxString m_text;
3774};
3775
706465df
JS
3776/**
3777 @class wxRichTextImageBlock
5d7836c4 3778
706465df
JS
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*/
5d7836c4 3786
3b2cb431 3787class WXDLLIMPEXP_RICHTEXT wxRichTextImageBlock: public wxObject
5d7836c4
JS
3788{
3789public:
7afd2b58
JS
3790 /**
3791 Constructor.
3792 */
5d7836c4 3793 wxRichTextImageBlock();
7afd2b58
JS
3794
3795 /**
3796 Copy constructor.
3797 */
5d7836c4 3798 wxRichTextImageBlock(const wxRichTextImageBlock& block);
d3c7fc99 3799 virtual ~wxRichTextImageBlock();
5d7836c4 3800
7afd2b58
JS
3801 /**
3802 Initialises the block.
3803 */
5d7836c4 3804 void Init();
7afd2b58
JS
3805
3806 /**
3807 Clears the block.
3808 */
3809
5d7836c4
JS
3810 void Clear();
3811
7afd2b58
JS
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 */
d75a69e8
FM
3819 virtual bool MakeImageBlock(const wxString& filename, wxBitmapType imageType,
3820 wxImage& image, bool convertToJPEG = true);
5d7836c4 3821
7afd2b58
JS
3822 /**
3823 Make an image block from the wxImage in the given
3824 format.
3825 */
d75a69e8 3826 virtual bool MakeImageBlock(wxImage& image, wxBitmapType imageType, int quality = 80);
ce00f59b 3827
7afd2b58
JS
3828 /**
3829 Uses a const wxImage for efficiency, but can't set quality (only relevant for JPEG)
3830 */
cdaed652
VZ
3831 virtual bool MakeImageBlockDefaultQuality(const wxImage& image, wxBitmapType imageType);
3832
7afd2b58
JS
3833 /**
3834 Makes the image block.
3835 */
cdaed652 3836 virtual bool DoMakeImageBlock(const wxImage& image, wxBitmapType imageType);
5d7836c4 3837
7afd2b58
JS
3838 /**
3839 Writes the block to a file.
3840 */
5d7836c4
JS
3841 bool Write(const wxString& filename);
3842
7afd2b58
JS
3843 /**
3844 Writes the data in hex to a stream.
3845 */
5d7836c4
JS
3846 bool WriteHex(wxOutputStream& stream);
3847
7afd2b58
JS
3848 /**
3849 Reads the data in hex from a stream.
3850 */
d75a69e8 3851 bool ReadHex(wxInputStream& stream, int length, wxBitmapType imageType);
5d7836c4 3852
7afd2b58
JS
3853 /**
3854 Copy from @a block.
3855 */
5d7836c4
JS
3856 void Copy(const wxRichTextImageBlock& block);
3857
3858 // Load a wxImage from the block
7afd2b58
JS
3859 /**
3860 */
5d7836c4
JS
3861 bool Load(wxImage& image);
3862
7afd2b58
JS
3863// Operators
3864
3865 /**
3866 Assignment operation.
3867 */
5d7836c4
JS
3868 void operator=(const wxRichTextImageBlock& block);
3869
7afd2b58 3870// Accessors
5d7836c4 3871
7afd2b58
JS
3872 /**
3873 Returns the raw data.
3874 */
5d7836c4 3875 unsigned char* GetData() const { return m_data; }
7afd2b58
JS
3876
3877 /**
3878 Returns the data size in bytes.
3879 */
5d7836c4 3880 size_t GetDataSize() const { return m_dataSize; }
7afd2b58
JS
3881
3882 /**
3883 Returns the image type.
3884 */
d75a69e8 3885 wxBitmapType GetImageType() const { return m_imageType; }
5d7836c4 3886
7afd2b58
JS
3887 /**
3888 */
5d7836c4 3889 void SetData(unsigned char* image) { m_data = image; }
7afd2b58
JS
3890
3891 /**
3892 Sets the data size.
3893 */
5d7836c4 3894 void SetDataSize(size_t size) { m_dataSize = size; }
7afd2b58
JS
3895
3896 /**
3897 Sets the image type.
3898 */
d75a69e8 3899 void SetImageType(wxBitmapType imageType) { m_imageType = imageType; }
5d7836c4 3900
7afd2b58
JS
3901 /**
3902 Returns @true if the data is non-NULL.
3903 */
b7cacb43 3904 bool IsOk() const { return GetData() != NULL; }
7afd2b58 3905 bool Ok() const { return IsOk(); }
5d7836c4 3906
7afd2b58
JS
3907 /**
3908 Gets the extension for the block's type.
3909 */
d2d0adc7
JS
3910 wxString GetExtension() const;
3911
5d7836c4
JS
3912/// Implementation
3913
7afd2b58
JS
3914 /**
3915 Allocates and reads from a stream as a block of memory.
3916 */
5d7836c4 3917 static unsigned char* ReadBlock(wxInputStream& stream, size_t size);
7afd2b58
JS
3918
3919 /**
3920 Allocates and reads from a file as a block of memory.
3921 */
5d7836c4
JS
3922 static unsigned char* ReadBlock(const wxString& filename, size_t size);
3923
7afd2b58
JS
3924 /**
3925 Writes a memory block to stream.
3926 */
5d7836c4
JS
3927 static bool WriteBlock(wxOutputStream& stream, unsigned char* block, size_t size);
3928
7afd2b58
JS
3929 /**
3930 Writes a memory block to a file.
3931 */
5d7836c4
JS
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;
d75a69e8 3939 wxBitmapType m_imageType;
5d7836c4
JS
3940};
3941
706465df
JS
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*/
5d7836c4 3952
bec80f4f 3953class WXDLLIMPEXP_RICHTEXT wxRichTextImage: public wxRichTextObject
5d7836c4
JS
3954{
3955 DECLARE_DYNAMIC_CLASS(wxRichTextImage)
3956public:
3957// Constructors
3958
7afd2b58
JS
3959 /**
3960 Default constructor.
3961 */
bec80f4f 3962 wxRichTextImage(wxRichTextObject* parent = NULL): wxRichTextObject(parent) { }
7afd2b58
JS
3963
3964 /**
3965 Creates a wxRichTextImage from a wxImage.
3966 */
24777478 3967 wxRichTextImage(const wxImage& image, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL);
7afd2b58
JS
3968
3969 /**
3970 Creates a wxRichTextImage from an image block.
3971 */
24777478 3972 wxRichTextImage(const wxRichTextImageBlock& imageBlock, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL);
7afd2b58
JS
3973
3974 /**
3975 Copy constructor.
3976 */
bec80f4f 3977 wxRichTextImage(const wxRichTextImage& obj): wxRichTextObject(obj) { Copy(obj); }
5d7836c4 3978
d13b34d3 3979// Overridables
5d7836c4 3980
603f702b 3981 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
5d7836c4 3982
bb7bbd12 3983 virtual bool Layout(wxDC& dc, const wxRect& rect, const wxRect& parentRect, int style);
5d7836c4 3984
31778480 3985 virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, int flags, wxPoint position = wxPoint(0,0), wxArrayInt* partialExtents = NULL) const;
5d7836c4 3986
7afd2b58
JS
3987 /**
3988 Returns the 'natural' size for this object - the image size.
3989 */
603f702b
JS
3990 virtual wxTextAttrSize GetNaturalSize() const;
3991
a1b806b9 3992 virtual bool IsEmpty() const { return false; /* !m_imageBlock.IsOk(); */ }
cdaed652 3993
cdaed652
VZ
3994 virtual bool CanEditProperties() const { return true; }
3995
cdaed652 3996 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
5d7836c4 3997
603f702b
JS
3998 virtual wxString GetPropertiesMenuLabel() const { return _("&Picture"); }
3999
bec80f4f
JS
4000 virtual bool UsesParagraphAttributes() const { return false; }
4001
4002#if wxUSE_XML
603f702b 4003 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
bec80f4f
JS
4004#endif
4005
4006#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
bec80f4f
JS
4007 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
4008#endif
4009
4010#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
bec80f4f
JS
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
bec80f4f
JS
4017 virtual wxString GetXMLNodeName() const { return wxT("image"); }
4018
5d7836c4
JS
4019// Accessors
4020
7afd2b58
JS
4021 /**
4022 Returns the image cache (a scaled bitmap).
4023 */
cdaed652 4024 const wxBitmap& GetImageCache() const { return m_imageCache; }
5d7836c4 4025
7afd2b58
JS
4026 /**
4027 Sets the image cache.
4028 */
cdaed652
VZ
4029 void SetImageCache(const wxBitmap& bitmap) { m_imageCache = bitmap; }
4030
7afd2b58
JS
4031 /**
4032 Resets the image cache.
4033 */
cdaed652 4034 void ResetImageCache() { m_imageCache = wxNullBitmap; }
5d7836c4 4035
7afd2b58
JS
4036 /**
4037 Returns the image block containing the raw data.
4038 */
5d7836c4
JS
4039 wxRichTextImageBlock& GetImageBlock() { return m_imageBlock; }
4040
4041// Operations
4042
7afd2b58
JS
4043 /**
4044 Copies the image object.
4045 */
5d7836c4
JS
4046 void Copy(const wxRichTextImage& obj);
4047
7afd2b58
JS
4048 /**
4049 Clones the image object.
4050 */
5d7836c4
JS
4051 virtual wxRichTextObject* Clone() const { return new wxRichTextImage(*this); }
4052
7afd2b58
JS
4053 /**
4054 Creates a cached image at the required size.
4055 */
cdaed652 4056 virtual bool LoadImageCache(wxDC& dc, bool resetCache = false);
5d7836c4
JS
4057
4058protected:
5d7836c4 4059 wxRichTextImageBlock m_imageBlock;
cdaed652 4060 wxBitmap m_imageCache;
5d7836c4
JS
4061};
4062
b5dbe15d
VS
4063class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCommand;
4064class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction;
5d7836c4 4065
706465df
JS
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
3b2cb431 4077class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer: public wxRichTextParagraphLayoutBox
5d7836c4
JS
4078{
4079 DECLARE_DYNAMIC_CLASS(wxRichTextBuffer)
4080public:
4081// Constructors
4082
7afd2b58
JS
4083 /**
4084 Default constructor.
4085 */
5d7836c4 4086 wxRichTextBuffer() { Init(); }
7afd2b58
JS
4087
4088 /**
4089 Copy constructor.
4090 */
0ca07313 4091 wxRichTextBuffer(const wxRichTextBuffer& obj): wxRichTextParagraphLayoutBox() { Init(); Copy(obj); }
7afd2b58 4092
d3c7fc99 4093 virtual ~wxRichTextBuffer() ;
5d7836c4
JS
4094
4095// Accessors
4096
7afd2b58
JS
4097 /**
4098 Returns the command processor.
4099 A text buffer always creates its own command processor when it is initialized.
4100 */
5d7836c4
JS
4101 wxCommandProcessor* GetCommandProcessor() const { return m_commandProcessor; }
4102
7afd2b58
JS
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 */
5d7836c4 4109 void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; }
7afd2b58
JS
4110
4111 /**
4112 Returns the style sheet.
4113 */
38f833b1
JS
4114 virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; }
4115
7afd2b58
JS
4116 /**
4117 Sets the style sheet and sends a notification of the change.
4118 */
d2d0adc7
JS
4119 bool SetStyleSheetAndNotify(wxRichTextStyleSheet* sheet);
4120
7afd2b58
JS
4121 /**
4122 Pushes the style sheet to the top of the style sheet stack.
4123 */
38f833b1
JS
4124 bool PushStyleSheet(wxRichTextStyleSheet* styleSheet);
4125
7afd2b58
JS
4126 /**
4127 Pops the style sheet from the top of the style sheet stack.
4128 */
38f833b1 4129 wxRichTextStyleSheet* PopStyleSheet();
5d7836c4 4130
7afd2b58
JS
4131 /**
4132 Returns the table storing fonts, for quick access and font reuse.
4133 */
44cc96a8 4134 wxRichTextFontTable& GetFontTable() { return m_fontTable; }
7afd2b58
JS
4135
4136 /**
4137 Returns the table storing fonts, for quick access and font reuse.
4138 */
44cc96a8 4139 const wxRichTextFontTable& GetFontTable() const { return m_fontTable; }
7afd2b58
JS
4140
4141 /**
4142 Sets table storing fonts, for quick access and font reuse.
4143 */
44cc96a8
JS
4144 void SetFontTable(const wxRichTextFontTable& table) { m_fontTable = table; }
4145
5d7836c4
JS
4146// Operations
4147
7afd2b58
JS
4148 /**
4149 Initialisation.
4150 */
5d7836c4
JS
4151 void Init();
4152
7afd2b58
JS
4153 /**
4154 Clears the buffer, adds an empty paragraph, and clears the command processor.
4155 */
85d8909b 4156 virtual void ResetAndClearCommands();
5d7836c4 4157
7afd2b58
JS
4158 //@{
4159 /**
4160 Loads content from a stream or file.
4161 Not all handlers will implement file loading.
4162 */
d75a69e8 4163 virtual bool LoadFile(const wxString& filename, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
d75a69e8 4164 virtual bool LoadFile(wxInputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
7afd2b58 4165 //@}
5d7836c4 4166
7afd2b58
JS
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);
d75a69e8 4173 virtual bool SaveFile(wxOutputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
7afd2b58 4174 //@}
5d7836c4 4175
7afd2b58
JS
4176 /**
4177 Sets the handler flags, controlling loading and saving.
4178 */
d2d0adc7
JS
4179 void SetHandlerFlags(int flags) { m_handlerFlags = flags; }
4180
7afd2b58
JS
4181 /**
4182 Gets the handler flags, controlling loading and saving.
4183 */
d2d0adc7
JS
4184 int GetHandlerFlags() const { return m_handlerFlags; }
4185
7afd2b58
JS
4186 /**
4187 Convenience function to add a paragraph of text.
4188 */
24777478 4189 virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL) { Modify(); return wxRichTextParagraphLayoutBox::AddParagraph(text, paraStyle); }
5d7836c4 4190
7afd2b58
JS
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 */
5d7836c4
JS
4199 virtual bool BeginBatchUndo(const wxString& cmdName);
4200
7afd2b58
JS
4201 /**
4202 End collapsing undo/redo commands.
4203 */
5d7836c4
JS
4204 virtual bool EndBatchUndo();
4205
7afd2b58
JS
4206 /**
4207 Returns @true if we are collapsing commands.
4208 */
5d7836c4
JS
4209 virtual bool BatchingUndo() const { return m_batchedCommandDepth > 0; }
4210
7afd2b58
JS
4211 /**
4212 Submit the action immediately, or delay according to whether collapsing is on.
4213 */
5d7836c4
JS
4214 virtual bool SubmitAction(wxRichTextAction* action);
4215
7afd2b58
JS
4216 /**
4217 Returns the collapsed command.
4218 */
5d7836c4
JS
4219 virtual wxRichTextCommand* GetBatchedCommand() const { return m_batchedCommand; }
4220
7afd2b58
JS
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 */
5d7836c4
JS
4227 virtual bool BeginSuppressUndo();
4228
7afd2b58
JS
4229 /**
4230 End suppressing undo/redo commands.
4231 */
5d7836c4
JS
4232 virtual bool EndSuppressUndo();
4233
7afd2b58
JS
4234 /**
4235 Are we suppressing undo??
4236 */
5d7836c4
JS
4237 virtual bool SuppressingUndo() const { return m_suppressUndo > 0; }
4238
7afd2b58
JS
4239 /**
4240 Copy the range to the clipboard.
4241 */
5d7836c4
JS
4242 virtual bool CopyToClipboard(const wxRichTextRange& range);
4243
7afd2b58
JS
4244 /**
4245 Paste the clipboard content to the buffer.
4246 */
5d7836c4
JS
4247 virtual bool PasteFromClipboard(long position);
4248
7afd2b58
JS
4249 /**
4250 Returns @true if we can paste from the clipboard.
4251 */
5d7836c4
JS
4252 virtual bool CanPasteFromClipboard() const;
4253
7afd2b58
JS
4254 /**
4255 Begin using a style.
4256 */
24777478 4257 virtual bool BeginStyle(const wxRichTextAttr& style);
5d7836c4 4258
7afd2b58
JS
4259 /**
4260 End the style.
4261 */
5d7836c4
JS
4262 virtual bool EndStyle();
4263
7afd2b58
JS
4264 /**
4265 End all styles.
4266 */
5d7836c4
JS
4267 virtual bool EndAllStyles();
4268
7afd2b58
JS
4269 /**
4270 Clears the style stack.
4271 */
5d7836c4
JS
4272 virtual void ClearStyleStack();
4273
7afd2b58
JS
4274 /**
4275 Returns the size of the style stack, for example to check correct nesting.
4276 */
3b38e2a0 4277 virtual size_t GetStyleStackSize() const { return m_attributeStack.GetCount(); }
5d7836c4 4278
7afd2b58
JS
4279 /**
4280 Begins using bold.
4281 */
5d7836c4
JS
4282 bool BeginBold();
4283
7afd2b58
JS
4284 /**
4285 Ends using bold.
4286 */
5d7836c4
JS
4287 bool EndBold() { return EndStyle(); }
4288
7afd2b58
JS
4289 /**
4290 Begins using italic.
4291 */
5d7836c4
JS
4292 bool BeginItalic();
4293
7afd2b58
JS
4294 /**
4295 Ends using italic.
4296 */
5d7836c4
JS
4297 bool EndItalic() { return EndStyle(); }
4298
7afd2b58
JS
4299 /**
4300 Begins using underline.
4301 */
5d7836c4
JS
4302 bool BeginUnderline();
4303
7afd2b58
JS
4304 /**
4305 Ends using underline.
4306 */
5d7836c4
JS
4307 bool EndUnderline() { return EndStyle(); }
4308
7afd2b58
JS
4309 /**
4310 Begins using point size.
4311 */
5d7836c4
JS
4312 bool BeginFontSize(int pointSize);
4313
7afd2b58
JS
4314 /**
4315 Ends using point size.
4316 */
5d7836c4
JS
4317 bool EndFontSize() { return EndStyle(); }
4318
7afd2b58
JS
4319 /**
4320 Begins using this font.
4321 */
5d7836c4
JS
4322 bool BeginFont(const wxFont& font);
4323
7afd2b58
JS
4324 /**
4325 Ends using a font.
4326 */
5d7836c4
JS
4327 bool EndFont() { return EndStyle(); }
4328
7afd2b58
JS
4329 /**
4330 Begins using this colour.
4331 */
5d7836c4
JS
4332 bool BeginTextColour(const wxColour& colour);
4333
7afd2b58
JS
4334 /**
4335 Ends using a colour.
4336 */
5d7836c4
JS
4337 bool EndTextColour() { return EndStyle(); }
4338
7afd2b58
JS
4339 /**
4340 Begins using alignment.
4341 */
5d7836c4
JS
4342 bool BeginAlignment(wxTextAttrAlignment alignment);
4343
7afd2b58
JS
4344 /**
4345 Ends alignment.
4346 */
5d7836c4
JS
4347 bool EndAlignment() { return EndStyle(); }
4348
7afd2b58
JS
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 */
5d7836c4
JS
4358 bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0);
4359
7afd2b58
JS
4360 /**
4361 Ends left indent.
4362 */
5d7836c4
JS
4363 bool EndLeftIndent() { return EndStyle(); }
4364
7afd2b58
JS
4365 /**
4366 Begins a right indent, specified in tenths of a millimetre.
4367 */
5d7836c4
JS
4368 bool BeginRightIndent(int rightIndent);
4369
7afd2b58
JS
4370 /**
4371 Ends right indent.
4372 */
5d7836c4
JS
4373 bool EndRightIndent() { return EndStyle(); }
4374
7afd2b58
JS
4375 /**
4376 Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing
4377 in tenths of a millimetre.
4378 */
5d7836c4
JS
4379 bool BeginParagraphSpacing(int before, int after);
4380
7afd2b58
JS
4381 /**
4382 Ends paragraph spacing.
4383 */
5d7836c4
JS
4384 bool EndParagraphSpacing() { return EndStyle(); }
4385
7afd2b58
JS
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 */
5d7836c4
JS
4392 bool BeginLineSpacing(int lineSpacing);
4393
7afd2b58
JS
4394 /**
4395 Ends line spacing.
4396 */
5d7836c4
JS
4397 bool EndLineSpacing() { return EndStyle(); }
4398
7afd2b58
JS
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 */
5d7836c4
JS
4416 bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD);
4417
7afd2b58
JS
4418 /**
4419 Ends numbered bullet.
4420 */
5d7836c4
JS
4421 bool EndNumberedBullet() { return EndStyle(); }
4422
7afd2b58
JS
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 */
d2d0adc7 4429 bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL);
5d7836c4 4430
7afd2b58
JS
4431 /**
4432 Ends symbol bullet.
4433 */
5d7836c4
JS
4434 bool EndSymbolBullet() { return EndStyle(); }
4435
7afd2b58
JS
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 */
f089713f
JS
4443 bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD);
4444
7afd2b58
JS
4445 /**
4446 Ends standard bullet.
4447 */
f089713f
JS
4448 bool EndStandardBullet() { return EndStyle(); }
4449
7afd2b58
JS
4450 /**
4451 Begins named character style.
4452 */
5d7836c4
JS
4453 bool BeginCharacterStyle(const wxString& characterStyle);
4454
7afd2b58
JS
4455 /**
4456 Ends named character style.
4457 */
5d7836c4
JS
4458 bool EndCharacterStyle() { return EndStyle(); }
4459
7afd2b58
JS
4460 /**
4461 Begins named paragraph style.
4462 */
5d7836c4
JS
4463 bool BeginParagraphStyle(const wxString& paragraphStyle);
4464
7afd2b58
JS
4465 /**
4466 Ends named character style.
4467 */
5d7836c4 4468 bool EndParagraphStyle() { return EndStyle(); }
f089713f 4469
7afd2b58
JS
4470 /**
4471 Begins named list style.
4472
4473 Optionally, you can also pass a level and a number.
4474 */
f089713f
JS
4475 bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1);
4476
7afd2b58
JS
4477 /**
4478 Ends named character style.
4479 */
f089713f 4480 bool EndListStyle() { return EndStyle(); }
5d7836c4 4481
7afd2b58
JS
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 */
d2d0adc7
JS
4488 bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString);
4489
7afd2b58
JS
4490 /**
4491 Ends URL.
4492 */
d2d0adc7
JS
4493 bool EndURL() { return EndStyle(); }
4494
4495// Event handling
4496
7afd2b58
JS
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 */
d2d0adc7
JS
4508 bool AddEventHandler(wxEvtHandler* handler);
4509
7afd2b58
JS
4510 /**
4511 Removes an event handler from the buffer's list of handlers, deleting the
4512 object if @a deleteHandler is @true.
4513 */
d2d0adc7
JS
4514 bool RemoveEventHandler(wxEvtHandler* handler, bool deleteHandler = false);
4515
7afd2b58
JS
4516 /**
4517 Clear event handlers.
4518 */
d2d0adc7
JS
4519 void ClearEventHandlers();
4520
7afd2b58
JS
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 */
d2d0adc7
JS
4525 bool SendEvent(wxEvent& event, bool sendToAll = true);
4526
5d7836c4
JS
4527// Implementation
4528
603f702b
JS
4529 virtual int HitTest(wxDC& dc, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
4530
7afd2b58
JS
4531 /**
4532 Copies the buffer.
4533 */
0ca07313 4534 void Copy(const wxRichTextBuffer& obj);
5d7836c4 4535
7afd2b58
JS
4536 /**
4537 Assignment operator.
4538 */
bec80f4f
JS
4539 void operator= (const wxRichTextBuffer& obj) { Copy(obj); }
4540
7afd2b58
JS
4541 /**
4542 Clones the buffer.
4543 */
5d7836c4
JS
4544 virtual wxRichTextObject* Clone() const { return new wxRichTextBuffer(*this); }
4545
7afd2b58
JS
4546 /**
4547 Submits a command to insert paragraphs.
4548 */
0ca07313
JS
4549 bool InsertParagraphsWithUndo(long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0);
4550
7afd2b58
JS
4551 /**
4552 Submits a command to insert the given text.
4553 */
fe5aa22c 4554 bool InsertTextWithUndo(long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0);
5d7836c4 4555
7afd2b58
JS
4556 /**
4557 Submits a command to insert a newline.
4558 */
fe5aa22c 4559 bool InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int flags = 0);
5d7836c4 4560
7afd2b58
JS
4561 /**
4562 Submits a command to insert the given image.
4563 */
24777478
JS
4564 bool InsertImageWithUndo(long pos, const wxRichTextImageBlock& imageBlock, wxRichTextCtrl* ctrl, int flags = 0,
4565 const wxRichTextAttr& textAttr = wxRichTextAttr());
cdaed652 4566
7afd2b58
JS
4567 /**
4568 Submits a command to insert an object.
4569 */
603f702b 4570 wxRichTextObject* InsertObjectWithUndo(long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags);
5d7836c4 4571
7afd2b58
JS
4572 /**
4573 Submits a command to delete this range.
4574 */
12cc29c5 4575 bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl);
5d7836c4 4576
7afd2b58
JS
4577 /**
4578 Mark modified.
4579 */
5d7836c4 4580 void Modify(bool modify = true) { m_modified = modify; }
7afd2b58
JS
4581
4582 /**
4583 Returns @true if the buffer was modified.
4584 */
5d7836c4
JS
4585 bool IsModified() const { return m_modified; }
4586
7afd2b58
JS
4587 //@{
4588 /**
4589 Dumps contents of buffer for debugging purposes.
4590 */
5d7836c4
JS
4591 virtual void Dump();
4592 virtual void Dump(wxTextOutputStream& stream) { wxRichTextParagraphLayoutBox::Dump(stream); }
7afd2b58 4593 //@}
5d7836c4 4594
7afd2b58
JS
4595 /**
4596 Returns the file handlers.
4597 */
5d7836c4
JS
4598 static wxList& GetHandlers() { return sm_handlers; }
4599
7afd2b58
JS
4600 /**
4601 Adds a file handler to the end.
4602 */
5d7836c4
JS
4603 static void AddHandler(wxRichTextFileHandler *handler);
4604
7afd2b58
JS
4605 /**
4606 Inserts a file handler at the front.
4607 */
5d7836c4
JS
4608 static void InsertHandler(wxRichTextFileHandler *handler);
4609
7afd2b58
JS
4610 /**
4611 Removes a file handler.
4612 */
5d7836c4
JS
4613 static bool RemoveHandler(const wxString& name);
4614
7afd2b58
JS
4615 /**
4616 Finds a file handler by name.
4617 */
5d7836c4
JS
4618 static wxRichTextFileHandler *FindHandler(const wxString& name);
4619
7afd2b58
JS
4620 /**
4621 Finds a file handler by extension and type.
4622 */
d75a69e8 4623 static wxRichTextFileHandler *FindHandler(const wxString& extension, wxRichTextFileType imageType);
5d7836c4 4624
7afd2b58
JS
4625 /**
4626 Finds a handler by filename or, if supplied, type.
4627 */
d75a69e8
FM
4628 static wxRichTextFileHandler *FindHandlerFilenameOrType(const wxString& filename,
4629 wxRichTextFileType imageType);
5d7836c4 4630
7afd2b58
JS
4631 /**
4632 Finds a handler by type.
4633 */
d75a69e8 4634 static wxRichTextFileHandler *FindHandler(wxRichTextFileType imageType);
5d7836c4 4635
7afd2b58
JS
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 */
1e967276 4641 static wxString GetExtWildcard(bool combine = false, bool save = false, wxArrayInt* types = NULL);
5d7836c4 4642
7afd2b58
JS
4643 /**
4644 Clean up file handlers.
4645 */
5d7836c4
JS
4646 static void CleanUpHandlers();
4647
7afd2b58
JS
4648 /**
4649 Initialise the standard file handlers.
4650 Currently, only the plain text loading/saving handler is initialised by default.
4651 */
5d7836c4
JS
4652 static void InitStandardHandlers();
4653
7afd2b58
JS
4654 /**
4655 Returns the renderer object.
4656 */
d2d0adc7
JS
4657 static wxRichTextRenderer* GetRenderer() { return sm_renderer; }
4658
7afd2b58
JS
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 */
d2d0adc7
JS
4667 static void SetRenderer(wxRichTextRenderer* renderer);
4668
7afd2b58
JS
4669 /**
4670 Returns the minimum margin between bullet and paragraph in 10ths of a mm.
4671 */
d2d0adc7 4672 static int GetBulletRightMargin() { return sm_bulletRightMargin; }
7afd2b58
JS
4673
4674 /**
4675 Sets the minimum margin between bullet and paragraph in 10ths of a mm.
4676 */
d2d0adc7
JS
4677 static void SetBulletRightMargin(int margin) { sm_bulletRightMargin = margin; }
4678
7afd2b58
JS
4679 /**
4680 Returns the factor to multiply by character height to get a reasonable bullet size.
4681 */
d2d0adc7 4682 static float GetBulletProportion() { return sm_bulletProportion; }
7afd2b58
JS
4683
4684 /**
4685 Sets the factor to multiply by character height to get a reasonable bullet size.
4686 */
d2d0adc7 4687 static void SetBulletProportion(float prop) { sm_bulletProportion = prop; }
44219ff0 4688
7afd2b58
JS
4689 /**
4690 Returns the scale factor for calculating dimensions.
4691 */
44219ff0 4692 double GetScale() const { return m_scale; }
7afd2b58
JS
4693
4694 /**
4695 Sets the scale factor for calculating dimensions.
4696 */
44219ff0
JS
4697 void SetScale(double scale) { m_scale = scale; }
4698
5d7836c4
JS
4699protected:
4700
4701 /// Command processor
4702 wxCommandProcessor* m_commandProcessor;
4703
44cc96a8
JS
4704 /// Table storing fonts
4705 wxRichTextFontTable m_fontTable;
4706
5d7836c4
JS
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
d2d0adc7
JS
4725 /// List of event handlers that will be notified of events
4726 wxList m_eventHandlers;
4727
5d7836c4
JS
4728 /// Stack of attributes for convenience functions
4729 wxList m_attributeStack;
4730
d2d0adc7
JS
4731 /// Flags to be passed to handlers
4732 int m_handlerFlags;
4733
5d7836c4
JS
4734 /// File handlers
4735 static wxList sm_handlers;
d2d0adc7
JS
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;
44219ff0
JS
4745
4746 /// Scaling factor in use: needed to calculate correct dimensions when printing
4747 double m_scale;
5d7836c4
JS
4748};
4749
603f702b
JS
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
d13b34d3 4774// Overridables
603f702b 4775
603f702b
JS
4776 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
4777
603f702b
JS
4778 virtual wxString GetXMLNodeName() const { return wxT("cell"); }
4779
603f702b
JS
4780 virtual bool CanEditProperties() const { return true; }
4781
603f702b
JS
4782 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
4783
603f702b
JS
4784 virtual wxString GetPropertiesMenuLabel() const { return _("&Cell"); }
4785
4786// Accessors
4787
4788// Operations
4789
603f702b
JS
4790 virtual wxRichTextObject* Clone() const { return new wxRichTextCell(*this); }
4791
603f702b
JS
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
d13b34d3 4825// Overridables
603f702b 4826
603f702b
JS
4827 virtual bool Draw(wxDC& dc, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
4828
603f702b
JS
4829 virtual wxString GetXMLNodeName() const { return wxT("table"); }
4830
bb7bbd12 4831 virtual bool Layout(wxDC& dc, const wxRect& rect, const wxRect& parentRect, int style);
603f702b 4832
603f702b
JS
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
603f702b
JS
4835 virtual bool DeleteRange(const wxRichTextRange& range);
4836
603f702b
JS
4837 virtual wxString GetTextForRange(const wxRichTextRange& range) const;
4838
4839#if wxUSE_XML
603f702b
JS
4840 virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
4841#endif
4842
4843#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
603f702b
JS
4844 virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
4845#endif
4846
4847#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
603f702b
JS
4848 virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
4849#endif
4850
603f702b
JS
4851 virtual bool FindPosition(wxDC& dc, long index, wxPoint& pt, int* height, bool forceLineStart);
4852
603f702b
JS
4853 virtual void CalculateRange(long start, long& end);
4854
b3169c12 4855 // Can this object handle the selections of its children? FOr example, a table.
603f702b
JS
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
603f702b
JS
4862 virtual bool CanEditProperties() const { return true; }
4863
603f702b
JS
4864 virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
4865
603f702b
JS
4866 virtual wxString GetPropertiesMenuLabel() const { return _("&Table"); }
4867
b3169c12
JS
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).
603f702b
JS
4871 virtual bool AcceptsFocus() const { return false; }
4872
4873// Accessors
4874
7afd2b58
JS
4875 /**
4876 Returns the cells array.
4877 */
603f702b 4878 const wxRichTextObjectPtrArrayArray& GetCells() const { return m_cells; }
7afd2b58
JS
4879
4880 /**
4881 Returns the cells array.
4882 */
603f702b
JS
4883 wxRichTextObjectPtrArrayArray& GetCells() { return m_cells; }
4884
7afd2b58
JS
4885 /**
4886 Returns the row count.
4887 */
603f702b 4888 int GetRowCount() const { return m_rowCount; }
7afd2b58
JS
4889
4890 /**
4891 Returns the column count.
4892 */
603f702b
JS
4893 int GetColumnCount() const { return m_colCount; }
4894
7afd2b58
JS
4895 /**
4896 Returns the cell at the given row/column position.
4897 */
603f702b
JS
4898 virtual wxRichTextCell* GetCell(int row, int col) const;
4899
7afd2b58
JS
4900 /**
4901 Returns the cell at the given character position (in the range of the table).
4902 */
603f702b
JS
4903 virtual wxRichTextCell* GetCell(long pos) const;
4904
7afd2b58
JS
4905 /**
4906 Returns the row/column for a given character position.
4907 */
603f702b
JS
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
d13b34d3 4970 // hierarchy to accept non-paragraph objects in a paragraph layout box.
603f702b
JS
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
7afd2b58
JS
4978/**
4979 The command identifiers for Do/Undo.
4980*/
5d7836c4
JS
4981
4982enum wxRichTextCommandId
4983{
4984 wxRICHTEXT_INSERT,
4985 wxRICHTEXT_DELETE,
603f702b
JS
4986 wxRICHTEXT_CHANGE_ATTRIBUTES,
4987 wxRICHTEXT_CHANGE_STYLE,
590a0f8b 4988 wxRICHTEXT_CHANGE_PROPERTIES,
603f702b
JS
4989 wxRICHTEXT_CHANGE_OBJECT
4990};
4991
706465df
JS
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*/
603f702b
JS
5005
5006class WXDLLIMPEXP_RICHTEXT wxRichTextObjectAddress
5007{
5008public:
7afd2b58
JS
5009 /**
5010 Creates the address given a container and an object.
5011 */
603f702b 5012 wxRichTextObjectAddress(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj) { Create(topLevelContainer, obj); }
7afd2b58
JS
5013 /**
5014 */
603f702b 5015 wxRichTextObjectAddress() { Init(); }
7afd2b58
JS
5016 /**
5017 */
603f702b
JS
5018 wxRichTextObjectAddress(const wxRichTextObjectAddress& address) { Copy(address); }
5019
5020 void Init() {}
7afd2b58
JS
5021
5022 /**
5023 Copies the address.
5024 */
603f702b 5025 void Copy(const wxRichTextObjectAddress& address) { m_address = address.m_address; }
7afd2b58
JS
5026
5027 /**
5028 Assignment operator.
5029 */
603f702b
JS
5030 void operator=(const wxRichTextObjectAddress& address) { Copy(address); }
5031
7afd2b58
JS
5032 /**
5033 Returns the object specified by the address, given a top level container.
5034 */
603f702b 5035 wxRichTextObject* GetObject(wxRichTextParagraphLayoutBox* topLevelContainer) const;
7afd2b58
JS
5036
5037 /**
5038 Creates the address given a container and an object.
5039 */
603f702b
JS
5040 bool Create(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj);
5041
7afd2b58
JS
5042 /**
5043 Returns the array of integers representing the object address.
5044 */
603f702b 5045 wxArrayInt& GetAddress() { return m_address; }
7afd2b58
JS
5046
5047 /**
5048 Returns the array of integers representing the object address.
5049 */
603f702b 5050 const wxArrayInt& GetAddress() const { return m_address; }
7afd2b58
JS
5051
5052 /**
5053 Sets the address from an array of integers.
5054 */
603f702b
JS
5055 void SetAddress(const wxArrayInt& address) { m_address = address; }
5056
5057protected:
5058
5059 wxArrayInt m_address;
5d7836c4
JS
5060};
5061
b5dbe15d 5062class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction;
706465df
JS
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
3b2cb431 5076class WXDLLIMPEXP_RICHTEXT wxRichTextCommand: public wxCommand
5d7836c4
JS
5077{
5078public:
7afd2b58
JS
5079 /**
5080 Constructor for one action.
5081 */
5d7836c4 5082 wxRichTextCommand(const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer,
603f702b 5083 wxRichTextParagraphLayoutBox* container, wxRichTextCtrl* ctrl, bool ignoreFirstTime = false);
5d7836c4 5084
7afd2b58
JS
5085 /**
5086 Constructor for multiple actions.
5087 */
5d7836c4
JS
5088 wxRichTextCommand(const wxString& name);
5089
d3c7fc99 5090 virtual ~wxRichTextCommand();
5d7836c4 5091
7afd2b58
JS
5092 /**
5093 Performs the command.
5094 */
5d7836c4 5095 bool Do();
7afd2b58
JS
5096
5097 /**
5098 Undoes the command.
5099 */
5d7836c4
JS
5100 bool Undo();
5101
7afd2b58
JS
5102 /**
5103 Adds an action to the action list.
5104 */
5d7836c4 5105 void AddAction(wxRichTextAction* action);
7afd2b58
JS
5106
5107 /**
5108 Clears the action list.
5109 */
5d7836c4
JS
5110 void ClearActions();
5111
7afd2b58
JS
5112 /**
5113 Returns the action list.
5114 */
5d7836c4
JS
5115 wxList& GetActions() { return m_actions; }
5116
5117protected:
5118
5119 wxList m_actions;
5120};
5121
706465df
JS
5122/**
5123 @class wxRichTextAction
5124
5125 Implements a part of a command.
5126
5127 @library{wxrichtext}
5128 @category{richtext}
5129
5130 @see wxRichTextCommand
5131*/
5d7836c4 5132
3b2cb431 5133class WXDLLIMPEXP_RICHTEXT wxRichTextAction: public wxObject
5d7836c4
JS
5134{
5135public:
7afd2b58
JS
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 */
603f702b
JS
5140 wxRichTextAction(wxRichTextCommand* cmd, const wxString& name, wxRichTextCommandId id,
5141 wxRichTextBuffer* buffer, wxRichTextParagraphLayoutBox* container,
7fe8059f 5142 wxRichTextCtrl* ctrl, bool ignoreFirstTime = false);
5d7836c4 5143
d3c7fc99 5144 virtual ~wxRichTextAction();
5d7836c4 5145
7afd2b58
JS
5146 /**
5147 Performs the action.
5148 */
5d7836c4 5149 bool Do();
7afd2b58
JS
5150
5151 /**
5152 Undoes the action.
5153 */
5d7836c4
JS
5154 bool Undo();
5155
7afd2b58
JS
5156 /**
5157 Updates the control appearance, optimizing if possible given information from the call to Layout.
5158 */
ea160b2e 5159 void UpdateAppearance(long caretPosition, bool sendUpdateEvent = false,
7051fa41 5160 wxArrayInt* optimizationLineCharPositions = NULL, wxArrayInt* optimizationLineYPositions = NULL, bool isDoCmd = true);
5d7836c4 5161
7afd2b58
JS
5162 /**
5163 Replaces the buffer paragraphs with the given fragment.
5164 */
0ca07313 5165 void ApplyParagraphs(const wxRichTextParagraphLayoutBox& fragment);
5d7836c4 5166
7afd2b58
JS
5167 /**
5168 Returns the new fragments.
5169 */
0ca07313 5170 wxRichTextParagraphLayoutBox& GetNewParagraphs() { return m_newParagraphs; }
7afd2b58
JS
5171
5172 /**
5173 Returns the old fragments.
5174 */
0ca07313 5175 wxRichTextParagraphLayoutBox& GetOldParagraphs() { return m_oldParagraphs; }
5d7836c4 5176
7afd2b58
JS
5177 /**
5178 Returns the attributes, for single-object commands.
5179 */
603f702b
JS
5180 wxRichTextAttr& GetAttributes() { return m_attributes; }
5181
7afd2b58
JS
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 */
603f702b 5186 wxRichTextObject* GetObject() const { return m_object; }
7afd2b58
JS
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 */
603f702b 5192 void SetObject(wxRichTextObject* obj) { m_object = obj; m_objectAddress.Create(m_buffer, m_object); }
7afd2b58
JS
5193
5194 /**
5195 Makes an address from the given object.
5196 */
603f702b
JS
5197 void MakeObject(wxRichTextObject* obj) { m_objectAddress.Create(m_buffer, obj); }
5198
7afd2b58
JS
5199 /**
5200 Calculate arrays for refresh optimization.
5201 */
7051fa41
JS
5202 void CalculateRefreshOptimizations(wxArrayInt& optimizationLineCharPositions, wxArrayInt& optimizationLineYPositions);
5203
7afd2b58
JS
5204 /**
5205 Sets the position used for e.g. insertion.
5206 */
5d7836c4 5207 void SetPosition(long pos) { m_position = pos; }
7afd2b58
JS
5208
5209 /**
5210 Returns the position used for e.g. insertion.
5211 */
5d7836c4
JS
5212 long GetPosition() const { return m_position; }
5213
7afd2b58
JS
5214 /**
5215 Sets the range for e.g. deletion.
5216 */
5d7836c4 5217 void SetRange(const wxRichTextRange& range) { m_range = range; }
7afd2b58
JS
5218
5219 /**
5220 Returns the range for e.g. deletion.
5221 */
5d7836c4
JS
5222 const wxRichTextRange& GetRange() const { return m_range; }
5223
7afd2b58
JS
5224 /**
5225 Returns the address (nested position) of the container within the buffer being manipulated.
5226 */
603f702b 5227 wxRichTextObjectAddress& GetContainerAddress() { return m_containerAddress; }
7afd2b58
JS
5228
5229 /**
5230 Returns the address (nested position) of the container within the buffer being manipulated.
5231 */
603f702b 5232 const wxRichTextObjectAddress& GetContainerAddress() const { return m_containerAddress; }
7afd2b58
JS
5233
5234 /**
5235 Sets the address (nested position) of the container within the buffer being manipulated.
5236 */
603f702b 5237 void SetContainerAddress(const wxRichTextObjectAddress& address) { m_containerAddress = address; }
7afd2b58
JS
5238
5239 /**
5240 Sets the address (nested position) of the container within the buffer being manipulated.
5241 */
603f702b
JS
5242 void SetContainerAddress(wxRichTextParagraphLayoutBox* container, wxRichTextObject* obj) { m_containerAddress.Create(container, obj); }
5243
7afd2b58
JS
5244 /**
5245 Returns the container that this action refers to, using the container address and top-level buffer.
5246 */
603f702b 5247 wxRichTextParagraphLayoutBox* GetContainer() const;
7afd2b58
JS
5248
5249 /**
5250 Returns the action name.
5251 */
5d7836c4
JS
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
603f702b
JS
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
5d7836c4
JS
5266 // Control
5267 wxRichTextCtrl* m_ctrl;
5268
5269 // Stores the new paragraphs
0ca07313 5270 wxRichTextParagraphLayoutBox m_newParagraphs;
5d7836c4
JS
5271
5272 // Stores the old paragraphs
0ca07313 5273 wxRichTextParagraphLayoutBox m_oldParagraphs;
5d7836c4 5274
603f702b
JS
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
5d7836c4
JS
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
d2d0adc7
JS
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
b774c698
JS
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
a2beab22
JS
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
706465df
JS
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*/
5d7836c4 5335
3b2cb431 5336class WXDLLIMPEXP_RICHTEXT wxRichTextFileHandler: public wxObject
5d7836c4
JS
5337{
5338 DECLARE_CLASS(wxRichTextFileHandler)
5339public:
7afd2b58
JS
5340 /**
5341 Creates a file handler object.
5342 */
5d7836c4 5343 wxRichTextFileHandler(const wxString& name = wxEmptyString, const wxString& ext = wxEmptyString, int type = 0)
d8dd214c 5344 : m_name(name), m_extension(ext), m_type(type), m_flags(0), m_visible(true)
5d7836c4
JS
5345 { }
5346
5347#if wxUSE_STREAMS
7afd2b58
JS
5348 /**
5349 Loads the buffer from a stream.
5350 Not all handlers will implement file loading.
5351 */
7fe8059f
WS
5352 bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream)
5353 { return DoLoadFile(buffer, stream); }
7afd2b58
JS
5354
5355 /**
5356 Saves the buffer to a stream.
5357 Not all handlers will implement file saving.
5358 */
7fe8059f
WS
5359 bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream)
5360 { return DoSaveFile(buffer, stream); }
5d7836c4
JS
5361#endif
5362
a9b9495b 5363#if wxUSE_FFILE && wxUSE_STREAMS
7afd2b58
JS
5364 /**
5365 Loads the buffer from a file.
5366 */
fe8b0361 5367 virtual bool LoadFile(wxRichTextBuffer *buffer, const wxString& filename);
7afd2b58
JS
5368
5369 /**
5370 Saves the buffer to a file.
5371 */
fe8b0361 5372 virtual bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename);
a9b9495b 5373#endif // wxUSE_STREAMS && wxUSE_STREAMS
5d7836c4 5374
7afd2b58
JS
5375 /**
5376 Returns @true if we handle this filename (if using files). By default, checks the extension.
5377 */
5d7836c4
JS
5378 virtual bool CanHandle(const wxString& filename) const;
5379
7afd2b58
JS
5380 /**
5381 Returns @true if we can save using this handler.
5382 */
5d7836c4
JS
5383 virtual bool CanSave() const { return false; }
5384
7afd2b58
JS
5385 /**
5386 Returns @true if we can load using this handler.
5387 */
5d7836c4
JS
5388 virtual bool CanLoad() const { return false; }
5389
7afd2b58
JS
5390 /**
5391 Returns @true if this handler should be visible to the user.
5392 */
5d7836c4 5393 virtual bool IsVisible() const { return m_visible; }
7afd2b58
JS
5394
5395 /**
5396 Sets whether the handler should be visible to the user (via the application's
5397 load and save dialogs).
5398 */
5d7836c4
JS
5399 virtual void SetVisible(bool visible) { m_visible = visible; }
5400
7afd2b58
JS
5401 /**
5402 Sets the name of the nandler.
5403 */
5d7836c4 5404 void SetName(const wxString& name) { m_name = name; }
7afd2b58
JS
5405
5406 /**
5407 Returns the name of the nandler.
5408 */
5d7836c4
JS
5409 wxString GetName() const { return m_name; }
5410
7afd2b58
JS
5411 /**
5412 Sets the default extension to recognise.
5413 */
5d7836c4 5414 void SetExtension(const wxString& ext) { m_extension = ext; }
7afd2b58
JS
5415
5416 /**
5417 Returns the default extension to recognise.
5418 */
5d7836c4
JS
5419 wxString GetExtension() const { return m_extension; }
5420
7afd2b58
JS
5421 /**
5422 Sets the handler type.
5423 */
5d7836c4 5424 void SetType(int type) { m_type = type; }
7afd2b58
JS
5425
5426 /**
5427 Returns the handler type.
5428 */
5d7836c4
JS
5429 int GetType() const { return m_type; }
5430
7afd2b58
JS
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 */
d2d0adc7 5441 void SetFlags(int flags) { m_flags = flags; }
7afd2b58
JS
5442
5443 /**
5444 Returns flags controlling how loading and saving is done.
5445 */
d2d0adc7
JS
5446 int GetFlags() const { return m_flags; }
5447
7afd2b58
JS
5448 /**
5449 Sets the encoding to use when saving a file. If empty, a suitable encoding is chosen.
5450 */
b71e9aa4 5451 void SetEncoding(const wxString& encoding) { m_encoding = encoding; }
7afd2b58
JS
5452
5453 /**
5454 Returns the encoding to use when saving a file. If empty, a suitable encoding is chosen.
5455 */
b71e9aa4
JS
5456 const wxString& GetEncoding() const { return m_encoding; }
5457
5d7836c4
JS
5458protected:
5459
7fe8059f 5460#if wxUSE_STREAMS
7afd2b58
JS
5461 /**
5462 Override to load content from @a stream into @a buffer.
5463 */
7fe8059f 5464 virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) = 0;
7afd2b58
JS
5465
5466 /**
5467 Override to save content to @a stream from @a buffer.
5468 */
7fe8059f
WS
5469 virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0;
5470#endif
5471
5d7836c4 5472 wxString m_name;
b71e9aa4 5473 wxString m_encoding;
5d7836c4
JS
5474 wxString m_extension;
5475 int m_type;
d2d0adc7 5476 int m_flags;
5d7836c4
JS
5477 bool m_visible;
5478};
5479
706465df
JS
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*/
5d7836c4 5490
3b2cb431 5491class WXDLLIMPEXP_RICHTEXT wxRichTextPlainTextHandler: public wxRichTextFileHandler
5d7836c4
JS
5492{
5493 DECLARE_CLASS(wxRichTextPlainTextHandler)
5494public:
d75a69e8
FM
5495 wxRichTextPlainTextHandler(const wxString& name = wxT("Text"),
5496 const wxString& ext = wxT("txt"),
5497 wxRichTextFileType type = wxRICHTEXT_TYPE_TEXT)
5d7836c4
JS
5498 : wxRichTextFileHandler(name, ext, type)
5499 { }
5500
7afd2b58 5501 // Can we save using this handler?
5d7836c4
JS
5502 virtual bool CanSave() const { return true; }
5503
7afd2b58 5504 // Can we load using this handler?
5d7836c4
JS
5505 virtual bool CanLoad() const { return true; }
5506
5507protected:
5508
7fe8059f
WS
5509#if wxUSE_STREAMS
5510 virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream);
5511 virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream);
5512#endif
5513
5d7836c4
JS
5514};
5515
0ca07313
JS
5516#if wxUSE_DATAOBJ
5517
706465df
JS
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*/
0ca07313 5528
d2d0adc7 5529class WXDLLIMPEXP_RICHTEXT wxRichTextBufferDataObject: public wxDataObjectSimple
0ca07313
JS
5530{
5531public:
7afd2b58
JS
5532 /**
5533 The constructor doesn't copy the pointer, so it shouldn't go away while this object
5534 is alive.
5535 */
d3b9f782 5536 wxRichTextBufferDataObject(wxRichTextBuffer* richTextBuffer = NULL);
0ca07313
JS
5537 virtual ~wxRichTextBufferDataObject();
5538
7afd2b58
JS
5539 /**
5540 After a call to this function, the buffer is owned by the caller and it
5541 is responsible for deleting it.
5542 */
0ca07313
JS
5543 wxRichTextBuffer* GetRichTextBuffer();
5544
7afd2b58
JS
5545 /**
5546 Returns the id for the new data format.
5547 */
0ca07313
JS
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
706465df
JS
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*/
d2d0adc7
JS
5581
5582class WXDLLIMPEXP_RICHTEXT wxRichTextRenderer: public wxObject
5583{
5584public:
7afd2b58
JS
5585 /**
5586 Constructor.
5587 */
d2d0adc7
JS
5588 wxRichTextRenderer() {}
5589 virtual ~wxRichTextRenderer() {}
5590
7afd2b58
JS
5591 /**
5592 Draws a standard bullet, as specified by the value of GetBulletName. This function should be overridden.
5593 */
24777478 5594 virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0;
d2d0adc7 5595
7afd2b58
JS
5596 /**
5597 Draws a bullet that can be described by text, such as numbered or symbol bullets. This function should be overridden.
5598 */
24777478 5599 virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text) = 0;
d2d0adc7 5600
7afd2b58
JS
5601 /**
5602 Draws a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName. This function should be overridden.
5603 */
24777478 5604 virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0;
d2d0adc7 5605
7afd2b58
JS
5606 /**
5607 Enumerate the standard bullet names currently supported. This function should be overridden.
5608 */
d2d0adc7
JS
5609 virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames) = 0;
5610};
5611
706465df
JS
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*/
d2d0adc7
JS
5622
5623class WXDLLIMPEXP_RICHTEXT wxRichTextStdRenderer: public wxRichTextRenderer
5624{
5625public:
7afd2b58
JS
5626 /**
5627 Constructor.
5628 */
d2d0adc7
JS
5629 wxRichTextStdRenderer() {}
5630
7afd2b58 5631 // Draw a standard bullet, as specified by the value of GetBulletName
24777478 5632 virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect);
d2d0adc7 5633
7afd2b58 5634 // Draw a bullet that can be described by text, such as numbered or symbol bullets
24777478 5635 virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text);
d2d0adc7 5636
7afd2b58 5637 // Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName
24777478 5638 virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect);
d2d0adc7 5639
7afd2b58 5640 // Enumerate the standard bullet names currently supported
d2d0adc7
JS
5641 virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames);
5642};
5643
5d7836c4
JS
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
24777478
JS
5655WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2);
5656WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2);
5d7836c4
JS
5657
5658/// Compare two attribute objects, but take into account the flags
5659/// specifying attributes of interest.
24777478 5660WXDLLIMPEXP_RICHTEXT bool wxTextAttrEqPartial(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2);
5d7836c4
JS
5661
5662/// Apply one style to another
24777478 5663WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL);
59509217 5664
aeb6ebe2 5665// Remove attributes
24777478 5666WXDLLIMPEXP_RICHTEXT bool wxRichTextRemoveStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style);
aeb6ebe2 5667
42688aea
JS
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
4f32b3cf 5674/// Split into paragraph and character styles
24777478 5675WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxRichTextAttr& style, wxRichTextAttr& parStyle, wxRichTextAttr& charStyle);
4f32b3cf 5676
59509217 5677/// Compare tabs
d2d0adc7 5678WXDLLIMPEXP_RICHTEXT bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2);
59509217 5679
59509217 5680/// Convert a decimal to Roman numerals
d2d0adc7 5681WXDLLIMPEXP_RICHTEXT wxString wxRichTextDecimalToRoman(long n);
f1d6804f 5682
24777478
JS
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
f1d6804f
RD
5687WXDLLIMPEXP_RICHTEXT void wxRichTextModuleInit();
5688
5d7836c4
JS
5689#endif
5690 // wxUSE_RICHTEXT
5691
5692#endif
5693 // _WX_RICHTEXTBUFFER_H_
d2d0adc7 5694