diff --git a/src/richtext/richtextbuffer.cpp b/src/richtext/richtextbuffer.cpp index 3ea7a1cd31..c197301a2d 100644 --- a/src/richtext/richtextbuffer.cpp +++ b/src/richtext/richtextbuffer.cpp @@ -308,7 +308,8 @@ int wxRichTextCompositeObject::HitTest(wxDC& dc, const wxPoint& pt, long& textPo node = node->GetNext(); } - return wxRICHTEXT_HITTEST_NONE; + textPosition = GetRange().GetEnd()-1; + return wxRICHTEXT_HITTEST_AFTER|wxRICHTEXT_HITTEST_OUTSIDE; } /// Finds the absolute position and row height for the given character position @@ -3822,7 +3823,7 @@ int wxRichTextParagraph::HitTest(wxDC& dc, const wxPoint& pt, long& textPosition wxSize lineSize = line->GetSize(); wxRichTextRange lineRange = line->GetAbsoluteRange(); - if (pt.y >= linePos.y && pt.y <= linePos.y + lineSize.y) + if (pt.y <= linePos.y + lineSize.y) { if (pt.x < linePos.x) { @@ -5783,6 +5784,8 @@ bool wxRichTextBuffer::PasteFromClipboard(long position) if (richTextBuffer) { InsertParagraphsWithUndo(position+1, *richTextBuffer, GetRichTextCtrl(), wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE); + if (GetRichTextCtrl()) + GetRichTextCtrl()->ShowPosition(position + richTextBuffer->GetRange().GetEnd()); delete richTextBuffer; } } @@ -5806,6 +5809,9 @@ bool wxRichTextBuffer::PasteFromClipboard(long position) #endif InsertTextWithUndo(position+1, text2, GetRichTextCtrl()); + if (GetRichTextCtrl()) + GetRichTextCtrl()->ShowPosition(position + text2.Length()); + success = true; } else if (wxTheClipboard->IsSupported(wxDF_BITMAP)) diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index 1e5f86c7f2..5cc4db84c6 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -416,7 +416,7 @@ void wxRichTextCtrl::OnLeftUp(wxMouseEvent& event) wxPoint logicalPt = event.GetLogicalPosition(dc); int hit = GetBuffer().HitTest(dc, logicalPt, position); - if (hit != wxRICHTEXT_HITTEST_NONE) + if ((hit != wxRICHTEXT_HITTEST_NONE) && !(hit & wxRICHTEXT_HITTEST_OUTSIDE)) { wxTextAttrEx attr; if (GetStyle(position, attr)) @@ -663,7 +663,19 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) // Submit range in character positions, which are greater than caret positions, if (m_caretPosition < GetBuffer().GetRange().GetEnd()+1 && !HasSelection()) { - GetBuffer().DeleteRangeWithUndo(wxRichTextRange(m_caretPosition+1, m_caretPosition+1), this); + bool processed = false; + if (event.CmdDown()) + { + long pos = wxRichTextCtrl::FindNextWordPosition(-1); + if (pos != -1 && (pos < m_caretPosition)) + { + GetBuffer().DeleteRangeWithUndo(wxRichTextRange(pos+1, m_caretPosition), this); + processed = true; + } + } + + if (!processed) + GetBuffer().DeleteRangeWithUndo(wxRichTextRange(m_caretPosition+1, m_caretPosition+1), this); } else DeleteSelectedContent(); @@ -1901,13 +1913,17 @@ bool wxRichTextCtrl::DoSaveFile(const wxString& filename, int fileType) /// Add a new paragraph of text to the end of the buffer wxRichTextRange wxRichTextCtrl::AddParagraph(const wxString& text) { - return GetBuffer().AddParagraph(text); + wxRichTextRange range = GetBuffer().AddParagraph(text); + LayoutContent(); + return range; } /// Add an image wxRichTextRange wxRichTextCtrl::AddImage(const wxImage& image) { - return GetBuffer().AddImage(image); + wxRichTextRange range = GetBuffer().AddImage(image); + LayoutContent(); + return range; } // ---------------------------------------------------------------------------- @@ -1943,6 +1959,9 @@ bool wxRichTextCtrl::SelectWord(long position) if (!para) return false; + if (position == para->GetRange().GetEnd()) + position --; + long positionStart = position; long positionEnd = position; @@ -1970,6 +1989,9 @@ bool wxRichTextCtrl::SelectWord(long position) if (positionEnd >= para->GetRange().GetEnd()) positionEnd = para->GetRange().GetEnd(); + if (positionEnd < positionStart) + return false; + SetSelection(positionStart, positionEnd+1); if (positionStart >= 0)