diff --git a/core/dialog_search_replace.cpp b/core/dialog_search_replace.cpp index 3239cf1d9..4d52236a6 100644 --- a/core/dialog_search_replace.cpp +++ b/core/dialog_search_replace.cpp @@ -412,7 +412,7 @@ void SearchReplaceEngine::ReplaceNext(bool DoReplace) { grid->MakeCellVisible(curLine,0); if (field == 0) { grid->editBox->SetToLine(curLine); - grid->editBox->TextEdit->SetSelection(pos,pos+replaceLen); + grid->editBox->TextEdit->SetSelectionU(pos,pos+replaceLen); } grid->EndBatch(); diff --git a/core/subs_edit_box.cpp b/core/subs_edit_box.cpp index b5f9d0658..85578cdea 100644 --- a/core/subs_edit_box.cpp +++ b/core/subs_edit_box.cpp @@ -1041,13 +1041,13 @@ void SubsEditBox::SetOverride (wxString tagname,wxString preValue,int forcePos) // Shift selection selstart = origStart; - TextEdit->SetSelection(origStart+shift,selend+shift); + TextEdit->SetSelectionU(origStart+shift,selend+shift); } // Commit changes and shift selection TextEdit->SetTextTo(line->Text); line->ClearBlocks(); - TextEdit->SetSelection(selstart+shift,selend+shift); + TextEdit->SetSelectionU(selstart+shift,selend+shift); TextEdit->SetFocus(); } diff --git a/core/subs_edit_ctrl.cpp b/core/subs_edit_ctrl.cpp index 096cd0e36..1025e56c3 100644 --- a/core/subs_edit_ctrl.cpp +++ b/core/subs_edit_ctrl.cpp @@ -263,10 +263,18 @@ int SubsTextEditCtrl::GetUnicodePosition(int pos) { /////////////////////////////////////// // Reverse unicode-compatible position int SubsTextEditCtrl::GetReverseUnicodePosition(int pos) { + // Get UTF8 wxCharBuffer buffer = GetText().mb_str(wxConvUTF8); + + // Limit position to it + if (pos > (signed)strlen(buffer)) pos = strlen(buffer); + + // Get UTF8 substring char *buf2 = new char[pos+1]; memcpy(buf2,buffer,pos); buf2[pos] = 0; + + // Convert back and return its length wxString buf3(buf2,wxConvUTF8); return buf3.Length(); } @@ -399,7 +407,7 @@ void SubsTextEditCtrl::SetTextTo(const wxString _text) { UpdateStyle(); // Restore selection - SetSelection(from,to); + SetSelectionU(GetReverseUnicodePosition(from),GetReverseUnicodePosition(to)); // Finish Thaw(); @@ -733,7 +741,7 @@ void SubsTextEditCtrl::OnUseSuggestion(wxCommandEvent &event) { SetText(text.Left(MAX(0,start)) + suggestion + text.Mid(end+1)); // Set selection - SetSelection(GetUnicodePosition(start),GetUnicodePosition(start+suggestion.Length())); + SetSelectionU(start,start+suggestion.Length()); SetFocus(); } @@ -760,6 +768,12 @@ void SubsTextEditCtrl::OnUseThesaurusSuggestion(wxCommandEvent &event) { SetText(text.Left(MAX(0,start)) + suggestion + text.Mid(end+1)); // Set selection - SetSelection(GetUnicodePosition(start),GetUnicodePosition(start+suggestion.Length())); + SetSelectionU(start,start+suggestion.Length()); SetFocus(); } + + +// Set selection, unicode-aware +void SubsTextEditCtrl::SetSelectionU(int start, int end) { + SetSelection(GetUnicodePosition(start),GetUnicodePosition(end)); +} diff --git a/core/subs_edit_ctrl.h b/core/subs_edit_ctrl.h index 883c08586..217480c0a 100644 --- a/core/subs_edit_ctrl.h +++ b/core/subs_edit_ctrl.h @@ -89,6 +89,7 @@ public: SubsTextEditCtrl(wxWindow* parent, wxWindowID id, const wxString& value = _T(""), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxTextCtrlNameStr); ~SubsTextEditCtrl(); + void SetSelectionU(int start,int end); void SetTextTo(const wxString text); void UpdateStyle(int start=0,int length=-1); void StyleSpellCheck(int start=0,int length=-1);