]> git.saurik.com Git - wxWidgets.git/blame - include/wx/richtext/richtextformatdlg.h
Fix wxPropertyGrid::GetPropertyRect when the last item is collapsed.
[wxWidgets.git] / include / wx / richtext / richtextformatdlg.h
CommitLineData
97ff49b3
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: wx/richtext/richtextformatdlg.h
3// Purpose: Formatting dialog for wxRichTextCtrl
4// Author: Julian Smart
5// Modified by:
6// Created: 2006-10-01
97ff49b3
JS
7// Copyright: (c) Julian Smart
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11#ifndef _WX_RICHTEXTFORMATDLG_H_
12#define _WX_RICHTEXTFORMATDLG_H_
13
14/*!
15 * Includes
16 */
17
18#include "wx/defs.h"
19
20#if wxUSE_RICHTEXT
21
22#include "wx/propdlg.h"
2b741a39 23#include "wx/bookctrl.h"
abfdefed 24#include "wx/withimages.h"
2b741a39 25
97ff49b3
JS
26#if wxUSE_HTML
27#include "wx/htmllbox.h"
28#endif
29
30#include "wx/richtext/richtextbuffer.h"
31#include "wx/richtext/richtextstyles.h"
603f702b 32#include "wx/richtext/richtextuicustomization.h"
97ff49b3 33
b5dbe15d 34class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFormattingDialog;
2be72ac2
JS
35class WXDLLIMPEXP_FWD_CORE wxComboBox;
36class WXDLLIMPEXP_FWD_CORE wxCheckBox;
97ff49b3
JS
37
38/*!
dadd4f55 39 * Flags determining the pages and buttons to be created in the dialog
97ff49b3
JS
40 */
41
42#define wxRICHTEXT_FORMAT_STYLE_EDITOR 0x0001
43#define wxRICHTEXT_FORMAT_FONT 0x0002
44#define wxRICHTEXT_FORMAT_TABS 0x0004
45#define wxRICHTEXT_FORMAT_BULLETS 0x0008
46#define wxRICHTEXT_FORMAT_INDENTS_SPACING 0x0010
dadd4f55 47#define wxRICHTEXT_FORMAT_LIST_STYLE 0x0020
603f702b
JS
48#define wxRICHTEXT_FORMAT_MARGINS 0x0040
49#define wxRICHTEXT_FORMAT_SIZE 0x0080
50#define wxRICHTEXT_FORMAT_BORDERS 0x0100
51#define wxRICHTEXT_FORMAT_BACKGROUND 0x0200
dadd4f55 52
603f702b 53#define wxRICHTEXT_FORMAT_HELP_BUTTON 0x1000
97ff49b3 54
d2d0adc7
JS
55/*!
56 * Indices for bullet styles in list control
57 */
58
59enum {
60 wxRICHTEXT_BULLETINDEX_NONE = 0,
61 wxRICHTEXT_BULLETINDEX_ARABIC,
62 wxRICHTEXT_BULLETINDEX_UPPER_CASE,
63 wxRICHTEXT_BULLETINDEX_LOWER_CASE,
64 wxRICHTEXT_BULLETINDEX_UPPER_CASE_ROMAN,
65 wxRICHTEXT_BULLETINDEX_LOWER_CASE_ROMAN,
66 wxRICHTEXT_BULLETINDEX_OUTLINE,
67 wxRICHTEXT_BULLETINDEX_SYMBOL,
68 wxRICHTEXT_BULLETINDEX_BITMAP,
69 wxRICHTEXT_BULLETINDEX_STANDARD
70};
71
97ff49b3
JS
72/*!
73 * Shorthand for common combinations of pages
74 */
75
76#define wxRICHTEXT_FORMAT_PARAGRAPH (wxRICHTEXT_FORMAT_INDENTS_SPACING | wxRICHTEXT_FORMAT_BULLETS | wxRICHTEXT_FORMAT_TABS | wxRICHTEXT_FORMAT_FONT)
77#define wxRICHTEXT_FORMAT_CHARACTER (wxRICHTEXT_FORMAT_FONT)
78#define wxRICHTEXT_FORMAT_STYLE (wxRICHTEXT_FORMAT_PARAGRAPH | wxRICHTEXT_FORMAT_STYLE_EDITOR)
79
80/*!
81 * Factory for formatting dialog
82 */
83
84class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialogFactory: public wxObject
85{
86public:
87 wxRichTextFormattingDialogFactory() {}
88 virtual ~wxRichTextFormattingDialogFactory() {}
89
d13b34d3 90// Overridables
97ff49b3
JS
91
92 /// Create all pages, under the dialog's book control, also calling AddPage
93 virtual bool CreatePages(long pages, wxRichTextFormattingDialog* dialog);
94
95 /// Create a page, given a page identifier
96 virtual wxPanel* CreatePage(int page, wxString& title, wxRichTextFormattingDialog* dialog);
97
98 /// Enumerate all available page identifiers
99 virtual int GetPageId(int i) const;
100
101 /// Get the number of available page identifiers
102 virtual int GetPageIdCount() const;
103
104 /// Get the image index for the given page identifier
105 virtual int GetPageImage(int WXUNUSED(id)) const { return -1; }
106
107 /// Invoke help for the dialog
603f702b 108 virtual bool ShowHelp(int page, wxRichTextFormattingDialog* dialog);
97ff49b3
JS
109
110 /// Set the sheet style, called at the start of wxRichTextFormattingDialog::Create
111 virtual bool SetSheetStyle(wxRichTextFormattingDialog* dialog);
112
113 /// Create the main dialog buttons
114 virtual bool CreateButtons(wxRichTextFormattingDialog* dialog);
115};
116
117/*!
118 * Formatting dialog for a wxRichTextCtrl
119 */
120
abfdefed
VZ
121class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialog: public wxPropertySheetDialog,
122 public wxWithImages
97ff49b3
JS
123{
124DECLARE_CLASS(wxRichTextFormattingDialog)
603f702b
JS
125DECLARE_HELP_PROVISION()
126
97ff49b3 127public:
32423dd8
JS
128 enum { Option_AllowPixelFontSize = 0x0001 };
129
97ff49b3
JS
130 wxRichTextFormattingDialog() { Init(); }
131
be6d15fb 132 wxRichTextFormattingDialog(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY,
97ff49b3
JS
133 const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize,
134 long style = wxDEFAULT_DIALOG_STYLE)
135 {
136 Init();
137 Create(flags, parent, title, id, pos, sz, style);
138 }
139
140 ~wxRichTextFormattingDialog();
141
142 void Init();
143
be6d15fb 144 bool Create(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY,
97ff49b3
JS
145 const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize,
146 long style = wxDEFAULT_DIALOG_STYLE);
147
148 /// Get attributes from the given range
149 virtual bool GetStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range);
150
151 /// Set the attributes and optionally update the display
24777478 152 virtual bool SetStyle(const wxRichTextAttr& style, bool update = true);
97ff49b3
JS
153
154 /// Set the style definition and optionally update the display
155 virtual bool SetStyleDefinition(const wxRichTextStyleDefinition& styleDef, wxRichTextStyleSheet* sheet, bool update = true);
156
157 /// Get the style definition, if any
158 virtual wxRichTextStyleDefinition* GetStyleDefinition() const { return m_styleDefinition; }
159
160 /// Get the style sheet, if any
161 virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; }
162
163 /// Update the display
164 virtual bool UpdateDisplay();
165
166 /// Apply attributes to the given range
167 virtual bool ApplyStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_OPTIMIZE);
32423dd8 168
603f702b
JS
169 /// Apply attributes to the object being edited, if any
170 virtual bool ApplyStyle(wxRichTextCtrl* ctrl, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
97ff49b3
JS
171
172 /// Gets and sets the attributes
24777478
JS
173 const wxRichTextAttr& GetAttributes() const { return m_attributes; }
174 wxRichTextAttr& GetAttributes() { return m_attributes; }
175 void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; }
32423dd8
JS
176
177 /// Sets the dialog options, determining what the interface presents to the user.
178 /// Currently the only option is Option_AllowPixelFontSize.
179 void SetOptions(int options) { m_options = options; }
180
181 /// Gets the dialog options, determining what the interface presents to the user.
182 /// Currently the only option is Option_AllowPixelFontSize.
183 int GetOptions() const { return m_options; }
184
185 /// Returns @true if the given option is present.
186 bool HasOption(int option) const { return (m_options & option) != 0; }
187
603f702b
JS
188 /// If editing the attributes for a particular object, such as an image,
189 /// set the object so the code can initialize attributes such as size correctly.
190 wxRichTextObject* GetObject() const { return m_object; }
191 void SetObject(wxRichTextObject* obj) { m_object = obj; }
97ff49b3
JS
192
193 /// Transfers the data and from to the window
194 virtual bool TransferDataToWindow();
195 virtual bool TransferDataFromWindow();
196
197 /// Apply the styles when a different tab is selected, so the previews are
198 /// up to date
2b741a39 199 void OnTabChanged(wxBookCtrlEvent& event);
97ff49b3 200
1807a1f3
JS
201 /// Respond to help command
202 void OnHelp(wxCommandEvent& event);
603f702b 203 void OnUpdateHelp(wxUpdateUIEvent& event);
1807a1f3 204
97ff49b3
JS
205 /// Get/set formatting factory object
206 static void SetFormattingDialogFactory(wxRichTextFormattingDialogFactory* factory);
207 static wxRichTextFormattingDialogFactory* GetFormattingDialogFactory() { return ms_FormattingDialogFactory; }
208
209 /// Helper for pages to get the top-level dialog
210 static wxRichTextFormattingDialog* GetDialog(wxWindow* win);
211
212 /// Helper for pages to get the attributes
24777478 213 static wxRichTextAttr* GetDialogAttributes(wxWindow* win);
97ff49b3 214
603f702b
JS
215 /// Helper for pages to get the reset attributes
216 static wxRichTextAttr* GetDialogResetAttributes(wxWindow* win);
217
97ff49b3
JS
218 /// Helper for pages to get the style
219 static wxRichTextStyleDefinition* GetDialogStyleDefinition(wxWindow* win);
220
dadd4f55
JS
221 /// Should we show tooltips?
222 static bool ShowToolTips() { return sm_showToolTips; }
41a85215 223
dadd4f55
JS
224 /// Determines whether tooltips will be shown
225 static void SetShowToolTips(bool show) { sm_showToolTips = show; }
41a85215 226
603f702b
JS
227 /// Set the dimension into the value and units controls
228 static void SetDimensionValue(wxTextAttrDimension& dim, wxTextCtrl* valueCtrl, wxComboBox* unitsCtrl, wxCheckBox* checkBox);
229
230 /// Get the dimension from the value and units controls
231 static void GetDimensionValue(wxTextAttrDimension& dim, wxTextCtrl* valueCtrl, wxComboBox* unitsCtrl, wxCheckBox* checkBox);
32423dd8 232
603f702b
JS
233 /// Convert CM to MM
234 static bool ConvertFromString(const wxString& string, int& ret, int scale);
235
1807a1f3
JS
236 /// Map book control page index to our page id
237 void AddPageId(int id) { m_pageIds.Add(id); }
32423dd8 238
603f702b
JS
239 /// Find a page by class
240 wxWindow* FindPage(wxClassInfo* info) const;
1807a1f3 241
97ff49b3
JS
242protected:
243
24777478 244 wxRichTextAttr m_attributes;
97ff49b3
JS
245 wxRichTextStyleDefinition* m_styleDefinition;
246 wxRichTextStyleSheet* m_styleSheet;
603f702b 247 wxRichTextObject* m_object;
1807a1f3 248 wxArrayInt m_pageIds; // mapping of book control indexes to page ids
32423dd8 249 int m_options; // UI options
97ff49b3
JS
250
251 static wxRichTextFormattingDialogFactory* ms_FormattingDialogFactory;
dadd4f55 252 static bool sm_showToolTips;
97ff49b3
JS
253
254DECLARE_EVENT_TABLE()
255};
256
257//-----------------------------------------------------------------------------
258// helper class - wxRichTextFontPreviewCtrl
259//-----------------------------------------------------------------------------
260
261class WXDLLIMPEXP_RICHTEXT wxRichTextFontPreviewCtrl : public wxWindow
262{
263public:
2fce6547 264 wxRichTextFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0);
97ff49b3 265
42688aea
JS
266 void SetTextEffects(int effects) { m_textEffects = effects; }
267 int GetTextEffects() const { return m_textEffects; }
268
97ff49b3 269private:
42688aea
JS
270 int m_textEffects;
271
97ff49b3
JS
272 void OnPaint(wxPaintEvent& event);
273 DECLARE_EVENT_TABLE()
274};
275
276/*
277 * A control for displaying a small preview of a colour or bitmap
278 */
279
280class WXDLLIMPEXP_RICHTEXT wxRichTextColourSwatchCtrl: public wxControl
281{
282 DECLARE_CLASS(wxRichTextColourSwatchCtrl)
283public:
284 wxRichTextColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0);
285 ~wxRichTextColourSwatchCtrl();
286
97ff49b3
JS
287 void OnMouseEvent(wxMouseEvent& event);
288
289 void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); }
290
291 wxColour& GetColour() { return m_colour; }
292
293 virtual wxSize DoGetBestSize() const { return GetSize(); }
294
295protected:
296 wxColour m_colour;
297
298DECLARE_EVENT_TABLE()
299};
300
301/*!
302 * wxRichTextFontListBox class declaration
303 * A listbox to display fonts.
304 */
305
306class WXDLLIMPEXP_RICHTEXT wxRichTextFontListBox: public wxHtmlListBox
307{
308 DECLARE_CLASS(wxRichTextFontListBox)
309 DECLARE_EVENT_TABLE()
310
311public:
312 wxRichTextFontListBox()
313 {
314 Init();
315 }
316 wxRichTextFontListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
317 const wxSize& size = wxDefaultSize, long style = 0);
318 virtual ~wxRichTextFontListBox();
319
320 void Init()
321 {
322 }
323
324 bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
325 const wxSize& size = wxDefaultSize, long style = 0);
326
327 /// Creates a suitable HTML fragment for a font
328 wxString CreateHTML(const wxString& facename) const;
329
330 /// Get font name for index
331 wxString GetFaceName(size_t i) const ;
332
333 /// Set selection for string, returning the index.
334 int SetFaceNameSelection(const wxString& name);
335
336 /// Updates the font list
337 void UpdateFonts();
338
339 /// Does this face name exist?
340 bool HasFaceName(const wxString& faceName) const { return m_faceNames.Index(faceName) != wxNOT_FOUND; }
341
342 /// Returns the array of face names
343 const wxArrayString& GetFaceNames() const { return m_faceNames; }
344
345protected:
346 /// Returns the HTML for this item
347 virtual wxString OnGetItem(size_t n) const;
348
349private:
350
351 wxArrayString m_faceNames;
352};
353
354#endif
355 // wxUSE_RICHTEXT
356
357#endif
358 // _WX_RICHTEXTFORMATDLG_H_