diff options
-rw-r--r-- | win32/ScintillaWin.cxx | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 0d76e949f..62d87fd9d 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -2007,11 +2007,9 @@ STDMETHODIMP ScintillaWin::DragEnter(LPDATAOBJECT pIDataSource, DWORD grfKeyStat POINTL, PDWORD pdwEffect) { if (pIDataSource == NULL) return E_POINTER; - if (IsUnicodeMode()) { - FORMATETC fmtu = {CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; - HRESULT hrHasUText = pIDataSource->QueryGetData(&fmtu); - hasOKText = (hrHasUText == S_OK); - } + FORMATETC fmtu = {CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + HRESULT hrHasUText = pIDataSource->QueryGetData(&fmtu); + hasOKText = (hrHasUText == S_OK); if (!hasOKText) { FORMATETC fmte = {CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; HRESULT hrHasText = pIDataSource->QueryGetData(&fmte); @@ -2078,24 +2076,40 @@ STDMETHODIMP ScintillaWin::Drop(LPDATAOBJECT pIDataSource, DWORD grfKeyState, SetDragPosition(invalidPosition); STGMEDIUM medium={0,{0},0}; - HRESULT hr = S_OK; char *data = 0; bool dataAllocated = false; - if (IsUnicodeMode()) { - FORMATETC fmtu = {CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; - hr = pIDataSource->GetData(&fmtu, &medium); - if (SUCCEEDED(hr) && medium.hGlobal) { - wchar_t *udata = static_cast<wchar_t *>(::GlobalLock(medium.hGlobal)); + FORMATETC fmtu = {CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + HRESULT hr = pIDataSource->GetData(&fmtu, &medium); + if (SUCCEEDED(hr) && medium.hGlobal) { + wchar_t *udata = static_cast<wchar_t *>(::GlobalLock(medium.hGlobal)); + if (IsUnicodeMode()) { int tlen = ::GlobalSize(medium.hGlobal); - // Convert UCS-2 to UTF-8 + // Convert UTF-16 to UTF-8 int dataLen = UTF8Length(udata, tlen/2); data = new char[dataLen+1]; if (data) { UTF8FromUTF16(udata, tlen/2, data, dataLen); dataAllocated = true; } + } else { + // Convert UTF-16 to ANSI + // + // Default Scintilla behavior in Unicode mode + // CF_UNICODETEXT available, but not in Unicode mode + // Convert from Unicode to current Scintilla code page + UINT cpDest = CodePageFromCharSet( + vs.styles[STYLE_DEFAULT].characterSet, pdoc->dbcsCodePage); + int tlen = ::WideCharToMultiByte(cpDest, 0, udata, -1, + NULL, 0, NULL, NULL) - 1; // subtract 0 terminator + data = new char[tlen + 1]; + if (data) { + memset(data, 0, (tlen+1)); + ::WideCharToMultiByte(cpDest, 0, udata, -1, + data, tlen + 1, NULL, NULL); + dataAllocated = true; + } } } |