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