]> git.saurik.com Git - wxWidgets.git/commitdiff
Added a couple of text effects
authorJulian Smart <julian@anthemion.co.uk>
Wed, 8 Nov 2006 14:05:50 +0000 (14:05 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Wed, 8 Nov 2006 14:05:50 +0000 (14:05 +0000)
Added style description
Fixed some bugs in style comparison
Fixed extra newline when loading

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43197 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

12 files changed:
include/wx/richtext/richtextbuffer.h
include/wx/richtext/richtextfontpage.h
include/wx/richtext/richtextformatdlg.h
include/wx/richtext/richtextstyles.h
samples/richtext/richtext.cpp
src/richtext/richtextbuffer.cpp
src/richtext/richtextctrl.cpp
src/richtext/richtextfontpage.cpp
src/richtext/richtextformatdlg.cpp
src/richtext/richtexthtml.cpp
src/richtext/richtextstyles.cpp
src/richtext/richtextxml.cpp

index 063e1bd9f5cb35ca1e4e338297dc2c1abdd179de..8a1149dec6eaf290abb4fbc959e83a939c939269 100644 (file)
@@ -199,6 +199,7 @@ class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer;
 #define wxTEXT_ATTR_BULLET_NAME             0x00100000
 #define wxTEXT_ATTR_URL                     0x00200000
 #define wxTEXT_ATTR_PAGE_BREAK              0x00400000
 #define wxTEXT_ATTR_BULLET_NAME             0x00100000
 #define wxTEXT_ATTR_URL                     0x00200000
 #define wxTEXT_ATTR_PAGE_BREAK              0x00400000
+#define wxTEXT_ATTR_EFFECTS                 0x00800000
 
 /*!
  * Styles for wxTextAttrEx::SetBulletStyle
 
 /*!
  * Styles for wxTextAttrEx::SetBulletStyle
@@ -222,6 +223,22 @@ class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer;
 #define wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT        0x00001000
 #define wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE       0x00002000
 
 #define wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT        0x00001000
 #define wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE       0x00002000
 
+/*!
+ * Styles for wxTextAttrEx::SetTextEffects
+ */
+
+#define wxTEXT_ATTR_EFFECT_NONE                     0x00000000
+#define wxTEXT_ATTR_EFFECT_CAPITALS                 0x00000001
+#define wxTEXT_ATTR_EFFECT_SMALL_CAPITALS           0x00000002
+#define wxTEXT_ATTR_EFFECT_STRIKETHROUGH            0x00000004
+#define wxTEXT_ATTR_EFFECT_DOUBLE_STRIKETHROUGH     0x00000008
+#define wxTEXT_ATTR_EFFECT_SHADOW                   0x00000010
+#define wxTEXT_ATTR_EFFECT_EMBOSS                   0x00000020
+#define wxTEXT_ATTR_EFFECT_OUTLINE                  0x00000040
+#define wxTEXT_ATTR_EFFECT_ENGRAVE                  0x00000080
+#define wxTEXT_ATTR_EFFECT_SUPERSCRIPT              0x00000100
+#define wxTEXT_ATTR_EFFECT_SUBSCRIPT                0x00000200
+
 /*!
  * Line spacing values
  */
 /*!
  * Line spacing values
  */
@@ -234,7 +251,7 @@ class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer;
  * Character and paragraph combined styles
  */
 
  * Character and paragraph combined styles
  */
 
-#define wxTEXT_ATTR_CHARACTER (wxTEXT_ATTR_FONT | wxTEXT_ATTR_BACKGROUND_COLOUR | wxTEXT_ATTR_TEXT_COLOUR | wxTEXT_ATTR_CHARACTER_STYLE_NAME | wxTEXT_ATTR_URL)
+#define wxTEXT_ATTR_CHARACTER (wxTEXT_ATTR_FONT|wxTEXT_ATTR_EFFECTS|wxTEXT_ATTR_BACKGROUND_COLOUR|wxTEXT_ATTR_TEXT_COLOUR|wxTEXT_ATTR_CHARACTER_STYLE_NAME|wxTEXT_ATTR_URL)
 
 #define wxTEXT_ATTR_PARAGRAPH (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_TABS|\
     wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|wxTEXT_ATTR_LINE_SPACING|\
 
 #define wxTEXT_ATTR_PARAGRAPH (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_TABS|\
     wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|wxTEXT_ATTR_LINE_SPACING|\
@@ -348,6 +365,8 @@ public:
     void SetBulletFont(const wxString& bulletFont) { m_bulletFont = bulletFont; }
     void SetURL(const wxString& url) { m_urlTarget = url; SetFlags(GetFlags() | wxTEXT_ATTR_URL); }
     void SetPageBreak(bool pageBreak = true) { SetFlags(pageBreak ? (GetFlags() | wxTEXT_ATTR_PAGE_BREAK) : (GetFlags() & ~wxTEXT_ATTR_PAGE_BREAK)); }
     void SetBulletFont(const wxString& bulletFont) { m_bulletFont = bulletFont; }
     void SetURL(const wxString& url) { m_urlTarget = url; SetFlags(GetFlags() | wxTEXT_ATTR_URL); }
     void SetPageBreak(bool pageBreak = true) { SetFlags(pageBreak ? (GetFlags() | wxTEXT_ATTR_PAGE_BREAK) : (GetFlags() & ~wxTEXT_ATTR_PAGE_BREAK)); }
+    void SetTextEffects(int effects) { m_textEffects = effects; SetFlags(GetFlags() | wxTEXT_ATTR_EFFECTS); }
+    void SetTextEffectFlags(int effects) { m_textEffectFlags = effects; }
 
     const wxString& GetCharacterStyleName() const { return m_characterStyleName; }
     const wxString& GetParagraphStyleName() const { return m_paragraphStyleName; }
 
     const wxString& GetCharacterStyleName() const { return m_characterStyleName; }
     const wxString& GetParagraphStyleName() const { return m_paragraphStyleName; }
@@ -361,6 +380,8 @@ public:
     const wxString& GetBulletName() const { return m_bulletName; }
     const wxString& GetBulletFont() const { return m_bulletFont; }
     const wxString& GetURL() const { return m_urlTarget; }
     const wxString& GetBulletName() const { return m_bulletName; }
     const wxString& GetBulletFont() const { return m_bulletFont; }
     const wxString& GetURL() const { return m_urlTarget; }
+    int GetTextEffects() const { return m_textEffects; }
+    int GetTextEffectFlags() const { return m_textEffectFlags; }
 
     bool HasWeight() const { return (GetFlags() & wxTEXT_ATTR_FONT_WEIGHT) != 0; }
     bool HasSize() const { return (GetFlags() & wxTEXT_ATTR_FONT_SIZE) != 0; }
 
     bool HasWeight() const { return (GetFlags() & wxTEXT_ATTR_FONT_WEIGHT) != 0; }
     bool HasSize() const { return (GetFlags() & wxTEXT_ATTR_FONT_SIZE) != 0; }
@@ -380,6 +401,8 @@ public:
     bool HasBulletName() const { return HasFlag(wxTEXT_ATTR_BULLET_NAME); }
     bool HasURL() const { return HasFlag(wxTEXT_ATTR_URL); }
     bool HasPageBreak() const { return HasFlag(wxTEXT_ATTR_PAGE_BREAK); }
     bool HasBulletName() const { return HasFlag(wxTEXT_ATTR_BULLET_NAME); }
     bool HasURL() const { return HasFlag(wxTEXT_ATTR_URL); }
     bool HasPageBreak() const { return HasFlag(wxTEXT_ATTR_PAGE_BREAK); }
+    bool HasTextEffects() const { return HasFlag(wxTEXT_ATTR_EFFECTS); }
+    bool HasTextEffect(int effect) const { return HasFlag(wxTEXT_ATTR_EFFECTS) && ((GetTextEffectFlags() & effect) != 0); }
 
     // Is this a character style?
     bool IsCharacterStyle() const { return (0 != (GetFlags() & wxTEXT_ATTR_CHARACTER)); }
 
     // Is this a character style?
     bool IsCharacterStyle() const { return (0 != (GetFlags() & wxTEXT_ATTR_CHARACTER)); }
@@ -388,11 +411,7 @@ public:
     // returns false if we have any attributes set, true otherwise
     bool IsDefault() const
     {
     // returns false if we have any attributes set, true otherwise
     bool IsDefault() const
     {
-        return !HasTextColour() && !HasBackgroundColour() && !HasFont() && !HasAlignment() &&
-               !HasTabs() && !HasLeftIndent() && !HasRightIndent() &&
-               !HasParagraphSpacingAfter() && !HasParagraphSpacingBefore() && !HasLineSpacing() &&
-               !HasCharacterStyleName() && !HasParagraphStyleName() && !HasListStyleName() &&
-               !HasBulletNumber() && !HasBulletStyle() && !HasBulletText() && !HasBulletName() && !HasURL();
+        return (GetFlags() == 0);
     }
 
     // return the attribute having the valid font and colours: it uses the
     }
 
     // return the attribute having the valid font and colours: it uses the
@@ -409,6 +428,8 @@ private:
     int                 m_lineSpacing;
     int                 m_bulletStyle;
     int                 m_bulletNumber;
     int                 m_lineSpacing;
     int                 m_bulletStyle;
     int                 m_bulletNumber;
+    int                 m_textEffects;
+    int                 m_textEffectFlags;
     wxString            m_bulletText;
     wxString            m_bulletFont;
     wxString            m_bulletName;
     wxString            m_bulletText;
     wxString            m_bulletFont;
     wxString            m_bulletName;
@@ -496,6 +517,8 @@ public:
     void SetBulletName(const wxString& name) { m_bulletName = name; m_flags |= wxTEXT_ATTR_BULLET_NAME; }
     void SetURL(const wxString& url) { m_urlTarget = url; m_flags |= wxTEXT_ATTR_URL; }
     void SetPageBreak(bool pageBreak = true) { SetFlags(pageBreak ? (GetFlags() | wxTEXT_ATTR_PAGE_BREAK) : (GetFlags() & ~wxTEXT_ATTR_PAGE_BREAK)); }
     void SetBulletName(const wxString& name) { m_bulletName = name; m_flags |= wxTEXT_ATTR_BULLET_NAME; }
     void SetURL(const wxString& url) { m_urlTarget = url; m_flags |= wxTEXT_ATTR_URL; }
     void SetPageBreak(bool pageBreak = true) { SetFlags(pageBreak ? (GetFlags() | wxTEXT_ATTR_PAGE_BREAK) : (GetFlags() & ~wxTEXT_ATTR_PAGE_BREAK)); }
+    void SetTextEffects(int effects) { m_textEffects = effects; SetFlags(GetFlags() | wxTEXT_ATTR_EFFECTS); }
+    void SetTextEffectFlags(int effects) { m_textEffectFlags = effects; }
 
     const wxColour& GetTextColour() const { return m_colText; }
     const wxColour& GetBackgroundColour() const { return m_colBack; }
 
     const wxColour& GetTextColour() const { return m_colText; }
     const wxColour& GetBackgroundColour() const { return m_colBack; }
@@ -524,6 +547,8 @@ public:
     const wxString& GetBulletFont() const { return m_bulletFont; }
     const wxString& GetBulletName() const { return m_bulletName; }
     const wxString& GetURL() const { return m_urlTarget; }
     const wxString& GetBulletFont() const { return m_bulletFont; }
     const wxString& GetBulletName() const { return m_bulletName; }
     const wxString& GetURL() const { return m_urlTarget; }
+    int GetTextEffects() const { return m_textEffects; }
+    int GetTextEffectFlags() const { return m_textEffectFlags; }
 
     // accessors
     bool HasTextColour() const { return m_colText.Ok() && HasFlag(wxTEXT_ATTR_TEXT_COLOUR) ; }
 
     // accessors
     bool HasTextColour() const { return m_colText.Ok() && HasFlag(wxTEXT_ATTR_TEXT_COLOUR) ; }
@@ -551,6 +576,8 @@ public:
     bool HasBulletName() const { return (m_flags & wxTEXT_ATTR_BULLET_NAME) != 0; }
     bool HasURL() const { return HasFlag(wxTEXT_ATTR_URL); }
     bool HasPageBreak() const { return HasFlag(wxTEXT_ATTR_PAGE_BREAK); }
     bool HasBulletName() const { return (m_flags & wxTEXT_ATTR_BULLET_NAME) != 0; }
     bool HasURL() const { return HasFlag(wxTEXT_ATTR_URL); }
     bool HasPageBreak() const { return HasFlag(wxTEXT_ATTR_PAGE_BREAK); }
+    bool HasTextEffects() const { return HasFlag(wxTEXT_ATTR_EFFECTS); }
+    bool HasTextEffect(int effect) const { return HasFlag(wxTEXT_ATTR_EFFECTS) && ((GetTextEffectFlags() & effect) != 0); }
 
     bool HasFlag(long flag) const { return (m_flags & flag) != 0; }
 
 
     bool HasFlag(long flag) const { return (m_flags & flag) != 0; }
 
@@ -561,11 +588,7 @@ public:
     // returns false if we have any attributes set, true otherwise
     bool IsDefault() const
     {
     // returns false if we have any attributes set, true otherwise
     bool IsDefault() const
     {
-        return !HasTextColour() && !HasBackgroundColour() && !HasFont() && !HasAlignment() &&
-               !HasTabs() && !HasLeftIndent() && !HasRightIndent() &&
-               !HasParagraphSpacingAfter() && !HasParagraphSpacingBefore() && !HasLineSpacing() &&
-               !HasCharacterStyleName() && !HasParagraphStyleName() && !HasListStyleName() &&
-               !HasBulletNumber() && !HasBulletStyle() && !HasBulletText() && !HasBulletName() && !HasURL();
+        return GetFlags() == 0;
     }
 
     // return the attribute having the valid font and colours: it uses the
     }
 
     // return the attribute having the valid font and colours: it uses the
@@ -591,6 +614,8 @@ private:
     int                 m_lineSpacing;
     int                 m_bulletStyle;
     int                 m_bulletNumber;
     int                 m_lineSpacing;
     int                 m_bulletStyle;
     int                 m_bulletNumber;
+    int                 m_textEffects;
+    int                 m_textEffectFlags;
     wxString            m_bulletText;
     wxString            m_bulletFont;
     wxString            m_bulletName;
     wxString            m_bulletText;
     wxString            m_bulletFont;
     wxString            m_bulletName;
@@ -1036,7 +1061,7 @@ public:
 
     /// Combines 'style' with 'currentStyle' for the purpose of summarising the attributes of a range of
     /// content.
 
     /// Combines 'style' with 'currentStyle' for the purpose of summarising the attributes of a range of
     /// content.
-    bool CollectStyle(wxTextAttrEx& currentStyle, const wxTextAttrEx& style, long& multipleStyleAttributes);
+    bool CollectStyle(wxTextAttrEx& currentStyle, const wxTextAttrEx& style, long& multipleStyleAttributes, int& multipleTextEffectAttributes);
 
     /// Set list style
     virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
 
     /// Set list style
     virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
@@ -2267,6 +2292,12 @@ WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const
 WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL);
 WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL);
 
 WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL);
 WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL);
 
+/// Combine two bitlists
+WXDLLIMPEXP_RICHTEXT bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB);
+
+/// Compare two bitlists
+WXDLLIMPEXP_RICHTEXT bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags);
+
 /// Split into paragraph and character styles
 WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxTextAttrEx& style, wxTextAttrEx& parStyle, wxTextAttrEx& charStyle);
 
 /// Split into paragraph and character styles
 WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxTextAttrEx& style, wxTextAttrEx& parStyle, wxTextAttrEx& charStyle);
 
index 48fb930353063f03dfb6f5d0ef0d0aec817e463d..839e9ce978d35e20cda8e5efc08f152f1328e93c 100644 (file)
@@ -97,6 +97,12 @@ public:
     /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL
     void OnUnderliningCtrlSelected( wxCommandEvent& event );
 
     /// wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL
     void OnUnderliningCtrlSelected( wxCommandEvent& event );
 
+    /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL
+    void OnStrikethroughctrlClick( wxCommandEvent& event );
+
+    /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_CAPSCTRL
+    void OnCapsctrlClick( wxCommandEvent& event );
+
 ////@end wxRichTextFontPage event handler declarations
 
 ////@begin wxRichTextFontPage member function declarations
 ////@end wxRichTextFontPage event handler declarations
 
 ////@begin wxRichTextFontPage member function declarations
@@ -120,6 +126,8 @@ public:
     wxComboBox* m_weightCtrl;
     wxComboBox* m_underliningCtrl;
     wxRichTextColourSwatchCtrl* m_colourCtrl;
     wxComboBox* m_weightCtrl;
     wxComboBox* m_underliningCtrl;
     wxRichTextColourSwatchCtrl* m_colourCtrl;
+    wxCheckBox* m_strikethroughCtrl;
+    wxCheckBox* m_capitalsCtrl;
     wxRichTextFontPreviewCtrl* m_previewCtrl;
     /// Control identifiers
     enum {
     wxRichTextFontPreviewCtrl* m_previewCtrl;
     /// Control identifiers
     enum {
@@ -132,6 +140,8 @@ public:
         ID_RICHTEXTFONTPAGE_WEIGHTCTRL = 10004,
         ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL = 10008,
         ID_RICHTEXTFONTPAGE_COLOURCTRL = 10009,
         ID_RICHTEXTFONTPAGE_WEIGHTCTRL = 10004,
         ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL = 10008,
         ID_RICHTEXTFONTPAGE_COLOURCTRL = 10009,
+        ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL = 10010,
+        ID_RICHTEXTFONTPAGE_CAPSCTRL = 10011,
         ID_RICHTEXTFONTPAGE_PREVIEWCTRL = 10003
     };
 ////@end wxRichTextFontPage member variables
         ID_RICHTEXTFONTPAGE_PREVIEWCTRL = 10003
     };
 ////@end wxRichTextFontPage member variables
index af41de90865f05e6fb77f2aca9de8951e6ba0ef2..0e3aec20ceff74eb4e09e23f161ed633d7709f36 100644 (file)
@@ -222,9 +222,15 @@ public:
         wxWindow(parent, id, pos, sz, style)
     {
         SetBackgroundColour(*wxWHITE);
         wxWindow(parent, id, pos, sz, style)
     {
         SetBackgroundColour(*wxWHITE);
+        m_textEffects = 0;
     }
 
     }
 
+    void SetTextEffects(int effects) { m_textEffects = effects; }
+    int GetTextEffects() const { return m_textEffects; }
+
 private:
 private:
+    int m_textEffects;
+
     void OnPaint(wxPaintEvent& event);
     DECLARE_EVENT_TABLE()
 };
     void OnPaint(wxPaintEvent& event);
     DECLARE_EVENT_TABLE()
 };
index bce0f3399fd731c02b4642ddb61b73b45c2adbd3..30ec7fe3f9063722f29ac8a13cb809429a7d81de 100644 (file)
@@ -85,6 +85,10 @@ public:
     void SetName(const wxString& name) { m_name = name; }
     const wxString& GetName() const { return m_name; }
 
     void SetName(const wxString& name) { m_name = name; }
     const wxString& GetName() const { return m_name; }
 
+    /// Sets and gets the style description
+    void SetDescription(const wxString& descr) { m_description = descr; }
+    const wxString& GetDescription() const { return m_description; }
+
     /// Sets and gets the name of the style that this style is based on
     void SetBaseStyle(const wxString& name) { m_baseStyle = name; }
     const wxString& GetBaseStyle() const { return m_baseStyle; }
     /// Sets and gets the name of the style that this style is based on
     void SetBaseStyle(const wxString& name) { m_baseStyle = name; }
     const wxString& GetBaseStyle() const { return m_baseStyle; }
@@ -97,6 +101,7 @@ public:
 protected:
     wxString        m_name;
     wxString        m_baseStyle;
 protected:
     wxString        m_name;
     wxString        m_baseStyle;
+    wxString        m_description;
     wxRichTextAttr  m_style;
 };
 
     wxRichTextAttr  m_style;
 };
 
@@ -327,6 +332,14 @@ public:
     wxRichTextStyleSheet* GetPreviousSheet() const { return m_previousSheet; }
     void SetPreviousSheet(wxRichTextStyleSheet* sheet) { m_previousSheet = sheet; }
 
     wxRichTextStyleSheet* GetPreviousSheet() const { return m_previousSheet; }
     void SetPreviousSheet(wxRichTextStyleSheet* sheet) { m_previousSheet = sheet; }
 
+    /// Sets and gets the name of the style sheet
+    void SetName(const wxString& name) { m_name = name; }
+    const wxString& GetName() const { return m_name; }
+
+    /// Sets and gets the style description
+    void SetDescription(const wxString& descr) { m_description = descr; }
+    const wxString& GetDescription() const { return m_description; }
+
 /// Implementation
 
     /// Add a definition to one of the style lists
 /// Implementation
 
     /// Add a definition to one of the style lists
@@ -340,12 +353,15 @@ public:
 
 protected:
 
 
 protected:
 
-    wxList  m_characterStyleDefinitions;
-    wxList  m_paragraphStyleDefinitions;
-    wxList  m_listStyleDefinitions;
+    wxString                m_description;
+    wxString                m_name;
+
+    wxList                  m_characterStyleDefinitions;
+    wxList                  m_paragraphStyleDefinitions;
+    wxList                  m_listStyleDefinitions;
 
 
-    wxRichTextStyleSheet* m_previousSheet;
-    wxRichTextStyleSheet* m_nextSheet;
+    wxRichTextStyleSheet*   m_previousSheet;
+    wxRichTextStyleSheet*   m_nextSheet;
 };
 
 #if wxUSE_HTML
 };
 
 #if wxUSE_HTML
index 08d7db7605185fe775218eafc4d0a454845b38eb..ff192a817f889d51deeb23234f99711f6acb5459 100644 (file)
@@ -735,8 +735,8 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos,
     r.EndItalic();
 
     r.EndBold();
     r.EndItalic();
 
     r.EndBold();
-
     r.Newline();
     r.Newline();
+
     r.WriteImage(wxBitmap(zebra_xpm));
 
     r.EndAlignment();
     r.WriteImage(wxBitmap(zebra_xpm));
 
     r.EndAlignment();
@@ -745,6 +745,7 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos,
     r.Newline();
 
     r.WriteText(wxT("What can you do with this thing? "));
     r.Newline();
 
     r.WriteText(wxT("What can you do with this thing? "));
+
     r.WriteImage(wxBitmap(smiley_xpm));
     r.WriteText(wxT(" Well, you can change text "));
 
     r.WriteImage(wxBitmap(smiley_xpm));
     r.WriteText(wxT(" Well, you can change text "));
 
@@ -1100,7 +1101,7 @@ void MyFrame::OnFont(wxCommandEvent& WXUNUSED(event))
 
     if (formatDlg.ShowModal() == wxID_OK)
     {
 
     if (formatDlg.ShowModal() == wxID_OK)
     {
-        formatDlg.ApplyStyle(m_richTextCtrl, range);
+        formatDlg.ApplyStyle(m_richTextCtrl, range, wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_OPTIMIZE|wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY);
     }
 
     // Old method using wxFontDialog
     }
 
     // Old method using wxFontDialog
index 064e792bad167417d640f0049e1337d6511ca236..e361c51a296211e8243e46e8a70d27ed95107205 100644 (file)
@@ -1853,7 +1853,7 @@ static bool wxHasStyle(long flags, long style)
 
 /// Combines 'style' with 'currentStyle' for the purpose of summarising the attributes of a range of
 /// content.
 
 /// Combines 'style' with 'currentStyle' for the purpose of summarising the attributes of a range of
 /// content.
-bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, const wxTextAttrEx& style, long& multipleStyleAttributes)
+bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, const wxTextAttrEx& style, long& multipleStyleAttributes, int& multipleTextEffectAttributes)
 {
     if (style.HasFont())
     {
 {
     if (style.HasFont())
     {
@@ -2066,7 +2066,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasParagraphSpacingAfter())
         {
     {
         if (currentStyle.HasParagraphSpacingAfter())
         {
-            if (currentStyle.HasParagraphSpacingAfter() != style.HasParagraphSpacingAfter())
+            if (currentStyle.GetParagraphSpacingAfter() != style.GetParagraphSpacingAfter())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_PARA_SPACING_AFTER;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_PARA_SPACING_AFTER;
@@ -2081,7 +2081,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasParagraphSpacingBefore())
         {
     {
         if (currentStyle.HasParagraphSpacingBefore())
         {
-            if (currentStyle.HasParagraphSpacingBefore() != style.HasParagraphSpacingBefore())
+            if (currentStyle.GetParagraphSpacingBefore() != style.GetParagraphSpacingBefore())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_PARA_SPACING_BEFORE;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_PARA_SPACING_BEFORE;
@@ -2096,7 +2096,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasLineSpacing())
         {
     {
         if (currentStyle.HasLineSpacing())
         {
-            if (currentStyle.HasLineSpacing() != style.HasLineSpacing())
+            if (currentStyle.GetLineSpacing() != style.GetLineSpacing())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_LINE_SPACING;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_LINE_SPACING;
@@ -2111,7 +2111,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasCharacterStyleName())
         {
     {
         if (currentStyle.HasCharacterStyleName())
         {
-            if (currentStyle.HasCharacterStyleName() != style.HasCharacterStyleName())
+            if (currentStyle.GetCharacterStyleName() != style.GetCharacterStyleName())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_CHARACTER_STYLE_NAME;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_CHARACTER_STYLE_NAME;
@@ -2126,7 +2126,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasParagraphStyleName())
         {
     {
         if (currentStyle.HasParagraphStyleName())
         {
-            if (currentStyle.HasParagraphStyleName() != style.HasParagraphStyleName())
+            if (currentStyle.GetParagraphStyleName() != style.GetParagraphStyleName())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_PARAGRAPH_STYLE_NAME;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_PARAGRAPH_STYLE_NAME;
@@ -2141,7 +2141,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasListStyleName())
         {
     {
         if (currentStyle.HasListStyleName())
         {
-            if (currentStyle.HasListStyleName() != style.HasListStyleName())
+            if (currentStyle.GetListStyleName() != style.GetListStyleName())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_LIST_STYLE_NAME;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_LIST_STYLE_NAME;
@@ -2156,7 +2156,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasBulletStyle())
         {
     {
         if (currentStyle.HasBulletStyle())
         {
-            if (currentStyle.HasBulletStyle() != style.HasBulletStyle())
+            if (currentStyle.GetBulletStyle() != style.GetBulletStyle())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_STYLE;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_STYLE;
@@ -2171,7 +2171,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasBulletNumber())
         {
     {
         if (currentStyle.HasBulletNumber())
         {
-            if (currentStyle.HasBulletNumber() != style.HasBulletNumber())
+            if (currentStyle.GetBulletNumber() != style.GetBulletNumber())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_NUMBER;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_NUMBER;
@@ -2186,7 +2186,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasBulletText())
         {
     {
         if (currentStyle.HasBulletText())
         {
-            if (currentStyle.HasBulletText() != style.HasBulletText())
+            if (currentStyle.GetBulletText() != style.GetBulletText())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_TEXT;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_TEXT;
@@ -2204,7 +2204,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasBulletName())
         {
     {
         if (currentStyle.HasBulletName())
         {
-            if (currentStyle.HasBulletName() != style.HasBulletName())
+            if (currentStyle.GetBulletName() != style.GetBulletName())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_NAME;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_BULLET_NAME;
@@ -2221,7 +2221,7 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
     {
         if (currentStyle.HasURL())
         {
     {
         if (currentStyle.HasURL())
         {
-            if (currentStyle.HasURL() != style.HasURL())
+            if (currentStyle.GetURL() != style.GetURL())
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_URL;
             {
                 // Clash of style - mark as such
                 multipleStyleAttributes |= wxTEXT_ATTR_URL;
@@ -2234,6 +2234,33 @@ bool wxRichTextParagraphLayoutBox::CollectStyle(wxTextAttrEx& currentStyle, cons
         }
     }
 
         }
     }
 
+    if (style.HasTextEffects() && !wxHasStyle(multipleStyleAttributes, wxTEXT_ATTR_EFFECTS))
+    {
+        if (currentStyle.HasTextEffects())
+        {
+            // We need to find the bits in the new style that are different:
+            // just look at those bits that are specified by the new style.
+                
+            int currentRelevantTextEffects = currentStyle.GetTextEffects() & style.GetTextEffectFlags();
+            int newRelevantTextEffects = style.GetTextEffects() & style.GetTextEffectFlags();
+
+            if (currentRelevantTextEffects != newRelevantTextEffects)
+            {
+                // Find the text effects that were different, using XOR
+                int differentEffects = currentRelevantTextEffects ^ newRelevantTextEffects;
+                    
+                // Clash of style - mark as such
+                multipleTextEffectAttributes |= differentEffects;
+                currentStyle.SetTextEffectFlags(currentStyle.GetTextEffectFlags() & ~differentEffects);
+            }
+        }
+        else
+        {
+            currentStyle.SetTextEffects(style.GetTextEffects());
+            currentStyle.SetTextEffectFlags(style.GetTextEffectFlags());
+        }
+    }
+
     return true;
 }
 
     return true;
 }
 
@@ -2247,7 +2274,8 @@ bool wxRichTextParagraphLayoutBox::GetStyleForRange(const wxRichTextRange& range
 
     // The attributes that aren't valid because of multiple styles within the range
     long multipleStyleAttributes = 0;
 
     // The attributes that aren't valid because of multiple styles within the range
     long multipleStyleAttributes = 0;
-
+    int multipleTextEffectAttributes = 0;
+    
     wxRichTextObjectList::compatibility_iterator node = GetChildren().GetFirst();
     while (node)
     {
     wxRichTextObjectList::compatibility_iterator node = GetChildren().GetFirst();
     while (node)
     {
@@ -2258,7 +2286,7 @@ bool wxRichTextParagraphLayoutBox::GetStyleForRange(const wxRichTextRange& range
             {
                 wxTextAttrEx paraStyle = para->GetCombinedAttributes();
 
             {
                 wxTextAttrEx paraStyle = para->GetCombinedAttributes();
 
-                CollectStyle(style, paraStyle, multipleStyleAttributes);
+                CollectStyle(style, paraStyle, multipleStyleAttributes, multipleTextEffectAttributes);
             }
             else
             {
             }
             else
             {
@@ -2268,7 +2296,7 @@ bool wxRichTextParagraphLayoutBox::GetStyleForRange(const wxRichTextRange& range
                 // First collect paragraph attributes only
                 wxTextAttrEx paraStyle = para->GetCombinedAttributes();
                 paraStyle.SetFlags(paraStyle.GetFlags() & wxTEXT_ATTR_PARAGRAPH);
                 // First collect paragraph attributes only
                 wxTextAttrEx paraStyle = para->GetCombinedAttributes();
                 paraStyle.SetFlags(paraStyle.GetFlags() & wxTEXT_ATTR_PARAGRAPH);
-                CollectStyle(style, paraStyle, multipleStyleAttributes);
+                CollectStyle(style, paraStyle, multipleStyleAttributes, multipleTextEffectAttributes);
 
                 wxRichTextObjectList::compatibility_iterator childNode = para->GetChildren().GetFirst();
 
 
                 wxRichTextObjectList::compatibility_iterator childNode = para->GetChildren().GetFirst();
 
@@ -2282,7 +2310,7 @@ bool wxRichTextParagraphLayoutBox::GetStyleForRange(const wxRichTextRange& range
                         // Now collect character attributes only
                         childStyle.SetFlags(childStyle.GetFlags() & wxTEXT_ATTR_CHARACTER);
 
                         // Now collect character attributes only
                         childStyle.SetFlags(childStyle.GetFlags() & wxTEXT_ATTR_CHARACTER);
 
-                        CollectStyle(style, childStyle, multipleStyleAttributes);
+                        CollectStyle(style, childStyle, multipleStyleAttributes, multipleTextEffectAttributes);
                     }
 
                     childNode = childNode->GetNext();
                     }
 
                     childNode = childNode->GetNext();
@@ -4106,6 +4134,8 @@ bool wxRichTextPlainText::Draw(wxDC& dc, const wxRichTextRange& range, const wxR
 
     long len = range.GetLength();
     wxString stringChunk = m_text.Mid(range.GetStart() - offset, (size_t) len);
 
     long len = range.GetLength();
     wxString stringChunk = m_text.Mid(range.GetStart() - offset, (size_t) len);
+    if (textAttr.HasTextEffects() && (textAttr.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
+        stringChunk.MakeUpper();
 
     int charHeight = dc.GetCharHeight();
 
 
     int charHeight = dc.GetCharHeight();
 
@@ -4278,6 +4308,15 @@ bool wxRichTextPlainText::DrawTabbedString(wxDC& dc, const wxTextAttrEx& attr, c
                     dc.DrawRectangle(selRect);
                 }
                 dc.DrawText(stringChunk, x, y);
                     dc.DrawRectangle(selRect);
                 }
                 dc.DrawText(stringChunk, x, y);
+
+                if (attr.HasTextEffects() && (attr.GetTextEffects() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH))
+                {
+                    wxPen oldPen = dc.GetPen();
+                    dc.SetPen(wxPen(attr.GetTextColour(), 1));
+                    dc.DrawLine(x, (int) (y+(h/2)+0.5), x+w, (int) (y+(h/2)+0.5));
+                    dc.SetPen(oldPen);
+                }
+
                 x = nextTabPos;
             }
         }
                 x = nextTabPos;
             }
         }
@@ -4293,6 +4332,15 @@ bool wxRichTextPlainText::DrawTabbedString(wxDC& dc, const wxTextAttrEx& attr, c
             dc.DrawRectangle(selRect);
         }
         dc.DrawText(str, x, y);
             dc.DrawRectangle(selRect);
         }
         dc.DrawText(str, x, y);
+
+        if (attr.HasTextEffects() && (attr.GetTextEffects() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH))
+        {
+            wxPen oldPen = dc.GetPen();
+            dc.SetPen(wxPen(attr.GetTextColour(), 1));
+            dc.DrawLine(x, (int) (y+(h/2)+0.5), x+w, (int) (y+(h/2)+0.5));
+            dc.SetPen(oldPen);
+        }
+
         x += w;
     }
     return true;
         x += w;
     }
     return true;
@@ -4314,8 +4362,12 @@ bool wxRichTextPlainText::Layout(wxDC& dc, const wxRect& WXUNUSED(rect), int WXU
     if (textAttr.GetFont().Ok())
         dc.SetFont(textAttr.GetFont());
 
     if (textAttr.GetFont().Ok())
         dc.SetFont(textAttr.GetFont());
 
+    wxString str = m_text;    
+    if (textAttr.HasTextEffects() && (textAttr.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
+        str.MakeUpper();
+
     wxCoord w, h;
     wxCoord w, h;
-    dc.GetTextExtent(m_text, & w, & h, & m_descent);
+    dc.GetTextExtent(str, & w, & h, & m_descent);
     m_size = wxSize(w, dc.GetCharHeight());
 
     return true;
     m_size = wxSize(w, dc.GetCharHeight());
 
     return true;
@@ -4355,6 +4407,10 @@ bool wxRichTextPlainText::GetRangeSize(const wxRichTextRange& range, wxSize& siz
     int startPos = range.GetStart() - GetRange().GetStart();
     long len = range.GetLength();
     wxString stringChunk = m_text.Mid(startPos, (size_t) len);
     int startPos = range.GetStart() - GetRange().GetStart();
     long len = range.GetLength();
     wxString stringChunk = m_text.Mid(startPos, (size_t) len);
+
+    if (textAttr.HasTextEffects() && (textAttr.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
+        stringChunk.MakeUpper();
+
     wxCoord w, h;
     int width = 0;
     if (stringChunk.Find(wxT('\t')) != wxNOT_FOUND)
     wxCoord w, h;
     int width = 0;
     if (stringChunk.Find(wxT('\t')) != wxNOT_FOUND)
@@ -6329,6 +6385,8 @@ bool wxTextAttrEq(const wxTextAttrEx& attr1, const wxRichTextAttr& attr2)
         attr1.GetFont().GetWeight() == attr2.GetFontWeight() &&
         attr1.GetFont().GetFaceName() == attr2.GetFontFaceName() &&
         attr1.GetFont().GetUnderlined() == attr2.GetFontUnderlined() &&
         attr1.GetFont().GetWeight() == attr2.GetFontWeight() &&
         attr1.GetFont().GetFaceName() == attr2.GetFontFaceName() &&
         attr1.GetFont().GetUnderlined() == attr2.GetFontUnderlined() &&
+        attr1.GetTextEffects() == attr2.GetTextEffects() &&
+        attr1.GetTextEffectFlags() == attr2.GetTextEffectFlags() &&
         attr1.GetAlignment() == attr2.GetAlignment() &&
         attr1.GetLeftIndent() == attr2.GetLeftIndent() &&
         attr1.GetRightIndent() == attr2.GetRightIndent() &&
         attr1.GetAlignment() == attr2.GetAlignment() &&
         attr1.GetLeftIndent() == attr2.GetLeftIndent() &&
         attr1.GetRightIndent() == attr2.GetRightIndent() &&
@@ -6438,6 +6496,14 @@ bool wxTextAttrEqPartial(const wxTextAttrEx& attr1, const wxTextAttrEx& attr2, i
         (attr1.HasPageBreak() != attr2.HasPageBreak()))
          return false;
 
         (attr1.HasPageBreak() != attr2.HasPageBreak()))
          return false;
 
+    if (flags & wxTEXT_ATTR_EFFECTS)
+    {
+        if (attr1.HasTextEffects() != attr2.HasTextEffects())
+            return false;
+        if (!wxRichTextBitlistsEqPartial(attr1.GetTextEffects(), attr2.GetTextEffects(), attr2.GetTextEffectFlags()))
+            return false;
+    }
+
     return true;
 }
 
     return true;
 }
 
@@ -6532,6 +6598,14 @@ bool wxTextAttrEqPartial(const wxTextAttrEx& attr1, const wxRichTextAttr& attr2,
         (attr1.HasPageBreak() != attr2.HasPageBreak()))
          return false;
 
         (attr1.HasPageBreak() != attr2.HasPageBreak()))
          return false;
 
+    if (flags & wxTEXT_ATTR_EFFECTS)
+    {
+        if (attr1.HasTextEffects() != attr2.HasTextEffects())
+            return false;
+        if (!wxRichTextBitlistsEqPartial(attr1.GetTextEffects(), attr2.GetTextEffects(), attr2.GetTextEffectFlags()))
+            return false;
+    }
+
     return true;
 }
 
     return true;
 }
 
@@ -6550,7 +6624,6 @@ bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2)
     return true;
 }
 
     return true;
 }
 
-
 /// Apply one style to another
 bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxTextAttrEx& style)
 {
 /// Apply one style to another
 bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxTextAttrEx& style)
 {
@@ -6658,6 +6731,20 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxTextAttrEx& style)
     if (style.HasPageBreak())
         destStyle.SetPageBreak();
 
     if (style.HasPageBreak())
         destStyle.SetPageBreak();
 
+    if (style.HasTextEffects())
+    {
+        int destBits = destStyle.GetTextEffects();
+        int destFlags = destStyle.GetTextEffectFlags();
+
+        int srcBits = style.GetTextEffects();
+        int srcFlags = style.GetTextEffectFlags();
+            
+        wxRichTextCombineBitlists(destBits, srcBits, destFlags, srcFlags);
+            
+        destStyle.SetTextEffects(destBits);
+        destStyle.SetTextEffectFlags(destFlags);
+    }
+
     return true;
 }
 
     return true;
 }
 
@@ -6878,9 +6965,54 @@ bool wxRichTextApplyStyle(wxTextAttrEx& destStyle, const wxRichTextAttr& style,
             destStyle.SetPageBreak();
     }
 
             destStyle.SetPageBreak();
     }
 
+    if (style.HasTextEffects())
+    {
+        if (!(compareWith && compareWith->HasTextEffects() && compareWith->GetTextEffects() == style.GetTextEffects()))
+        {
+            int destBits = destStyle.GetTextEffects();
+            int destFlags = destStyle.GetTextEffectFlags();
+
+            int srcBits = style.GetTextEffects();
+            int srcFlags = style.GetTextEffectFlags();
+            
+            wxRichTextCombineBitlists(destBits, srcBits, destFlags, srcFlags);
+            
+            destStyle.SetTextEffects(destBits);
+            destStyle.SetTextEffectFlags(destFlags);
+        }
+    }
+
     return true;
 }
 
     return true;
 }
 
+/// Combine two bitlists, specifying the bits of interest with separate flags.
+bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB)
+{
+    // We want to apply B's bits to A, taking into account each's flags which indicate which bits
+    // are to be taken into account. A zero in B's bits should reset that bit in A but only if B's flags
+    // indicate it.
+    
+    // First, reset the 0 bits from B. We make a mask so we're only dealing with B's zero
+    // bits at this point, ignoring any 1 bits in B or 0 bits in B that are not relevant.
+    int valueA2 = ~(~valueB & flagsB) & valueA;
+    
+    // Now combine the 1 bits.
+    int valueA3 = (valueB & flagsB) | valueA2;
+    
+    valueA = valueA3;
+    flagsA = (flagsA | flagsB);
+    
+    return true;
+}
+
+/// Compare two bitlists
+bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags)
+{
+    int relevantBitsA = valueA & flags;
+    int relevantBitsB = valueB & flags;
+    return (relevantBitsA != relevantBitsB);
+}
+
 /// Split into paragraph and character styles
 bool wxRichTextSplitParaCharStyles(const wxTextAttrEx& style, wxTextAttrEx& parStyle, wxTextAttrEx& charStyle)
 {
 /// Split into paragraph and character styles
 bool wxRichTextSplitParaCharStyles(const wxTextAttrEx& style, wxTextAttrEx& parStyle, wxTextAttrEx& charStyle)
 {
@@ -7003,6 +7135,8 @@ void wxRichTextAttr::Init()
     m_paragraphSpacingBefore = 0;
     m_lineSpacing = 0;
     m_bulletStyle = wxTEXT_ATTR_BULLET_STYLE_NONE;
     m_paragraphSpacingBefore = 0;
     m_lineSpacing = 0;
     m_bulletStyle = wxTEXT_ATTR_BULLET_STYLE_NONE;
+    m_textEffects = wxTEXT_ATTR_EFFECT_NONE;
+    m_textEffectFlags = wxTEXT_ATTR_EFFECT_NONE;
     m_bulletNumber = 0;
 }
 
     m_bulletNumber = 0;
 }
 
@@ -7023,6 +7157,8 @@ void wxRichTextAttr::Copy(const wxRichTextAttr& attr)
     m_fontWeight = attr.m_fontWeight;
     m_fontUnderlined = attr.m_fontUnderlined;
     m_fontFaceName = attr.m_fontFaceName;
     m_fontWeight = attr.m_fontWeight;
     m_fontUnderlined = attr.m_fontUnderlined;
     m_fontFaceName = attr.m_fontFaceName;
+    m_textEffects = attr.m_textEffects;
+    m_textEffectFlags = attr.m_textEffectFlags;
 
     m_paragraphSpacingAfter = attr.m_paragraphSpacingAfter;
     m_paragraphSpacingBefore = attr.m_paragraphSpacingBefore;
 
     m_paragraphSpacingAfter = attr.m_paragraphSpacingAfter;
     m_paragraphSpacingBefore = attr.m_paragraphSpacingBefore;
@@ -7048,6 +7184,8 @@ void wxRichTextAttr::operator= (const wxRichTextAttr& attr)
 // operators
 void wxRichTextAttr::operator= (const wxTextAttrEx& attr)
 {
 // operators
 void wxRichTextAttr::operator= (const wxTextAttrEx& attr)
 {
+    m_flags = attr.GetFlags();
+
     m_colText = attr.GetTextColour();
     m_colBack = attr.GetBackgroundColour();
     m_textAlignment = attr.GetAlignment();
     m_colText = attr.GetTextColour();
     m_colBack = attr.GetBackgroundColour();
     m_textAlignment = attr.GetAlignment();
@@ -7055,7 +7193,8 @@ void wxRichTextAttr::operator= (const wxTextAttrEx& attr)
     m_leftSubIndent = attr.GetLeftSubIndent();
     m_rightIndent = attr.GetRightIndent();
     m_tabs = attr.GetTabs();
     m_leftSubIndent = attr.GetLeftSubIndent();
     m_rightIndent = attr.GetRightIndent();
     m_tabs = attr.GetTabs();
-    m_flags = attr.GetFlags();
+    m_textEffects = attr.GetTextEffects();
+    m_textEffectFlags = attr.GetTextEffectFlags();
 
     m_paragraphSpacingAfter = attr.GetParagraphSpacingAfter();
     m_paragraphSpacingBefore = attr.GetParagraphSpacingBefore();
 
     m_paragraphSpacingAfter = attr.GetParagraphSpacingAfter();
     m_paragraphSpacingBefore = attr.GetParagraphSpacingBefore();
@@ -7110,6 +7249,9 @@ bool wxRichTextAttr::operator== (const wxRichTextAttr& attr) const
             GetBulletFont() == attr.GetBulletFont() &&
             GetBulletName() == attr.GetBulletName() &&
 
             GetBulletFont() == attr.GetBulletFont() &&
             GetBulletName() == attr.GetBulletName() &&
 
+            GetTextEffects() == attr.GetTextEffects() &&
+            GetTextEffectFlags() == attr.GetTextEffectFlags() &&
+
             m_fontSize == attr.m_fontSize &&
             m_fontStyle == attr.m_fontStyle &&
             m_fontWeight == attr.m_fontWeight &&
             m_fontSize == attr.m_fontSize &&
             m_fontStyle == attr.m_fontStyle &&
             m_fontWeight == attr.m_fontWeight &&
@@ -7141,6 +7283,8 @@ void wxRichTextAttr::CopyTo(wxTextAttrEx& attr) const
     attr.SetCharacterStyleName(m_characterStyleName);
     attr.SetParagraphStyleName(m_paragraphStyleName);
     attr.SetListStyleName(m_listStyleName);
     attr.SetCharacterStyleName(m_characterStyleName);
     attr.SetParagraphStyleName(m_paragraphStyleName);
     attr.SetListStyleName(m_listStyleName);
+    attr.SetTextEffects(m_textEffects);
+    attr.SetTextEffectFlags(m_textEffectFlags);
 
     attr.SetURL(m_urlTarget);
 
 
     attr.SetURL(m_urlTarget);
 
@@ -7272,6 +7416,12 @@ wxRichTextAttr wxRichTextAttr::Combine(const wxRichTextAttr& attr,
     if (attr.HasPageBreak())
         newAttr.SetPageBreak();
 
     if (attr.HasPageBreak())
         newAttr.SetPageBreak();
 
+    if (attr.HasTextEffects())
+    {
+        newAttr.SetTextEffects(attr.GetTextEffects());
+        newAttr.SetTextEffectFlags(attr.GetTextEffectFlags());
+    }
+
     return newAttr;
 }
 
     return newAttr;
 }
 
@@ -7291,6 +7441,8 @@ void wxTextAttrEx::Init()
     m_paragraphSpacingBefore = 0;
     m_lineSpacing = 0;
     m_bulletStyle = wxTEXT_ATTR_BULLET_STYLE_NONE;
     m_paragraphSpacingBefore = 0;
     m_lineSpacing = 0;
     m_bulletStyle = wxTEXT_ATTR_BULLET_STYLE_NONE;
+    m_textEffects = wxTEXT_ATTR_EFFECT_NONE;
+    m_textEffectFlags = wxTEXT_ATTR_EFFECT_NONE;
     m_bulletNumber = 0;
 }
 
     m_bulletNumber = 0;
 }
 
@@ -7311,6 +7463,8 @@ void wxTextAttrEx::Copy(const wxTextAttrEx& attr)
     m_bulletFont = attr.m_bulletFont;
     m_bulletName = attr.m_bulletName;
     m_urlTarget = attr.m_urlTarget;
     m_bulletFont = attr.m_bulletFont;
     m_bulletName = attr.m_bulletName;
     m_urlTarget = attr.m_urlTarget;
+    m_textEffects = attr.m_textEffects;
+    m_textEffectFlags = attr.m_textEffectFlags;
 }
 
 // Assignment from a wxTextAttrEx object
 }
 
 // Assignment from a wxTextAttrEx object
@@ -7332,6 +7486,7 @@ bool wxTextAttrEx::operator== (const wxTextAttrEx& attr) const
         GetTextColour() == attr.GetTextColour() &&
         GetBackgroundColour() == attr.GetBackgroundColour() &&
         GetFont() == attr.GetFont() &&
         GetTextColour() == attr.GetTextColour() &&
         GetBackgroundColour() == attr.GetBackgroundColour() &&
         GetFont() == attr.GetFont() &&
+        GetTextEffects() == attr.GetTextEffects() &&
         GetAlignment() == attr.GetAlignment() &&
         GetLeftIndent() == attr.GetLeftIndent() &&
         GetRightIndent() == attr.GetRightIndent() &&
         GetAlignment() == attr.GetAlignment() &&
         GetLeftIndent() == attr.GetLeftIndent() &&
         GetRightIndent() == attr.GetRightIndent() &&
@@ -7499,6 +7654,12 @@ wxTextAttrEx wxTextAttrEx::CombineEx(const wxTextAttrEx& attr,
     if (attr.HasURL())
         newAttr.SetURL(attr.GetURL());
 
     if (attr.HasURL())
         newAttr.SetURL(attr.GetURL());
 
+    if (attr.HasTextEffects())
+    {
+        newAttr.SetTextEffects(attr.GetTextEffects());
+        newAttr.SetTextEffectFlags(attr.GetTextEffectFlags());
+    }
+
     return newAttr;
 }
 
     return newAttr;
 }
 
@@ -7571,12 +7732,12 @@ bool wxRichTextPlainTextHandler::DoLoadFile(wxRichTextBuffer *buffer, wxInputStr
         }
     }
 
         }
     }
 
+    buffer->ResetAndClearCommands();
     buffer->Clear();
     buffer->AddParagraphs(str);
     buffer->UpdateRanges();
 
     return true;
     buffer->Clear();
     buffer->AddParagraphs(str);
     buffer->UpdateRanges();
 
     return true;
-
 }
 
 bool wxRichTextPlainTextHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream)
 }
 
 bool wxRichTextPlainTextHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream)
index 636c49443972f05c48317d86accc05b5cd23aee8..f894b85f5cb68b13def46ed6fb09491089d8afc4 100644 (file)
@@ -137,6 +137,7 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va
     if (style & wxTE_READONLY)
         SetEditable(false);
 
     if (style & wxTE_READONLY)
         SetEditable(false);
 
+    // The base attributes must all have default values
     wxTextAttrEx attributes;
     attributes.SetFont(GetFont());
     attributes.SetTextColour(*wxBLACK);
     wxTextAttrEx attributes;
     attributes.SetFont(GetFont());
     attributes.SetTextColour(*wxBLACK);
@@ -145,6 +146,8 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va
     attributes.SetLineSpacing(10);
     attributes.SetParagraphSpacingAfter(10);
     attributes.SetParagraphSpacingBefore(0);
     attributes.SetLineSpacing(10);
     attributes.SetParagraphSpacingAfter(10);
     attributes.SetParagraphSpacingBefore(0);
+    attributes.SetTextEffects(0);
+    attributes.SetTextEffectFlags(wxTEXT_ATTR_EFFECT_STRIKETHROUGH|wxTEXT_ATTR_EFFECT_CAPITALS);
 
     SetBasicStyle(attributes);
 
 
     SetBasicStyle(attributes);
 
index fc220dd7409143d268ce39d83943515cea9bc046..a44548659707ae14b939cacd5dd073afda9ac76d 100644 (file)
@@ -38,6 +38,10 @@ BEGIN_EVENT_TABLE( wxRichTextFontPage, wxPanel )
 
     EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL, wxRichTextFontPage::OnUnderliningCtrlSelected )
 
 
     EVT_COMBOBOX( ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL, wxRichTextFontPage::OnUnderliningCtrlSelected )
 
+    EVT_CHECKBOX( ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL, wxRichTextFontPage::OnStrikethroughctrlClick )
+
+    EVT_CHECKBOX( ID_RICHTEXTFONTPAGE_CAPSCTRL, wxRichTextFontPage::OnCapsctrlClick )
+
 ////@end wxRichTextFontPage event table entries
 
 END_EVENT_TABLE()
 ////@end wxRichTextFontPage event table entries
 
 END_EVENT_TABLE()
@@ -75,6 +79,8 @@ void wxRichTextFontPage::Init()
     m_weightCtrl = NULL;
     m_underliningCtrl = NULL;
     m_colourCtrl = NULL;
     m_weightCtrl = NULL;
     m_underliningCtrl = NULL;
     m_colourCtrl = NULL;
+    m_strikethroughCtrl = NULL;
+    m_capitalsCtrl = NULL;
     m_previewCtrl = NULL;
 ////@end wxRichTextFontPage member initialisation
 }
     m_previewCtrl = NULL;
 ////@end wxRichTextFontPage member initialisation
 }
@@ -122,7 +128,7 @@ void wxRichTextFontPage::CreateControls()
     wxStaticText* itemStaticText6 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Font:"), wxDefaultPosition, wxDefaultSize, 0 );
     itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxStaticText* itemStaticText6 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Font:"), wxDefaultPosition, wxDefaultSize, 0 );
     itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
-    m_faceTextCtrl = new wxTextCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_FACETEXTCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+    m_faceTextCtrl = new wxTextCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_FACETEXTCTRL, _T(""), wxDefaultPosition, wxDefaultSize, 0 );
     m_faceTextCtrl->SetHelpText(_("Type a font name."));
     if (ShowToolTips())
         m_faceTextCtrl->SetToolTip(_("Type a font name."));
     m_faceTextCtrl->SetHelpText(_("Type a font name."));
     if (ShowToolTips())
         m_faceTextCtrl->SetToolTip(_("Type a font name."));
@@ -140,7 +146,7 @@ void wxRichTextFontPage::CreateControls()
     wxStaticText* itemStaticText10 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Size:"), wxDefaultPosition, wxDefaultSize, 0 );
     itemBoxSizer9->Add(itemStaticText10, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxStaticText* itemStaticText10 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Size:"), wxDefaultPosition, wxDefaultSize, 0 );
     itemBoxSizer9->Add(itemStaticText10, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
-    m_sizeTextCtrl = new wxTextCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_SIZETEXTCTRL, wxEmptyString, wxDefaultPosition, wxSize(50, -1), 0 );
+    m_sizeTextCtrl = new wxTextCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_SIZETEXTCTRL, _T(""), wxDefaultPosition, wxSize(50, -1), 0 );
     m_sizeTextCtrl->SetHelpText(_("Type a size in points."));
     if (ShowToolTips())
         m_sizeTextCtrl->SetToolTip(_("Type a size in points."));
     m_sizeTextCtrl->SetHelpText(_("Type a size in points."));
     if (ShowToolTips())
         m_sizeTextCtrl->SetToolTip(_("Type a size in points."));
@@ -163,7 +169,7 @@ void wxRichTextFontPage::CreateControls()
     itemBoxSizer14->Add(itemStaticText15, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxString* m_styleCtrlStrings = NULL;
     itemBoxSizer14->Add(itemStaticText15, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxString* m_styleCtrlStrings = NULL;
-    m_styleCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_STYLECTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, m_styleCtrlStrings, wxCB_READONLY );
+    m_styleCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_STYLECTRL, _T(""), wxDefaultPosition, wxDefaultSize, 0, m_styleCtrlStrings, wxCB_READONLY );
     m_styleCtrl->SetHelpText(_("Select regular or italic style."));
     if (ShowToolTips())
         m_styleCtrl->SetToolTip(_("Select regular or italic style."));
     m_styleCtrl->SetHelpText(_("Select regular or italic style."));
     if (ShowToolTips())
         m_styleCtrl->SetToolTip(_("Select regular or italic style."));
@@ -176,7 +182,7 @@ void wxRichTextFontPage::CreateControls()
     itemBoxSizer17->Add(itemStaticText18, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxString* m_weightCtrlStrings = NULL;
     itemBoxSizer17->Add(itemStaticText18, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxString* m_weightCtrlStrings = NULL;
-    m_weightCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_WEIGHTCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, m_weightCtrlStrings, wxCB_READONLY );
+    m_weightCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_WEIGHTCTRL, _T(""), wxDefaultPosition, wxDefaultSize, 0, m_weightCtrlStrings, wxCB_READONLY );
     m_weightCtrl->SetHelpText(_("Select regular or bold."));
     if (ShowToolTips())
         m_weightCtrl->SetToolTip(_("Select regular or bold."));
     m_weightCtrl->SetHelpText(_("Select regular or bold."));
     if (ShowToolTips())
         m_weightCtrl->SetToolTip(_("Select regular or bold."));
@@ -189,7 +195,7 @@ void wxRichTextFontPage::CreateControls()
     itemBoxSizer20->Add(itemStaticText21, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxString* m_underliningCtrlStrings = NULL;
     itemBoxSizer20->Add(itemStaticText21, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
     wxString* m_underliningCtrlStrings = NULL;
-    m_underliningCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, m_underliningCtrlStrings, wxCB_READONLY );
+    m_underliningCtrl = new wxComboBox( itemPanel1, ID_RICHTEXTFONTPAGE_UNDERLINING_CTRL, _T(""), wxDefaultPosition, wxDefaultSize, 0, m_underliningCtrlStrings, wxCB_READONLY );
     m_underliningCtrl->SetHelpText(_("Select underlining or no underlining."));
     if (ShowToolTips())
         m_underliningCtrl->SetToolTip(_("Select underlining or no underlining."));
     m_underliningCtrl->SetHelpText(_("Select underlining or no underlining."));
     if (ShowToolTips())
         m_underliningCtrl->SetToolTip(_("Select underlining or no underlining."));
@@ -207,6 +213,23 @@ void wxRichTextFontPage::CreateControls()
         m_colourCtrl->SetToolTip(_("Click to change the text colour."));
     itemBoxSizer23->Add(m_colourCtrl, 0, wxALIGN_LEFT|wxALL, 5);
 
         m_colourCtrl->SetToolTip(_("Click to change the text colour."));
     itemBoxSizer23->Add(m_colourCtrl, 0, wxALIGN_LEFT|wxALL, 5);
 
+    wxBoxSizer* itemBoxSizer26 = new wxBoxSizer(wxHORIZONTAL);
+    itemBoxSizer3->Add(itemBoxSizer26, 0, wxGROW, 5);
+
+    m_strikethroughCtrl = new wxCheckBox( itemPanel1, ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL, _("&Strikethrough"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
+    m_strikethroughCtrl->SetValue(false);
+    m_strikethroughCtrl->SetHelpText(_("Check to show a line through the text."));
+    if (ShowToolTips())
+        m_strikethroughCtrl->SetToolTip(_("Check to show a line through the text."));
+    itemBoxSizer26->Add(m_strikethroughCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+
+    m_capitalsCtrl = new wxCheckBox( itemPanel1, ID_RICHTEXTFONTPAGE_CAPSCTRL, _("Ca&pitals"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
+    m_capitalsCtrl->SetValue(false);
+    m_capitalsCtrl->SetHelpText(_("Check to show the text in capitals."));
+    if (ShowToolTips())
+        m_capitalsCtrl->SetToolTip(_("Check to show the text in capitals."));
+    itemBoxSizer26->Add(m_capitalsCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+
     itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
 
     m_previewCtrl = new wxRichTextFontPreviewCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_PREVIEWCTRL, wxDefaultPosition, wxSize(100, 80), wxSIMPLE_BORDER );
     itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
 
     m_previewCtrl = new wxRichTextFontPreviewCtrl( itemPanel1, ID_RICHTEXTFONTPAGE_PREVIEWCTRL, wxDefaultPosition, wxSize(100, 80), wxSIMPLE_BORDER );
@@ -329,6 +352,26 @@ bool wxRichTextFontPage::TransferDataFromWindow()
     }
     else
         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_TEXT_COLOUR));
     }
     else
         attr->SetFlags(attr->GetFlags() & (~ wxTEXT_ATTR_TEXT_COLOUR));
+        
+    if (m_strikethroughCtrl->Get3StateValue() != wxCHK_UNDETERMINED)
+    {
+        attr->SetTextEffectFlags(attr->GetTextEffectFlags() | wxTEXT_ATTR_EFFECT_STRIKETHROUGH);
+
+        if (m_strikethroughCtrl->Get3StateValue() == wxCHK_CHECKED)
+            attr->SetTextEffects(attr->GetTextEffects() | wxTEXT_ATTR_EFFECT_STRIKETHROUGH);
+        else
+            attr->SetTextEffects(attr->GetTextEffects() & ~wxTEXT_ATTR_EFFECT_STRIKETHROUGH);
+    }
+
+    if (m_capitalsCtrl->Get3StateValue() != wxCHK_UNDETERMINED)
+    {
+        attr->SetTextEffectFlags(attr->GetTextEffectFlags() | wxTEXT_ATTR_EFFECT_CAPITALS);
+    
+        if (m_capitalsCtrl->Get3StateValue() == wxCHK_CHECKED)
+            attr->SetTextEffects(attr->GetTextEffects() | wxTEXT_ATTR_EFFECT_CAPITALS);
+        else
+            attr->SetTextEffects(attr->GetTextEffects() & ~wxTEXT_ATTR_EFFECT_CAPITALS);
+    }
 
     return true;
 }
 
     return true;
 }
@@ -406,6 +449,34 @@ bool wxRichTextFontPage::TransferDataToWindow()
         m_colourPresent = true;
     }
 
         m_colourPresent = true;
     }
 
+    if (attr->HasTextEffects())
+    {
+        if (attr->GetTextEffectFlags() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH)
+        {
+            if (attr->GetTextEffects() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH)
+                m_strikethroughCtrl->Set3StateValue(wxCHK_CHECKED);
+            else
+                m_strikethroughCtrl->Set3StateValue(wxCHK_UNCHECKED);
+        }
+        else
+            m_strikethroughCtrl->Set3StateValue(wxCHK_UNDETERMINED);
+
+        if (attr->GetTextEffectFlags() & wxTEXT_ATTR_EFFECT_CAPITALS)
+        {
+            if (attr->GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)
+                m_capitalsCtrl->Set3StateValue(wxCHK_CHECKED);
+            else
+                m_capitalsCtrl->Set3StateValue(wxCHK_UNCHECKED);
+        }
+        else
+            m_capitalsCtrl->Set3StateValue(wxCHK_UNDETERMINED);
+    }
+    else
+    {
+        m_strikethroughCtrl->Set3StateValue(wxCHK_UNDETERMINED);
+        m_capitalsCtrl->Set3StateValue(wxCHK_UNDETERMINED);
+    }
+
     UpdatePreview();
 
     m_dontUpdate = false;
     UpdatePreview();
 
     m_dontUpdate = false;
@@ -472,8 +543,21 @@ void wxRichTextFontPage::UpdatePreview()
 
         font.SetUnderlined(underlined);
     }
 
         font.SetUnderlined(underlined);
     }
+    
+    int textEffects = 0;
+
+    if (m_strikethroughCtrl->Get3StateValue() == wxCHK_CHECKED)
+    {
+        textEffects |= wxTEXT_ATTR_EFFECT_STRIKETHROUGH;
+    }
+
+    if (m_capitalsCtrl->Get3StateValue() == wxCHK_CHECKED)
+    {
+        textEffects |= wxTEXT_ATTR_EFFECT_CAPITALS;
+    }
 
     m_previewCtrl->SetFont(font);
 
     m_previewCtrl->SetFont(font);
+    m_previewCtrl->SetTextEffects(textEffects);
     m_previewCtrl->Refresh();
 }
 
     m_previewCtrl->Refresh();
 }
 
@@ -628,3 +712,22 @@ void wxRichTextFontPage::OnColourClicked( wxCommandEvent& WXUNUSED(event) )
 
     UpdatePreview();
 }
 
     UpdatePreview();
 }
+/*!
+ * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_STRIKETHROUGHCTRL
+ */
+
+void wxRichTextFontPage::OnStrikethroughctrlClick( wxCommandEvent& WXUNUSED(event) )
+{
+    UpdatePreview();
+}
+
+/*!
+ * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTFONTPAGE_CAPSCTRL
+ */
+
+void wxRichTextFontPage::OnCapsctrlClick( wxCommandEvent& WXUNUSED(event) )
+{
+    UpdatePreview();
+}
+
+
index 7c21d4c0622dbb98b4054a83911f2c02fd4c3e1d..018bbb77605fc37086d99412c1b90337907dc8f9 100644 (file)
@@ -408,6 +408,8 @@ void wxRichTextFontPreviewCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
         long w = 0, h = 0;
 
         wxString text(_("ABCDEFGabcdefg12345"));
         long w = 0, h = 0;
 
         wxString text(_("ABCDEFGabcdefg12345"));
+        if (GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)
+            text.MakeUpper();
 
         dc.GetTextExtent( text, &w, &h);
         int cx = wxMax(2, (size.x/2) - (w/2));
 
         dc.GetTextExtent( text, &w, &h);
         int cx = wxMax(2, (size.x/2) - (w/2));
@@ -416,6 +418,13 @@ void wxRichTextFontPreviewCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
         dc.SetTextForeground(GetForegroundColour());
         dc.SetClippingRegion(2, 2, size.x-4, size.y-4);
         dc.DrawText(text, cx, cy);
         dc.SetTextForeground(GetForegroundColour());
         dc.SetClippingRegion(2, 2, size.x-4, size.y-4);
         dc.DrawText(text, cx, cy);
+        
+        if (GetTextEffects() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH)
+        {
+            dc.SetPen(wxPen(GetForegroundColour(), 1));
+            dc.DrawLine(cx, (int) (cy + h/2 + 0.5), cx + w, (int) (cy + h/2 + 0.5));
+        }
+        
         dc.DestroyClippingRegion();
     }
 }
         dc.DestroyClippingRegion();
     }
 }
index c1722d2281acad3a96c252cb64a759a61a04366a..965bbd4630618ca49521b674cbc9655c1449a115 100644 (file)
@@ -100,8 +100,13 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream&
                 {
                     wxTextAttrEx charStyle(para->GetCombinedAttributes(obj->GetAttributes()));
                     BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, stream);
                 {
                     wxTextAttrEx charStyle(para->GetCombinedAttributes(obj->GetAttributes()));
                     BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, stream);
+                    
+                    wxString text = textObj->GetText();
 
 
-                    str << textObj->GetText();
+                    if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
+                        text.MakeUpper();
+
+                    str << text;
 
                     EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, stream);
                 }
 
                     EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, stream);
                 }
@@ -321,6 +326,12 @@ void wxRichTextHTMLHandler::OutputParagraphFormatting(const wxTextAttrEx& WXUNUS
         wxString align = GetAlignment(thisStyle);
         str << wxString::Format(wxT("<p align=\"%s\">"), align.c_str());
     }
         wxString align = GetAlignment(thisStyle);
         str << wxString::Format(wxT("<p align=\"%s\">"), align.c_str());
     }
+    
+    if (thisStyle.HasPageBreak())
+    {
+        wxTextOutputStream str(stream);
+        str << wxT("<div style=\"page-break-after:always\"></div>\n");
+    }
 }
 
 void wxRichTextHTMLHandler::NavigateToListPosition(const wxTextAttrEx& thisStyle, wxTextOutputStream& str)
 }
 
 void wxRichTextHTMLHandler::NavigateToListPosition(const wxTextAttrEx& thisStyle, wxTextOutputStream& str)
index 804f28061dcf60e850eab05b8b7c452803019c6d..7ecf8463230609b39cd5723fe07d0a977817ef69 100644 (file)
@@ -45,6 +45,7 @@ void wxRichTextStyleDefinition::Copy(const wxRichTextStyleDefinition& def)
     m_name = def.m_name;
     m_baseStyle = def.m_baseStyle;
     m_style = def.m_style;
     m_name = def.m_name;
     m_baseStyle = def.m_baseStyle;
     m_style = def.m_style;
+    m_description = def.m_description;
 }
 
 bool wxRichTextStyleDefinition::Eq(const wxRichTextStyleDefinition& def) const
 }
 
 bool wxRichTextStyleDefinition::Eq(const wxRichTextStyleDefinition& def) const
@@ -376,6 +377,9 @@ void wxRichTextStyleSheet::Copy(const wxRichTextStyleSheet& sheet)
         wxRichTextListStyleDefinition* def = (wxRichTextListStyleDefinition*) node->GetData();
         AddListStyle(new wxRichTextListStyleDefinition(*def));
     }
         wxRichTextListStyleDefinition* def = (wxRichTextListStyleDefinition*) node->GetData();
         AddListStyle(new wxRichTextListStyleDefinition(*def));
     }
+    
+    SetName(sheet.GetName());
+    SetDescription(sheet.GetDescription());
 }
 
 /// Equality
 }
 
 /// Equality
index 82170da836ca6d60d28a2ec7663425d90bc98926..2a9ac747cc31665a5c0fe85ef8f148d10d69d69d 100644 (file)
@@ -42,6 +42,7 @@ bool wxRichTextXMLHandler::DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& s
         return false;
 
     buffer->ResetAndClearCommands();
         return false;
 
     buffer->ResetAndClearCommands();
+    buffer->Clear();
 
     wxXmlDocument* xmlDoc = new wxXmlDocument;
     bool success = true;
 
     wxXmlDocument* xmlDoc = new wxXmlDocument;
     bool success = true;
@@ -55,6 +56,7 @@ bool wxRichTextXMLHandler::DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& s
 
     if (!xmlDoc->Load(stream, encoding))
     {
 
     if (!xmlDoc->Load(stream, encoding))
     {
+        buffer->ResetAndClearCommands();
         success = false;
     }
     else
         success = false;
     }
     else
@@ -215,6 +217,10 @@ bool wxRichTextXMLHandler::ImportXML(wxRichTextBuffer* buffer, wxXmlNode* node)
         if (GetFlags() & wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET)
         {
             wxRichTextStyleSheet* sheet = new wxRichTextStyleSheet;
         if (GetFlags() & wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET)
         {
             wxRichTextStyleSheet* sheet = new wxRichTextStyleSheet;
+            wxString sheetName = node->GetPropVal(wxT("name"), wxEmptyString);
+            wxString sheetDescription = node->GetPropVal(wxT("description"), wxEmptyString);
+            sheet->SetName(sheetName);
+            sheet->SetDescription(sheetDescription);
             
             wxXmlNode* child = node->GetChildren();
             while (child)
             
             wxXmlNode* child = node->GetChildren();
             while (child)
@@ -573,7 +579,12 @@ bool wxRichTextXMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream&
     if (buffer->GetStyleSheet() && (GetFlags() & wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET))
     {
         OutputIndentation(stream, level);
     if (buffer->GetStyleSheet() && (GetFlags() & wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET))
     {
         OutputIndentation(stream, level);
-        OutputString(stream, wxT("<stylesheet>"), convMem, convFile);
+        wxString nameAndDescr;
+        if (!buffer->GetStyleSheet()->GetName().IsEmpty())
+            nameAndDescr << wxT(" name=\"") << buffer->GetStyleSheet()->GetName() << wxT("\"");
+        if (!buffer->GetStyleSheet()->GetDescription().IsEmpty())
+            nameAndDescr << wxT(" description=\"") << buffer->GetStyleSheet()->GetDescription() << wxT("\"");
+        OutputString(stream, wxString(wxT("<stylesheet")) + nameAndDescr + wxT(">"), convMem, convFile);
 
         int i;
 
 
         int i;
 
@@ -773,10 +784,15 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxMBCon
     if (!baseStyle.IsEmpty())
         baseStyleProp = wxT(" basestyle=\"") + baseStyle + wxT("\"");
     
     if (!baseStyle.IsEmpty())
         baseStyleProp = wxT(" basestyle=\"") + baseStyle + wxT("\"");
     
+    wxString descr = def->GetDescription();
+    wxString descrProp;
+    if (!descr.IsEmpty())
+        descrProp = wxT(" description=\"") + descr + wxT("\"");
+    
     if (charDef)
     {
         OutputIndentation(stream, level);
     if (charDef)
     {
         OutputIndentation(stream, level);
-        OutputString(stream, wxT("<characterstyle") + baseStyleProp + wxT(">"), convMem, convFile);
+        OutputString(stream, wxT("<characterstyle") + baseStyleProp + descrProp + wxT(">"), convMem, convFile);
         
         level ++;
 
         
         level ++;
 
@@ -800,7 +816,7 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxMBCon
         if (!listDef->GetNextStyle().IsEmpty())
             baseStyleProp << wxT(" basestyle=\"") << listDef->GetNextStyle() << wxT("\"");
         
         if (!listDef->GetNextStyle().IsEmpty())
             baseStyleProp << wxT(" basestyle=\"") << listDef->GetNextStyle() << wxT("\"");
         
-        OutputString(stream, wxT("<liststyle") + baseStyleProp + wxT(">"), convMem, convFile);
+        OutputString(stream, wxT("<liststyle") + baseStyleProp + descrProp + wxT(">"), convMem, convFile);
         
         level ++;
 
         
         level ++;
 
@@ -841,7 +857,7 @@ bool wxRichTextXMLHandler::ExportStyleDefinition(wxOutputStream& stream, wxMBCon
         if (!listDef->GetNextStyle().IsEmpty())
             baseStyleProp << wxT(" basestyle=\"") << listDef->GetNextStyle() << wxT("\"");
         
         if (!listDef->GetNextStyle().IsEmpty())
             baseStyleProp << wxT(" basestyle=\"") << listDef->GetNextStyle() << wxT("\"");
         
-        OutputString(stream, wxT("<paragraphstyle") + baseStyleProp + wxT(">"), convMem, convFile);
+        OutputString(stream, wxT("<paragraphstyle") + baseStyleProp + descrProp + wxT(">"), convMem, convFile);
         
         level ++;
 
         
         level ++;
 
@@ -896,6 +912,13 @@ wxString wxRichTextXMLHandler::CreateStyle(const wxTextAttrEx& attr, bool isPara
             str << wxT(" fontface=\"") << attr.GetFont().GetFaceName() << wxT("\"");
     }
 
             str << wxT(" fontface=\"") << attr.GetFont().GetFaceName() << wxT("\"");
     }
 
+    if (attr.HasTextEffects())
+    {
+        str << wxT(" texteffects=\"");
+        str << attr.GetTextEffects();
+        str << wxT("\"");
+    }
+
     if (!attr.GetCharacterStyleName().empty())
         str << wxT(" characterstyle=\"") << wxString(attr.GetCharacterStyleName()) << wxT("\"");
 
     if (!attr.GetCharacterStyleName().empty())
         str << wxT(" characterstyle=\"") << wxString(attr.GetCharacterStyleName()) << wxT("\"");
 
@@ -964,6 +987,11 @@ wxString wxRichTextXMLHandler::CreateStyle(const wxTextAttrEx& attr, bool isPara
             }
             str << wxT("\"");            
         }
             }
             str << wxT("\"");            
         }
+        
+        if (attr.HasPageBreak())
+        {
+            str << wxT(" pagebreak=\"1\"");
+        }
     }
 
     return str;
     }
 
     return str;
@@ -1048,6 +1076,12 @@ bool wxRichTextXMLHandler::GetStyle(wxTextAttrEx& attr, wxXmlNode* node, bool is
     if (!value.empty())
         attr.SetCharacterStyleName(value);
 
     if (!value.empty())
         attr.SetCharacterStyleName(value);
 
+    value = node->GetPropVal(wxT("texteffects"), wxEmptyString);
+    if (!value.IsEmpty())
+    {
+        attr.SetTextEffects(wxAtoi(value));
+    }
+
     // Set paragraph attributes
     if (isPara)
     {
     // Set paragraph attributes
     if (isPara)
     {
@@ -1145,6 +1179,12 @@ bool wxRichTextXMLHandler::GetStyle(wxTextAttrEx& attr, wxXmlNode* node, bool is
             }
             attr.SetTabs(tabs);
         }
             }
             attr.SetTabs(tabs);
         }
+        
+        value = node->GetPropVal(wxT("pagebreak"), wxEmptyString);
+        if (!value.IsEmpty())
+        {
+            attr.SetPageBreak(wxAtoi(value) != 0);
+        }
     }
 
     return true;
     }
 
     return true;