]> git.saurik.com Git - wxWidgets.git/blobdiff - src/richtext/richtextbuffer.cpp
Added resize support to wxMiniFrame.
[wxWidgets.git] / src / richtext / richtextbuffer.cpp
index 2c0904b4d566e668d66c8354d5038952bed2a7bb..ee680385d798f18012f01acc191654b7b57a8308 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        richtext/richtextbuffer.cpp
+// Name:        src/richtext/richtextbuffer.cpp
 // Purpose:     Buffer for wxRichTextCtrl
 // Author:      Julian Smart
 // Modified by:
@@ -13,7 +13,7 @@
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-  #pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #if wxUSE_RICHTEXT
 #include "wx/richtext/richtextbuffer.h"
 
 #ifndef WX_PRECOMP
-  #include "wx/wx.h"
+    #include "wx/dc.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/dataobj.h"
 #endif
 
 #include "wx/filename.h"
 #include "wx/clipbrd.h"
-#include "wx/dataobj.h"
 #include "wx/wfstream.h"
 #include "wx/module.h"
 #include "wx/mstream.h"
@@ -906,7 +908,7 @@ wxRichTextRange wxRichTextParagraphLayoutBox::AddParagraphs(const wxString& text
 
     wxRichTextRange range(-1, -1);
     size_t i = 0;
-    size_t len = text.Length();
+    size_t len = text.length();
     wxString line;
     while (i < len)
     {
@@ -1411,7 +1413,7 @@ wxString wxRichTextParagraphLayoutBox::GetText() const
 /// Get the paragraph by number
 wxRichTextParagraph* wxRichTextParagraphLayoutBox::GetParagraphAtLine(long paragraphNumber) const
 {
-    if ((size_t) paragraphNumber <= GetChildCount())
+    if ((size_t) paragraphNumber >= GetChildCount())
         return NULL;
 
     return (wxRichTextParagraph*) GetChild((size_t) paragraphNumber);
@@ -1671,7 +1673,13 @@ bool wxRichTextParagraphLayoutBox::GetStyle(long position, wxRichTextAttr& style
 /// Set default style
 bool wxRichTextParagraphLayoutBox::SetDefaultStyle(const wxTextAttrEx& style)
 {
-    m_defaultAttributes = style;
+    // keep the old attributes if the new style doesn't specify them unless the
+    // new style is empty - then reset m_defaultStyle (as there is no other way
+    // to do it)
+    if ( style.IsDefault() )
+        m_defaultAttributes = style;
+    else
+        m_defaultAttributes = wxTextAttrEx::CombineEx(style, m_defaultAttributes, NULL);
 
     return true;
 }
@@ -2258,7 +2266,7 @@ bool wxRichTextParagraph::InsertText(long pos, const wxString& text)
                                text + textObject->GetText().Mid(posInString);
             textObject->SetText(newText);
 
-            int textLength = text.Length();
+            int textLength = text.length();
 
             textObject->SetRange(wxRichTextRange(textObject->GetRange().GetStart(),
                                                  textObject->GetRange().GetEnd() + textLength));
@@ -2752,7 +2760,7 @@ bool wxRichTextParagraph::FindWrapPosition(const wxRichTextRange& range, wxDC& d
         int spacePos = plainText.Find(wxT(' '), true);
         if (spacePos != wxNOT_FOUND)
         {
-            int positionsFromEndOfString = plainText.Length() - spacePos - 1;
+            int positionsFromEndOfString = plainText.length() - spacePos - 1;
             breakPosition = breakPosition - positionsFromEndOfString;
         }
     }
@@ -3040,7 +3048,7 @@ bool wxRichTextPlainText::Draw(wxDC& dc, const wxRichTextRange& range, const wxR
 
     return true;
 }
+
 bool wxRichTextPlainText::DrawTabbedString(wxDC& dc,const wxRect& rect,wxString& str, wxCoord& x, wxCoord& y, bool selected)
 {
     wxArrayInt tab_array =  GetAttributes().GetTabs();
@@ -3053,7 +3061,7 @@ bool wxRichTextPlainText::DrawTabbedString(wxDC& dc,const wxRect& rect,wxString&
     dc.SetMapMode(wxMM_LOMETRIC );
     int num_tabs = tab_array.GetCount();
     for( int i = 0; i < num_tabs; ++i){
-       tab_array[i] = dc.LogicalToDeviceXRel(tab_array[i]);         
+       tab_array[i] = dc.LogicalToDeviceXRel(tab_array[i]);
     }
     dc.SetMapMode(map_mode );
     int next_tab_pos = -1;
@@ -3069,7 +3077,7 @@ bool wxRichTextPlainText::DrawTabbedString(wxDC& dc,const wxRect& rect,wxString&
         dc.SetTextForeground(GetAttributes().GetTextColour());
         dc.SetBackgroundMode(wxTRANSPARENT);
     }
-    while(str.Find(wxT('\t')) >= 0){// the string has a tab 
+    while(str.Find(wxT('\t')) >= 0){// the string has a tab
         // break up the string at the Tab
         wxString stringChunk = str.BeforeFirst(wxT('\t'));
         str = str.AfterFirst(wxT('\t'));
@@ -3083,18 +3091,18 @@ bool wxRichTextPlainText::DrawTabbedString(wxDC& dc,const wxRect& rect,wxString&
                 if(selected){
                     w = next_tab_pos - x;
                     wxRect selRect(x, rect.y, w, rect.GetHeight());
-                    dc.DrawRectangle(selRect);   
+                    dc.DrawRectangle(selRect);
                 }
                 dc.DrawText(stringChunk, x, y);
                 x = next_tab_pos;
             }
         }
     }
-    
+
     dc.GetTextExtent(str, & w, & h);
     if(selected){
         wxRect selRect(x, rect.y, w, rect.GetHeight());
-        dc.DrawRectangle(selRect);   
+        dc.DrawRectangle(selRect);
     }
     dc.DrawText(str, x, y);
     x += w;
@@ -3141,23 +3149,27 @@ bool wxRichTextPlainText::GetRangeSize(const wxRichTextRange& range, wxSize& siz
     wxString stringChunk = m_text.Mid(startPos, (size_t) len);
     wxCoord w, h;
     int width = 0;
-    if(stringChunk.Find(wxT('\t')) >= 0){// the string has a tab 
+    if(stringChunk.Find(wxT('\t')) >= 0){// the string has a tab
         wxArrayInt tab_array =  GetAttributes().GetTabs();
-        if(tab_array.IsEmpty()){// create a default tab list at 10 mm each.
-            for( int i = 0; i < 20; ++i){
+        if(tab_array.IsEmpty())
+        {
+            // create a default tab list at 10 mm each.
+            for( int i = 0; i < 20; ++i)
+            {
                 tab_array.Add(i*100);
             }
         }
         int map_mode = dc.GetMapMode();
         dc.SetMapMode(wxMM_LOMETRIC );
         int num_tabs = tab_array.GetCount();
-        for( int i = 0; i < num_tabs; ++i){
-            tab_array[i] = dc.LogicalToDeviceXRel(tab_array[i]);         
+        for( int i = 0; i < num_tabs; ++i)
+        {
+            tab_array[i] = dc.LogicalToDeviceXRel(tab_array[i]);
         }
         dc.SetMapMode(map_mode );
         int next_tab_pos = -1;
-        
-        while(stringChunk.Find(wxT('\t')) >= 0){// the string has a tab 
+
+        while(stringChunk.Find(wxT('\t')) >= 0){// the string has a tab
             // break up the string at the Tab
             wxString stringFragment = stringChunk.BeforeFirst(wxT('\t'));
             stringChunk = stringChunk.AfterFirst(wxT('\t'));
@@ -3168,7 +3180,7 @@ bool wxRichTextPlainText::GetRangeSize(const wxRichTextRange& range, wxSize& siz
             for( int i = 0; i < num_tabs && not_found; ++i){
                 next_tab_pos = tab_array.Item(i);
                 if( next_tab_pos > absolute_width){
-                    not_found = false;                  
+                    not_found = false;
                     width = next_tab_pos - position.x;
                 }
             }
@@ -3177,7 +3189,7 @@ bool wxRichTextPlainText::GetRangeSize(const wxRichTextRange& range, wxSize& siz
     dc.GetTextExtent(stringChunk, & w, & h, & descent);
     width += w;
     size = wxSize(width, dc.GetCharHeight());
-    
+
     return true;
 }
 
@@ -3186,7 +3198,7 @@ bool wxRichTextPlainText::GetRangeSize(const wxRichTextRange& range, wxSize& siz
 wxRichTextObject* wxRichTextPlainText::DoSplit(long pos)
 {
     int index = pos - GetRange().GetStart();
-    if (index < 0 || index >= (int) m_text.Length())
+    if (index < 0 || index >= (int) m_text.length())
         return NULL;
 
     wxString firstPart = m_text.Mid(0, index);
@@ -3206,7 +3218,7 @@ wxRichTextObject* wxRichTextPlainText::DoSplit(long pos)
 /// Calculate range
 void wxRichTextPlainText::CalculateRange(long start, long& end)
 {
-    end = start + m_text.Length() - 1;
+    end = start + m_text.length() - 1;
     m_range.SetRange(start, end);
 }
 
@@ -3331,7 +3343,7 @@ bool wxRichTextBuffer::InsertTextWithUndo(long pos, const wxString& text, wxRich
     action->SetPosition(pos);
 
     // Set the range we'll need to delete in Undo
-    action->SetRange(wxRichTextRange(pos, pos + text.Length() - 1));
+    action->SetRange(wxRichTextRange(pos, pos + text.length() - 1));
 
     SubmitAction(action);
 
@@ -4913,6 +4925,94 @@ bool wxRichTextAttr::GetFontAttributes(const wxFont& font)
     return true;
 }
 
+wxRichTextAttr wxRichTextAttr::Combine(const wxRichTextAttr& attr,
+                               const wxRichTextAttr& attrDef,
+                               const wxTextCtrlBase *text)
+{
+    wxColour colFg = attr.GetTextColour();
+    if ( !colFg.Ok() )
+    {
+        colFg = attrDef.GetTextColour();
+
+        if ( text && !colFg.Ok() )
+            colFg = text->GetForegroundColour();
+    }
+
+    wxColour colBg = attr.GetBackgroundColour();
+    if ( !colBg.Ok() )
+    {
+        colBg = attrDef.GetBackgroundColour();
+
+        if ( text && !colBg.Ok() )
+            colBg = text->GetBackgroundColour();
+    }
+
+    wxRichTextAttr newAttr(colFg, colBg);
+
+    if (attr.HasWeight())
+        newAttr.SetFontWeight(attr.GetFontWeight());
+
+    if (attr.HasSize())
+        newAttr.SetFontSize(attr.GetFontSize());
+
+    if (attr.HasItalic())
+        newAttr.SetFontStyle(attr.GetFontStyle());
+
+    if (attr.HasUnderlined())
+        newAttr.SetFontUnderlined(attr.GetFontUnderlined());
+
+    if (attr.HasFaceName())
+        newAttr.SetFontFaceName(attr.GetFontFaceName());
+
+    if (attr.HasAlignment())
+        newAttr.SetAlignment(attr.GetAlignment());
+    else if (attrDef.HasAlignment())
+        newAttr.SetAlignment(attrDef.GetAlignment());
+
+    if (attr.HasTabs())
+        newAttr.SetTabs(attr.GetTabs());
+    else if (attrDef.HasTabs())
+        newAttr.SetTabs(attrDef.GetTabs());
+
+    if (attr.HasLeftIndent())
+        newAttr.SetLeftIndent(attr.GetLeftIndent(), attr.GetLeftSubIndent());
+    else if (attrDef.HasLeftIndent())
+        newAttr.SetLeftIndent(attrDef.GetLeftIndent(), attr.GetLeftSubIndent());
+
+    if (attr.HasRightIndent())
+        newAttr.SetRightIndent(attr.GetRightIndent());
+    else if (attrDef.HasRightIndent())
+        newAttr.SetRightIndent(attrDef.GetRightIndent());
+
+    // NEW ATTRIBUTES
+
+    if (attr.HasParagraphSpacingAfter())
+        newAttr.SetParagraphSpacingAfter(attr.GetParagraphSpacingAfter());
+
+    if (attr.HasParagraphSpacingBefore())
+        newAttr.SetParagraphSpacingBefore(attr.GetParagraphSpacingBefore());
+
+    if (attr.HasLineSpacing())
+        newAttr.SetLineSpacing(attr.GetLineSpacing());
+
+    if (attr.HasCharacterStyleName())
+        newAttr.SetCharacterStyleName(attr.GetCharacterStyleName());
+
+    if (attr.HasParagraphStyleName())
+        newAttr.SetParagraphStyleName(attr.GetParagraphStyleName());
+
+    if (attr.HasBulletStyle())
+        newAttr.SetBulletStyle(attr.GetBulletStyle());
+
+    if (attr.HasBulletNumber())
+        newAttr.SetBulletNumber(attr.GetBulletNumber());
+
+    if (attr.HasBulletSymbol())
+        newAttr.SetBulletSymbol(attr.GetBulletSymbol());
+
+    return newAttr;
+}
+
 /*!
  * wxTextAttrEx is an extended version of wxTextAttr with more paragraph attributes.
  */
@@ -4962,6 +5062,146 @@ void wxTextAttrEx::operator= (const wxTextAttr& attr)
     wxTextAttr::operator= (attr);
 }
 
+wxTextAttrEx wxTextAttrEx::CombineEx(const wxTextAttrEx& attr,
+                               const wxTextAttrEx& attrDef,
+                               const wxTextCtrlBase *text)
+{
+    wxTextAttrEx newAttr;
+
+    // If attr specifies the complete font, just use that font, overriding all
+    // default font attributes.
+    if ((attr.GetFlags() & wxTEXT_ATTR_FONT) == wxTEXT_ATTR_FONT)
+        newAttr.SetFont(attr.GetFont());
+    else
+    {
+        // First find the basic, default font
+        long flags = 0;
+
+        wxFont font;
+        if (attrDef.HasFont())
+        {
+            flags = (attrDef.GetFlags() & wxTEXT_ATTR_FONT);
+            font = attrDef.GetFont();
+        }
+        else
+        {
+            if (text)
+                font = text->GetFont();
+
+            // We leave flags at 0 because no font attributes have been specified yet
+        }
+        if (!font.Ok())
+            font = *wxNORMAL_FONT;
+
+        // Otherwise, if there are font attributes in attr, apply them
+        if (attr.HasFont())
+        {
+            if (attr.HasSize())
+            {
+                flags |= wxTEXT_ATTR_FONT_SIZE;
+                font.SetPointSize(attr.GetFont().GetPointSize());
+            }
+            if (attr.HasItalic())
+            {
+                flags |= wxTEXT_ATTR_FONT_ITALIC;;
+                font.SetStyle(attr.GetFont().GetStyle());
+            }
+            if (attr.HasWeight())
+            {
+                flags |= wxTEXT_ATTR_FONT_WEIGHT;
+                font.SetWeight(attr.GetFont().GetWeight());
+            }
+            if (attr.HasFaceName())
+            {
+                flags |= wxTEXT_ATTR_FONT_FACE;
+                font.SetFaceName(attr.GetFont().GetFaceName());
+            }
+            if (attr.HasUnderlined())
+            {
+                flags |= wxTEXT_ATTR_FONT_UNDERLINE;
+                font.SetUnderlined(attr.GetFont().GetUnderlined());
+            }
+            newAttr.SetFont(font);
+            newAttr.SetFlags(newAttr.GetFlags()|flags);
+        }
+    }
+
+    // TODO: should really check we are specifying these in the flags,
+    // before setting them, as per above; or we will set them willy-nilly.
+    // However, we should also check whether this is the intention
+    // as per wxTextAttr::Combine, i.e. always to have valid colours
+    // in the style.
+    wxColour colFg = attr.GetTextColour();
+    if ( !colFg.Ok() )
+    {
+        colFg = attrDef.GetTextColour();
+
+        if ( text && !colFg.Ok() )
+            colFg = text->GetForegroundColour();
+    }
+
+    wxColour colBg = attr.GetBackgroundColour();
+    if ( !colBg.Ok() )
+    {
+        colBg = attrDef.GetBackgroundColour();
+
+        if ( text && !colBg.Ok() )
+            colBg = text->GetBackgroundColour();
+    }
+
+    newAttr.SetTextColour(colFg);
+    newAttr.SetBackgroundColour(colBg);
+
+    if (attr.HasAlignment())
+        newAttr.SetAlignment(attr.GetAlignment());
+    else if (attrDef.HasAlignment())
+        newAttr.SetAlignment(attrDef.GetAlignment());
+
+    if (attr.HasTabs())
+        newAttr.SetTabs(attr.GetTabs());
+    else if (attrDef.HasTabs())
+        newAttr.SetTabs(attrDef.GetTabs());
+
+    if (attr.HasLeftIndent())
+        newAttr.SetLeftIndent(attr.GetLeftIndent(), attr.GetLeftSubIndent());
+    else if (attrDef.HasLeftIndent())
+        newAttr.SetLeftIndent(attrDef.GetLeftIndent(), attr.GetLeftSubIndent());
+
+    if (attr.HasRightIndent())
+        newAttr.SetRightIndent(attr.GetRightIndent());
+    else if (attrDef.HasRightIndent())
+        newAttr.SetRightIndent(attrDef.GetRightIndent());
+
+    // NEW ATTRIBUTES
+
+    if (attr.HasParagraphSpacingAfter())
+        newAttr.SetParagraphSpacingAfter(attr.GetParagraphSpacingAfter());
+
+    if (attr.HasParagraphSpacingBefore())
+        newAttr.SetParagraphSpacingBefore(attr.GetParagraphSpacingBefore());
+
+    if (attr.HasLineSpacing())
+        newAttr.SetLineSpacing(attr.GetLineSpacing());
+
+    if (attr.HasCharacterStyleName())
+        newAttr.SetCharacterStyleName(attr.GetCharacterStyleName());
+
+    if (attr.HasParagraphStyleName())
+        newAttr.SetParagraphStyleName(attr.GetParagraphStyleName());
+
+    if (attr.HasBulletStyle())
+        newAttr.SetBulletStyle(attr.GetBulletStyle());
+
+    if (attr.HasBulletNumber())
+        newAttr.SetBulletNumber(attr.GetBulletNumber());
+
+    if (attr.HasBulletSymbol())
+        newAttr.SetBulletSymbol(attr.GetBulletSymbol());
+
+    return newAttr;
+}
+
+
 /*!
  * wxRichTextFileHandler
  * Base class for file handlers
@@ -5046,7 +5286,7 @@ bool wxRichTextPlainTextHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputSt
     wxString text = buffer->GetText();
     wxCharBuffer buf = text.ToAscii();
 
-    stream.Write((const char*) buf, text.Length());
+    stream.Write((const char*) buf, text.length());
     return true;
 }
 #endif // wxUSE_STREAMS
@@ -5245,7 +5485,7 @@ bool wxRichTextImageBlock::WriteHex(wxOutputStream& stream)
         hex = wxDecToHex(m_data[i]);
         wxCharBuffer buf = hex.ToAscii();
 
-        stream.Write((const char*) buf, hex.Length());
+        stream.Write((const char*) buf, hex.length());
     }
 
     return true;