X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d3c7fc996a73e9f6a83067bc28a3c5581a3fee65..d18868bb9b22d6f0fd1010779ddab14a6ab398d8:/include/wx/richtext/richtextstyles.h diff --git a/include/wx/richtext/richtextstyles.h b/include/wx/richtext/richtextstyles.h index 08ff7e683b..d903fccb86 100644 --- a/include/wx/richtext/richtextstyles.h +++ b/include/wx/richtext/richtextstyles.h @@ -1,10 +1,10 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: richtextstyles.h +// Name: wx/richtext/richtextstyles.h // Purpose: Style management for wxRichTextCtrl // Author: Julian Smart -// Modified by: +// Modified by: // Created: 2005-09-30 -// RCS-ID: +// RCS-ID: // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -16,14 +16,20 @@ * Includes */ -#include "wx/richtext/richtextbuffer.h" +#include "wx/defs.h" #if wxUSE_RICHTEXT +#include "wx/richtext/richtextbuffer.h" + #if wxUSE_HTML #include "wx/htmllbox.h" #endif +#if wxUSE_COMBOCTRL +#include "wx/combo.h" +#endif + /*! * Forward declarations */ @@ -43,10 +49,20 @@ public: // Constructors + wxRichTextStyleDefinition(const wxRichTextStyleDefinition& def) + : wxObject() + { + Copy(def); + } wxRichTextStyleDefinition(const wxString& name = wxEmptyString) { Init(); m_name = name; } virtual ~wxRichTextStyleDefinition() {} void Init() {} + void Copy(const wxRichTextStyleDefinition& def); + bool Eq(const wxRichTextStyleDefinition& def) const; + void operator =(const wxRichTextStyleDefinition& def) { Copy(def); } + bool operator ==(const wxRichTextStyleDefinition& def) const { return Eq(def); } + virtual wxRichTextStyleDefinition* Clone() const = 0; /// The name of the style. void SetName(const wxString& name) { m_name = name; } @@ -78,10 +94,13 @@ public: // Constructors + wxRichTextCharacterStyleDefinition(const wxRichTextCharacterStyleDefinition& def): wxRichTextStyleDefinition(def) {} wxRichTextCharacterStyleDefinition(const wxString& name = wxEmptyString): wxRichTextStyleDefinition(name) {} virtual ~wxRichTextCharacterStyleDefinition() {} + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextCharacterStyleDefinition(*this); } + protected: }; @@ -96,6 +115,7 @@ public: // Constructors + wxRichTextParagraphStyleDefinition(const wxRichTextParagraphStyleDefinition& def): wxRichTextStyleDefinition(def) { m_nextStyle = def.m_nextStyle; } wxRichTextParagraphStyleDefinition(const wxString& name = wxEmptyString): wxRichTextStyleDefinition(name) {} virtual ~wxRichTextParagraphStyleDefinition() {} @@ -104,6 +124,12 @@ public: void SetNextStyle(const wxString& name) { m_nextStyle = name; } const wxString& GetNextStyle() const { return m_nextStyle; } + void Copy(const wxRichTextParagraphStyleDefinition& def); + void operator =(const wxRichTextParagraphStyleDefinition& def) { Copy(def); } + bool operator ==(const wxRichTextParagraphStyleDefinition& def) const; + + virtual wxRichTextStyleDefinition* Clone() const { return new wxRichTextParagraphStyleDefinition(*this); } + protected: /// The next style to use when adding a paragraph after this style. @@ -120,29 +146,43 @@ class WXDLLIMPEXP_RICHTEXT wxRichTextStyleSheet: public wxObject public: /// Constructors + wxRichTextStyleSheet(const wxRichTextStyleSheet& sheet) + : wxObject() + { + Copy(sheet); + } wxRichTextStyleSheet() { Init(); } virtual ~wxRichTextStyleSheet() { DeleteStyles(); } /// Initialisation void Init(); + /// Copy + void Copy(const wxRichTextStyleSheet& sheet); + + /// Assignment + void operator=(const wxRichTextStyleSheet& sheet) { Copy(sheet); } + + /// Equality + bool operator==(const wxRichTextStyleSheet& sheet) const; + /// Add a definition to the character style list - bool AddCharacterStyle(wxRichTextCharacterStyleDefinition* def) { return AddStyle(m_characterStyleDefinitions, def); } + bool AddCharacterStyle(wxRichTextCharacterStyleDefinition* def); /// Add a definition to the paragraph style list - bool AddParagraphStyle(wxRichTextParagraphStyleDefinition* def) { return AddStyle(m_paragraphStyleDefinitions, def); } + bool AddParagraphStyle(wxRichTextParagraphStyleDefinition* def); /// Remove a character style bool RemoveCharacterStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_characterStyleDefinitions, def, deleteStyle); } /// Remove a paragraph style - bool RemoveParagraphStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_characterStyleDefinitions, def, deleteStyle); } + bool RemoveParagraphStyle(wxRichTextStyleDefinition* def, bool deleteStyle = false) { return RemoveStyle(m_paragraphStyleDefinitions, def, deleteStyle); } /// Find a character definition by name wxRichTextCharacterStyleDefinition* FindCharacterStyle(const wxString& name) const { return (wxRichTextCharacterStyleDefinition*) FindStyle(m_characterStyleDefinitions, name); } /// Find a paragraph definition by name - wxRichTextParagraphStyleDefinition* FindParagraphStyle(const wxString& name) const { return (wxRichTextParagraphStyleDefinition*) FindStyle(m_characterStyleDefinitions, name); } + wxRichTextParagraphStyleDefinition* FindParagraphStyle(const wxString& name) const { return (wxRichTextParagraphStyleDefinition*) FindStyle(m_paragraphStyleDefinitions, name); } /// Return the number of character styes. size_t GetCharacterStyleCount() const { return m_characterStyleDefinitions.GetCount(); } @@ -188,10 +228,24 @@ class WXDLLIMPEXP_RICHTEXT wxRichTextStyleListBox: public wxHtmlListBox DECLARE_EVENT_TABLE() public: + wxRichTextStyleListBox() + { + Init(); + } wxRichTextStyleListBox(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); virtual ~wxRichTextStyleListBox(); + void Init() + { + m_styleSheet = NULL; + m_richTextCtrl = NULL; + m_applyOnSelection = true; + } + + 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 definition wxString CreateHTML(wxRichTextStyleDefinition* def) const; @@ -203,26 +257,46 @@ public: void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_richTextCtrl = ctrl; } wxRichTextCtrl* GetRichTextCtrl() const { return m_richTextCtrl; } - // Get style for index + /// Get style for index wxRichTextStyleDefinition* GetStyle(size_t i) const ; + /// Get index for style name + int GetIndexForStyle(const wxString& name) const ; + + /// Set selection for string, returning the index. + int SetStyleSelection(const wxString& name); + /// Updates the list void UpdateStyles(); + /// Apply the style + void ApplyStyle(int i); + /// React to selection void OnSelect(wxCommandEvent& event); /// Left click void OnLeftDown(wxMouseEvent& event); + /// Auto-select from style under caret in idle time + void OnIdle(wxIdleEvent& event); + #if 0 virtual wxColour GetSelectedTextColour(const wxColour& colFg) const; virtual wxColour GetSelectedTextBgColour(const wxColour& colBg) const; #endif - // Convert units in tends of a millimetre to device units + /// Convert units in tends of a millimetre to device units int ConvertTenthsMMToPixels(wxDC& dc, int units) const; + /// Can we set the selection based on the editor caret position? + /// Need to override this if being used in a combobox popup + virtual bool CanAutoSetSelection() { return true; } + + /// Set whether the style should be applied as soon as the item is selected (the default) + void SetApplyOnSelection(bool applyOnSel) { m_applyOnSelection = applyOnSel; } + bool GetApplyOnSelection() const { return m_applyOnSelection; } + protected: /// Returns the HTML for this item virtual wxString OnGetItem(size_t n) const; @@ -231,8 +305,119 @@ private: wxRichTextStyleSheet* m_styleSheet; wxRichTextCtrl* m_richTextCtrl; + bool m_applyOnSelection; // if true, applies style on selection }; + +#if wxUSE_COMBOCTRL + +/*! + * Style drop-down for a wxComboCtrl + */ + +class wxRichTextStyleComboPopup : public wxRichTextStyleListBox, public wxComboPopup +{ +public: + virtual void Init() + { + m_itemHere = -1; // hot item in list + m_value = -1; + } + + virtual bool Create( wxWindow* parent ) + { + return wxRichTextStyleListBox::Create(parent, wxID_ANY, + wxPoint(0,0), wxDefaultSize, + wxSIMPLE_BORDER); + } + + virtual wxWindow *GetControl() { return this; } + + virtual void SetStringValue( const wxString& s ); + + virtual wxString GetStringValue() const; + + /// Can we set the selection based on the editor caret position? + // virtual bool CanAutoSetSelection() { return ((m_combo == NULL) || !m_combo->IsPopupShown()); } + virtual bool CanAutoSetSelection() { return false; } + + // + // Popup event handlers + // + + // Mouse hot-tracking + void OnMouseMove(wxMouseEvent& event); + + // On mouse left, set the value and close the popup + void OnMouseClick(wxMouseEvent& WXUNUSED(event)); + +protected: + + int m_itemHere; // hot item in popup + int m_value; + +private: + DECLARE_EVENT_TABLE() +}; + +/*! + * wxRichTextStyleComboCtrl + * A combo for applying styles. + */ + +class WXDLLIMPEXP_RICHTEXT wxRichTextStyleComboCtrl: public wxComboCtrl +{ + DECLARE_CLASS(wxRichTextStyleComboCtrl) + DECLARE_EVENT_TABLE() + +public: + wxRichTextStyleComboCtrl() + { + Init(); + } + + wxRichTextStyleComboCtrl(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = wxCB_READONLY) + { + Init(); + Create(parent, id, pos, size, style); + } + + virtual ~wxRichTextStyleComboCtrl() {} + + void Init() + { + m_stylePopup = NULL; + } + + bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0); + + /// Updates the list + void UpdateStyles() { m_stylePopup->UpdateStyles(); } + + /// Associates the control with a style manager + void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_stylePopup->SetStyleSheet(styleSheet); } + wxRichTextStyleSheet* GetStyleSheet() const { return m_stylePopup->GetStyleSheet(); } + + /// Associates the control with a wxRichTextCtrl + void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_stylePopup->SetRichTextCtrl(ctrl); } + wxRichTextCtrl* GetRichTextCtrl() const { return m_stylePopup->GetRichTextCtrl(); } + + /// Gets the style popup + wxRichTextStyleComboPopup* GetStylePopup() const { return m_stylePopup; } + + /// Auto-select from style under caret in idle time + void OnIdle(wxIdleEvent& event); + +protected: + wxRichTextStyleComboPopup* m_stylePopup; +}; + +#endif + // wxUSE_COMBOCTRL + #endif + // wxUSE_HTML #endif // wxUSE_RICHTEXT