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