]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/richtext/richtextstyles.h
WinCE build fix.
[wxWidgets.git] / include / wx / richtext / richtextstyles.h
index 08ff7e683b7600472d4275ee1bfa5debf20b52b9..d903fccb863d0ab8edf18078d89dc5dc7e15c82c 100644 (file)
@@ -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
 /////////////////////////////////////////////////////////////////////////////
  * 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