#17 [wxScintilla] Fixes for ScintillaWX::Paste()

CVS_HEAD
open
nobody
None
5
2007-05-11
2007-05-11
heromyth
No

The function of Paste() works improperly, especially for non-ascii characters.

The details about this problem are described at http://forums.codeblocks.org/index.php/topic,1929.msg43896.html#msg43896

Here are two patches: one is basic, and the other is optimized.

The basic fixes are:

*** src/ScintillaWX.cpp Wed Jan 31 15:13:24 2007
--- src/ScintillaWX-new.cpp Fri May 11 13:15:38 2007
***************
*** 508,514 ****
if (gotRectData && selData.GetSize()>1) {
const char* rectBuf = (const char*)selData.GetData();
rectangular = rectBuf[0] == (char)1;
! len = selData.GetDataSize()-1;
char* buffer = new char[len];
memcpy (buffer, rectBuf+1, len);
textString = sci2wx(buffer, len);
--- 508,514 ----
if (gotRectData && selData.GetSize()>1) {
const char* rectBuf = (const char*)selData.GetData();
rectangular = rectBuf[0] == (char)1;
! len = selData.GetDataSize()-2; // The first and last char should be stripped!
char* buffer = new char[len];
memcpy (buffer, rectBuf+1, len);
textString = sci2wx(buffer, len);

====================

The optimized ones are:

*** src/ScintillaWX.cpp Wed Jan 31 15:13:24 2007
--- src/ScintillaWX-new.cpp Fri May 11 13:29:42 2007
***************
*** 494,500 ****

#if wxUSE_DATAOBJ
wxTextDataObject data;
! wxString textString;

wxWX2MBbuf buf;
int len = 0;
--- 494,500 ----

#if wxUSE_DATAOBJ
wxTextDataObject data;
! wxString textString = wxEmptyString;

wxWX2MBbuf buf;
int len = 0;
***************
*** 508,531 ****
if (gotRectData && selData.GetSize()>1) {
const char* rectBuf = (const char*)selData.GetData();
rectangular = rectBuf[0] == (char)1;
! len = selData.GetDataSize()-1;
! char* buffer = new char[len];
! memcpy (buffer, rectBuf+1, len);
! textString = sci2wx(buffer, len);
! delete buffer;
} else {
bool gotData = wxTheClipboard->GetData(data);
if (gotData) {
textString = wxTextBuffer::Translate (data.GetText(),
wxConvertEOLMode(pdoc->eolMode));
}
}
data.SetText(wxEmptyString); // free the data object content
wxTheClipboard->Close();
}

- buf = (wxWX2MBbuf)wx2sci(textString);
- len = strlen(buf);
int newPos = 0;
if (rectangular) {
int newLine = pdoc->LineFromPosition (currentPos) + wxCountLines (buf, pdoc->eolMode);
--- 508,528 ----
if (gotRectData && selData.GetSize()>1) {
const char* rectBuf = (const char*)selData.GetData();
rectangular = rectBuf[0] == (char)1;
! len = selData.GetDataSize()-2; // The first and last char should be stripped!
! buf=rectBuf+1;
} else {
bool gotData = wxTheClipboard->GetData(data);
if (gotData) {
textString = wxTextBuffer::Translate (data.GetText(),
wxConvertEOLMode(pdoc->eolMode));
+ buf = (wxWX2MBbuf)wx2sci(textString);
+ len = strlen(buf);
}
}
data.SetText(wxEmptyString); // free the data object content
wxTheClipboard->Close();
}

int newPos = 0;
if (rectangular) {
int newLine = pdoc->LineFromPosition (currentPos) + wxCountLines (buf, pdoc->eolMode);

====================

Discussion

  • heromyth
    heromyth
    2007-05-11

    Logged In: YES
    user_id=1190746
    Originator: YES

    File Added: ScintillaWX.cpp-optimized.patch

     
  • heromyth
    heromyth
    2007-05-11

    Optimized fixes

     
  • heromyth
    heromyth
    2007-05-11

    Basic fixes

     
  • heromyth
    heromyth
    2007-05-11

    Logged In: YES
    user_id=1190746
    Originator: YES

    File Added: ScintillaWX.cpp-basic.patch

     
  • heromyth
    heromyth
    2007-05-11

    Logged In: YES
    user_id=1190746
    Originator: YES

    Sorry, I am not sure the optimized fixes would works always.

     
  • heromyth
    heromyth
    2007-05-11

    • summary: [wxScintilla] Fixes for void ScintillaWX::Paste() --> [wxScintilla] Fixes for ScintillaWX::Paste()