Browse Source

Fix minor memory leak in AvalonEdit.

pull/18/head
Daniel Grunwald 14 years ago
parent
commit
6030c6869c
  1. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/WeakReferenceTests.cs
  2. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretNavigationCommandHandler.cs
  3. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs
  4. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextAreaDefaultInputHandlers.cs

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/WeakReferenceTests.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Editing;
using ICSharpCode.AvalonEdit.Rendering; using ICSharpCode.AvalonEdit.Rendering;
@ -45,7 +46,6 @@ namespace ICSharpCode.AvalonEdit
} }
[Test] [Test]
[Ignore]
public void DocumentDoesNotHoldReferenceToTextArea() public void DocumentDoesNotHoldReferenceToTextArea()
{ {
TextDocument textDocument = new TextDocument(); TextDocument textDocument = new TextDocument();
@ -61,7 +61,6 @@ namespace ICSharpCode.AvalonEdit
} }
[Test] [Test]
[Ignore]
public void DocumentDoesNotHoldReferenceToTextEditor() public void DocumentDoesNotHoldReferenceToTextEditor()
{ {
TextDocument textDocument = new TextDocument(); TextDocument textDocument = new TextDocument();
@ -102,9 +101,12 @@ namespace ICSharpCode.AvalonEdit
static void GarbageCollect() static void GarbageCollect()
{ {
GC.WaitForPendingFinalizers(); for (int i = 0; i < 3; i++) {
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers();
GC.WaitForPendingFinalizers(); GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
// pump WPF messages so that WeakEventManager can unregister
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new Action(delegate {}));
}
} }
} }
} }

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretNavigationCommandHandler.cs

@ -73,6 +73,8 @@ namespace ICSharpCode.AvalonEdit.Editing
AddBinding(EditingCommands.SelectToDocumentEnd, Ctrl | Shift, Key.End, OnMoveCaretExtendSelection(CaretMovementType.DocumentEnd)); AddBinding(EditingCommands.SelectToDocumentEnd, Ctrl | Shift, Key.End, OnMoveCaretExtendSelection(CaretMovementType.DocumentEnd));
CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, OnSelectAll)); CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, OnSelectAll));
TextAreaDefaultInputHandler.WorkaroundWPFMemoryLeak(InputBindings);
} }
static void OnSelectAll(object target, ExecutedRoutedEventArgs args) static void OnSelectAll(object target, ExecutedRoutedEventArgs args)

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs

@ -75,6 +75,8 @@ namespace ICSharpCode.AvalonEdit.Editing
CommandBindings.Add(new CommandBinding(AvalonEditCommands.ConvertLeadingTabsToSpaces, OnConvertLeadingTabsToSpaces)); CommandBindings.Add(new CommandBinding(AvalonEditCommands.ConvertLeadingTabsToSpaces, OnConvertLeadingTabsToSpaces));
CommandBindings.Add(new CommandBinding(AvalonEditCommands.ConvertLeadingSpacesToTabs, OnConvertLeadingSpacesToTabs)); CommandBindings.Add(new CommandBinding(AvalonEditCommands.ConvertLeadingSpacesToTabs, OnConvertLeadingSpacesToTabs));
CommandBindings.Add(new CommandBinding(AvalonEditCommands.IndentSelection, OnIndentSelection)); CommandBindings.Add(new CommandBinding(AvalonEditCommands.IndentSelection, OnIndentSelection));
TextAreaDefaultInputHandler.WorkaroundWPFMemoryLeak(InputBindings);
} }
static TextArea GetTextArea(object target) static TextArea GetTextArea(object target)

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextAreaDefaultInputHandlers.cs

@ -2,7 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Linq; using System.Collections.Generic;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
@ -54,6 +54,16 @@ namespace ICSharpCode.AvalonEdit.Editing
return kb; return kb;
} }
internal static void WorkaroundWPFMemoryLeak(List<InputBinding> inputBindings)
{
// Work around WPF memory leak:
// KeyBinding retains a reference to whichever UIElement it is used in first.
// Using a dummy element for this purpose ensures that we don't leak
// a real text editor (which a potentially large document).
UIElement dummyElement = new UIElement();
dummyElement.InputBindings.AddRange(inputBindings);
}
#region Undo / Redo #region Undo / Redo
UndoStack GetUndoStack() UndoStack GetUndoStack()
{ {

Loading…
Cancel
Save