X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/336d8ae9a3feae7b2c3ecd8f64fe0e16984edfe7..817414944059fe4e8c4d2323132e4aee19a47bb5:/src/richtext/richtextctrl.cpp?ds=sidebyside diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index 3dcaa1f4ec..5953ab31af 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -74,6 +74,7 @@ BEGIN_EVENT_TABLE( wxRichTextCtrl, wxControl ) EVT_SIZE(wxRichTextCtrl::OnSize) EVT_SET_FOCUS(wxRichTextCtrl::OnSetFocus) EVT_KILL_FOCUS(wxRichTextCtrl::OnKillFocus) + EVT_MOUSE_CAPTURE_LOST(wxRichTextCtrl::OnCaptureLost) EVT_CONTEXT_MENU(wxRichTextCtrl::OnContextMenu) EVT_MENU(wxID_UNDO, wxRichTextCtrl::OnUndo) @@ -140,7 +141,7 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va GetBuffer().Reset(); GetBuffer().SetRichTextCtrl(this); - + SetCaret(new wxCaret(this, wxRICHTEXT_DEFAULT_CARET_WIDTH, 16)); GetCaret()->Show(); @@ -151,7 +152,6 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va wxTextAttrEx attributes; attributes.SetFont(GetFont()); attributes.SetTextColour(*wxBLACK); - attributes.SetBackgroundColour(*wxWHITE); attributes.SetAlignment(wxTEXT_ALIGNMENT_LEFT); attributes.SetLineSpacing(10); attributes.SetParagraphSpacingAfter(10); @@ -193,7 +193,7 @@ bool wxRichTextCtrl::Create( wxWindow* parent, wxWindowID id, const wxString& va wxRichTextCtrl::~wxRichTextCtrl() { GetBuffer().RemoveEventHandler(this); - + delete m_contextMenu; } @@ -325,6 +325,11 @@ void wxRichTextCtrl::OnKillFocus(wxFocusEvent& WXUNUSED(event)) // Refresh(false); } +void wxRichTextCtrl::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) +{ + m_dragging = false; +} + /// Left-click void wxRichTextCtrl::OnLeftClick(wxMouseEvent& event) { @@ -384,7 +389,7 @@ void wxRichTextCtrl::OnLeftUp(wxMouseEvent& event) long position = 0; wxPoint logicalPt = event.GetLogicalPosition(dc); int hit = GetBuffer().HitTest(dc, logicalPt, position); - + if (hit != wxRICHTEXT_HITTEST_NONE) { wxTextAttrEx attr; @@ -396,20 +401,20 @@ void wxRichTextCtrl::OnLeftUp(wxMouseEvent& event) if (!urlTarget.IsEmpty()) { wxMouseEvent mouseEvent(event); - + long startPos = 0, endPos = 0; wxRichTextObject* obj = GetBuffer().GetLeafObjectAtPosition(position); if (obj) { startPos = obj->GetRange().GetStart(); endPos = obj->GetRange().GetEnd(); - } - + } + wxTextUrlEvent urlEvent(GetId(), mouseEvent, startPos, endPos); InitCommandEvent(urlEvent); urlEvent.SetString(urlTarget); - + GetEventHandler()->ProcessEvent(urlEvent); } } @@ -428,11 +433,11 @@ void wxRichTextCtrl::OnMoveMouse(wxMouseEvent& event) long position = 0; wxPoint logicalPt = event.GetLogicalPosition(dc); int hit = GetBuffer().HitTest(dc, logicalPt, position); - + // See if we need to change the cursor - + { - if (hit != wxRICHTEXT_HITTEST_NONE) + if (hit != wxRICHTEXT_HITTEST_NONE && !(hit & wxRICHTEXT_HITTEST_OUTSIDE)) { wxTextAttrEx attr; if (GetStyle(position, attr)) @@ -447,6 +452,8 @@ void wxRichTextCtrl::OnMoveMouse(wxMouseEvent& event) } } } + else + SetCursor(m_textCursor); } if (!event.Dragging()) @@ -582,7 +589,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) // Generate conventional event wxCommandEvent textEvent(wxEVT_COMMAND_TEXT_ENTER, GetId()); InitCommandEvent(textEvent); - + GetEventHandler()->ProcessEvent(textEvent); } Update(); @@ -590,7 +597,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) else if (event.GetKeyCode() == WXK_BACK) { BeginBatchUndo(_("Delete Text")); - + // Submit range in character positions, which are greater than caret positions, // so subtract 1 for deleted character and add 1 for conversion to character position. if (m_caretPosition > -1 && !HasSelection()) @@ -662,7 +669,6 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) switch ( keycode ) { case WXK_ESCAPE: - // case WXK_SPACE: case WXK_DELETE: case WXK_START: case WXK_LBUTTON: @@ -756,6 +762,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) case WXK_NUMPAD_SEPARATOR: case WXK_NUMPAD_SUBTRACT: case WXK_NUMPAD_DECIMAL: + case WXK_WINDOWS_LEFT: { event.Skip(); return; @@ -776,7 +783,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) cmdEvent.SetFlags(flags); cmdEvent.SetCharacter((wxChar) keycode); cmdEvent.SetPosition(m_caretPosition+1); - + if (keycode == wxT('\t')) { // See if we need to promote or demote the selection or paragraph at the cursor @@ -813,7 +820,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) SetDefaultStyleToCursorStyle(); ScrollIntoView(m_caretPosition, WXK_RIGHT); - + GetEventHandler()->ProcessEvent(cmdEvent); Update(); @@ -1325,7 +1332,7 @@ bool wxRichTextCtrl::MoveDown(int noLines, int flags) // we want to be at the end of the last line but with m_caretAtLineStart set to true, // so we view the caret at the start of the line. bool caretLineStart = false; - if (hitTest == wxRICHTEXT_HITTEST_BEFORE) + if (hitTest & wxRICHTEXT_HITTEST_BEFORE) { wxRichTextLine* thisLine = GetBuffer().GetLineAtPosition(newPos-1); wxRichTextRange lineRange; @@ -1548,6 +1555,11 @@ bool wxRichTextCtrl::PageDown(int noPages, int flags) return false; } +static bool wxRichTextCtrlIsWhitespace(const wxString& str) +{ + return str == wxT(" ") || str == wxT("\t"); +} + // Finds the caret position for the next word long wxRichTextCtrl::FindNextWordPosition(int direction) const { @@ -1562,7 +1574,12 @@ long wxRichTextCtrl::FindNextWordPosition(int direction) const { // i is in character, not caret positions wxString text = GetBuffer().GetTextForRange(wxRichTextRange(i, i)); - if (text != wxT(" ") && !text.empty()) + wxRichTextLine* line = GetBuffer().GetLineAtPosition(i, false); + if (line && (i == line->GetAbsoluteRange().GetEnd())) + { + break; + } + else if (!wxRichTextCtrlIsWhitespace(text) && !text.empty()) i += direction; else { @@ -1573,9 +1590,13 @@ long wxRichTextCtrl::FindNextWordPosition(int direction) const { // i is in character, not caret positions wxString text = GetBuffer().GetTextForRange(wxRichTextRange(i, i)); + wxRichTextLine* line = GetBuffer().GetLineAtPosition(i, false); + if (line && (i == line->GetAbsoluteRange().GetEnd())) + return wxMax(-1, i); + if (text.empty()) // End of paragraph, or maybe an image return wxMax(-1, i - 1); - else if (text == wxT(" ") || text.empty()) + else if (wxRichTextCtrlIsWhitespace(text) || text.empty()) i += direction; else { @@ -1596,9 +1617,11 @@ long wxRichTextCtrl::FindNextWordPosition(int direction) const { // i is in character, not caret positions wxString text = GetBuffer().GetTextForRange(wxRichTextRange(i, i)); - if (text.empty()) // End of paragraph, or maybe an image + wxRichTextLine* line = GetBuffer().GetLineAtPosition(i, false); + + if (text.empty() || (line && (i == line->GetAbsoluteRange().GetStart()))) // End of paragraph, or maybe an image break; - else if (text == wxT(" ") || text.empty()) + else if (wxRichTextCtrlIsWhitespace(text) || text.empty()) i += direction; else break; @@ -1608,7 +1631,11 @@ long wxRichTextCtrl::FindNextWordPosition(int direction) const { // i is in character, not caret positions wxString text = GetBuffer().GetTextForRange(wxRichTextRange(i, i)); - if (text != wxT(" ") /* && !text.empty() */) + wxRichTextLine* line = GetBuffer().GetLineAtPosition(i, false); + if (line && line->GetAbsoluteRange().GetStart() == i) + return i-1; + + if (!wxRichTextCtrlIsWhitespace(text) /* && !text.empty() */) i += direction; else { @@ -1969,17 +1996,12 @@ wxRichTextCtrl::HitTest(const wxPoint& pt, int hit = ((wxRichTextCtrl*)this)->GetBuffer().HitTest(dc, pt2, *pos); - switch ( hit ) - { - case wxRICHTEXT_HITTEST_BEFORE: - return wxTE_HT_BEFORE; - - case wxRICHTEXT_HITTEST_AFTER: - return wxTE_HT_BEYOND; - - case wxRICHTEXT_HITTEST_ON: - return wxTE_HT_ON_TEXT; - } + if ((hit & wxRICHTEXT_HITTEST_BEFORE) && (hit & wxRICHTEXT_HITTEST_OUTSIDE)) + return wxTE_HT_BEFORE; + else if ((hit & wxRICHTEXT_HITTEST_AFTER) && (hit & wxRICHTEXT_HITTEST_OUTSIDE)) + return wxTE_HT_BEYOND; + else if (hit & wxRICHTEXT_HITTEST_BEFORE|wxRICHTEXT_HITTEST_AFTER) + return wxTE_HT_ON_TEXT; return wxTE_HT_UNKNOWN; } @@ -2039,7 +2061,7 @@ void wxRichTextCtrl::DoWriteText(const wxString& value, int flags) { wxString valueUnix = wxTextFile::Translate(value, wxTextFileType_Unix); - GetBuffer().InsertTextWithUndo(m_caretPosition+1, valueUnix, this); + GetBuffer().InsertTextWithUndo(m_caretPosition+1, valueUnix, this, wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE); if ( flags & SetValue_SendEvent ) SendTextUpdatedEvent(); @@ -2678,6 +2700,10 @@ bool wxRichTextCtrl::GetCaretPositionForIndex(long position, wxRect& rect) if (GetBuffer().FindPosition(dc, position, pt, & height, m_caretAtLineStart)) { + // Caret height can't be zero + if (height == 0) + height = dc.GetCharHeight(); + rect = wxRect(pt, wxSize(wxRICHTEXT_DEFAULT_CARET_WIDTH, height)); return true; }