Browse Source

Fixed SD2-1329: Index was out of range when cutting text.

Replace DoEvents() with a timer to make waiting for the second clipboard set operation non-blocking.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.1@2432 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
cea87a1bcc
  1. 37
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaClipboardHandler.cs
  2. 29
      src/Main/Core/Project/Src/Util/ClipboardWrapper.cs

37
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaClipboardHandler.cs

@ -88,21 +88,38 @@ namespace ICSharpCode.TextEditor
} }
OnCopyText(new CopyTextEventArgs(stringToCopy)); OnCopyText(new CopyTextEventArgs(stringToCopy));
// Work around ExternalException bug. (SD2-426) SafeSetClipboard(dataObject);
// Best reproducable inside Virtual PC.
try {
Clipboard.SetDataObject(dataObject, true, 10, 50);
} catch (ExternalException) {
Application.DoEvents();
try {
Clipboard.SetDataObject(dataObject, true, 10, 50);
} catch (ExternalException) {}
}
return true; return true;
} else { } else {
return false; return false;
} }
} }
// Code duplication: TextAreaClipboardHandler.cs also has SafeSetClipboard
[ThreadStatic] static int SafeSetClipboardDataVersion;
static void SafeSetClipboard(object dataObject)
{
// Work around ExternalException bug. (SD2-426)
// Best reproducable inside Virtual PC.
int version = unchecked(++SafeSetClipboardDataVersion);
try {
Clipboard.SetDataObject(dataObject, true);
} catch (ExternalException) {
Timer timer = new Timer();
timer.Interval = 100;
timer.Tick += delegate {
timer.Stop();
timer.Dispose();
if (SafeSetClipboardDataVersion == version) {
try {
Clipboard.SetDataObject(dataObject, true, 10, 50);
} catch (ExternalException) { }
}
};
timer.Start();
}
}
bool CopyTextToClipboard(string stringToCopy) bool CopyTextToClipboard(string stringToCopy)
{ {

29
src/Main/Core/Project/Src/Util/ClipboardWrapper.cs

@ -60,13 +60,32 @@ namespace ICSharpCode.Core
public static void SetDataObject(object data) public static void SetDataObject(object data)
{ {
SafeSetClipboard(data);
}
// Code duplication: TextAreaClipboardHandler.cs also has SafeSetClipboard
[ThreadStatic] static int SafeSetClipboardDataVersion;
static void SafeSetClipboard(object dataObject)
{
// Work around ExternalException bug. (SD2-426)
// Best reproducable inside Virtual PC.
int version = unchecked(++SafeSetClipboardDataVersion);
try { try {
Clipboard.SetDataObject(data, true, 10, 50); Clipboard.SetDataObject(dataObject, true);
} catch (ExternalException) { } catch (ExternalException) {
Application.DoEvents(); Timer timer = new Timer();
try { timer.Interval = 100;
Clipboard.SetDataObject(data, true, 10, 50); timer.Tick += delegate {
} catch (ExternalException) { } timer.Stop();
timer.Dispose();
if (SafeSetClipboardDataVersion == version) {
try {
Clipboard.SetDataObject(dataObject, true, 10, 50);
} catch (ExternalException) { }
}
};
timer.Start();
} }
} }
} }

Loading…
Cancel
Save