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