]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixes for incorrect selection, extra newline insertion when undoing deletion of selec...
authorJulian Smart <julian@anthemion.co.uk>
Tue, 2 Feb 2010 22:19:33 +0000 (22:19 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Tue, 2 Feb 2010 22:19:33 +0000 (22:19 +0000)
incorrect SetScrollbar optimization, insufficient refresh for operations on last line,
HasCharacter/ParagraphAttributes bug.

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

src/richtext/richtextbuffer.cpp
src/richtext/richtextctrl.cpp

index bf1efe3ca3ba09712883bf39edf1c300c7e171eb..eccbc7dfb008026da4907d4278235bbee037102d 100644 (file)
@@ -2469,7 +2469,7 @@ bool wxRichTextParagraphLayoutBox::HasCharacterAttributes(const wxRichTextRange&
         {
             // Stop searching if we're beyond the range of interest
             if (para->GetRange().GetStart() > range.GetEnd())
-                return foundCount == matchingCount;
+                return foundCount == matchingCount && foundCount != 0;
 
             if (!para->GetRange().IsOutside(range))
             {
@@ -2478,7 +2478,12 @@ bool wxRichTextParagraphLayoutBox::HasCharacterAttributes(const wxRichTextRange&
                 while (node2)
                 {
                     wxRichTextObject* child = node2->GetData();
-                    if (!child->GetRange().IsOutside(range) && child->IsKindOf(CLASSINFO(wxRichTextPlainText)))
+                    // Allow for empty string if no buffer
+                    wxRichTextRange childRange = child->GetRange();
+                    if (childRange.GetLength() == 0 && GetRange().GetLength() == 1)
+                        childRange.SetEnd(childRange.GetEnd()+1);
+
+                    if (!childRange.IsOutside(range) && child->IsKindOf(CLASSINFO(wxRichTextPlainText)))
                     {
                         foundCount ++;
                         wxTextAttr textAttr = para->GetCombinedAttributes(child->GetAttributes());
@@ -2517,7 +2522,7 @@ bool wxRichTextParagraphLayoutBox::HasParagraphAttributes(const wxRichTextRange&
         {
             // Stop searching if we're beyond the range of interest
             if (para->GetRange().GetStart() > range.GetEnd())
-                return foundCount == matchingCount;
+                return foundCount == matchingCount && foundCount != 0;
 
             if (!para->GetRange().IsOutside(range))
             {
@@ -6959,8 +6964,12 @@ void wxRichTextAction::UpdateAppearance(long caretPosition, bool sendUpdateEvent
                         // Detect last line in the buffer
                         else if (!node2->GetNext() && para->GetRange().Contains(m_buffer->GetRange().GetEnd()))
                         {
-                            foundEnd = true;
-                            lastY = pt.y + line->GetSize().y;
+                            // If deleting text, make sure we refresh below as well as above
+                            if (positionOffset >= 0)
+                            {
+                                foundEnd = true;
+                                lastY = pt.y + line->GetSize().y;
+                            }
 
                             node2 = wxRichTextLineList::compatibility_iterator();
                             node = wxRichTextObjectList::compatibility_iterator();
index a9910f4210f9f32c9bf257874752f09e91aaa7d2..96783289893e6e72b9014ff790771944f0a59172 100644 (file)
@@ -1079,7 +1079,15 @@ bool wxRichTextCtrl::DeleteSelectedContent(long* newPos)
     if (HasSelection())
     {
         long pos = m_selectionRange.GetStart();
-        GetBuffer().DeleteRangeWithUndo(m_selectionRange, this);
+        wxRichTextRange range = m_selectionRange;
+
+        // SelectAll causes more to be selected than doing it interactively,
+        // and causes a new paragraph to be inserted. So for multiline buffers,
+        // don't delete the final position.
+        if (range.GetEnd() == GetLastPosition() && GetNumberOfLines() > 0)
+            range.SetEnd(range.GetEnd()-1);
+
+        GetBuffer().DeleteRangeWithUndo(range, this);
         m_selectionRange.SetRange(-2, -2);
 
         if (newPos)
@@ -2059,7 +2067,7 @@ void wxRichTextCtrl::SetupScrollbars(bool atTop)
         return;
 
     // Don't set scrollbars if there were none before, and there will be none now.
-    if (oldPPUY != 0 && (oldVirtualSizeY < clientSize.y) && (unitsY*pixelsPerUnit < clientSize.y))
+    if (oldPPUY != 0 && (oldVirtualSizeY*oldPPUY < clientSize.y) && (unitsY*pixelsPerUnit < clientSize.y))
         return;
 
     // Move to previous scroll position if
@@ -2589,10 +2597,9 @@ void wxRichTextCtrl::SetSelection(long from, long to)
     else
     {
         wxRichTextRange oldSelection = m_selectionRange;
-        m_selectionAnchor = from;
+        m_selectionAnchor = from-1;
         m_selectionRange.SetRange(from, to-1);
 
-        // Have to subtract 2, one because of endPos+1 rule (SetSelection docs) and another to turn into caret position.
         m_caretPosition = wxMax(-1, to-2);
 
         RefreshForSelectionChange(oldSelection, m_selectionRange);
@@ -2810,7 +2817,7 @@ void wxRichTextCtrl::OnSelectAll(wxCommandEvent& WXUNUSED(event))
 
 void wxRichTextCtrl::OnUpdateSelectAll(wxUpdateUIEvent& event)
 {
-    event.Enable(GetLastPosition() > 0);
+    event.Enable(GetLastPosition() >= 0);
 }
 
 void wxRichTextCtrl::OnContextMenu(wxContextMenuEvent& event)