diff options
-rw-r--r-- | doc/ScintillaHistory.html | 1 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 28 |
2 files changed, 20 insertions, 9 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index cbd7f568f..999141df8 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -470,6 +470,7 @@ <li> Copy and paste of rectangular selections compatible with Borland Delphi IDE on Windows. <a href="http://sourceforge.net/p/scintilla/feature-requests/1002/">Feature #1002.</a> + <a href="http://sourceforge.net/p/scintilla/bugs/1513/">Bug #1513</a>. </li> <li> On Windows, fix painting on an explicit HDC when first paint attempt abandoned. diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 52f8fa4a1..216334b17 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -197,7 +197,7 @@ class ScintillaWin : bool hasOKText; CLIPFORMAT cfColumnSelect; - CLIPFORMAT cfColumnSelectBorland; + CLIPFORMAT cfBorlandIDEBlockType; CLIPFORMAT cfLineSelect; HRESULT hrOle; @@ -316,7 +316,7 @@ public: friend class DataObject; friend class DropTarget; bool DragIsRectangularOK(CLIPFORMAT fmt) const { - return drag.rectangular && ((fmt == cfColumnSelect) || (fmt == cfColumnSelectBorland)); + return drag.rectangular && (fmt == cfColumnSelect); } private: @@ -351,7 +351,7 @@ ScintillaWin::ScintillaWin(HWND hwnd) { // contains a rectangular selection, so copy Developer Studio and Borland Delphi. cfColumnSelect = static_cast<CLIPFORMAT>( ::RegisterClipboardFormat(TEXT("MSDEVColumnSelect"))); - cfColumnSelectBorland = static_cast<CLIPFORMAT>( + cfBorlandIDEBlockType = static_cast<CLIPFORMAT>( ::RegisterClipboardFormat(TEXT("Borland IDE Block Type"))); // Likewise for line-copy (copies a full line when no text is selected) @@ -1704,7 +1704,16 @@ void ScintillaWin::Paste() { SelectionPosition selStart = sel.IsRectangular() ? sel.Rectangular().Start() : sel.Range(sel.Main()).Start(); - bool isRectangular = ((::IsClipboardFormatAvailable(cfColumnSelect) != 0) || (::IsClipboardFormatAvailable(cfColumnSelectBorland) != 0)); + bool isRectangular = (::IsClipboardFormatAvailable(cfColumnSelect) != 0); + + if (!isRectangular) { + // Evaluate "Borland IDE Block Type" explicitly + GlobalMemory memBorlandSelection(::GetClipboardData(cfBorlandIDEBlockType)); + if (memBorlandSelection) { + isRectangular = (memBorlandSelection.Size() == 1) && (static_cast<BYTE *>(memBorlandSelection.ptr)[0] == 0x02); + memBorlandSelection.Unlock(); + } + } // Always use CF_UNICODETEXT if available GlobalMemory memUSelection(::GetClipboardData(CF_UNICODETEXT)); @@ -2251,11 +2260,12 @@ void ScintillaWin::CopyToClipboard(const SelectionText &selectedText) { if (selectedText.rectangular) { ::SetClipboardData(cfColumnSelect, 0); - GlobalMemory borlandColumn; - borlandColumn.Allocate(1); - if (borlandColumn) { - static_cast<BYTE *>(borlandColumn.ptr)[0] = 0x02; - borlandColumn.SetClip(cfColumnSelectBorland); + + GlobalMemory borlandSelection; + borlandSelection.Allocate(1); + if (borlandSelection) { + static_cast<BYTE *>(borlandSelection.ptr)[0] = 0x02; + borlandSelection.SetClip(cfBorlandIDEBlockType); } } |