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
7// RCS-ID:      $Id: richtextformatdlg.h 49946 2007-11-14 14:22:56Z JS $
8// Copyright:   (c) Julian Smart
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_RICHTEXTFORMATDLG_H_
13#define _WX_RICHTEXTFORMATDLG_H_
14
15/*!
16 * Includes
17 */
18
19#include "wx/defs.h"
20
21#if wxUSE_RICHTEXT
22
23#include "wx/propdlg.h"
24#include "wx/bookctrl.h"
25
26#if wxUSE_HTML
27#include "wx/htmllbox.h"
28#endif
29
30#include "wx/richtext/richtextbuffer.h"
31#include "wx/richtext/richtextstyles.h"
32
33class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFormattingDialog;
34class WXDLLIMPEXP_FWD_CORE wxImageList;
35
36/*!
37 * Flags determining the pages and buttons to be created in the dialog
38 */
39
40#define wxRICHTEXT_FORMAT_STYLE_EDITOR      0x0001
41#define wxRICHTEXT_FORMAT_FONT              0x0002
42#define wxRICHTEXT_FORMAT_TABS              0x0004
43#define wxRICHTEXT_FORMAT_BULLETS           0x0008
44#define wxRICHTEXT_FORMAT_INDENTS_SPACING   0x0010
45#define wxRICHTEXT_FORMAT_LIST_STYLE        0x0020
46
47#define wxRICHTEXT_FORMAT_HELP_BUTTON       0x0100
48
49/*!
50 * Indices for bullet styles in list control
51 */
52
53enum {
54    wxRICHTEXT_BULLETINDEX_NONE = 0,
55    wxRICHTEXT_BULLETINDEX_ARABIC,
56    wxRICHTEXT_BULLETINDEX_UPPER_CASE,
57    wxRICHTEXT_BULLETINDEX_LOWER_CASE,
58    wxRICHTEXT_BULLETINDEX_UPPER_CASE_ROMAN,
59    wxRICHTEXT_BULLETINDEX_LOWER_CASE_ROMAN,
60    wxRICHTEXT_BULLETINDEX_OUTLINE,
61    wxRICHTEXT_BULLETINDEX_SYMBOL,
62    wxRICHTEXT_BULLETINDEX_BITMAP,
63    wxRICHTEXT_BULLETINDEX_STANDARD
64};
65
66/*!
67 * Shorthand for common combinations of pages
68 */
69
70#define wxRICHTEXT_FORMAT_PARAGRAPH         (wxRICHTEXT_FORMAT_INDENTS_SPACING | wxRICHTEXT_FORMAT_BULLETS | wxRICHTEXT_FORMAT_TABS | wxRICHTEXT_FORMAT_FONT)
71#define wxRICHTEXT_FORMAT_CHARACTER         (wxRICHTEXT_FORMAT_FONT)
72#define wxRICHTEXT_FORMAT_STYLE             (wxRICHTEXT_FORMAT_PARAGRAPH | wxRICHTEXT_FORMAT_STYLE_EDITOR)
73
74/*!
75 * Factory for formatting dialog
76 */
77
78class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialogFactory: public wxObject
79{
80public:
81    wxRichTextFormattingDialogFactory() {}
82    virtual ~wxRichTextFormattingDialogFactory() {}
83
84// Overrideables
85
86    /// Create all pages, under the dialog's book control, also calling AddPage
87    virtual bool CreatePages(long pages, wxRichTextFormattingDialog* dialog);
88
89    /// Create a page, given a page identifier
90    virtual wxPanel* CreatePage(int page, wxString& title, wxRichTextFormattingDialog* dialog);
91
92    /// Enumerate all available page identifiers
93    virtual int GetPageId(int i) const;
94
95    /// Get the number of available page identifiers
96    virtual int GetPageIdCount() const;
97
98    /// Get the image index for the given page identifier
99    virtual int GetPageImage(int WXUNUSED(id)) const { return -1; }
100
101    /// Invoke help for the dialog
102    virtual bool ShowHelp(int WXUNUSED(page), wxRichTextFormattingDialog* WXUNUSED(dialog)) { return false; }
103
104    /// Set the sheet style, called at the start of wxRichTextFormattingDialog::Create
105    virtual bool SetSheetStyle(wxRichTextFormattingDialog* dialog);
106
107    /// Create the main dialog buttons
108    virtual bool CreateButtons(wxRichTextFormattingDialog* dialog);
109};
110
111/*!
112 * Formatting dialog for a wxRichTextCtrl
113 */
114
115class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialog: public wxPropertySheetDialog
116{
117DECLARE_CLASS(wxRichTextFormattingDialog)
118public:
119    wxRichTextFormattingDialog() { Init(); }
120
121    wxRichTextFormattingDialog(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY,
122        const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize,
123        long style = wxDEFAULT_DIALOG_STYLE)
124    {
125        Init();
126        Create(flags, parent, title, id, pos, sz, style);
127    }
128
129    ~wxRichTextFormattingDialog();
130
131    void Init();
132
133    bool Create(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY,
134        const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize,
135        long style = wxDEFAULT_DIALOG_STYLE);
136
137    /// Get attributes from the given range
138    virtual bool GetStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range);
139
140    /// Set the attributes and optionally update the display
141    virtual bool SetStyle(const wxTextAttrEx& style, bool update = true);
142
143    /// Set the style definition and optionally update the display
144    virtual bool SetStyleDefinition(const wxRichTextStyleDefinition& styleDef, wxRichTextStyleSheet* sheet, bool update = true);
145
146    /// Get the style definition, if any
147    virtual wxRichTextStyleDefinition* GetStyleDefinition() const { return m_styleDefinition; }
148
149    /// Get the style sheet, if any
150    virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; }
151
152    /// Update the display
153    virtual bool UpdateDisplay();
154
155    /// Apply attributes to the given range
156    virtual bool ApplyStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_OPTIMIZE);
157
158    /// Gets and sets the attributes
159    const wxTextAttrEx& GetAttributes() const { return m_attributes; }
160    wxTextAttrEx& GetAttributes() { return m_attributes; }
161    void SetAttributes(const wxTextAttrEx& attr) { m_attributes = attr; }
162
163    /// Transfers the data and from to the window
164    virtual bool TransferDataToWindow();
165    virtual bool TransferDataFromWindow();
166
167    /// Apply the styles when a different tab is selected, so the previews are
168    /// up to date
169    void OnTabChanged(wxBookCtrlEvent& event);
170
171    /// Respond to help command
172    void OnHelp(wxCommandEvent& event);
173
174    /// Set/get image list
175    void SetImageList(wxImageList* imageList) { m_imageList = imageList; }
176    wxImageList* GetImageList() const { return m_imageList; }
177
178    /// Get/set formatting factory object
179    static void SetFormattingDialogFactory(wxRichTextFormattingDialogFactory* factory);
180    static wxRichTextFormattingDialogFactory* GetFormattingDialogFactory() { return ms_FormattingDialogFactory; }
181
182    /// Helper for pages to get the top-level dialog
183    static wxRichTextFormattingDialog* GetDialog(wxWindow* win);
184
185    /// Helper for pages to get the attributes
186    static wxTextAttrEx* GetDialogAttributes(wxWindow* win);
187
188    /// Helper for pages to get the style
189    static wxRichTextStyleDefinition* GetDialogStyleDefinition(wxWindow* win);
190
191    /// Should we show tooltips?
192    static bool ShowToolTips() { return sm_showToolTips; }
193
194    /// Determines whether tooltips will be shown
195    static void SetShowToolTips(bool show) { sm_showToolTips = show; }
196
197    /// Map book control page index to our page id
198    void AddPageId(int id) { m_pageIds.Add(id); }
199
200protected:
201
202    wxImageList*                                m_imageList;
203    wxTextAttrEx                                m_attributes;
204    wxRichTextStyleDefinition*                  m_styleDefinition;
205    wxRichTextStyleSheet*                       m_styleSheet;
206    wxArrayInt                                  m_pageIds; // mapping of book control indexes to page ids
207
208    static wxRichTextFormattingDialogFactory*   ms_FormattingDialogFactory;
209    static bool                                 sm_showToolTips;
210
211DECLARE_EVENT_TABLE()
212};
213
214//-----------------------------------------------------------------------------
215// helper class - wxRichTextFontPreviewCtrl
216//-----------------------------------------------------------------------------
217
218class WXDLLIMPEXP_RICHTEXT wxRichTextFontPreviewCtrl : public wxWindow
219{
220public:
221    wxRichTextFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0)
222    {
223        if ((style & wxBORDER_MASK) == wxBORDER_DEFAULT)
224#ifdef __WXMSW__
225            style |= GetThemedBorderStyle();
226#else
227            style |= wxBORDER_SUNKEN;
228#endif
229        wxWindow::Create(parent, id, pos, sz, style);
230
231        SetBackgroundColour(*wxWHITE);
232        m_textEffects = 0;
233    }
234
235    void SetTextEffects(int effects) { m_textEffects = effects; }
236    int GetTextEffects() const { return m_textEffects; }
237
238private:
239    int m_textEffects;
240
241    void OnPaint(wxPaintEvent& event);
242    DECLARE_EVENT_TABLE()
243};
244
245/*
246 * A control for displaying a small preview of a colour or bitmap
247 */
248
249class WXDLLIMPEXP_RICHTEXT wxRichTextColourSwatchCtrl: public wxControl
250{
251    DECLARE_CLASS(wxRichTextColourSwatchCtrl)
252public:
253    wxRichTextColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0);
254    ~wxRichTextColourSwatchCtrl();
255
256    void OnMouseEvent(wxMouseEvent& event);
257
258    void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); }
259
260    wxColour& GetColour() { return m_colour; }
261
262    virtual wxSize DoGetBestSize() const { return GetSize(); }
263
264protected:
265    wxColour    m_colour;
266
267DECLARE_EVENT_TABLE()
268};
269
270/*!
271 * wxRichTextFontListBox class declaration
272 * A listbox to display fonts.
273 */
274
275class WXDLLIMPEXP_RICHTEXT wxRichTextFontListBox: public wxHtmlListBox
276{
277    DECLARE_CLASS(wxRichTextFontListBox)
278    DECLARE_EVENT_TABLE()
279
280public:
281    wxRichTextFontListBox()
282    {
283        Init();
284    }
285    wxRichTextFontListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
286        const wxSize& size = wxDefaultSize, long style = 0);
287    virtual ~wxRichTextFontListBox();
288
289    void Init()
290    {
291    }
292
293    bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
294        const wxSize& size = wxDefaultSize, long style = 0);
295
296    /// Creates a suitable HTML fragment for a font
297    wxString CreateHTML(const wxString& facename) const;
298
299    /// Get font name for index
300    wxString GetFaceName(size_t i) const ;
301
302    /// Set selection for string, returning the index.
303    int SetFaceNameSelection(const wxString& name);
304
305    /// Updates the font list
306    void UpdateFonts();
307
308    /// Does this face name exist?
309    bool HasFaceName(const wxString& faceName) const { return m_faceNames.Index(faceName) != wxNOT_FOUND; }
310
311    /// Returns the array of face names
312    const wxArrayString& GetFaceNames() const { return m_faceNames; }
313
314protected:
315    /// Returns the HTML for this item
316    virtual wxString OnGetItem(size_t n) const;
317
318private:
319
320    wxArrayString           m_faceNames;
321};
322
323#endif
324    // wxUSE_RICHTEXT
325
326#endif
327    // _WX_RICHTEXTFORMATDLG_H_
328