Added custom properties to style definitions and style sheets
[wxWidgets.git] / interface / wx / richtext / richtextstyles.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: richtext/richtextstyles.h
3 // Purpose: interface of wxRichTextStyleListCtrl
4 // Author: wxWidgets team
5 // RCS-ID: $Id$
6 // Licence: wxWindows licence
7 /////////////////////////////////////////////////////////////////////////////
8
9 /**
10 @class wxRichTextStyleListCtrl
11
12 This class incorporates a wxRichTextStyleListBox and a choice control that
13 allows the user to select the category of style to view.
14
15 It is demonstrated in the wxRichTextCtrl sample in @c samples/richtext.
16
17 To use wxRichTextStyleListCtrl, add the control to your window hierarchy and
18 call wxRichTextStyleListCtrl::SetStyleType with one of
19 wxRichTextStyleListBox::wxRICHTEXT_STYLE_ALL,
20 wxRichTextStyleListBox::wxRICHTEXT_STYLE_PARAGRAPH,
21 wxRichTextStyleListBox::wxRICHTEXT_STYLE_CHARACTER and
22 wxRichTextStyleListBox::wxRICHTEXT_STYLE_LIST to set the current view.
23
24 Associate the control with a style sheet and rich text control with
25 SetStyleSheet and SetRichTextCtrl, so that when a style is double-clicked,
26 it is applied to the selection.
27
28 @beginStyleTable
29 @style{wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR}
30 This style hides the category selection control.
31 @endStyleTable
32
33 @library{wxrichtext}
34 @category{richtext}
35 */
36 class wxRichTextStyleListCtrl : public wxControl
37 {
38 public:
39 //@{
40 /**
41 Constructors.
42 */
43 wxRichTextStyleListCtrl(wxWindow* parent,
44 wxWindowID id = wxID_ANY,
45 const wxPoint& pos = wxDefaultPosition,
46 const wxSize& size = wxDefaultSize,
47 long style = 0);
48 wxRichTextStyleListCtrl();
49 //@}
50
51 /**
52 Creates the windows.
53 */
54 bool Create(wxWindow* parent, wxWindowID id = wxID_ANY,
55 const wxPoint& pos = wxDefaultPosition,
56 const wxSize& size = wxDefaultSize,
57 long style = 0);
58
59 /**
60 Returns the associated rich text control, if any.
61 */
62 wxRichTextCtrl* GetRichTextCtrl() const;
63
64 /**
65 Returns the wxChoice control used for selecting the style category.
66 */
67 wxChoice* GetStyleChoice() const;
68
69 /**
70 Returns the wxListBox control used to view the style list.
71 */
72 wxRichTextStyleListBox* GetStyleListBox() const;
73
74 /**
75 Returns the associated style sheet, if any.
76 */
77 wxRichTextStyleSheet* GetStyleSheet() const;
78
79 /**
80 Returns the type of style to show in the list box.
81 */
82 wxRichTextStyleListBox::wxRichTextStyleType GetStyleType() const;
83
84 /**
85 Associates the control with a wxRichTextCtrl.
86 */
87 void SetRichTextCtrl(wxRichTextCtrl* ctrl);
88
89 /**
90 Associates the control with a style sheet.
91 */
92 void SetStyleSheet(wxRichTextStyleSheet* styleSheet);
93
94 /**
95 Sets the style type to display.
96
97 One of
98 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_ALL,
99 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_PARAGRAPH,
100 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_CHARACTER
101 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_LIST.
102 */
103 void SetStyleType(wxRichTextStyleListBox::wxRichTextStyleType styleType);
104
105 /**
106 Updates the style list box.
107 */
108 void UpdateStyles();
109 };
110
111
112
113 /**
114 @class wxRichTextStyleDefinition
115
116 This is a base class for paragraph and character styles.
117
118 @library{wxrichtext}
119 @category{richtext}
120 */
121 class wxRichTextStyleDefinition : public wxObject
122 {
123 public:
124 /**
125 Constructor.
126 */
127 wxRichTextStyleDefinition(const wxString& name = wxEmptyString);
128
129 /**
130 Destructor.
131 */
132 virtual ~wxRichTextStyleDefinition();
133
134 /**
135 Returns the style on which this style is based.
136 */
137 const wxString& GetBaseStyle() const;
138
139 /**
140 Returns the style's description.
141 */
142 const wxString& GetDescription() const;
143
144 /**
145 Returns the style name.
146 */
147 const wxString& GetName() const;
148
149 //@{
150 /**
151 Returns the attributes associated with this style.
152 */
153 wxTextAttr GetStyle() const;
154 const wxTextAttr GetStyle() const;
155 //@}
156
157 /**
158 Returns the style attributes combined with the attributes of the specified base
159 style, if any. This function works recursively.
160 */
161 virtual wxTextAttr GetStyleMergedWithBase(const wxRichTextStyleSheet* sheet) const;
162
163 /**
164 Sets the name of the style that this style is based on.
165 */
166 void SetBaseStyle(const wxString& name);
167
168 /**
169 Sets the style description.
170 */
171 void SetDescription(const wxString& descr);
172
173 /**
174 Sets the name of the style.
175 */
176 void SetName(const wxString& name);
177
178 /**
179 Sets the attributes for this style.
180 */
181 void SetStyle(const wxTextAttr& style);
182
183 /**
184 Returns the definition's properties.
185 */
186 wxRichTextProperties& GetProperties();
187
188 /**
189 Returns the definition's properties.
190 */
191 const wxRichTextProperties& GetProperties() const;
192
193 /**
194 Sets the definition's properties.
195 */
196 void SetProperties(const wxRichTextProperties& props);
197 };
198
199
200
201 /**
202 @class wxRichTextParagraphStyleDefinition
203
204 This class represents a paragraph style definition, usually added to a
205 wxRichTextStyleSheet.
206
207 @library{wxrichtext}
208 @category{richtext}
209 */
210 class wxRichTextParagraphStyleDefinition : public wxRichTextStyleDefinition
211 {
212 public:
213 /**
214 Constructor.
215 */
216 wxRichTextParagraphStyleDefinition(const wxString& name = wxEmptyString);
217
218 /**
219 Destructor.
220 */
221 virtual ~wxRichTextParagraphStyleDefinition();
222
223 /**
224 Returns the style that should normally follow this style.
225 */
226 const wxString& GetNextStyle() const;
227
228 /**
229 Sets the style that should normally follow this style.
230 */
231 void SetNextStyle(const wxString& name);
232 };
233
234
235
236 /**
237 @class wxRichTextStyleListBox
238
239 This is a listbox that can display the styles in a wxRichTextStyleSheet,
240 and apply the selection to an associated wxRichTextCtrl.
241
242 See @c samples/richtext for an example of how to use it.
243
244 @library{wxrichtext}
245 @category{richtext}
246
247 @see wxRichTextStyleComboCtrl, @ref overview_richtextctrl
248 */
249 class wxRichTextStyleListBox : public wxHtmlListBox
250 {
251 public:
252 /**
253 Constructor.
254 */
255 wxRichTextStyleListBox(wxWindow* parent,
256 wxWindowID id = wxID_ANY,
257 const wxPoint& pos = wxDefaultPosition,
258 const wxSize& size = wxDefaultSize,
259 long style = 0);
260
261 /**
262 Destructor.
263 */
264 virtual ~wxRichTextStyleListBox();
265
266 /**
267 Applies the @e ith style to the associated rich text control.
268 */
269 void ApplyStyle(int i);
270
271 /**
272 Converts units in tenths of a millimetre to device units.
273 */
274 int ConvertTenthsMMToPixels(wxDC& dc, int units) const;
275
276 /**
277 Creates a suitable HTML fragment for a definition.
278 */
279 wxString CreateHTML(wxRichTextStyleDefinition* def) const;
280
281 /**
282 If the return value is @true, clicking on a style name in the list will
283 immediately apply the style to the associated rich text control.
284 */
285 bool GetApplyOnSelection() const;
286
287 /**
288 Returns the wxRichTextCtrl associated with this listbox.
289 */
290 wxRichTextCtrl* GetRichTextCtrl() const;
291
292 /**
293 Gets a style for a listbox index.
294 */
295 wxRichTextStyleDefinition* GetStyle(size_t i) const;
296
297 /**
298 Returns the style sheet associated with this listbox.
299 */
300 wxRichTextStyleSheet* GetStyleSheet() const;
301
302 /**
303 Returns the type of style to show in the list box.
304 */
305 wxRichTextStyleListBox::wxRichTextStyleType GetStyleType() const;
306
307 /**
308 Implements left click behaviour, applying the clicked style to the
309 wxRichTextCtrl.
310 */
311 void OnLeftDown(wxMouseEvent& event);
312
313 /**
314 If @a applyOnSelection is @true, clicking on a style name in the list will
315 immediately apply the style to the associated rich text control.
316 */
317 void SetApplyOnSelection(bool applyOnSelection);
318
319 /**
320 Associates the listbox with a wxRichTextCtrl.
321 */
322 void SetRichTextCtrl(wxRichTextCtrl* ctrl);
323
324 /**
325 Associates the control with a style sheet.
326 */
327 void SetStyleSheet(wxRichTextStyleSheet* styleSheet);
328
329 /**
330 Sets the style type to display. One of
331 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_ALL,
332 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_PARAGRAPH,
333 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_CHARACTER
334 - wxRichTextStyleListBox::wxRICHTEXT_STYLE_LIST.
335 */
336 void SetStyleType(wxRichTextStyleListBox::wxRichTextStyleType styleType);
337
338 /**
339 Updates the list from the associated style sheet.
340 */
341 void UpdateStyles();
342
343 protected:
344
345 /**
346 Returns the HTML for this item.
347 */
348 virtual wxString OnGetItem(size_t n) const;
349 };
350
351
352
353 /**
354 @class wxRichTextStyleComboCtrl
355
356 This is a combo control that can display the styles in a wxRichTextStyleSheet,
357 and apply the selection to an associated wxRichTextCtrl.
358
359 See @c samples/richtext for an example of how to use it.
360
361 @library{wxrichtext}
362 @category{richtext}
363
364 @see wxRichTextStyleListBox, @ref overview_richtextctrl
365 */
366 class wxRichTextStyleComboCtrl : public wxComboCtrl
367 {
368 public:
369 /**
370 Constructor.
371 */
372 wxRichTextStyleComboCtrl(wxWindow* parent,
373 wxWindowID id = wxID_ANY,
374 const wxPoint& pos = wxDefaultPosition,
375 const wxSize& size = wxDefaultSize,
376 long style = 0);
377
378 /**
379 Destructor.
380 */
381 virtual ~wxRichTextStyleComboCtrl();
382
383 /**
384 Returns the wxRichTextCtrl associated with this control.
385 */
386 wxRichTextCtrl* GetRichTextCtrl() const;
387
388 /**
389 Returns the style sheet associated with this control.
390 */
391 wxRichTextStyleSheet* GetStyleSheet() const;
392
393 /**
394 Associates the control with a wxRichTextCtrl.
395 */
396 void SetRichTextCtrl(wxRichTextCtrl* ctrl);
397
398 /**
399 Associates the control with a style sheet.
400 */
401 void SetStyleSheet(wxRichTextStyleSheet* styleSheet);
402
403 /**
404 Updates the combo control from the associated style sheet.
405 */
406 void UpdateStyles();
407 };
408
409
410
411 /**
412 @class wxRichTextCharacterStyleDefinition
413
414 This class represents a character style definition, usually added to a
415 wxRichTextStyleSheet.
416
417 @library{wxrichtext}
418 @category{richtext}
419 */
420 class wxRichTextCharacterStyleDefinition : public wxRichTextStyleDefinition
421 {
422 public:
423 /**
424 Constructor.
425 */
426 wxRichTextCharacterStyleDefinition(const wxString& name = wxEmptyString);
427
428 /**
429 Destructor.
430 */
431 virtual ~wxRichTextCharacterStyleDefinition();
432 };
433
434
435
436 /**
437 @class wxRichTextListStyleDefinition
438
439 This class represents a list style definition, usually added to a
440 wxRichTextStyleSheet.
441
442 The class inherits paragraph attributes from wxRichTextStyleParagraphDefinition,
443 and adds 10 further attribute objects, one for each level of a list.
444 When applying a list style to a paragraph, the list style's base and
445 appropriate level attributes are merged with the paragraph's existing attributes.
446
447 You can apply a list style to one or more paragraphs using wxRichTextCtrl::SetListStyle.
448 You can also use the functions wxRichTextCtrl::NumberList, wxRichTextCtrl::PromoteList and
449 wxRichTextCtrl::ClearListStyle.
450
451 As usual, there are wxRichTextBuffer versions of these functions
452 so that you can apply them directly to a buffer without requiring a control.
453
454 @library{wxrichtext}
455 @category{richtext}
456 */
457 class wxRichTextListStyleDefinition : public wxRichTextParagraphStyleDefinition
458 {
459 public:
460 /**
461 Constructor.
462 */
463 wxRichTextListStyleDefinition(const wxString& name = wxEmptyString);
464
465 /**
466 Destructor.
467 */
468 virtual ~wxRichTextListStyleDefinition();
469
470 /**
471 This function combines the given paragraph style with the list style's base
472 attributes and level style matching the given indent, returning the combined attributes.
473
474 If @a styleSheet is specified, the base style for this definition will also be
475 included in the result.
476 */
477 wxTextAttr CombineWithParagraphStyle(int indent,
478 const wxTextAttr& paraStyle,
479 wxRichTextStyleSheet* styleSheet = NULL);
480
481 /**
482 This function finds the level (from 0 to 9) whose indentation attribute mostly
483 closely matches @a indent (expressed in tenths of a millimetre).
484 */
485 int FindLevelForIndent(int indent) const;
486
487 /**
488 This function combines the list style's base attributes and the level style
489 matching the given indent, returning the combined attributes.
490
491 If @a styleSheet is specified, the base style for this definition will also be
492 included in the result.
493 */
494 wxTextAttr GetCombinedStyle(int indent,
495 wxRichTextStyleSheet* styleSheet = NULL);
496
497 /**
498 This function combines the list style's base attributes and the style for the
499 specified level, returning the combined attributes.
500
501 If @a styleSheet is specified, the base style for this definition will also be
502 included in the result.
503 */
504
505 wxTextAttr GetCombinedStyleForLevel(int level,
506 wxRichTextStyleSheet* styleSheet = NULL) const;
507
508 /**
509 Returns the style for the given level. @a level is a number between 0 and 9.
510 */
511 const wxTextAttr* GetLevelAttributes(int level) const;
512
513 /**
514 Returns the number of levels. This is hard-wired to 10.
515 Returns the style for the given level. @e level is a number between 0 and 9.
516 */
517 int GetLevelCount() const;
518
519 /**
520 Returns @true if the given level has numbered list attributes.
521 */
522 bool IsNumbered(int level) const;
523
524 /**
525 Sets the style for the given level. @a level is a number between 0 and 9.
526 The first and most flexible form uses a wxTextAttr object, while the second
527 form is for convenient setting of the most commonly-used attributes.
528 */
529 void SetLevelAttributes(int level, const wxTextAttr& attr);
530 };
531
532
533
534 /**
535 @class wxRichTextStyleSheet
536
537 A style sheet contains named paragraph and character styles that make it
538 easy for a user to apply combinations of attributes to a wxRichTextCtrl.
539
540 You can use a wxRichTextStyleListBox in your user interface to show available
541 styles to the user, and allow application of styles to the control.
542
543 @library{wxrichtext}
544 @category{richtext}
545 */
546 class wxRichTextStyleSheet : public wxObject
547 {
548 public:
549 /**
550 Constructor.
551 */
552 wxRichTextStyleSheet();
553
554 /**
555 Destructor.
556 */
557 virtual ~wxRichTextStyleSheet();
558
559 /**
560 Adds a definition to the character style list.
561 */
562 bool AddCharacterStyle(wxRichTextCharacterStyleDefinition* def);
563
564 /**
565 Adds a definition to the list style list.
566 */
567 bool AddListStyle(wxRichTextListStyleDefinition* def);
568
569 /**
570 Adds a definition to the paragraph style list.
571 */
572 bool AddParagraphStyle(wxRichTextParagraphStyleDefinition* def);
573
574 /**
575 Adds a definition to the appropriate style list.
576 */
577 bool AddStyle(wxRichTextStyleDefinition* def);
578
579 /**
580 Deletes all styles.
581 */
582 void DeleteStyles();
583
584 /**
585 Finds a character definition by name.
586 */
587 wxRichTextCharacterStyleDefinition* FindCharacterStyle(const wxString& name,
588 bool recurse = true) const;
589
590 /**
591 Finds a list definition by name.
592 */
593 wxRichTextListStyleDefinition* FindListStyle(const wxString& name,
594 bool recurse = true) const;
595
596 /**
597 Finds a paragraph definition by name.
598 */
599 wxRichTextParagraphStyleDefinition* FindParagraphStyle(const wxString& name,
600 bool recurse = true) const;
601
602 /**
603 Finds a style definition by name.
604 */
605 wxRichTextStyleDefinition* FindStyle(const wxString& name) const;
606
607 /**
608 Returns the @e nth character style.
609 */
610 wxRichTextCharacterStyleDefinition* GetCharacterStyle(size_t n) const;
611
612 /**
613 Returns the number of character styles.
614 */
615 size_t GetCharacterStyleCount() const;
616
617 /**
618 Returns the style sheet's description.
619 */
620 const wxString& GetDescription() const;
621
622 /**
623 Returns the @e nth list style.
624 */
625 wxRichTextListStyleDefinition* GetListStyle(size_t n) const;
626
627 /**
628 Returns the number of list styles.
629 */
630 size_t GetListStyleCount() const;
631
632 /**
633 Returns the style sheet's name.
634 */
635 const wxString& GetName() const;
636
637 /**
638 Returns the @e nth paragraph style.
639 */
640 wxRichTextParagraphStyleDefinition* GetParagraphStyle(size_t n) const;
641
642 /**
643 Returns the number of paragraph styles.
644 */
645 size_t GetParagraphStyleCount() const;
646
647 /**
648 Removes a character style.
649 */
650 bool RemoveCharacterStyle(wxRichTextStyleDefinition* def,
651 bool deleteStyle = false);
652
653 /**
654 Removes a list style.
655 */
656 bool RemoveListStyle(wxRichTextStyleDefinition* def,
657 bool deleteStyle = false);
658
659 /**
660 Removes a paragraph style.
661 */
662 bool RemoveParagraphStyle(wxRichTextStyleDefinition* def,
663 bool deleteStyle = false);
664
665 /**
666 Removes a style.
667 */
668 bool RemoveStyle(wxRichTextStyleDefinition* def,
669 bool deleteStyle = false);
670
671 /**
672 Sets the style sheet's description.
673 */
674 void SetDescription(const wxString& descr);
675
676 /**
677 Sets the style sheet's name.
678 */
679 void SetName(const wxString& name);
680
681 /**
682 Returns the sheet's properties.
683 */
684 wxRichTextProperties& GetProperties();
685
686 /**
687 Returns the sheet's properties.
688 */
689 const wxRichTextProperties& GetProperties() const;
690
691 /**
692 Sets the sheet's properties.
693 */
694 void SetProperties(const wxRichTextProperties& props);
695 };
696