]> git.saurik.com Git - wxWidgets.git/blobdiff - src/richtext/richtextbuffer.cpp
use CanSetValueAs() instead of CanGetValueAs() in wxGridCellBoolEditor::EndEdit
[wxWidgets.git] / src / richtext / richtextbuffer.cpp
index 38b0f76f74b1a32af0e94e5163f8f43a484eb15b..33031e957a9dc762c63f6a48a494f5d4919e739b 100644 (file)
@@ -57,6 +57,7 @@ const wxChar wxRichTextLineBreakChar = (wxChar) 29;
 
 inline void wxCheckSetFont(wxDC& dc, const wxFont& font)
 {
 
 inline void wxCheckSetFont(wxDC& dc, const wxFont& font)
 {
+#if 0
     const wxFont& font1 = dc.GetFont();
     if (font1.IsOk() && font.IsOk())
     {
     const wxFont& font1 = dc.GetFont();
     if (font1.IsOk() && font.IsOk())
     {
@@ -68,6 +69,7 @@ inline void wxCheckSetFont(wxDC& dc, const wxFont& font)
             font1.GetFaceName() == font.GetFaceName())
             return;
     }
             font1.GetFaceName() == font.GetFaceName())
             return;
     }
+#endif
     dc.SetFont(font);
 }
 
     dc.SetFont(font);
 }
 
@@ -431,7 +433,7 @@ bool wxRichTextCompositeObject::Defragment(const wxRichTextRange& range)
     while (node)
     {
         wxRichTextObject* child = node->GetData();
     while (node)
     {
         wxRichTextObject* child = node->GetData();
-        if (!child->GetRange().IsOutside(range))
+        if (range == wxRICHTEXT_ALL || !child->GetRange().IsOutside(range))
         {
             wxRichTextCompositeObject* composite = wxDynamicCast(child, wxRichTextCompositeObject);
             if (composite)
         {
             wxRichTextCompositeObject* composite = wxDynamicCast(child, wxRichTextCompositeObject);
             if (composite)
@@ -1796,8 +1798,7 @@ bool wxRichTextParagraphLayoutBox::SetStyle(const wxRichTextRange& range, const
                 // we only want the paragraphs to hold this character style, then we _don't_ want to
                 // apply the character style. So we need to be able to choose.
 
                 // we only want the paragraphs to hold this character style, then we _don't_ want to
                 // apply the character style. So we need to be able to choose.
 
-                // if (!paragraphStyle && characterStyle && range.GetStart() != newPara->GetRange().GetEnd())
-                if (!parasOnly && characterStyle && range.GetStart() != newPara->GetRange().GetEnd())
+                if (!parasOnly && (characterStyle|charactersOnly) && range.GetStart() != newPara->GetRange().GetEnd())
                 {
                     wxRichTextRange childRange(range);
                     childRange.LimitTo(newPara->GetRange());
                 {
                     wxRichTextRange childRange(range);
                     childRange.LimitTo(newPara->GetRange());
@@ -3549,7 +3550,7 @@ bool wxRichTextParagraph::Layout(wxDC& dc, const wxRect& rect, int style)
     ClearUnusedLines(lineCount);
 
     // Apply styles to wrapped lines
     ClearUnusedLines(lineCount);
 
     // Apply styles to wrapped lines
-    ApplyParagraphStyle(attr, rect);
+    ApplyParagraphStyle(attr, rect, dc);
 
     SetCachedSize(wxSize(maxWidth, currentPosition.y + spaceBeforePara + spaceAfterPara));
 
 
     SetCachedSize(wxSize(maxWidth, currentPosition.y + spaceBeforePara + spaceAfterPara));
 
@@ -3601,7 +3602,7 @@ bool wxRichTextParagraph::Layout(wxDC& dc, const wxRect& rect, int style)
 }
 
 /// Apply paragraph styles, such as centering, to wrapped lines
 }
 
 /// Apply paragraph styles, such as centering, to wrapped lines
-void wxRichTextParagraph::ApplyParagraphStyle(const wxTextAttr& attr, const wxRect& rect)
+void wxRichTextParagraph::ApplyParagraphStyle(const wxTextAttr& attr, const wxRect& rect, wxDC& dc)
 {
     if (!attr.HasAlignment())
         return;
 {
     if (!attr.HasAlignment())
         return;
@@ -3617,12 +3618,14 @@ void wxRichTextParagraph::ApplyParagraphStyle(const wxTextAttr& attr, const wxRe
         // centering, right-justification
         if (attr.HasAlignment() && GetAttributes().GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
         {
         // centering, right-justification
         if (attr.HasAlignment() && GetAttributes().GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
         {
-            pos.x = (rect.GetWidth() - size.x)/2 + pos.x;
+            int rightIndent = ConvertTenthsMMToPixels(dc, attr.GetRightIndent());
+            pos.x = (rect.GetWidth() - (pos.x - rect.x) - rightIndent - size.x)/2 + pos.x;
             line->SetPosition(pos);
         }
         else if (attr.HasAlignment() && GetAttributes().GetAlignment() == wxTEXT_ALIGNMENT_RIGHT)
         {
             line->SetPosition(pos);
         }
         else if (attr.HasAlignment() && GetAttributes().GetAlignment() == wxTEXT_ALIGNMENT_RIGHT)
         {
-            pos.x = pos.x + rect.GetWidth() - size.x;
+            int rightIndent = ConvertTenthsMMToPixels(dc, attr.GetRightIndent());
+            pos.x = rect.x + rect.GetWidth() - size.x - rightIndent;
             line->SetPosition(pos);
         }
 
             line->SetPosition(pos);
         }
 
@@ -4172,7 +4175,9 @@ bool wxRichTextParagraph::GetContiguousPlainText(wxString& text, const wxRichTex
                     text += textObj->GetTextForRange(range);
                 }
                 else
                     text += textObj->GetTextForRange(range);
                 }
                 else
-                    return true;
+                {
+                    text += wxT(" ");
+                }
             }
 
             node = node->GetNext();
             }
 
             node = node->GetNext();
@@ -4192,7 +4197,9 @@ bool wxRichTextParagraph::GetContiguousPlainText(wxString& text, const wxRichTex
                     text = textObj->GetTextForRange(range) + text;
                 }
                 else
                     text = textObj->GetTextForRange(range) + text;
                 }
                 else
-                    return true;
+                {
+                    text = wxT(" ") + text;
+                }
             }
 
             node = node->GetPrevious();
             }
 
             node = node->GetPrevious();
@@ -4223,7 +4230,7 @@ bool wxRichTextParagraph::FindWrapPosition(const wxRichTextRange& range, wxDC& d
             widthBefore = 0;
 
         size_t i;
             widthBefore = 0;
 
         size_t i;
-        for (i = (size_t) range.GetStart(); i < (size_t) range.GetEnd(); i++)
+        for (i = (size_t) range.GetStart(); i <= (size_t) range.GetEnd(); i++)
         {
             int widthFromStartOfThisRange = (*partialExtents)[i - GetRange().GetStart()] - widthBefore;
 
         {
             int widthFromStartOfThisRange = (*partialExtents)[i - GetRange().GetStart()] - widthBefore;
 
@@ -5335,8 +5342,14 @@ bool wxRichTextBuffer::InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int
     {
         if (para && para->GetRange().GetEnd() == pos)
             pos1 ++;
     {
         if (para && para->GetRange().GetEnd() == pos)
             pos1 ++;
+
+        // Now see if we need to number the paragraph.
         if (newPara->GetAttributes().HasBulletNumber())
         if (newPara->GetAttributes().HasBulletNumber())
-            newPara->GetAttributes().SetBulletNumber(newPara->GetAttributes().GetBulletNumber()+1);
+        {
+            wxRichTextAttr numberingAttr;
+            if (FindNextParagraphNumber(para, numberingAttr))
+                wxRichTextApplyStyle(newPara->GetAttributes(), (const wxRichTextAttr&) numberingAttr);
+        }
     }
 
     action->SetPosition(pos);
     }
 
     action->SetPosition(pos);
@@ -5445,6 +5458,25 @@ wxTextAttr wxRichTextBuffer::GetStyleForNewParagraph(long pos, bool caretPositio
                 }
             }
         }
                 }
             }
         }
+
+        // Also apply list style if present
+        if (lookUpNewParaStyle && !para->GetAttributes().GetListStyleName().IsEmpty() && GetStyleSheet())
+        {
+            wxRichTextListStyleDefinition* listDef = GetStyleSheet()->FindListStyle(para->GetAttributes().GetListStyleName());
+            if (listDef)
+            {
+                int thisIndent = para->GetAttributes().GetLeftIndent();
+                int thisLevel = para->GetAttributes().HasOutlineLevel() ? para->GetAttributes().GetOutlineLevel() : listDef->FindLevelForIndent(thisIndent);
+
+                // Apply the overall list style, and item style for this level
+                wxRichTextAttr listStyle(listDef->GetCombinedStyleForLevel(thisLevel, GetStyleSheet()));
+                wxRichTextApplyStyle(attr, listStyle);
+                attr.SetOutlineLevel(thisLevel);
+                if (para->GetAttributes().HasBulletNumber())
+                    attr.SetBulletNumber(para->GetAttributes().GetBulletNumber());
+            }
+        }
+
         if (!foundAttributes)
         {
             attr = para->GetAttributes();
         if (!foundAttributes)
         {
             attr = para->GetAttributes();
@@ -5457,14 +5489,6 @@ wxTextAttr wxRichTextBuffer::GetStyleForNewParagraph(long pos, bool caretPositio
             attr.SetFlags(flags);
         }
 
             attr.SetFlags(flags);
         }
 
-        // Now see if we need to number the paragraph.
-        if (attr.HasBulletStyle())
-        {
-            wxTextAttr numberingAttr;
-            if (FindNextParagraphNumber(para, numberingAttr))
-                wxRichTextApplyStyle(attr, (const wxTextAttr&) numberingAttr);
-        }
-
         return attr;
     }
     else
         return attr;
     }
     else
@@ -6161,10 +6185,10 @@ bool wxRichTextBuffer::PasteFromClipboard(long position)
                 if (action->GetNewParagraphs().GetChildCount() == 1)
                     action->GetNewParagraphs().SetPartialParagraph(true);
 
                 if (action->GetNewParagraphs().GetChildCount() == 1)
                     action->GetNewParagraphs().SetPartialParagraph(true);
 
-                action->SetPosition(position);
+                action->SetPosition(position+1);
 
                 // Set the range we'll need to delete in Undo
 
                 // Set the range we'll need to delete in Undo
-                action->SetRange(wxRichTextRange(position, position));
+                action->SetRange(wxRichTextRange(position+1, position+1));
 
                 SubmitAction(action);
 
 
                 SubmitAction(action);
 
@@ -7045,10 +7069,11 @@ bool wxRichTextImage::LoadFromBlock()
 /// Make block from the wxImage
 bool wxRichTextImage::MakeBlock()
 {
 /// Make block from the wxImage
 bool wxRichTextImage::MakeBlock()
 {
-    if (m_imageBlock.GetImageType() == wxBITMAP_TYPE_ANY || m_imageBlock.GetImageType() == -1)
-        m_imageBlock.SetImageType(wxBITMAP_TYPE_PNG);
+    wxBitmapType type = m_imageBlock.GetImageType();
+    if ( type == wxBITMAP_TYPE_ANY || type == wxBITMAP_TYPE_INVALID )
+        m_imageBlock.SetImageType(type = wxBITMAP_TYPE_PNG);
 
 
-    m_imageBlock.MakeImageBlock(m_image, m_imageBlock.GetImageType());
+    m_imageBlock.MakeImageBlock(m_image, type);
     return m_imageBlock.Ok();
 }
 
     return m_imageBlock.Ok();
 }
 
@@ -7394,7 +7419,7 @@ bool wxRichTextImageBlock::MakeImageBlock(const wxString& filename, wxBitmapType
     wxString filenameToRead(filename);
     bool removeFile = false;
 
     wxString filenameToRead(filename);
     bool removeFile = false;
 
-    if (imageType == -1)
+    if (imageType == wxBITMAP_TYPE_INVALID)
         return false; // Could not determine image type
 
     if ((imageType != wxBITMAP_TYPE_JPEG) && convertToJPEG)
         return false; // Could not determine image type
 
     if ((imageType != wxBITMAP_TYPE_JPEG) && convertToJPEG)
@@ -7436,7 +7461,7 @@ bool wxRichTextImageBlock::MakeImageBlock(wxImage& image, wxBitmapType imageType
     m_imageType = imageType;
     image.SetOption(wxT("quality"), quality);
 
     m_imageType = imageType;
     image.SetOption(wxT("quality"), quality);
 
-    if (imageType == -1)
+    if (imageType == wxBITMAP_TYPE_INVALID)
         return false; // Could not determine image type
 
     wxString tempFile;
         return false; // Could not determine image type
 
     wxString tempFile;
@@ -7566,7 +7591,10 @@ bool wxRichTextImageBlock::ReadHex(wxInputStream& stream, int length, wxBitmapTy
     if (m_data)
         delete[] m_data;
 
     if (m_data)
         delete[] m_data;
 
-    wxChar str[2];
+    // create a null terminated temporary string:
+    char str[3];
+    str[2] = '\0';
+
     m_data = new unsigned char[dataSize];
     int i;
     for (i = 0; i < dataSize; i ++)
     m_data = new unsigned char[dataSize];
     int i;
     for (i = 0; i < dataSize; i ++)