X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88bee7e621cb3cf7bc63cb82b1439c2290b51bb6..ea29564c40a8566e99841eca0d82316c22050f79:/src/richtext/richtextctrl.cpp diff --git a/src/richtext/richtextctrl.cpp b/src/richtext/richtextctrl.cpp index 2f4ac745e7..bf06f72f30 100644 --- a/src/richtext/richtextctrl.cpp +++ b/src/richtext/richtextctrl.cpp @@ -152,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); @@ -393,30 +392,39 @@ void wxRichTextCtrl::OnLeftUp(wxMouseEvent& event) if (hit != wxRICHTEXT_HITTEST_NONE) { - wxTextAttrEx attr; - if (GetStyle(position, attr)) + wxRichTextEvent cmdEvent( + wxEVT_COMMAND_RICHTEXT_LEFT_CLICK, + GetId()); + cmdEvent.SetEventObject(this); + cmdEvent.SetPosition(m_caretPosition+1); + + if (!GetEventHandler()->ProcessEvent(cmdEvent)) { - if (attr.HasFlag(wxTEXT_ATTR_URL)) + wxTextAttrEx attr; + if (GetStyle(position, attr)) { - wxString urlTarget = attr.GetURL(); - if (!urlTarget.IsEmpty()) + if (attr.HasFlag(wxTEXT_ATTR_URL)) { - wxMouseEvent mouseEvent(event); - - long startPos = 0, endPos = 0; - wxRichTextObject* obj = GetBuffer().GetLeafObjectAtPosition(position); - if (obj) + wxString urlTarget = attr.GetURL(); + if (!urlTarget.IsEmpty()) { - startPos = obj->GetRange().GetStart(); - endPos = obj->GetRange().GetEnd(); - } + 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); + wxTextUrlEvent urlEvent(GetId(), mouseEvent, startPos, endPos); + InitCommandEvent(urlEvent); - urlEvent.SetString(urlTarget); + urlEvent.SetString(urlTarget); - GetEventHandler()->ProcessEvent(urlEvent); + GetEventHandler()->ProcessEvent(urlEvent); + } } } } @@ -496,23 +504,45 @@ void wxRichTextCtrl::OnMoveMouse(wxMouseEvent& event) } /// Right-click -void wxRichTextCtrl::OnRightClick(wxMouseEvent& event) +void wxRichTextCtrl::OnRightClick(wxMouseEvent& WXUNUSED(event)) { SetFocus(); - event.Skip(); + + wxRichTextEvent cmdEvent( + wxEVT_COMMAND_RICHTEXT_RIGHT_CLICK, + GetId()); + cmdEvent.SetEventObject(this); + cmdEvent.SetPosition(m_caretPosition+1); + + GetEventHandler()->ProcessEvent(cmdEvent); } /// Left-double-click -void wxRichTextCtrl::OnLeftDClick(wxMouseEvent& event) +void wxRichTextCtrl::OnLeftDClick(wxMouseEvent& WXUNUSED(event)) { - SelectWord(GetCaretPosition()+1); - event.Skip(); + wxRichTextEvent cmdEvent( + wxEVT_COMMAND_RICHTEXT_LEFT_DCLICK, + GetId()); + cmdEvent.SetEventObject(this); + cmdEvent.SetPosition(m_caretPosition+1); + + if (!GetEventHandler()->ProcessEvent(cmdEvent)) + { + SelectWord(GetCaretPosition()+1); + } } /// Middle-click void wxRichTextCtrl::OnMiddleClick(wxMouseEvent& event) { - event.Skip(); + wxRichTextEvent cmdEvent( + wxEVT_COMMAND_RICHTEXT_MIDDLE_CLICK, + GetId()); + cmdEvent.SetEventObject(this); + cmdEvent.SetPosition(m_caretPosition+1); + + if (!GetEventHandler()->ProcessEvent(cmdEvent)) + event.Skip(); } /// Key press @@ -782,7 +812,11 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) GetId()); cmdEvent.SetEventObject(this); cmdEvent.SetFlags(flags); +#if wxUSE_UNICODE + cmdEvent.SetCharacter(event.GetUnicodeKey()); +#else cmdEvent.SetCharacter((wxChar) keycode); +#endif cmdEvent.SetPosition(m_caretPosition+1); if (keycode == wxT('\t')) @@ -814,7 +848,11 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event) long newPos = m_caretPosition; DeleteSelectedContent(& newPos); +#if wxUSE_UNICODE + wxString str = event.GetUnicodeKey(); +#else wxString str = (wxChar) event.GetKeyCode(); +#endif GetBuffer().InsertTextWithUndo(newPos+1, str, this, 0); EndBatchUndo(); @@ -1009,7 +1047,7 @@ bool wxRichTextCtrl::ScrollIntoView(long position, int keyCode) // Going down if (keyCode == WXK_DOWN || keyCode == WXK_NUMPAD_DOWN || - keyCode == WXK_RIGHT || keyCode == WXK_NUMPAD_DOWN || + keyCode == WXK_RIGHT || keyCode == WXK_NUMPAD_RIGHT || keyCode == WXK_END || keyCode == WXK_NUMPAD_END || keyCode == WXK_PAGEDOWN || keyCode == WXK_NUMPAD_PAGEDOWN) { @@ -1556,6 +1594,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 { @@ -1570,7 +1613,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 { @@ -1581,9 +1629,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 { @@ -1604,9 +1656,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; @@ -1616,7 +1670,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 { @@ -1981,7 +2039,7 @@ wxRichTextCtrl::HitTest(const wxPoint& pt, 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) + else if (hit & (wxRICHTEXT_HITTEST_BEFORE|wxRICHTEXT_HITTEST_AFTER)) return wxTE_HT_ON_TEXT; return wxTE_HT_UNKNOWN; @@ -2006,30 +2064,21 @@ void wxRichTextCtrl::DoSetValue(const wxString& value, int flags) { Clear(); - // if the text is long enough, it's faster to just set it instead of first - // comparing it with the old one (chances are that it will be different - // anyhow, this comparison is there to avoid flicker for small single-line - // edit controls mostly) - if ( (value.length() > 0x400) || (value != GetValue()) ) + if (!value.IsEmpty()) { + // Remove empty paragraph + GetBuffer().Clear(); DoWriteText(value); // for compatibility, don't move the cursor when doing SetValue() SetInsertionPoint(0); } - else // same text + else { - if ( flags & SetValue_SendEvent ) - { - // still send an event for consistency + // still send an event for consistency + if (flags & SetValue_SendEvent) SendTextUpdatedEvent(); - } } - - // we should reset the modified flag even if the value didn't really change - - // mark the control as being not dirty - we changed its text, not the - // user DiscardEdits(); }