Browse Source

Fixed issue in CodeEditorView: CustomTabCommand was modifying a KeyBinding shared by all AvalonEdit instances. The code now creates a new KeyBinding instead.

AvalonEdit: mark shared KeyBindings as frozen if possible (only possible on .NET 4).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5545 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
4a3f617c1b
  1. 4
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs
  2. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretNavigationCommandHandler.cs
  3. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/EditingCommandHandler.cs
  4. 13
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextAreaDefaultInputHandlers.cs

4
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs

@ -60,7 +60,9 @@ namespace ICSharpCode.AvalonEdit.AddIn
var editingKeyBindings = this.TextArea.DefaultInputHandler.Editing.InputBindings.OfType<KeyBinding>(); var editingKeyBindings = this.TextArea.DefaultInputHandler.Editing.InputBindings.OfType<KeyBinding>();
var tabBinding = editingKeyBindings.Single(b => b.Key == Key.Tab && b.Modifiers == ModifierKeys.None); var tabBinding = editingKeyBindings.Single(b => b.Key == Key.Tab && b.Modifiers == ModifierKeys.None);
tabBinding.Command = new CustomTabCommand(this, tabBinding.Command); this.TextArea.DefaultInputHandler.Editing.InputBindings.Remove(tabBinding);
var newTabBinding = new KeyBinding(new CustomTabCommand(this, tabBinding.Command), tabBinding.Key, tabBinding.Modifiers);
this.TextArea.DefaultInputHandler.Editing.InputBindings.Add(newTabBinding);
} }
protected override void OnOptionChanged(PropertyChangedEventArgs e) protected override void OnOptionChanged(PropertyChangedEventArgs e)

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

@ -37,7 +37,7 @@ namespace ICSharpCode.AvalonEdit.Editing
static void AddBinding(ICommand command, ModifierKeys modifiers, Key key, ExecutedRoutedEventHandler handler) static void AddBinding(ICommand command, ModifierKeys modifiers, Key key, ExecutedRoutedEventHandler handler)
{ {
CommandBindings.Add(new CommandBinding(command, handler)); CommandBindings.Add(new CommandBinding(command, handler));
InputBindings.Add(new KeyBinding(command, key, modifiers)); InputBindings.Add(TextAreaDefaultInputHandler.CreateFrozenKeyBinding(command, modifiers, key));
} }
static CaretNavigationCommandHandler() static CaretNavigationCommandHandler()

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

@ -46,7 +46,7 @@ namespace ICSharpCode.AvalonEdit.Editing
static void AddBinding(ICommand command, ModifierKeys modifiers, Key key, ExecutedRoutedEventHandler handler) static void AddBinding(ICommand command, ModifierKeys modifiers, Key key, ExecutedRoutedEventHandler handler)
{ {
CommandBindings.Add(new CommandBinding(command, handler)); CommandBindings.Add(new CommandBinding(command, handler));
InputBindings.Add(new KeyBinding(command, key, modifiers)); InputBindings.Add(TextAreaDefaultInputHandler.CreateFrozenKeyBinding(command, modifiers, key));
} }
static EditingCommandHandler() static EditingCommandHandler()

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

@ -6,7 +6,9 @@
// </file> // </file>
using System; using System;
using System.Windows;
using System.Windows.Input; using System.Windows.Input;
using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Document;
namespace ICSharpCode.AvalonEdit.Editing namespace ICSharpCode.AvalonEdit.Editing
@ -44,6 +46,17 @@ namespace ICSharpCode.AvalonEdit.Editing
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, ExecuteRedo, CanExecuteRedo)); this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, ExecuteRedo, CanExecuteRedo));
} }
internal static KeyBinding CreateFrozenKeyBinding(ICommand command, ModifierKeys modifiers, Key key)
{
KeyBinding kb = new KeyBinding(command, key, modifiers);
// Mark KeyBindings as frozen because they're shared between multiple editor instances.
// KeyBinding derives from Freezable only in .NET 4, so we have to use this little trick:
Freezable f = ((object)kb) as Freezable;
if (f != null)
f.Freeze();
return kb;
}
#region Undo / Redo #region Undo / Redo
UndoStack GetUndoStack() UndoStack GetUndoStack()
{ {

Loading…
Cancel
Save