///////////////////////////////////////////////////////////////////////////// // Name: wx/richtext/richtextformatdlg.h // Purpose: Formatting dialog for wxRichTextCtrl // Author: Julian Smart // Modified by: // Created: 2006-10-01 // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_RICHTEXTFORMATDLG_H_ #define _WX_RICHTEXTFORMATDLG_H_ /*! * Includes */ #include "wx/defs.h" #if wxUSE_RICHTEXT #include "wx/propdlg.h" #include "wx/bookctrl.h" #include "wx/withimages.h" #include "wx/colourdata.h" #if wxUSE_HTML #include "wx/htmllbox.h" #endif #include "wx/richtext/richtextbuffer.h" #include "wx/richtext/richtextstyles.h" #include "wx/richtext/richtextuicustomization.h" class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFormattingDialog; class WXDLLIMPEXP_FWD_CORE wxComboBox; class WXDLLIMPEXP_FWD_CORE wxCheckBox; /*! * Flags determining the pages and buttons to be created in the dialog */ #define wxRICHTEXT_FORMAT_STYLE_EDITOR 0x0001 #define wxRICHTEXT_FORMAT_FONT 0x0002 #define wxRICHTEXT_FORMAT_TABS 0x0004 #define wxRICHTEXT_FORMAT_BULLETS 0x0008 #define wxRICHTEXT_FORMAT_INDENTS_SPACING 0x0010 #define wxRICHTEXT_FORMAT_LIST_STYLE 0x0020 #define wxRICHTEXT_FORMAT_MARGINS 0x0040 #define wxRICHTEXT_FORMAT_SIZE 0x0080 #define wxRICHTEXT_FORMAT_BORDERS 0x0100 #define wxRICHTEXT_FORMAT_BACKGROUND 0x0200 #define wxRICHTEXT_FORMAT_HELP_BUTTON 0x1000 /*! * Indices for bullet styles in list control */ enum { wxRICHTEXT_BULLETINDEX_NONE = 0, wxRICHTEXT_BULLETINDEX_ARABIC, wxRICHTEXT_BULLETINDEX_UPPER_CASE, wxRICHTEXT_BULLETINDEX_LOWER_CASE, wxRICHTEXT_BULLETINDEX_UPPER_CASE_ROMAN, wxRICHTEXT_BULLETINDEX_LOWER_CASE_ROMAN, wxRICHTEXT_BULLETINDEX_OUTLINE, wxRICHTEXT_BULLETINDEX_SYMBOL, wxRICHTEXT_BULLETINDEX_BITMAP, wxRICHTEXT_BULLETINDEX_STANDARD }; /*! * Shorthand for common combinations of pages */ #define wxRICHTEXT_FORMAT_PARAGRAPH (wxRICHTEXT_FORMAT_INDENTS_SPACING | wxRICHTEXT_FORMAT_BULLETS | wxRICHTEXT_FORMAT_TABS | wxRICHTEXT_FORMAT_FONT) #define wxRICHTEXT_FORMAT_CHARACTER (wxRICHTEXT_FORMAT_FONT) #define wxRICHTEXT_FORMAT_STYLE (wxRICHTEXT_FORMAT_PARAGRAPH | wxRICHTEXT_FORMAT_STYLE_EDITOR) /*! * Factory for formatting dialog */ class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialogFactory: public wxObject { public: wxRichTextFormattingDialogFactory() {} virtual ~wxRichTextFormattingDialogFactory() {} // Overridables /// Create all pages, under the dialog's book control, also calling AddPage virtual bool CreatePages(long pages, wxRichTextFormattingDialog* dialog); /// Create a page, given a page identifier virtual wxPanel* CreatePage(int page, wxString& title, wxRichTextFormattingDialog* dialog); /// Enumerate all available page identifiers virtual int GetPageId(int i) const; /// Get the number of available page identifiers virtual int GetPageIdCount() const; /// Get the image index for the given page identifier virtual int GetPageImage(int WXUNUSED(id)) const { return -1; } /// Invoke help for the dialog virtual bool ShowHelp(int page, wxRichTextFormattingDialog* dialog); /// Set the sheet style, called at the start of wxRichTextFormattingDialog::Create virtual bool SetSheetStyle(wxRichTextFormattingDialog* dialog); /// Create the main dialog buttons virtual bool CreateButtons(wxRichTextFormattingDialog* dialog); }; /*! * Formatting dialog for a wxRichTextCtrl */ class WXDLLIMPEXP_RICHTEXT wxRichTextFormattingDialog: public wxPropertySheetDialog, public wxWithImages { wxDECLARE_CLASS(wxRichTextFormattingDialog); DECLARE_HELP_PROVISION() public: enum { Option_AllowPixelFontSize = 0x0001 }; wxRichTextFormattingDialog() { Init(); } wxRichTextFormattingDialog(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE) { Init(); Create(flags, parent, title, id, pos, sz, style); } ~wxRichTextFormattingDialog(); void Init(); bool Create(long flags, wxWindow* parent, const wxString& title = wxGetTranslation(wxT("Formatting")), wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE); /// Get attributes from the given range virtual bool GetStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range); /// Set the attributes and optionally update the display virtual bool SetStyle(const wxRichTextAttr& style, bool update = true); /// Set the style definition and optionally update the display virtual bool SetStyleDefinition(const wxRichTextStyleDefinition& styleDef, wxRichTextStyleSheet* sheet, bool update = true); /// Get the style definition, if any virtual wxRichTextStyleDefinition* GetStyleDefinition() const { return m_styleDefinition; } /// Get the style sheet, if any virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } /// Update the display virtual bool UpdateDisplay(); /// Apply attributes to the given range virtual bool ApplyStyle(wxRichTextCtrl* ctrl, const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_OPTIMIZE); /// Apply attributes to the object being edited, if any virtual bool ApplyStyle(wxRichTextCtrl* ctrl, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO); /// Gets and sets the attributes const wxRichTextAttr& GetAttributes() const { return m_attributes; } wxRichTextAttr& GetAttributes() { return m_attributes; } void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; } /// Sets the dialog options, determining what the interface presents to the user. /// Currently the only option is Option_AllowPixelFontSize. void SetOptions(int options) { m_options = options; } /// Gets the dialog options, determining what the interface presents to the user. /// Currently the only option is Option_AllowPixelFontSize. int GetOptions() const { return m_options; } /// Returns @true if the given option is present. bool HasOption(int option) const { return (m_options & option) != 0; } /// If editing the attributes for a particular object, such as an image, /// set the object so the code can initialize attributes such as size correctly. wxRichTextObject* GetObject() const { return m_object; } void SetObject(wxRichTextObject* obj) { m_object = obj; } /// Transfers the data and from to the window virtual bool TransferDataToWindow() wxOVERRIDE; virtual bool TransferDataFromWindow() wxOVERRIDE; /// Apply the styles when a different tab is selected, so the previews are /// up to date void OnTabChanged(wxBookCtrlEvent& event); /// Respond to help command void OnHelp(wxCommandEvent& event); void OnUpdateHelp(wxUpdateUIEvent& event); /// Get/set formatting factory object static void SetFormattingDialogFactory(wxRichTextFormattingDialogFactory* factory); static wxRichTextFormattingDialogFactory* GetFormattingDialogFactory() { return ms_FormattingDialogFactory; } /// Helper for pages to get the top-level dialog static wxRichTextFormattingDialog* GetDialog(wxWindow* win); /// Helper for pages to get the attributes static wxRichTextAttr* GetDialogAttributes(wxWindow* win); /// Helper for pages to get the reset attributes static wxRichTextAttr* GetDialogResetAttributes(wxWindow* win); /// Helper for pages to get the style static wxRichTextStyleDefinition* GetDialogStyleDefinition(wxWindow* win); /// Should we show tooltips? static bool ShowToolTips() { return sm_showToolTips; } /// Determines whether tooltips will be shown static void SetShowToolTips(bool show) { sm_showToolTips = show; } /// Set the dimension into the value and units controls. Optionally pass units to /// specify the ordering of units in the combobox. static void SetDimensionValue(wxTextAttrDimension& dim, wxTextCtrl* valueCtrl, wxComboBox* unitsCtrl, wxCheckBox* checkBox, wxArrayInt* units = NULL); /// Get the dimension from the value and units controls Optionally pass units to /// specify the ordering of units in the combobox. static void GetDimensionValue(wxTextAttrDimension& dim, wxTextCtrl* valueCtrl, wxComboBox* unitsCtrl, wxCheckBox* checkBox, wxArrayInt* units = NULL); /// Convert from a string to a dimension integer. static bool ConvertFromString(const wxString& str, int& ret, int unit); /// Map book control page index to our page id void AddPageId(int id) { m_pageIds.Add(id); } /// Find a page by class wxWindow* FindPage(wxClassInfo* info) const; /// Whether to restore the last-selected page. static bool GetRestoreLastPage() { return sm_restoreLastPage; } static void SetRestoreLastPage(bool b) { sm_restoreLastPage = b; } /// The page identifier of the last page selected (not the control id) static int GetLastPage() { return sm_lastPage; } static void SetLastPage(int lastPage) { sm_lastPage = lastPage; } /// Sets the custom colour data for use by the colour dialog. static void SetColourData(const wxColourData& colourData) { sm_colourData = colourData; } /// Returns the custom colour data for use by the colour dialog. static wxColourData GetColourData() { return sm_colourData; } protected: wxRichTextAttr m_attributes; wxRichTextStyleDefinition* m_styleDefinition; wxRichTextStyleSheet* m_styleSheet; wxRichTextObject* m_object; wxArrayInt m_pageIds; // mapping of book control indexes to page ids int m_options; // UI options bool m_ignoreUpdates; static wxColourData sm_colourData; static wxRichTextFormattingDialogFactory* ms_FormattingDialogFactory; static bool sm_showToolTips; static bool sm_restoreLastPage; static int sm_lastPage; wxDECLARE_EVENT_TABLE(); }; //----------------------------------------------------------------------------- // helper class - wxRichTextFontPreviewCtrl //----------------------------------------------------------------------------- class WXDLLIMPEXP_RICHTEXT wxRichTextFontPreviewCtrl : public wxWindow { public: wxRichTextFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0); void SetTextEffects(int effects) { m_textEffects = effects; } int GetTextEffects() const { return m_textEffects; } private: int m_textEffects; void OnPaint(wxPaintEvent& event); wxDECLARE_EVENT_TABLE(); }; /* * A control for displaying a small preview of a colour or bitmap */ class WXDLLIMPEXP_RICHTEXT wxRichTextColourSwatchCtrl: public wxControl { wxDECLARE_CLASS(wxRichTextColourSwatchCtrl); public: wxRichTextColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); ~wxRichTextColourSwatchCtrl(); void OnMouseEvent(wxMouseEvent& event); void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); } wxColour& GetColour() { return m_colour; } virtual wxSize DoGetBestSize() const wxOVERRIDE { return GetSize(); } protected: wxColour m_colour; wxDECLARE_EVENT_TABLE(); }; /*! * wxRichTextFontListBox class declaration * A listbox to display fonts. */ class WXDLLIMPEXP_RICHTEXT wxRichTextFontListBox: public wxHtmlListBox { wxDECLARE_CLASS(wxRichTextFontListBox); wxDECLARE_EVENT_TABLE(); public: wxRichTextFontListBox() { Init(); } wxRichTextFontListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); virtual ~wxRichTextFontListBox(); void Init() { } bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); /// Creates a suitable HTML fragment for a font wxString CreateHTML(const wxString& facename) const; /// Get font name for index wxString GetFaceName(size_t i) const ; /// Set selection for string, returning the index. int SetFaceNameSelection(const wxString& name); /// Updates the font list void UpdateFonts(); /// Does this face name exist? bool HasFaceName(const wxString& faceName) const { return m_faceNames.Index(faceName) != wxNOT_FOUND; } /// Returns the array of face names const wxArrayString& GetFaceNames() const { return m_faceNames; } protected: /// Returns the HTML for this item virtual wxString OnGetItem(size_t n) const wxOVERRIDE; private: wxArrayString m_faceNames; }; #endif // wxUSE_RICHTEXT #endif // _WX_RICHTEXTFORMATDLG_H_