Browse Source

Save user defined gestures

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/shortcuts@4356 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts^2
Sergej Andrejev 16 years ago
parent
commit
bcb1fd10b9
  1. 6
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 78
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  3. BIN
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement.suo
  4. 9
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Resources/StringResources.resx
  5. 2
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/ShortcutsManagement.csproj
  6. 7
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Converters/GesturesCollectionConverter.cs
  7. 12
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Converters/InputGestureConverter.cs
  8. 7
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Data/Shortcut.cs
  9. 25
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Data/ShortcutsFinder.cs
  10. 4
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/MultiKeyGestureTextBox.xaml
  11. 17
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/MultiKeyGestureTextBox.xaml.cs
  12. 28
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutManagementWindow.xaml
  13. 38
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutManagementWindow.xaml.cs
  14. 7
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsManagementOptionsPanel.xaml
  15. 10
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsManagementOptionsPanel.xaml.cs
  16. 4
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsTreeView.xaml
  17. 6
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsTreeView.xaml.cs
  18. 89
      src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Window1.xaml.cs
  19. 53
      src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs
  20. 2
      src/Main/Base/Project/Src/Commands/NavigationCommands.cs
  21. 3
      src/Main/Base/Project/Src/Commands/ToolsCommands.cs
  22. 48
      src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml
  23. 3
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs
  24. 9
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs
  25. 7
      src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs
  26. 5
      src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/Command/CommandBindingDescriptor.cs
  27. 5
      src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/Command/InputBindingDescriptor.cs
  28. 279
      src/Main/ICSharpCode.Core.Presentation/CommandsService/CommandBindingInfo.cs
  29. 165
      src/Main/ICSharpCode.Core.Presentation/CommandsService/CommandManager.cs
  30. 53
      src/Main/ICSharpCode.Core.Presentation/CommandsService/CommandsService.cs
  31. 2
      src/Main/ICSharpCode.Core.Presentation/CommandsService/InputBindingCategory.cs
  32. 168
      src/Main/ICSharpCode.Core.Presentation/CommandsService/InputBindingInfo.cs
  33. 10
      src/Main/ICSharpCode.Core.Presentation/CommandsService/InputGestureCollectionConverter.cs
  34. 17
      src/Main/ICSharpCode.Core.Presentation/CommandsService/InputGestureCollectionExtensions.cs
  35. 100
      src/Main/ICSharpCode.Core.Presentation/CommandsService/InputGestureExtensions.cs
  36. 35
      src/Main/ICSharpCode.Core.Presentation/CommandsService/ManagedCommandBinding.cs
  37. 24
      src/Main/ICSharpCode.Core.Presentation/CommandsService/ManagedInputBinding.cs
  38. 33
      src/Main/ICSharpCode.Core.Presentation/CommandsService/MultiKeyGesture.cs
  39. 4
      src/Main/ICSharpCode.Core.Presentation/CommandsService/MultiKeyGestureConverter.cs
  40. 28
      src/Main/ICSharpCode.Core.Presentation/CommandsService/PartialKeyGesture.cs
  41. 87
      src/Main/ICSharpCode.Core.Presentation/CommandsService/UserDefinedGesturesManager.cs
  42. 7
      src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj
  43. 56
      src/Main/ICSharpCode.Core.Presentation/Menu/MenuCommand.cs
  44. 24
      src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs
  45. 278
      src/SharpDevelop.sln

6
AddIns/ICSharpCode.SharpDevelop.addin

@ -129,7 +129,7 @@ @@ -129,7 +129,7 @@
<CommandBinding
command="SDBuildCommands.BuildSolution"
class="ICSharpCode.SharpDevelop.Project.Commands.Build"
gestures="Ctrl+Alt+R,R|Ctrl+B,B"
gestures="Ctrl+Alt+R,R;Ctrl+B,B"
category="Building"
/>
<CommandBinding
@ -214,7 +214,7 @@ @@ -214,7 +214,7 @@
<CommandBinding
command="SDDebugCommands.ContinueDebugging"
class="ICSharpCode.SharpDevelop.Project.Commands.ContinueDebuggingCommand"
gestures="Ctrl+Alt+B | Ctrl+Alt+D"
gestures="Ctrl+Alt+B; Ctrl+Alt+D"
category="Debugger" />
<CommandBinding
command="SDDebugCommands.StepOver"
@ -429,7 +429,7 @@ @@ -429,7 +429,7 @@
<Path path = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/SolutionNode">
<MenuItem id = "Build"
label = "${res:XML.MainMenu.BuildMenu.BuildSolution}"
shortcut = "F8"
shortcut = "Ctrl+B,B"
icon = "Icons.16x16.BuildCombine"
class = "ICSharpCode.SharpDevelop.Project.Commands.Build"
command = "SDBuildCommands.Build" />

78
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -25,9 +25,11 @@ using ICSharpCode.AvalonEdit.Rendering; @@ -25,9 +25,11 @@ using ICSharpCode.AvalonEdit.Rendering;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Editor;
using CommandManager=ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.AvalonEdit.AddIn
{
@ -115,18 +117,21 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -115,18 +117,21 @@ namespace ICSharpCode.AvalonEdit.AddIn
}
}
public CodeEditor()
static CodeEditor()
{
var contextName = this.GetType().FullName;
var commandBindingInfo = new CommandBindingInfo();
commandBindingInfo.OwnerInstance = this;
commandBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
commandBindingInfo.RoutedCommandName = "SDWindowCommands.SplitView";
commandBindingInfo.ExecutedEventHandler = OnSplitView;
commandBindingInfo.CanExecutedEventHandler = OnCanSplitView;
CommandsRegistry.RegisterCommandBinding(commandBindingInfo);
commandBindingInfo.CanExecuteEventHandler = OnCanSplitView;
commandBindingInfo.Name = "CodeEditorCommandBinding";
CommandManager.RegisterCommandBinding(commandBindingInfo);
}
public CodeEditor()
{
textMarkerService = new TextMarkerService(this);
iconBarManager = new IconBarManager();
@ -206,33 +211,56 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -206,33 +211,56 @@ namespace ICSharpCode.AvalonEdit.AddIn
primaryTextEditor.Save(stream);
}
void OnCanSplitView(object sender, CanExecuteRoutedEventArgs e)
static void OnCanSplitView(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
var avalonEditViewContent = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as AvalonEditViewContent;
if(avalonEditViewContent == null) {
e.CanExecute = false;
return;
}
var codeEditor = avalonEditViewContent.CodeEditor as CodeEditor;
if(codeEditor == null) {
e.CanExecute = false;
return;
}
e.CanExecute = (codeEditor.ActiveTextEditor == codeEditor.PrimaryTextEditor);
}
void OnSplitView(object sender, ExecutedRoutedEventArgs e)
static void OnSplitView(object sender, ExecutedRoutedEventArgs e)
{
if (secondaryTextEditor == null) {
var avalonEditViewContent = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent as AvalonEditViewContent;
if(avalonEditViewContent == null) {
return;
}
var codeEditor = avalonEditViewContent.CodeEditor as CodeEditor;
if(codeEditor == null) {
return;
}
if (codeEditor.secondaryTextEditor == null) {
// create secondary editor
this.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
secondaryTextEditor = CreateTextEditor();
secondaryTextEditorAdapter = (CodeEditorAdapter)secondaryTextEditor.TextArea.GetService(typeof(ITextEditor));
Debug.Assert(primaryTextEditorAdapter != null);
codeEditor.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
codeEditor.secondaryTextEditor = codeEditor.CreateTextEditor();
codeEditor.secondaryTextEditorAdapter = (CodeEditorAdapter)codeEditor.secondaryTextEditor.TextArea.GetService(typeof(ITextEditor));
Debug.Assert(codeEditor.primaryTextEditorAdapter != null);
secondaryTextEditor.SetBinding(TextEditor.DocumentProperty,
new Binding(TextEditor.DocumentProperty.Name) { Source = primaryTextEditor });
secondaryTextEditor.TextArea.SetBinding(TextArea.IndentationStrategyProperty,
new Binding(TextArea.IndentationStrategyProperty.Name) { Source = primaryTextEditor.TextArea });
secondaryTextEditor.SyntaxHighlighting = primaryTextEditor.SyntaxHighlighting;
codeEditor.secondaryTextEditor.SetBinding(TextEditor.DocumentProperty,
new Binding(TextEditor.DocumentProperty.Name) { Source = codeEditor.primaryTextEditor });
codeEditor.secondaryTextEditor.TextArea.SetBinding(TextArea.IndentationStrategyProperty,
new Binding(TextArea.IndentationStrategyProperty.Name) { Source = codeEditor.primaryTextEditor.TextArea });
codeEditor.secondaryTextEditor.SyntaxHighlighting = codeEditor.primaryTextEditor.SyntaxHighlighting;
SetRow(secondaryTextEditor, 2);
this.Children.Add(secondaryTextEditor);
SetRow(codeEditor.secondaryTextEditor, 2);
codeEditor.Children.Add(codeEditor.secondaryTextEditor);
} else {
// remove secondary editor
this.Children.Remove(secondaryTextEditor);
secondaryTextEditor = null;
secondaryTextEditorAdapter = null;
this.RowDefinitions.RemoveAt(this.RowDefinitions.Count - 1);
codeEditor.Children.Remove(codeEditor.secondaryTextEditor);
codeEditor.secondaryTextEditor = null;
codeEditor.secondaryTextEditorAdapter = null;
codeEditor.RowDefinitions.RemoveAt(codeEditor.RowDefinitions.Count - 1);
}
}

BIN
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement.suo

Binary file not shown.

9
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Resources/StringResources.resx

@ -118,13 +118,13 @@ @@ -118,13 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ShortcutsManagement.EnterGestureLabel" xml:space="preserve">
<value>Enter key gesture</value>
<value>Add gesture</value>
</data>
<data name="ShortcutsManagement.ShortcutGesturesLabel" xml:space="preserve">
<value>Registered gestures</value>
<value>Shortcut gestures</value>
</data>
<data name="ShortcutsManagement.SimilarShortcutsLabel" xml:space="preserve">
<value>Commands with same gestures assigned</value>
<value>Shortcuts with same gestures</value>
</data>
<data name="Global.CancelButtonText" xml:space="preserve">
<value>_Cancel</value>
@ -167,4 +167,7 @@ @@ -167,4 +167,7 @@
<data name="ShortcutsManagement.ModificationWindow.AdditionIsSuccessfull" xml:space="preserve">
<value>Gesture added</value>
</data>
<data name="ShortcutsManagement.ModificationWindow.AddingExistingGesture" xml:space="preserve">
<value>Failed to add a gesture. Such gesture already exists in shortcut gestures collections</value>
</data>
</root>

2
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/ShortcutsManagement.csproj

@ -148,7 +148,6 @@ @@ -148,7 +148,6 @@
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="Src\Data\GestureFilterMode.cs" />
<Compile Include="Src\Data\IShortcutTreeEntry.cs" />
<Compile Include="Src\Data\Shortcut.cs" />
<Compile Include="Src\Data\ShortcutCategory.cs" />
@ -166,7 +165,6 @@ @@ -166,7 +165,6 @@
<Compile Include="Src\Dialogs\ShortcutsTreeView.xaml.cs">
<DependentUpon>ShortcutsTreeView.xaml</DependentUpon>
</Compile>
<Compile Include="Src\Extensions\PartialKeyGestureExtensions.cs" />
<Compile Include="Src\Extensions\TextBlockBehavior.cs" />
<Compile Include="Src\Extensions\TreeViewExtensions.cs" />
<Compile Include="Src\Converters\TypeNameConverter.cs" />

7
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Converters/GesturesCollectionConverter.cs

@ -22,8 +22,9 @@ namespace ICSharpCode.ShortcutsManagement.Converters @@ -22,8 +22,9 @@ namespace ICSharpCode.ShortcutsManagement.Converters
/// <returns>String representing collection of gestures</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string converterValue = "";
if (value is InputGestureCollection && (targetType == typeof(string) || targetType.IsSubclassOf(typeof(string)))) {
return new InputGestureCollectionConverter().ConvertToInvariantString(value);
converterValue = new InputGestureCollectionConverter().ConvertToInvariantString(value);
}
if (value is ObservableCollection<InputGesture> && (targetType == typeof(string) || targetType.IsSubclassOf(typeof(string)))) {
@ -31,10 +32,10 @@ namespace ICSharpCode.ShortcutsManagement.Converters @@ -31,10 +32,10 @@ namespace ICSharpCode.ShortcutsManagement.Converters
foreach (var gesture in (ObservableCollection<InputGesture>)value) {
inputGestureCollection.Add(gesture);
}
return new InputGestureCollectionConverter().ConvertToInvariantString(inputGestureCollection);
converterValue = new InputGestureCollectionConverter().ConvertToInvariantString(inputGestureCollection);
}
return value.ToString();
return converterValue.Replace("+", " + ").Replace(",", ", ").Replace(";", "; "); ;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

12
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Converters/InputGestureConverter.cs

@ -21,19 +21,15 @@ namespace ICSharpCode.ShortcutsManagement.Converters @@ -21,19 +21,15 @@ namespace ICSharpCode.ShortcutsManagement.Converters
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is MultiKeyGesture && targetType == typeof(string))
if (value is KeyGesture && targetType == typeof(string))
{
return new MultiKeyGestureConverter().ConvertToInvariantString(value).Replace("+", " + ");
}
if(value is KeyGesture && targetType == typeof(string))
{
return new KeyGestureConverter().ConvertToInvariantString(value).Replace("+", " + ");
var gestures = new InputGestureCollection(new[] {value});
return new InputGestureCollectionConverter().ConvertToInvariantString(gestures).Replace("+", " + ").Replace(",", ", ");
}
if(value is MouseGesture && targetType == typeof(string))
{
return new MouseGestureConverter().ConvertToInvariantString(value).Replace("+", " + ");
return new MouseGestureConverter().ConvertToInvariantString(value);
}
return "";

7
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Data/Shortcut.cs

@ -12,7 +12,7 @@ namespace ICSharpCode.ShortcutsManagement.Data @@ -12,7 +12,7 @@ namespace ICSharpCode.ShortcutsManagement.Data
public class Shortcut : INotifyPropertyChanged, IShortcutTreeEntry
{
/// <summary>
/// List of input gestures which will invoke this action
/// List of input gestures which invoking this action
/// </summary>
public ObservableCollection<InputGesture> Gestures
{
@ -42,6 +42,11 @@ namespace ICSharpCode.ShortcutsManagement.Data @@ -42,6 +42,11 @@ namespace ICSharpCode.ShortcutsManagement.Data
}
}
/// <summary>
/// Sort shortcut sub-elements.
///
/// Does nothing.
/// </summary>
public void SortSubEntries()
{

25
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Data/ShortcutsFinder.cs

@ -99,7 +99,7 @@ namespace ICSharpCode.ShortcutsManagement.Data @@ -99,7 +99,7 @@ namespace ICSharpCode.ShortcutsManagement.Data
/// </summary>
/// <param name="inputGestureTemplate">Gesture template which should match shortcut gesture partly to make it visible</param>
/// <param name="mode">Filtering mode</param>
public void FilterGesture(InputGesture inputGestureTemplate, GestureFilterMode mode)
public void FilterGesture(InputGesture inputGestureTemplate, GestureCompareMode mode)
{
FilterGesture(new InputGestureCollection(new[] { inputGestureTemplate }), mode);
}
@ -111,7 +111,7 @@ namespace ICSharpCode.ShortcutsManagement.Data @@ -111,7 +111,7 @@ namespace ICSharpCode.ShortcutsManagement.Data
/// </summary>
/// <param name="inputGestureTemplateCollection">Collection of gesture templates which (atleast one) should match shortcut gesture partly to make it visible</param>
/// <param name="mode">Filtering mode</param>
public void FilterGesture(InputGestureCollection inputGestureTemplateCollection, GestureFilterMode mode)
public void FilterGesture(InputGestureCollection inputGestureTemplateCollection, GestureCompareMode mode)
{
Debug.WriteLine("Changed to" + new InputGestureCollectionConverter().ConvertToInvariantString(inputGestureTemplateCollection));
foreach (var entry in RootEntries)
@ -142,7 +142,7 @@ namespace ICSharpCode.ShortcutsManagement.Data @@ -142,7 +142,7 @@ namespace ICSharpCode.ShortcutsManagement.Data
if (rootShortcut != null) {
rootShortcut.IsVisible = false;
foreach (InputGesture template in inputGestureTemplateCollection) {
if (template.MatchesCollection(new InputGestureCollection(rootShortcut.Gestures), mode)) {
if (template.IsTemplateForAny(new InputGestureCollection(rootShortcut.Gestures), mode)) {
rootShortcut.IsVisible = true;
break;
}
@ -158,7 +158,7 @@ namespace ICSharpCode.ShortcutsManagement.Data @@ -158,7 +158,7 @@ namespace ICSharpCode.ShortcutsManagement.Data
/// <param name="inputGestureTemplateCollection">Collection of gesture templates which (atleast one) should match shortcut gesture partly to make it visible</param>
/// <param name="mode">Filtering mode</param>
/// <returns></returns>
private static bool FilterGesture(ShortcutCategory category, InputGestureCollection inputGestureTemplateCollection, GestureFilterMode mode)
private static bool FilterGesture(ShortcutCategory category, InputGestureCollection inputGestureTemplateCollection, GestureCompareMode mode)
{
// Apply filter to sub-categories
var isSubElementVisible = false;
@ -171,21 +171,8 @@ namespace ICSharpCode.ShortcutsManagement.Data @@ -171,21 +171,8 @@ namespace ICSharpCode.ShortcutsManagement.Data
// Apply filter to shortcuts
foreach (var shortcut in category.Shortcuts) {
var gestureMatched = false;
foreach (InputGesture template in inputGestureTemplateCollection)
{
if (shortcut.Gestures.Count > 0 && ((KeyGesture)shortcut.Gestures[0]).Key == Key.F5)
{
}
if (template.MatchesCollection(new InputGestureCollection(shortcut.Gestures), mode))
{
gestureMatched = true;
break;
}
}
var gestureMatched = inputGestureTemplateCollection.ContainsTemplateForAny(new InputGestureCollection(shortcut.Gestures), mode);
if (gestureMatched) {
shortcut.IsVisible = true;
isSubElementVisible = true;

4
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/MultiKeyGestureTextBox.xaml

@ -37,8 +37,8 @@ @@ -37,8 +37,8 @@
</Border>
<!-- Notification panel under the textbox -->
<StackPanel Grid.Row="1" Orientation="Horizontal" Visibility="{Binding ElementName=_this, Path=NotificationVisibility}">
<Image Width="16" Margin="5,0,10,0">
<StackPanel Grid.Row="1" Orientation="Horizontal" Visibility="{Binding ElementName=_this, Path=NotificationVisibility}" Height="16" Margin="0">
<Image Height="16" Margin="5,0,10,0">
<Image.Style>
<Style>
<Style.Triggers>

17
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/MultiKeyGestureTextBox.xaml.cs

@ -78,7 +78,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -78,7 +78,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
}
if (enteredKeyGestureSequence.Count == 1) {
return enteredKeyGestureSequence.First();
return new PartialKeyGesture(enteredKeyGestureSequence.First());
}
return new MultiKeyGesture(enteredKeyGestureSequence);
@ -159,7 +159,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -159,7 +159,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
/// <summary>
/// Last entered chords
/// </summary>
private readonly List<PartialKeyGesture> enteredKeyGestureSequence = new List<PartialKeyGesture>();
private List<PartialKeyGesture> enteredKeyGestureSequence = new List<PartialKeyGesture>();
/// <summary>
/// Time when last successfull chord was entered
@ -190,7 +190,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -190,7 +190,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
/// </summary>
public void Clear()
{
enteredKeyGestureSequence.Clear();
enteredKeyGestureSequence = new List<PartialKeyGesture>();
shortcutTextBox.Text = "";
DisplayNotification("", NotificationType.None);
}
@ -240,7 +240,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -240,7 +240,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
}
// Check whether time given for chord entry haven't expired yet
if (DateTime.Now - lastEnterTime > MultiKeyGesture.DelayBetweenGestureInputs) {
if (DateTime.Now - lastEnterTime > MultiKeyGesture.DelayBetweenChords) {
if (enteredKeyGestureSequence.Count > 0) {
DisplayNotification(StringParser.Parse("${res:ShortcutsManagement.GestureTextBox.TimeExpired}"), NotificationType.Invalid);
}
@ -252,15 +252,18 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -252,15 +252,18 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
var partialKeyGesture = new PartialKeyGesture(e);
var lastGesture = enteredKeyGestureSequence.Count > 0 ? enteredKeyGestureSequence.LastOrDefault() : null;
var isLastGestureComplete = lastGesture != null && lastGesture.Key != Key.None;
var isContinuedGesture = lastGesture != null && partialKeyGesture.Modifiers - (partialKeyGesture.Modifiers ^ lastGesture.Modifiers) >= 0;
var isLastGestureSpecialKey = lastGesture != null && (lastGesture.Key >= Key.F1) && (lastGesture.Key <= Key.F24);
var isLastGestureComplete = lastGesture != null && (lastGesture.Key != Key.None || isLastGestureSpecialKey);
var isContinuedGesture = lastGesture != null && partialKeyGesture.Modifiers - (partialKeyGesture.Modifiers ^ lastGesture.Modifiers) >= 0;
// If continuing previous chord
if (!isLastGestureComplete && isContinuedGesture)
{
enteredKeyGestureSequence.RemoveAt(enteredKeyGestureSequence.Count - 1);
}
// If previous chord is unfinished and second chor is already entered
// If previous chord is unfinished and second chord is already entered
// start from scratch.
else if (!isLastGestureComplete)
{

28
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutManagementWindow.xaml

@ -1,7 +1,6 @@ @@ -1,7 +1,6 @@
<Window x:Class="ICSharpCode.ShortcutsManagement.Dialogs.ShortcutManagementWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ShortcutsManagement="clr-namespace:ICSharpCode.ShortcutsManagement"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:Dialogs="clr-namespace:ICSharpCode.ShortcutsManagement.Dialogs"
Title="{Binding Text}"
@ -28,12 +27,15 @@ @@ -28,12 +27,15 @@
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition />
<RowDefinition Height="2" />
<RowDefinition />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<!-- Field for entering a gesture -->
<Label x:Name="shortcutLabel" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Top" Content="{core:Localize ShortcutsManagement.EnterGestureLabel}" />
<Label x:Name="shortcutLabel" Grid.Column="0" Grid.Row="0" Target="{Binding ElementName=gestureTextBox}" HorizontalAlignment="Right" VerticalAlignment="Top">
<TextBlock TextWrapping="Wrap" Text="{core:Localize ShortcutsManagement.EnterGestureLabel}" />
</Label>
<Grid Grid.Column="2" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition />
@ -45,7 +47,9 @@ @@ -45,7 +47,9 @@
</Grid>
<!-- List of gestures assigned to modified shortcut -->
<Label x:Name="otherShortcutsLabel" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Top" Content="{core:Localize ShortcutsManagement.ShortcutGesturesLabel}" />
<Label x:Name="otherShortcutsLabel" Grid.Column="0" Grid.Row="1" Target="{Binding ElementName=otherShortcutsListBox}" HorizontalAlignment="Right" VerticalAlignment="Top">
<TextBlock TextWrapping="Wrap" Text="{core:Localize ShortcutsManagement.ShortcutGesturesLabel}" />
</Label>
<ListBox x:Name="otherShortcutsListBox" Grid.Column="1" Grid.Row="1" ItemContainerStyle="{StaticResource GesturesListBox}" ItemsSource="{Binding Path=Gestures}" Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type InputGesture}">
@ -67,12 +71,22 @@ @@ -67,12 +71,22 @@
</ListBox.ItemTemplate>
</ListBox>
<!-- List of shortcuts which have same gestures assigned to them -->
<Label x:Name="otherCommandsLabel" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Top" Content="{core:Localize ShortcutsManagement.SimilarShortcutsLabel}" />
<ShortcutsManagement:ShortcutsTreeView Grid.Row="2" Grid.Column="1" x:Name="shortcutsManagementOptionsPanel" IsSearchable="False" Padding="3" RemoveShortcutClick="shortcutsManagementOptionsPanel_RemoveShortcutClick" IsRemovableShortcutsEnabled="True" />
<GridSplitter Grid.Row="2" Grid.Column="2" ResizeDirection="Rows"
Width="Auto"
Height="2"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="White"
Margin="0"/>
<!-- List of shortcuts which have same gestures assigned to them -->
<Label x:Name="otherCommandsLabel" Grid.Row="3" Grid.Column="0" Target="{Binding ElementName=shortcutsManagementOptionsPanel}" HorizontalAlignment="Right" VerticalAlignment="Top">
<TextBlock TextWrapping="Wrap" Text="{core:Localize ShortcutsManagement.SimilarShortcutsLabel}" />
</Label>
<Dialogs:ShortcutsTreeView Grid.Row="3" Grid.Column="1" x:Name="shortcutsManagementOptionsPanel" IsSearchable="False" Padding="3" RemoveShortcutClick="shortcutsManagementOptionsPanel_RemoveShortcutClick" IsRemovableShortcutsEnabled="True" />
<!-- Ok/Cancel buttons -->
<StackPanel Orientation="Horizontal" Grid.Column="2" Grid.Row="3" HorizontalAlignment="Right" >
<StackPanel Orientation="Horizontal" Grid.Column="2" Grid.Row="4" HorizontalAlignment="Right" >
<Button Click="saveButton_Click" x:Name="saveButton" Margin="3" Width="80" Content="{core:Localize Global.OKButtonText}" />
<Button Click="resetButton_Click" x:Name="resetButton" Margin="3" Width="80" Content="{core:Localize Global.CancelButtonText}" />
</StackPanel>

38
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutManagementWindow.xaml.cs

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
@ -8,7 +9,6 @@ using ICSharpCode.Core; @@ -8,7 +9,6 @@ using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop;
using ICSharpCode.ShortcutsManagement.Data;
using ICSharpCode.ShortcutsManagement.Extensions;
namespace ICSharpCode.ShortcutsManagement.Dialogs
{
@ -88,8 +88,8 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -88,8 +88,8 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
foreach (var gesture in shortcutCopy.Gestures) {
var multiKeyGestureTemplate = gesture as MultiKeyGesture;
if (multiKeyGestureTemplate != null) {
if (multiKeyGestureTemplate.Gestures != null && multiKeyGestureTemplate.Gestures.Count > 0) {
templates.Add(multiKeyGestureTemplate.Gestures.FirstOrDefault());
if (multiKeyGestureTemplate.Chords != null && multiKeyGestureTemplate.Chords.Count > 0) {
templates.Add(multiKeyGestureTemplate.Chords.FirstOrDefault());
}
} else {
templates.Add(gesture);
@ -99,7 +99,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -99,7 +99,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
// Find shortcuts with same gesture and hide them.
// Also hide modified shortcut from this list
var finder = new ShortcutsFinder(rootEntriesCopy);
finder.FilterGesture(templates, GestureFilterMode.StartsWith);
finder.FilterGesture(templates, GestureCompareMode.StartsWith);
finder.HideShortcut(shortcutCopy);
shortcutsManagementOptionsPanel.ExpandAll();
@ -149,18 +149,31 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -149,18 +149,31 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
// Check whether last chord is finished
var multiKeyGesture = gestureTextBox.Gesture as MultiKeyGesture;
if (multiKeyGesture != null && multiKeyGesture.Gestures.Last().Key == Key.None) {
if (multiKeyGesture != null && multiKeyGesture.Chords.Last().Key == Key.None) {
DisplayNotification(StringParser.Parse("${res:ShortcutsManagement.ModificationWindow.AdditionFailedLastChordIsIncompete}"), NotificationType.Failed);
return;
}
// Check whether gesture exist in shortcut gestures collection
foreach (var existingGesture in shortcutCopy.Gestures) {
if (gestureTextBox.Gesture.IsTemplateFor(existingGesture, GestureCompareMode.ExactlyMatches)) {
DisplayNotification(StringParser.Parse("${res:ShortcutsManagement.ModificationWindow.AddingExistingGesture}"), NotificationType.Failed);
return;
}
}
// Add gesture
if (partialKeyGesture != null) {
var keyGesture = new KeyGesture(partialKeyGesture.Key, partialKeyGesture.Modifiers);
shortcutCopy.Gestures.Add(keyGesture);
try {
var keyGesture = new KeyGesture(partialKeyGesture.Key, partialKeyGesture.Modifiers);
shortcutCopy.Gestures.Add(keyGesture);
} catch (NotSupportedException) {
shortcutCopy.Gestures.Add(partialKeyGesture);
}
} else {
shortcutCopy.Gestures.Add(gestureTextBox.Gesture);
}
DisplayNotification(StringParser.Parse("${res:ShortcutsManagement.ModificationWindow.AdditionIsSuccessfull}"), NotificationType.Added);
}
@ -177,12 +190,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -177,12 +190,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
var removedShortcutGestures = e.RemovedShortcut.Gestures;
for (int i = removedShortcutGestures.Count - 1; i >= 0; i--) {
foreach (var modifiedInputGesture in shortcutCopy.Gestures) {
var modifiedKeyGesture = modifiedInputGesture as KeyGesture;
var removedKeyGesture = removedShortcutGestures[i] as KeyGesture;
if (modifiedKeyGesture != null
&& removedKeyGesture != null
&& modifiedKeyGesture.Key == removedKeyGesture.Key
&& modifiedKeyGesture.Modifiers == removedKeyGesture.Modifiers) {
if (removedShortcutGestures[i].IsTemplateFor(modifiedInputGesture, GestureCompareMode.StartsWith)) {
removedShortcutGestures.RemoveAt(i);
FilterSimilarShortcuts();

7
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsManagementOptionsPanel.xaml

@ -1,7 +1,10 @@ @@ -1,7 +1,10 @@
<UserControl x:Class="ICSharpCode.ShortcutsManagement.Dialogs.ShortcutsManagementOptionsPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ShortcutsManagement="clr-namespace:ICSharpCode.ShortcutsManagement">
xmlns:Dialogs="clr-namespace:ICSharpCode.ShortcutsManagement.Dialogs">
<ShortcutsManagement:ShortcutsTreeView x:Name="shortcutsManagementOptionsPanel" IsSearchable="True"/>
<Dialogs:ShortcutsTreeView
x:Name="shortcutsManagementOptionsPanel"
IsSearchable="True"
Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=ActualHeight}" />
</UserControl>

10
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsManagementOptionsPanel.xaml.cs

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Controls;
using System.Windows.Input;
@ -8,6 +9,7 @@ using ICSharpCode.SharpDevelop; @@ -8,6 +9,7 @@ using ICSharpCode.SharpDevelop;
using ICSharpCode.ShortcutsManagement.Data;
using AddIn=ICSharpCode.Core.AddIn;
using ShortcutManagement=ICSharpCode.ShortcutsManagement.Data;
using CommandManager = ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.ShortcutsManagement.Dialogs
{
@ -45,7 +47,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -45,7 +47,7 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
rootEntries.Add(unspecifiedAddInSection);
// Go through all input bindings
var inputBindingInfos = CommandsRegistry.FindInputBindingInfos(null, null, null, null, null);
var inputBindingInfos = CommandManager.FindInputBindingInfos(null, null, null, null, null);
foreach(var inputBindingInfo in inputBindingInfos) {
// Find appropriate or create new add-in section for input binding
ShortcutManagement.AddIn addinSection;
@ -163,10 +165,12 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs @@ -163,10 +165,12 @@ namespace ICSharpCode.ShortcutsManagement.Dialogs
} else {
inputBindingInfo.IsModifyed = true;
}
inputBindingInfo.Gestures = new InputGestureCollection(shortcut.Gestures);
}
CommandsRegistry.InvokeInputBindingUpdateHandlers();
CommandManager.SaveGestures(CommandManager.UserGesturesFilePath);
CommandManager.InvokeInputBindingUpdateHandlers();
return true;
}

4
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsTreeView.xaml

@ -1,10 +1,8 @@ @@ -1,10 +1,8 @@
<UserControl x:Class="ICSharpCode.ShortcutsManagement.ShortcutsTreeView"
<UserControl x:Class="ICSharpCode.ShortcutsManagement.Dialogs.ShortcutsTreeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ShortcutsManagement="clr-namespace:ICSharpCode.ShortcutsManagement"
xmlns:Converters="clr-namespace:ICSharpCode.ShortcutsManagement.Converters"
xmlns:Data="clr-namespace:ICSharpCode.ShortcutsManagement.Data"
xmlns:Dialogs="clr-namespace:ICSharpCode.ShortcutsManagement.Dialogs"
xmlns:Extensions="clr-namespace:ICSharpCode.ShortcutsManagement.Extensions"

6
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Dialogs/ShortcutsTreeView.xaml.cs

@ -5,12 +5,10 @@ using System.Windows; @@ -5,12 +5,10 @@ using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop;
using ICSharpCode.ShortcutsManagement.Data;
using ICSharpCode.ShortcutsManagement.Dialogs;
using ICSharpCode.ShortcutsManagement.Extensions;
namespace ICSharpCode.ShortcutsManagement
namespace ICSharpCode.ShortcutsManagement.Dialogs
{
/// <summary>
/// This panel is used in SharpDevelop options window to manage shortcuts
@ -269,7 +267,7 @@ namespace ICSharpCode.ShortcutsManagement @@ -269,7 +267,7 @@ namespace ICSharpCode.ShortcutsManagement
}
if (gestureTextBox.Gesture != null) {
new ShortcutsFinder(RootEntries).FilterGesture(gestureTextBox.Gesture, GestureFilterMode.PartlyMatches);
new ShortcutsFinder(RootEntries).FilterGesture(gestureTextBox.Gesture, GestureCompareMode.PartlyMatches);
SelectFirstVisibleShortcut(false);
} else {
new ShortcutsFinder(RootEntries).Filter("");

89
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Window1.xaml.cs

@ -24,54 +24,55 @@ namespace ICSharpCode.ShortcutsManagement @@ -24,54 +24,55 @@ namespace ICSharpCode.ShortcutsManagement
addin1.Categories.Add(new ShortcutCategory("Editing"));
addin1.Categories[0].Shortcuts.Add(new Shortcut("MultiKey", GetGestures("Ctrl+C, Ctrl+K")));
addin1.Categories[0].Shortcuts.Add(new Shortcut("Copy", GetGestures("Ctrl + C")));
addin1.Categories[0].Shortcuts.Add(new Shortcut("Paste", GetGestures("Ctrl + V | Ctrl+Insert")));
addin1.Categories[0].Shortcuts.Add(new Shortcut("Cut", GetGestures("Ctrl + X")));
addin1.Categories[0].Shortcuts.Add(new Shortcut("Undo", GetGestures("Ctrl + Z")));
addin1.Categories[0].Shortcuts.Add(new Shortcut("Redo", GetGestures("Ctrl + Y")));
addin1.Categories.Add(new ShortcutCategory("Building"));
addin1.Categories[1].Shortcuts.Add(new Shortcut("Build", GetGestures("Ctrl + Shift+B")));
addin1.Categories[1].Shortcuts.Add(new Shortcut("Run", GetGestures("F5")));
addin1.Categories[1].Shortcuts.Add(new Shortcut("Run without debuger", GetGestures("Ctrl + F5")));
addin1.Categories[1].Shortcuts.Add(new Shortcut("Attach debuger", GetGestures("Ctrl + F8")));
addin1.Categories.Add(new ShortcutCategory("Uncategorized"));
addin1.Categories[2].Shortcuts.Add(new Shortcut("Attach debuger", GetGestures("Ctrl + F8")));
addin1.Categories[0].Shortcuts.Add(new Shortcut("Paste", GetGestures("Ctrl + C ; Ctrl+Insert")));
//addin1.Categories[0].Shortcuts.Add(new Shortcut("Cut", GetGestures("Ctrl + X")));
//addin1.Categories[0].Shortcuts.Add(new Shortcut("Undo", GetGestures("Ctrl + Z")));
//addin1.Categories[0].Shortcuts.Add(new Shortcut("Redo", GetGestures("Ctrl + Y")));
//addin1.Categories.Add(new ShortcutCategory("Building"));
//addin1.Categories[1].Shortcuts.Add(new Shortcut("Build", GetGestures("Ctrl + Shift+B")));
//addin1.Categories[1].Shortcuts.Add(new Shortcut("Run", GetGestures("F5")));
//addin1.Categories[1].Shortcuts.Add(new Shortcut("Run without debuger", GetGestures("Ctrl + F5")));
//addin1.Categories[1].Shortcuts.Add(new Shortcut("Attach debuger", GetGestures("Ctrl + F8")));
//addin1.Categories.Add(new ShortcutCategory("Uncategorized"));
//addin1.Categories[2].Shortcuts.Add(new Shortcut("Attach debuger", GetGestures("Ctrl + F8")));
var addin2 = new AddInSection("Search & replace");
rootEntries.Add(addin2);
addin2.Categories.Add(new ShortcutCategory("Uncategorized"));
addin2.Categories[0].Shortcuts.Add(new Shortcut("Quick find", GetGestures("Ctrl + F")));
addin2.Categories[0].Shortcuts.Add(new Shortcut("Quick replace", GetGestures("Ctrl + H")));
addin2.Categories[0].SubCategories.Add(new ShortcutCategory("Subcategory 3"));
addin2.Categories[0].SubCategories[0].SubCategories.Add(new ShortcutCategory("Subcategory 4"));
addin2.Categories[0].SubCategories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut N", GetGestures("Ctrl + N")));
addin2.Categories[0].SubCategories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut O", GetGestures("Ctrl + O")));
addin2.Categories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut L", GetGestures("Ctrl + L")));
addin2.Categories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut M", GetGestures("Ctrl + M")));
addin2.Categories[0].Shortcuts.Add(new Shortcut("Find in files", GetGestures("Ctrl + Shift + F | Ctrl + Shift + H | Ctrl + I")));
addin2.Categories[0].Shortcuts.Add(new Shortcut("Replace in files", GetGestures("Ctrl + Shift + H")));
addin2.Categories[0].Shortcuts.Add(new Shortcut("Find symbol", null));
//var addin2 = new AddInSection("Search & replace");
//rootEntries.Add(addin2);
//addin2.Categories.Add(new ShortcutCategory("Uncategorized"));
//addin2.Categories[0].Shortcuts.Add(new Shortcut("Quick find", GetGestures("Ctrl + F")));
//addin2.Categories[0].Shortcuts.Add(new Shortcut("Quick replace", GetGestures("Ctrl + H")));
//addin2.Categories[0].SubCategories.Add(new ShortcutCategory("Subcategory 3"));
//addin2.Categories[0].SubCategories[0].SubCategories.Add(new ShortcutCategory("Subcategory 4"));
//addin2.Categories[0].SubCategories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut N", GetGestures("Ctrl + N")));
//addin2.Categories[0].SubCategories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut O", GetGestures("Ctrl + O")));
//addin2.Categories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut L", GetGestures("Ctrl + L")));
//addin2.Categories[0].SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut M", GetGestures("Ctrl + M")));
//addin2.Categories[0].Shortcuts.Add(new Shortcut("Find in files", GetGestures("Ctrl + Shift + F | Ctrl + Shift + H | Ctrl + I")));
//addin2.Categories[0].Shortcuts.Add(new Shortcut("Replace in files", GetGestures("Ctrl + Shift + H")));
//addin2.Categories[0].Shortcuts.Add(new Shortcut("Find symbol", null));
var addin3 = new AddInSection("Unspecified");
rootEntries.Add(addin3);
addin3.Categories.Add(new ShortcutCategory("Uncategorized"));
addin3.Categories[0].Shortcuts.Add(new Shortcut("Test regex expression", null));
//var addin3 = new AddInSection("Unspecified");
//rootEntries.Add(addin3);
//addin3.Categories.Add(new ShortcutCategory("Uncategorized"));
//addin3.Categories[0].Shortcuts.Add(new Shortcut("Test regex expression", null));
var rootCategory = new ShortcutCategory("Without addin");
rootEntries.Add(rootCategory);
rootCategory.SubCategories.Add(new ShortcutCategory("Subcategory 1"));
rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut H", GetGestures("Ctrl + H")));
rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut I", GetGestures("Ctrl + I")));
rootCategory.SubCategories.Add(new ShortcutCategory("Subcategory 2"));
rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut J", GetGestures("Ctrl + J")));
rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut K", GetGestures("Ctrl + K")));
rootCategory.Shortcuts.Add(new Shortcut("Shortcut A", GetGestures("Ctrl + A")));
rootCategory.Shortcuts.Add(new Shortcut("Shortcut B", GetGestures("Ctrl + B")));
rootCategory.Shortcuts.Add(new Shortcut("Shortcut C", GetGestures("Ctrl + C")));
rootCategory.Shortcuts.Add(new Shortcut("Shortcut D", GetGestures("Ctrl + D")));
rootCategory.Shortcuts.Add(new Shortcut("Shortcut E", null));
//var rootCategory = new ShortcutCategory("Without addin");
//rootEntries.Add(rootCategory);
//rootCategory.SubCategories.Add(new ShortcutCategory("Subcategory 1"));
//rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut H", GetGestures("Ctrl + H")));
//rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut I", GetGestures("Ctrl + I")));
//rootCategory.SubCategories.Add(new ShortcutCategory("Subcategory 2"));
//rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut J", GetGestures("Ctrl + J")));
//rootCategory.SubCategories[0].Shortcuts.Add(new Shortcut("Shortcut K", GetGestures("Ctrl + K")));
//rootCategory.Shortcuts.Add(new Shortcut("Shortcut A", GetGestures("Ctrl + A")));
//rootCategory.Shortcuts.Add(new Shortcut("Shortcut B", GetGestures("Ctrl + B")));
//rootCategory.Shortcuts.Add(new Shortcut("Shortcut C", GetGestures("Ctrl + C")));
//rootCategory.Shortcuts.Add(new Shortcut("Shortcut D", GetGestures("Ctrl + D")));
//rootCategory.Shortcuts.Add(new Shortcut("Shortcut E", null));
rootEntries.Add(new Shortcut("Shortcut F", GetGestures("Ctrl + F")));
rootEntries.Add(new Shortcut("Shortcut G", GetGestures("Ctrl + G")));
//rootEntries.Add(new Shortcut("Shortcut F", GetGestures("Ctrl + F")));
//rootEntries.Add(new Shortcut("Shortcut G", GetGestures("Ctrl + G")));
optionsPanel.DataContext = rootEntries;
}

53
src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs

@ -22,6 +22,8 @@ using ICSharpCode.SharpDevelop.Internal.ExternalTool; @@ -22,6 +22,8 @@ using ICSharpCode.SharpDevelop.Internal.ExternalTool;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Util;
using CommandManager=ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.SharpDevelop.Commands
{
public class NavigationHistoryMenuBuilder : IMenuItemBuilder
@ -478,40 +480,39 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -478,40 +480,39 @@ namespace ICSharpCode.SharpDevelop.Commands
var addIn = AddInTree.AddIns.FirstOrDefault(a => a.Name == "SharpDevelop");
// Dynamicaly create routed UI command to loaded pad and bindings for it
CommandsRegistry.RegisterRoutedUICommand(routedCommandName, routedCommandText);
CommandsRegistry.LoadCommand(routedCommandName, new BringPadToFrontCommand(padContent));
CommandManager.RegisterRoutedUICommand(routedCommandName, routedCommandText);
CommandManager.LoadCommand(routedCommandName, new BringPadToFrontCommand(padContent));
var commandBindingInfo = new CommandBindingInfo();
commandBindingInfo.ClassName = routedCommandName;
commandBindingInfo.OwnerType = typeof(WpfWorkbench);
commandBindingInfo.CommandTypeName = routedCommandName;
commandBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
commandBindingInfo.RoutedCommandName = routedCommandName;
commandBindingInfo.AddIn = addIn;
CommandsRegistry.RegisterCommandBinding(commandBindingInfo);
commandBindingInfo.Name = "ViewMenuCommandBinding_" + routedCommandName + "_" + routedCommandName + "_" + addIn.Name + "_" + CommandManager.DefaultContextName;
CommandManager.RegisterCommandBinding(commandBindingInfo);
// If pad have shortcut specified add input binding
if (!string.IsNullOrEmpty(padContent.Shortcut)) {
CommandsRegistry.RegisterClassInputBindingsUpdateHandler(CommandsRegistry.DefaultContextName, delegate {
var updatedGestures = CommandsRegistry.FindInputGestures(CommandsRegistry.DefaultContextName, null, null, null, routedCommandName);
item.InputGestureText = (string)new InputGestureCollectionConverter().ConvertToInvariantString(updatedGestures);
});
var gestures = (InputGestureCollection)new InputGestureCollectionConverter().ConvertFromString(padContent.Shortcut);
var inputBindingInfo = new InputBindingInfo();
inputBindingInfo.OwnerTypeName = CommandsRegistry.DefaultContextName;
inputBindingInfo.RoutedCommandName = routedCommandName;
inputBindingInfo.Gestures = gestures;
inputBindingInfo.Categories.AddRange(CommandsRegistry.RegisterInputBindingCategories("Menu Items/Views"));
inputBindingInfo.AddIn = addIn;
CommandsRegistry.RegisterInputBinding(inputBindingInfo);
}
var gestures = (InputGestureCollection)new InputGestureCollectionConverter().ConvertFromString(padContent.Shortcut);
var inputBindingInfo = new InputBindingInfo();
inputBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
inputBindingInfo.RoutedCommandName = routedCommandName;
inputBindingInfo.Gestures = gestures;
inputBindingInfo.Categories.AddRange(CommandManager.RegisterInputBindingCategories("Menu Items/Views"));
inputBindingInfo.AddIn = addIn;
inputBindingInfo.Name = "ViewMenuInputBinding_" + routedCommandName + "_" + routedCommandName + "_" + addIn.Name + "_" + CommandManager.DefaultContextName;
CommandManager.RegisterInputBinding(inputBindingInfo);
bindingsAssigned.Add(routedCommandName);
}
item.Command = CommandsRegistry.GetRoutedUICommand(routedCommandName);
}
item.Command = CommandManager.GetRoutedUICommand(routedCommandName);
var updatedGestures = CommandManager.FindInputGestures(CommandManager.DefaultContextName, null, null, null, routedCommandName);
var updatedGesturesText = (string)new InputGestureCollectionConverter().ConvertToInvariantString(updatedGestures);
item.InputGestureText = updatedGesturesText;
// item.Command = new BringPadToFrontCommand(padContent);
// if (!string.IsNullOrEmpty(padContent.Shortcut)) {

2
src/Main/Base/Project/Src/Commands/NavigationCommands.cs

@ -55,7 +55,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -55,7 +55,7 @@ namespace ICSharpCode.SharpDevelop.Commands
public void UpdateEnabledState()
{
CommandManager.InvalidateRequerySuggested();
System.Windows.Input.CommandManager.InvalidateRequerySuggested();
//splitButton.IsEnabled = NavigationService.CanNavigateBack;
//splitButton.IsDropDownEnabled = NavigationService.Count>1;
}

3
src/Main/Base/Project/Src/Commands/ToolsCommands.cs

@ -11,6 +11,7 @@ using ICSharpCode.Core; @@ -11,6 +11,7 @@ using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Gui;
using System.Windows.Input;
using CommandManager=ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.SharpDevelop.Commands
{
@ -24,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -24,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Commands
public void Execute(object parameter)
{
CommandsRegistry.GetRoutedUICommand("SDBuildCommands.BuildSolution").Execute(parameter, WorkbenchSingleton.MainWindow);
CommandManager.GetRoutedUICommand("SDBuildCommands.BuildSolution").Execute(parameter, WorkbenchSingleton.MainWindow);
System.Windows.MessageBox.Show("test");
}

48
src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml

@ -36,31 +36,31 @@ @@ -36,31 +36,31 @@
</TreeView.ItemTemplate>
</TreeView>
<GridSplitter Width="2" />
<ScrollViewer Name="optionPanelScrollViewer"
Grid.Column="1"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<DockPanel>
<TextBlock
DockPanel.Dock="Top"
Name="optionPanelTitle"
FontFamily="Tahoma" FontSize="14pt" FontWeight="Bold"
Padding="8"
>
<TextBlock.Background>
<LinearGradientBrush StartPoint="0, 0" EndPoint="0, 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.0"
Color="{DynamicResource {x:Static SystemColors.WindowColorKey}}" />
<GradientStop Offset="1.0"
Color="{DynamicResource {x:Static SystemColors.ControlColorKey}}" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</TextBlock.Background>
</TextBlock>
<DockPanel Grid.Column="1">
<TextBlock
DockPanel.Dock="Top"
Name="optionPanelTitle"
FontFamily="Tahoma" FontSize="14pt" FontWeight="Bold"
Padding="8"
>
<TextBlock.Background>
<LinearGradientBrush StartPoint="0, 0" EndPoint="0, 1">
<LinearGradientBrush.GradientStops>
<GradientStop Offset="0.0"
Color="{DynamicResource {x:Static SystemColors.WindowColorKey}}" />
<GradientStop Offset="1.0"
Color="{DynamicResource {x:Static SystemColors.ControlColorKey}}" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</TextBlock.Background>
</TextBlock>
<ScrollViewer Name="optionPanelScrollViewer"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<ContentControl Name="optionPanelContent" />
</DockPanel>
</ScrollViewer>
</ScrollViewer>
</DockPanel>
</Grid>
<Button
Content="{core:Localize Global.OKButtonText}"

3
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs

@ -13,6 +13,7 @@ using System.Windows.Threading; @@ -13,6 +13,7 @@ using System.Windows.Threading;
using System.Windows.Input;
using AvalonDock;
using ICSharpCode.Core;
using CommandManager=ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.SharpDevelop.Gui
{
@ -88,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -88,7 +89,7 @@ namespace ICSharpCode.SharpDevelop.Gui
placeholder = null;
var contextName = padInstance.GetType().FullName;
CommandsRegistry.RegisterNamedUIElementInstance(contextName, (UIElement)Content);
CommandManager.RegisterNamedUIElementInstance(contextName, (UIElement)Content);
}
}
}

9
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs

@ -19,6 +19,7 @@ using System.Windows.Media.Imaging; @@ -19,6 +19,7 @@ using System.Windows.Media.Imaging;
using AvalonDock;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using CommandManager=ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.SharpDevelop.Gui
{
@ -90,11 +91,11 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -90,11 +91,11 @@ namespace ICSharpCode.SharpDevelop.Gui
ActiveViewContentChanged(this, EventArgs.Empty);
}
oldActiveViewContent = newActiveViewContent;
CommandManager.InvalidateRequerySuggested();
System.Windows.Input.CommandManager.InvalidateRequerySuggested();
if (newActiveViewContent != null) {
string ownerName = newActiveViewContent.GetType().FullName;
CommandsRegistry.RegisterNamedUIElementInstance(ownerName, (UIElement)Content);
CommandManager.RegisterNamedUIElementInstance(ownerName, (UIElement)Content);
}
}
@ -276,7 +277,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -276,7 +277,7 @@ namespace ICSharpCode.SharpDevelop.Gui
void OnIsDirtyChanged(object sender, EventArgs e)
{
UpdateTitle();
CommandManager.InvalidateRequerySuggested();
System.Windows.Input.CommandManager.InvalidateRequerySuggested();
}
void UpdateTitle()
@ -379,7 +380,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -379,7 +380,7 @@ namespace ICSharpCode.SharpDevelop.Gui
{
base.OnClosed();
Dispose();
CommandManager.InvalidateRequerySuggested();
System.Windows.Input.CommandManager.InvalidateRequerySuggested();
}
public void RedrawContent()

7
src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs

@ -20,6 +20,7 @@ using System.Windows.Navigation; @@ -20,6 +20,7 @@ using System.Windows.Navigation;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using CommandManager=ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.SharpDevelop.Gui
{
@ -80,7 +81,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -80,7 +81,7 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
CommandsRegistry.DefaultContextName = this.GetType().AssemblyQualifiedName;
CommandManager.DefaultContextName = this.GetType().AssemblyQualifiedName;
CommandsService.RegisterBuiltInRoutedUICommands();
@ -90,7 +91,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -90,7 +91,7 @@ namespace ICSharpCode.SharpDevelop.Gui
CommandsService.RegisterInputBindings(this, "/SharpDevelop/Workbench/InputBindings");
// Register context and load all commands from addin
CommandsRegistry.LoadAddinCommands(AddInTree.AddIns.FirstOrDefault(a => a.Name == "SharpDevelop"));
CommandManager.LoadAddinCommands(AddInTree.AddIns.FirstOrDefault(a => a.Name == "SharpDevelop"));
//CommandsRegistry.RegisterCommandBindingsUpdateHandler(CommandsRegistry.DefaultContextName, null, delegate {
// var newBindings = CommandsRegistry.FindCommandBindings(CommandsRegistry.DefaultContextName, null, null, null);
@ -119,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -119,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Gui
AddHandler(Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler(OnRequestNavigate));
requerySuggestedEventHandler = new EventHandler(CommandManager_RequerySuggested);
CommandManager.RequerySuggested += requerySuggestedEventHandler;
System.Windows.Input.CommandManager.RequerySuggested += requerySuggestedEventHandler;
StatusBarService.SetMessage("${res:MainWindow.StatusBar.ReadyMessage}");
}

5
src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/Command/CommandBindingDescriptor.cs

@ -14,6 +14,10 @@ namespace ICSharpCode.Core @@ -14,6 +14,10 @@ namespace ICSharpCode.Core
get; private set;
}
public string Name {
get; private set;
}
/// <summary>
/// Full name of the command class which will be executed when this
/// binding is triggered
@ -89,6 +93,7 @@ namespace ICSharpCode.Core @@ -89,6 +93,7 @@ namespace ICSharpCode.Core
OwnerTypeName = Codon.Properties["owner-type"];
Gestures = Codon.Properties["gestures"];
Category = Codon.Properties["category"];
Name = Codon.Properties["name"];
}
}
}

5
src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/Command/InputBindingDescriptor.cs

@ -20,6 +20,10 @@ namespace ICSharpCode.Core @@ -20,6 +20,10 @@ namespace ICSharpCode.Core
public string Command {
get; private set;
}
public string Name {
get; private set;
}
/// <summary>
/// Override routed command text (string visible to user) if specified
@ -63,6 +67,7 @@ namespace ICSharpCode.Core @@ -63,6 +67,7 @@ namespace ICSharpCode.Core
OwnerTypeName = codon.Properties["owner-type"];
Gestures = codon.Properties["gestures"];
Category = codon.Properties["category"];
Name = codon.Properties["name"];
}
}
}

279
src/Main/ICSharpCode.Core.Presentation/CommandsService/CommandBindingInfo.cs

@ -1,14 +1,18 @@ @@ -1,14 +1,18 @@
using System;
using System.Windows;
using System.Windows.Input;
using CommandManager=ICSharpCode.Core.Presentation.CommandManager;
namespace ICSharpCode.Core.Presentation
{
/// <summary>
/// Stores details about command binding
/// Stores details about <see cref="CommandBinding" />
/// </summary>
public class CommandBindingInfo
{
/// <summary>
/// Creates new instance of <see cref="CommandBindingInfo" />
/// </summary>
public CommandBindingInfo()
{
IsModifyed = true;
@ -17,141 +21,245 @@ namespace ICSharpCode.Core.Presentation @@ -17,141 +21,245 @@ namespace ICSharpCode.Core.Presentation
}
/// <summary>
/// Routed command name
/// Command binding info name
///
/// Described binding is triggered by this routed command
/// The name should be unique to register a command binding
/// </summary>
public string Name
{
get; set;
}
/// <summary>
/// Name of the routed command which will be invoked when this binding is triggered
/// </summary>
/// <seealso cref="RoutedCommand"></seealso>
public string RoutedCommandName {
get; set;
}
/// <summary>
/// Routed command instance
///
/// Described binding is triggered by this routed command
/// Routed command instance which will be invoked when this binding is triggered
/// </summary>
/// <seealso cref="RoutedCommandName"></seealso>
public RoutedUICommand RoutedCommand {
get {
return CommandsRegistry.GetRoutedUICommand(RoutedCommandName);
return CommandManager.GetRoutedUICommand(RoutedCommandName);
}
}
/// <summary>
/// Add-in to which binded command belongs
/// Add-in to which binding belongs
/// </summary>
public AddIn AddIn {
get; set;
}
private string commandTypeName;
/// <summary>
/// Binded command class full name
/// Binded command type full name
///
/// Instance of this class is created as soon as user executes the command. See
/// <see cref="IsLazy" /> for details
///
/// If this attribute is provided <see cref="CommandInstance" />, <see cref="ExecutedEventHandler" />
/// and <see cref="CanExecuteEventHandler" /> can not be used
/// </summary>
public string ClassName {
get; set;
public string CommandTypeName {
get {
return commandTypeName;
}
set {
if(commandInstance != null || commandTypeName != null || canExecuteEventHandler != null || executedEventHandler != null) {
throw new ArgumentException("Executed or CanExecute command handlers are already specified");
}
commandTypeName = value;
}
}
private System.Windows.Input.ICommand classInstance;
private System.Windows.Input.ICommand commandInstance;
/// <summary>
/// Binded command instance
///
/// Reference to the command which is invoke when the binding is triggered. If this value is equal
/// to null then add-in is not loaded yet, see <see cref="IsLazy" /> attribute
/// for details
/// If this attribute is provided <see cref="CommandInstanceName" />, <see cref="ExecutedEventHandler" />
/// and <see cref="CanExecuteEventHandler" /> can not be used
/// </summary>
public System.Windows.Input.ICommand Class {
set {
classInstance = value;
}
public System.Windows.Input.ICommand CommandInstance {
get {
if(classInstance != null) {
return classInstance;
if(commandInstance != null) {
return commandInstance;
}
if(ExecutedEventHandler != null || CanExecutedEventHandler != null) {
if(ExecutedEventHandler != null || CanExecuteEventHandler != null) {
return null;
}
if(AddIn != null && (AddIn.DependenciesLoaded || IsLazy)) {
CommandsRegistry.LoadAddinCommands(AddIn);
CommandManager.LoadAddinCommands(AddIn);
}
System.Windows.Input.ICommand command;
CommandsRegistry.commands.TryGetValue(ClassName, out command);
classInstance = command;
CommandManager.commands.TryGetValue(CommandTypeName, out command);
commandInstance = command;
return command;
}
set {
if(commandInstance != null || commandTypeName != null || canExecuteEventHandler != null || executedEventHandler != null) {
throw new ArgumentException("Executed or CanExecute command handlers are already specified");
}
commandInstance = value;
}
}
private ExecutedRoutedEventHandler executedEventHandler;
/// <summary>
/// Occurs when invoking "Executed" event
///
/// If this attribute is provided <see cref="CommandInstanceName" /> and <see cref="CommandInstance" />
/// can not be used
/// </summary>
public ExecutedRoutedEventHandler ExecutedEventHandler
{
get {
return executedEventHandler;
}
set {
if(commandInstance != null || commandTypeName != null) {
throw new ArgumentException("Command class is already provided");
}
executedEventHandler = value;
}
}
private CanExecuteRoutedEventHandler canExecuteEventHandler;
/// <summary>
/// Store name of object owning this binding (can only be used with named objects)
/// Occurs when determining whether "Executed" event can be invoked
///
/// Named objects can be registered throgut <see cref="CommandsRegistry.RegisterNamedUIElementInstance" />
/// If this attribute is provided <see cref="CommandInstanceName" /> and <see cref="CommandInstance" />
/// can not be used
/// </summary>
public string OwnerInstanceName{
get; set;
public CanExecuteRoutedEventHandler CanExecuteEventHandler
{
get {
return canExecuteEventHandler;
}
set {
if(commandInstance != null || commandTypeName != null) {
throw new ArgumentException("Command class is already provided");
}
canExecuteEventHandler = value;
}
}
public string ownerInstanceName;
/// <summary>
/// Stores name of named instance to which this binding belongs. When this binding is registered a
/// <see cref="CommandBinding" /> is assigned to owner instance
///
/// If this attribute is used <see cref="OwnerInstance" />, <see cref="OwnerType" /> and
/// <see cref="OwnerTypeName" /> can not be set
/// </summary>
public string OwnerInstanceName {
get {
return ownerInstanceName;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerInstanceName = value;
}
}
private UIElement ownerInstance;
/// <summary>
/// Stores instance of object which is owning this binding
/// Stores owner instance to which this binding belongs. When this binding is registered a
/// <see cref="CommandBinding" /> is assigned to owner instance
///
/// If this attribute is used <see cref="OwnerInstanceName" />, <see cref="OwnerType" /> and
/// <see cref="OwnerTypeName" /> can not be set
/// </summary>
public UIElement OwnerInstance{
get {
if(OwnerInstanceName != null && ownerInstance == null) {
ownerInstance = CommandsRegistry.GetNamedUIElementInstance(OwnerInstanceName);
ownerInstance = CommandManager.GetNamedUIElementInstance(OwnerInstanceName);
}
return ownerInstance;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerInstance = value;
}
}
private string ownerTypeName;
/// <summary>
/// Assembly qualified name of the class owning this instance
/// Stores name of owner type. Full name with assembly should be used. When this binding is
/// registered <see cref="CommandBinding" /> is assigned to all instances of provided class
///
/// Named type can be registered throgut <see cref="CommandsRegistry.RegisterNamedUIType" />
/// If this attribute is used <see cref="OwnerInstance" />, <see cref="OwnerInstanceName" /> and
/// <see cref="OwnerType" /> can not be set
/// </summary>
public string OwnerTypeName{
get; set;
get {
return ownerTypeName;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerTypeName = value;
}
}
private Type ownerType;
/// <summary>
/// Stores type owning this binding
/// Stores owner type. When this binding is registered <see cref="CommandBinding" />
/// is assigned to all instances of provided class
///
/// If this attribute is used <see cref="OwnerInstance" />, <see cref="OwnerInstanceName" /> and
/// <see cref="OwnerTypeName" /> can not be set
/// </summary>
public Type OwnerType {
set {
ownerType = value;
}
get {
if(ownerType == null && OwnerTypeName != null) {
ownerType = Type.GetType(OwnerTypeName);
CommandsRegistry.RegisterNamedUIType(OwnerTypeName, ownerType);
CommandManager.RegisterNamedUIType(OwnerTypeName, ownerType);
}
return ownerType;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerType = value;
}
}
/// <summary>
/// Default binding update handler update owner or type bindings (depending on input binding info type)
/// so they would always contain latest version
/// </summary>
private BindingsUpdatedHandler defaultCommandBindingHandler;
/// <summary>
/// Default command binding handler. Updates command binding if binding info changes
/// Updates owner bindings
/// </summary>
internal BindingsUpdatedHandler DefaultCommandBindingHandler
{
@ -162,11 +270,11 @@ namespace ICSharpCode.Core.Presentation @@ -162,11 +270,11 @@ namespace ICSharpCode.Core.Presentation
GenerateCommandBindings();
foreach(CommandBinding binding in OldCommandBindings) {
CommandsRegistry.RemoveClassCommandBinding(OwnerType, binding);
CommandManager.RemoveClassCommandBinding(OwnerType, binding);
}
foreach(CommandBinding binding in NewCommandBindings) {
CommandManager.RegisterClassCommandBinding(OwnerType, binding);
System.Windows.Input.CommandManager.RegisterClassCommandBinding(OwnerType, binding);
}
IsModifyed = false;
@ -204,74 +312,87 @@ namespace ICSharpCode.Core.Presentation @@ -204,74 +312,87 @@ namespace ICSharpCode.Core.Presentation
get; set;
}
public ExecutedRoutedEventHandler ExecutedEventHandler
{
get; set;
}
public CanExecuteRoutedEventHandler CanExecutedEventHandler
{
get; set;
}
/// <summary>
/// Indicates that generated command bindings are modified from last access
/// Indicates whether <see cref="CommandBindingInfo" /> was modified. When modified
/// <see cref="CommandBinding" />s are re-generated
/// </summary>
public bool IsModifyed {
get; set;
}
public void GenerateCommandBindings()
/// <summary>
/// Re-generate <see cref="CommandBinding" /> from <see cref="CommandBindingInfo" />
/// </summary>
internal void GenerateCommandBindings()
{
OldCommandBindings = NewCommandBindings;
var commandBinding = new ManagedCommandBinding(RoutedCommand);
commandBinding.CanExecute += GeneratedCanExecuteEventHandler;
commandBinding.Executed += GeneratedExecutedEventHandler;
var commandBinding = new CommandBinding(RoutedCommand);
commandBinding.CanExecute += GenerateCanExecuteEventHandler;
commandBinding.Executed += GenerateExecutedEventHandler;
NewCommandBindings = new CommandBindingCollection();
NewCommandBindings.Add(commandBinding);
}
/// <summary>
/// Old command bindings which where assigned to owner when before <see cref="CommandBindingInfo" />
/// was modified.
///
/// When new <see cref="CommandBinding" />s are generated these bindings are removed from the owner
/// </summary>
internal CommandBindingCollection OldCommandBindings
{
get; set;
}
/// <summary>
/// New input bindings are assigned to owner when <see cref="CommandBindingInfo" /> is modified
/// </summary>
internal CommandBindingCollection NewCommandBindings
{
get; set;
}
internal void GeneratedExecutedEventHandler(object sender, ExecutedRoutedEventArgs e) {
/// <summary>
/// Forwards "executed" event to event handler provided to user
/// </summary>
/// <param name="sender">Event sender</param>
/// <param name="e">Event arguments</param>
internal void GenerateExecutedEventHandler(object sender, ExecutedRoutedEventArgs e) {
if(ExecutedEventHandler != null) {
ExecutedEventHandler.Invoke(sender, e);
} else {
if(IsLazy && Class == null) {
if(IsLazy && CommandInstance == null) {
AddIn.LoadRuntimeAssemblies();
var command = (ICommand)AddIn.CreateObject(ClassName);
CommandsRegistry.LoadCommand(ClassName, command);
var command = (ICommand)AddIn.CreateObject(CommandTypeName);
CommandManager.LoadCommand(CommandTypeName, command);
}
if(Class != null) {
Class.Execute(e.Parameter);
if(CommandInstance != null) {
CommandInstance.Execute(e.Parameter);
}
}
}
internal void GeneratedCanExecuteEventHandler(object sender, CanExecuteRoutedEventArgs e) {
if(CanExecutedEventHandler == null && ExecutedEventHandler != null) {
/// <summary>
/// Forwards "can execute" event to event handler provided to user
/// </summary>
/// <param name="sender">Event sender</param>
/// <param name="e">Event arguments</param>
internal void GenerateCanExecuteEventHandler(object sender, CanExecuteRoutedEventArgs e) {
if(CanExecuteEventHandler == null && ExecutedEventHandler != null) {
e.CanExecute = true;
} else if(CanExecutedEventHandler != null) {
CanExecutedEventHandler.Invoke(sender, e);
} else if(CanExecuteEventHandler != null) {
CanExecuteEventHandler.Invoke(sender, e);
} else {
if(IsLazy && Class == null) {
if(IsLazy && CommandInstance == null) {
e.CanExecute = true;
} else if(Class == null) {
} else if(CommandInstance == null) {
e.CanExecute = false;
} else {
e.CanExecute = Class.CanExecute(e.Parameter);
e.CanExecute = CommandInstance.CanExecute(e.Parameter);
}
}
}

165
src/Main/ICSharpCode.Core.Presentation/CommandsService/CommandsRegistry.cs → src/Main/ICSharpCode.Core.Presentation/CommandsService/CommandManager.cs

@ -1,14 +1,16 @@ @@ -1,14 +1,16 @@
using System;
using System.Collections.Generic;
using System.Windows.Input;
using System.Windows;
using ICSharpCode.Core;
using System.Threading;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows;
using System.Windows.Input;
using System.Xml.Serialization;
using ICSharpCode.Core;
namespace ICSharpCode.Core.Presentation
{
@ -17,7 +19,7 @@ namespace ICSharpCode.Core.Presentation @@ -17,7 +19,7 @@ namespace ICSharpCode.Core.Presentation
/// <summary>
/// Global registry to store and access commands, command bindings and input bindings
/// </summary>
public static class CommandsRegistry
public static class CommandManager
{
/// <summary>
/// This element is used to represent null key in dictionary
@ -33,9 +35,19 @@ namespace ICSharpCode.Core.Presentation @@ -33,9 +35,19 @@ namespace ICSharpCode.Core.Presentation
get; set;
}
/// <summary>
/// Path to file where current user defined gestures are set
/// </summary>
public static string UserGesturesFilePath
{
get {
return Path.Combine(PropertyService.ConfigDirectory, "UserDefinedGestures.xml");
}
}
// Binding infos
private static List<CommandBindingInfo> commandBindings = new List<CommandBindingInfo>();
private static List<InputBindingInfo> inputBidnings = new List<InputBindingInfo>();
private static Dictionary<string, CommandBindingInfo> commandBindings = new Dictionary<string, CommandBindingInfo>();
private static Dictionary<string, InputBindingInfo> inputBidnings = new Dictionary<string, InputBindingInfo>();
// Commands
private static Dictionary<string, RoutedUICommand> routedCommands = new Dictionary<string, RoutedUICommand>();
@ -54,6 +66,11 @@ namespace ICSharpCode.Core.Presentation @@ -54,6 +66,11 @@ namespace ICSharpCode.Core.Presentation
// Categories
private static List<InputBindingCategory> categories = new List<InputBindingCategory>();
static CommandManager()
{
UserDefinedGesturesManager.Load(UserGesturesFilePath);
}
/// <summary>
/// Register UI element instance accessible by unique name
/// </summary>
@ -169,7 +186,7 @@ namespace ICSharpCode.Core.Presentation @@ -169,7 +186,7 @@ namespace ICSharpCode.Core.Presentation
/// <param name="routedCommandName">Routed command name</param>
/// <param name="text">Short text describing command functionality</param>
public static RoutedUICommand RegisterRoutedUICommand(string routedCommandName, string text) {
var routedCommand = new RoutedUICommand(text, routedCommandName, typeof(CommandsRegistry));
var routedCommand = new RoutedUICommand(text, routedCommandName, typeof(CommandManager));
if(!routedCommands.ContainsKey(routedCommandName)) {
routedCommands.Add(routedCommandName, routedCommand);
@ -215,7 +232,19 @@ namespace ICSharpCode.Core.Presentation @@ -215,7 +232,19 @@ namespace ICSharpCode.Core.Presentation
/// <param name="inputBindingInfo">Input binding parameters</param>
public static void RegisterInputBinding(InputBindingInfo inputBindingInfo)
{
inputBidnings.Add(inputBindingInfo);
if(string.IsNullOrEmpty(inputBindingInfo.Name)) {
throw new ArgumentException("InputBindingInfo instance should have a name assigned");
}
if(inputBidnings.ContainsKey(inputBindingInfo.Name)) {
throw new ArgumentException("InputBindingInfo instance with provided name is already registered");
}
// Replace default gestures with user defined gestures
var userGestures = UserDefinedGesturesManager.GetInputBindingGesture(inputBindingInfo.Name);
if(userGestures != null) {
inputBindingInfo.Gestures = userGestures;
}
if(inputBindingInfo.OwnerTypeName != null || inputBindingInfo.OwnerType != null) {
RegisterClassDefaultInputBindingHandler(inputBindingInfo);
@ -224,6 +253,7 @@ namespace ICSharpCode.Core.Presentation @@ -224,6 +253,7 @@ namespace ICSharpCode.Core.Presentation
} else {
throw new ArgumentException("Binding owner must be specified");
}
inputBidnings.Add(inputBindingInfo.Name, inputBindingInfo);
}
/// <summary>
@ -232,9 +262,22 @@ namespace ICSharpCode.Core.Presentation @@ -232,9 +262,22 @@ namespace ICSharpCode.Core.Presentation
/// <param name="inputBindingInfo">Input binding parameters</param>
public static void UnregisterInputBinding(InputBindingInfo inputBindingInfo)
{
inputBidnings.Remove(inputBindingInfo);
inputBidnings.Remove(inputBindingInfo.Name);
}
/// <summary>
/// Get instance of <see cref="InputBindingInfo" /> by name
/// </summary>
/// <param name="inputBindingName">Input binding info name</param>
/// <returns>Input binding info matching provided name</returns>
public static InputBindingInfo GetInputBindingInfo(string inputBindingName) {
InputBindingInfo bindingInfo;
inputBidnings.TryGetValue(inputBindingName, out bindingInfo);
return bindingInfo;
}
/// <summary>
/// Find input input binding infos which satisfy provided arguments
///
@ -247,13 +290,13 @@ namespace ICSharpCode.Core.Presentation @@ -247,13 +290,13 @@ namespace ICSharpCode.Core.Presentation
var foundBindings = new List<InputBindingInfo>();
foreach(var binding in inputBidnings) {
if( (ownerInstanceName == null || binding.OwnerInstanceName == ownerInstanceName)
&& (ownerInstance == null || binding.OwnerInstance == ownerInstance)
&& (ownerTypeName == null || binding.OwnerTypeName == ownerTypeName)
&& (ownerType == null || binding.OwnerType == ownerType)
&& (routedCommandName == null || binding.RoutedCommandName == routedCommandName)) {
if( (ownerInstanceName == null || binding.Value.OwnerInstanceName == ownerInstanceName)
&& (ownerInstance == null || binding.Value.OwnerInstance == ownerInstance)
&& (ownerTypeName == null || binding.Value.OwnerTypeName == ownerTypeName)
&& (ownerType == null || binding.Value.OwnerType == ownerType)
&& (routedCommandName == null || binding.Value.RoutedCommandName == routedCommandName)) {
foundBindings.Add(binding);
foundBindings.Add(binding.Value);
}
}
@ -267,7 +310,7 @@ namespace ICSharpCode.Core.Presentation @@ -267,7 +310,7 @@ namespace ICSharpCode.Core.Presentation
/// <param name="inputBinding">Input binding</param>
public static void RemoveClassInputBinding(Type ownerType, InputBinding inputBinding)
{
var fieldInfo = typeof(CommandManager).GetField("_classInputBindings", BindingFlags.Static | BindingFlags.NonPublic);
var fieldInfo = typeof(System.Windows.Input.CommandManager).GetField("_classInputBindings", BindingFlags.Static | BindingFlags.NonPublic);
var fieldData = (HybridDictionary)fieldInfo.GetValue(null);
var classInputBindings = (InputBindingCollection)fieldData[ownerType];
@ -283,7 +326,7 @@ namespace ICSharpCode.Core.Presentation @@ -283,7 +326,7 @@ namespace ICSharpCode.Core.Presentation
/// <param name="commandBinding"></param>
public static void RemoveClassCommandBinding(Type ownerType, CommandBinding commandBinding)
{
var fieldInfo = typeof(CommandManager).GetField("_classCommandBindings", BindingFlags.Static | BindingFlags.NonPublic);
var fieldInfo = typeof(System.Windows.Input.CommandManager).GetField("_classCommandBindings", BindingFlags.Static | BindingFlags.NonPublic);
var fieldData = (HybridDictionary)fieldInfo.GetValue(null);
var classCommandBindings = (CommandBindingCollection)fieldData[ownerType];
@ -297,7 +340,14 @@ namespace ICSharpCode.Core.Presentation @@ -297,7 +340,14 @@ namespace ICSharpCode.Core.Presentation
/// </summary>
/// <param name="commandBindingInfo">Command binding parameters</param>
public static void RegisterCommandBinding(CommandBindingInfo commandBindingInfo) {
commandBindings.Add(commandBindingInfo);
if(string.IsNullOrEmpty(commandBindingInfo.Name)) {
throw new ArgumentException("cCommandBindingInfo instance should have a name assigned");
}
if(commandBindings.ContainsKey(commandBindingInfo.Name)) {
throw new ArgumentException("CommandBindingInfo instance with provided name is already registered");
}
commandBindingInfo.GenerateCommandBindings();
if(commandBindingInfo.OwnerTypeName != null || commandBindingInfo.OwnerType != null) {
@ -307,6 +357,8 @@ namespace ICSharpCode.Core.Presentation @@ -307,6 +357,8 @@ namespace ICSharpCode.Core.Presentation
} else {
throw new ArgumentException("Binding owner must be specified");
}
commandBindings.Add(commandBindingInfo.Name, commandBindingInfo);
}
/// <summary>
@ -314,7 +366,7 @@ namespace ICSharpCode.Core.Presentation @@ -314,7 +366,7 @@ namespace ICSharpCode.Core.Presentation
/// </summary>
/// <param name="commandBindingInfo">Command binding parameters</param>
public static void UnregisterCommandBinding(CommandBindingInfo commandBindingInfo) {
commandBindings.Remove(commandBindingInfo);
commandBindings.Remove(commandBindingInfo.Name);
// Remove command bindings
if(commandBindingInfo.OwnerType != null) {
@ -607,16 +659,16 @@ namespace ICSharpCode.Core.Presentation @@ -607,16 +659,16 @@ namespace ICSharpCode.Core.Presentation
/// <param name="addIn">Add-in</param>
public static void LoadAddinCommands(AddIn addIn) {
foreach(var binding in commandBindings) {
if(binding.AddIn != addIn) continue;
if(binding.Value.AddIn != addIn) continue;
if(binding.ClassName != null && !commands.ContainsKey(binding.ClassName)){
var command = addIn.CreateObject(binding.ClassName);
if(binding.Value.CommandTypeName != null && !commands.ContainsKey(binding.Value.CommandTypeName)){
var command = addIn.CreateObject(binding.Value.CommandTypeName);
var wpfCommand = command as System.Windows.Input.ICommand;
if(wpfCommand == null) {
wpfCommand = new WpfCommandWrapper((ICSharpCode.Core.ICommand)command);
}
commands.Add(binding.ClassName, wpfCommand);
commands.Add(binding.Value.CommandTypeName, wpfCommand);
}
}
}
@ -637,6 +689,18 @@ namespace ICSharpCode.Core.Presentation @@ -637,6 +689,18 @@ namespace ICSharpCode.Core.Presentation
commands.Add(commandName, wpfCommand);
}
}
/// <summary>
/// Get registered instance of <see cref="CommandBindingInfo" />
/// </summary>
/// <param name="commandBindingName">Command binding info name</param>
/// <returns>Command binding info matching provided name</returns>
public static CommandBindingInfo GetCommandBindingInfo(string commandBindingName) {
CommandBindingInfo bindingInfo;
commandBindings.TryGetValue(commandBindingName, out bindingInfo);
return bindingInfo;
}
/// <summary>
/// Get list of all command bindings which satisfy provided parameters
@ -652,14 +716,14 @@ namespace ICSharpCode.Core.Presentation @@ -652,14 +716,14 @@ namespace ICSharpCode.Core.Presentation
var foundBindings = new List<CommandBindingInfo>();
foreach(var binding in commandBindings) {
if( (ownerInstanceName == null || binding.OwnerInstanceName == ownerInstanceName)
&& (ownerInstance == null || binding.OwnerInstance == ownerInstance)
&& (ownerTypeName == null || binding.OwnerTypeName == ownerTypeName)
&& (ownerType == null || binding.OwnerType == ownerType)
&& (routedCommandName == null || binding.RoutedCommandName == routedCommandName)
&& (className == null || binding.ClassName == className)) {
if( (ownerInstanceName == null || binding.Value.OwnerInstanceName == ownerInstanceName)
&& (ownerInstance == null || binding.Value.OwnerInstance == ownerInstance)
&& (ownerTypeName == null || binding.Value.OwnerTypeName == ownerTypeName)
&& (ownerType == null || binding.Value.OwnerType == ownerType)
&& (routedCommandName == null || binding.Value.RoutedCommandName == routedCommandName)
&& (className == null || binding.Value.CommandTypeName == className)) {
foundBindings.Add(binding);
foundBindings.Add(binding.Value);
}
}
@ -729,6 +793,39 @@ namespace ICSharpCode.Core.Presentation @@ -729,6 +793,39 @@ namespace ICSharpCode.Core.Presentation
return registeredCategories;
}
/// <summary>
/// Saves current configuration in specified destination
/// </summary>
/// <param name="destinationPath">Destination file path</param>
public static void SaveGestures(string destinationPath)
{
foreach(var inputBindingInfo in inputBidnings) {
UserDefinedGesturesManager.SetInputBindingGesture(
inputBindingInfo.Key,
inputBindingInfo.Value.Gestures);
}
UserDefinedGesturesManager.Save(destinationPath);
}
/// <summary>
/// Loads current configuration in specified destination
/// </summary>
/// <param name="sourcePath">Source file path</param>
public static void LoadGestures(string sourcePath)
{
UserDefinedGesturesManager.Load(sourcePath);
foreach(var inputBindingInfo in inputBidnings) {
var userGestures = UserDefinedGesturesManager.GetInputBindingGesture(inputBindingInfo.Key);
if(userGestures != null) {
inputBindingInfo.Value.Gestures = userGestures;
inputBindingInfo.Value.IsModifyed = true;
}
}
}
/// <summary>
/// Register default command binding update hander which will keep instance command
/// bindings upated

53
src/Main/ICSharpCode.Core.Presentation/CommandsService/CommandsService.cs

@ -2,6 +2,7 @@ using System; @@ -2,6 +2,7 @@ using System;
using System.Reflection;
using System.Windows.Input;
using System.Windows.Documents;
using System.Text;
using ICSharpCode.Core;
namespace ICSharpCode.Core.Presentation
@ -15,7 +16,7 @@ namespace ICSharpCode.Core.Presentation @@ -15,7 +16,7 @@ namespace ICSharpCode.Core.Presentation
var typeProperties = type.GetProperties(BindingFlags.Static | BindingFlags.Public);
foreach(var property in typeProperties) {
var command = (RoutedUICommand)property.GetValue(null, null);
CommandsRegistry.RegisterRoutedUICommand(command);
CommandManager.RegisterRoutedUICommand(command);
}
}
@ -31,7 +32,7 @@ namespace ICSharpCode.Core.Presentation @@ -31,7 +32,7 @@ namespace ICSharpCode.Core.Presentation
{
var descriptors = AddInTree.BuildItems<RoutedUICommandDescriptor>(path, caller, false);
foreach(var desc in descriptors) {
CommandsRegistry.RegisterRoutedUICommand(desc.Name, desc.Text);
CommandManager.RegisterRoutedUICommand(desc.Name, desc.Text);
}
}
@ -39,40 +40,54 @@ namespace ICSharpCode.Core.Presentation @@ -39,40 +40,54 @@ namespace ICSharpCode.Core.Presentation
{
var descriptors = AddInTree.BuildItems<CommandBindingDescriptor>(path, caller, false);
foreach(var desc in descriptors) {
var commandBindingInfoName = new StringBuilder();
// If routed with such name is not registered register routed command with text same as name
if(CommandsRegistry.GetRoutedUICommand(desc.Command) == null) {
if(CommandManager.GetRoutedUICommand(desc.Command) == null) {
var commandText = string.IsNullOrEmpty(desc.CommandText) ? desc.Command : desc.CommandText;
CommandsRegistry.RegisterRoutedUICommand(desc.Command, commandText);
CommandManager.RegisterRoutedUICommand(desc.Command, commandText);
}
var commandBindingInfo = new CommandBindingInfo();
if(!string.IsNullOrEmpty(desc.OwnerInstanceName)) {
commandBindingInfo.OwnerInstanceName = desc.OwnerInstanceName;
commandBindingInfoName.AppendFormat("{0}_", desc.OwnerInstanceName);
} else if(!string.IsNullOrEmpty(desc.OwnerTypeName)) {
commandBindingInfo.OwnerTypeName = desc.OwnerTypeName;
commandBindingInfoName.AppendFormat("{0}_", desc.OwnerTypeName);
} else {
commandBindingInfo.OwnerTypeName = CommandsRegistry.DefaultContextName;
commandBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
commandBindingInfoName.AppendFormat("{0}_", CommandManager.DefaultContextName);
}
commandBindingInfo.RoutedCommandName = desc.Command;
commandBindingInfo.ClassName = desc.Class;
commandBindingInfoName.AppendFormat("{0}_", desc.Command);
commandBindingInfo.CommandTypeName = desc.Class;
commandBindingInfoName.AppendFormat("{0}_", desc.Class);
commandBindingInfo.AddIn = desc.Codon.AddIn;
commandBindingInfoName.Append(desc.Codon.AddIn.Name);
commandBindingInfo.IsLazy = desc.Lazy;
CommandsRegistry.RegisterCommandBinding(commandBindingInfo);
commandBindingInfo.Name = "CommandBinding_" + commandBindingInfoName.ToString();
CommandManager.RegisterCommandBinding(commandBindingInfo);
// If gestures are provided register input binding in the same context
if(!string.IsNullOrEmpty(desc.Gestures)) {
var gestures = (InputGestureCollection)new InputGestureCollectionConverter().ConvertFromString(desc.Gestures);
var inputBindingInfo = new InputBindingInfo();
inputBindingInfo.Name = "InputBinding_" + commandBindingInfoName.ToString();
if(!string.IsNullOrEmpty(desc.OwnerInstanceName)) {
inputBindingInfo.OwnerInstanceName = desc.OwnerInstanceName;
} else if(!string.IsNullOrEmpty(desc.OwnerTypeName)) {
inputBindingInfo.OwnerTypeName = desc.OwnerTypeName;
} else {
inputBindingInfo.OwnerTypeName = CommandsRegistry.DefaultContextName;
inputBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
}
inputBindingInfo.AddIn = desc.Codon.AddIn;
@ -84,10 +99,10 @@ namespace ICSharpCode.Core.Presentation @@ -84,10 +99,10 @@ namespace ICSharpCode.Core.Presentation
}
if(!string.IsNullOrEmpty(desc.Category)) {
inputBindingInfo.Categories.AddRange(CommandsRegistry.RegisterInputBindingCategories(desc.Category));
inputBindingInfo.Categories.AddRange(CommandManager.RegisterInputBindingCategories(desc.Category));
}
CommandsRegistry.RegisterInputBinding(inputBindingInfo);
CommandManager.RegisterInputBinding(inputBindingInfo);
}
}
}
@ -99,17 +114,26 @@ namespace ICSharpCode.Core.Presentation @@ -99,17 +114,26 @@ namespace ICSharpCode.Core.Presentation
var gestures = (InputGestureCollection)new InputGestureCollectionConverter().ConvertFromString(desc.Gestures);
var inputBindingInfo = new InputBindingInfo();
StringBuilder inputBindingInfoName = new StringBuilder();
if(!string.IsNullOrEmpty(desc.OwnerInstanceName)) {
inputBindingInfo.OwnerInstanceName = desc.OwnerInstanceName;
inputBindingInfoName.AppendFormat("{0}_", desc.OwnerInstanceName);
} else if(!string.IsNullOrEmpty(desc.OwnerTypeName)) {
inputBindingInfo.OwnerTypeName = desc.OwnerTypeName;
inputBindingInfoName.AppendFormat("{0}_", desc.OwnerTypeName);
} else {
inputBindingInfo.OwnerTypeName = CommandsRegistry.DefaultContextName;
inputBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
inputBindingInfoName.AppendFormat("{0}_", CommandManager.DefaultContextName);
}
inputBindingInfo.AddIn = desc.Codon.AddIn;
inputBindingInfoName.AppendFormat("{0}_", desc.Codon.AddIn.Name);
inputBindingInfo.RoutedCommandName = desc.Command;
inputBindingInfoName.AppendFormat("{0}_", desc.Command);
inputBindingInfo.Gestures = gestures;
if(!string.IsNullOrEmpty(desc.CommandText)) {
@ -117,10 +141,11 @@ namespace ICSharpCode.Core.Presentation @@ -117,10 +141,11 @@ namespace ICSharpCode.Core.Presentation
}
if(!string.IsNullOrEmpty(desc.Category)) {
inputBindingInfo.Categories.AddRange(CommandsRegistry.RegisterInputBindingCategories(desc.Category));
inputBindingInfo.Categories.AddRange(CommandManager.RegisterInputBindingCategories(desc.Category));
}
CommandsRegistry.RegisterInputBinding(inputBindingInfo);
inputBindingInfo.Name = inputBindingInfoName.ToString();
CommandManager.RegisterInputBinding(inputBindingInfo);
}
}
}

2
src/Main/ICSharpCode.Core.Presentation/CommandsService/InputBindingCategory.cs

@ -6,7 +6,7 @@ namespace ICSharpCode.Core.Presentation @@ -6,7 +6,7 @@ namespace ICSharpCode.Core.Presentation
/// Stores input binding category description
/// </summary>
public class InputBindingCategory
{
{
/// <summary>
/// Creates new instance of <see cref="InputBindingCategory" />
/// </summary>

168
src/Main/ICSharpCode.Core.Presentation/CommandsService/InputBindingInfo.cs

@ -10,7 +10,11 @@ namespace ICSharpCode.Core.Presentation @@ -10,7 +10,11 @@ namespace ICSharpCode.Core.Presentation
/// </summary>
public class InputBindingInfo
{
public InputBindingInfo() {
/// <summary>
/// Creates new instance of <see cref="InputBindingInfo"/>
/// </summary>
public InputBindingInfo()
{
IsModifyed = true;
OldInputBindings = new InputBindingCollection();
NewInputBindings = new InputBindingCollection();
@ -18,43 +22,110 @@ namespace ICSharpCode.Core.Presentation @@ -18,43 +22,110 @@ namespace ICSharpCode.Core.Presentation
Categories = new List<InputBindingCategory>();
}
public string OwnerInstanceName{
/// <summary>
/// Command binding info name
///
/// The name should be unique to register command binding
/// </summary>
public string Name {
get; set;
}
public string ownerInstanceName;
/// <summary>
/// Stores name of named instance to which this binding belongs. When this binding is registered a
/// <see cref="InputBinding" /> is assigned to owner instance
///
/// If this attribute is used <see cref="OwnerInstance" />, <see cref="OwnerType" /> and
/// <see cref="OwnerTypeName" /> can not be set
/// </summary>
public string OwnerInstanceName {
get {
return ownerInstanceName;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerInstanceName = value;
}
}
private UIElement ownerInstance;
/// <summary>
/// Stores owner instance to which this binding belongs. When this binding is registered a
/// <see cref="InputBinding" /> is assigned to owner instance
///
/// If this attribute is used <see cref="OwnerInstanceName" />, <see cref="OwnerType" /> and
/// <see cref="OwnerTypeName" /> can not be set
/// </summary>
public UIElement OwnerInstance{
get {
if(OwnerInstanceName != null && ownerInstance == null) {
ownerInstance = CommandsRegistry.GetNamedUIElementInstance(OwnerInstanceName);
ownerInstance = CommandManager.GetNamedUIElementInstance(OwnerInstanceName);
}
return ownerInstance;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerInstance = value;
}
}
private string ownerTypeName;
/// <summary>
/// Stores name of owner type. Full name with assembly should be used. When this binding is
/// registered <see cref="InputBinding" /> is assigned to all instances of provided class
///
/// If this attribute is used <see cref="OwnerInstance" />, <see cref="OwnerInstanceName" /> and
/// <see cref="OwnerType" /> can not be set
/// </summary>
public string OwnerTypeName{
get; set;
get {
return ownerTypeName;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerTypeName = value;
}
}
private Type ownerType;
/// <summary>
/// Stores owner type. When this binding is registered <see cref="InputBinding" />
/// is assigned to all instances of provided class
///
/// If this attribute is used <see cref="OwnerInstance" />, <see cref="OwnerInstanceName" /> and
/// <see cref="OwnerTypeName" /> can not be set
/// </summary>
public Type OwnerType {
set {
ownerType = value;
}
get {
if(ownerType == null && OwnerTypeName != null) {
ownerType = Type.GetType(OwnerTypeName);
CommandsRegistry.RegisterNamedUIType(OwnerTypeName, ownerType);
CommandManager.RegisterNamedUIType(OwnerTypeName, ownerType);
}
return ownerType;
}
set {
if(ownerInstanceName != null || ownerInstance != null || ownerType != null || ownerTypeName != null) {
throw new ArgumentException("This binding already has an owner");
}
ownerType = value;
}
}
/// <summary>
@ -83,34 +154,57 @@ namespace ICSharpCode.Core.Presentation @@ -83,34 +154,57 @@ namespace ICSharpCode.Core.Presentation
}
/// <summary>
/// Routed command name
///
/// Described binding triggers this routed command
/// Name of the routed command which will be invoked when this binding is triggered
/// </summary>
/// <seealso cref="RoutedCommand"></seealso>
public string RoutedCommandName {
get; set;
}
/// <summary>
/// Routed command instance
///
/// Described binding triggers this routed command
/// Routed command instance which will be invoked when this binding is triggered
/// </summary>
/// <seealso cref="RoutedCommandName"></seealso>
public RoutedUICommand RoutedCommand {
get {
return CommandsRegistry.GetRoutedUICommand(RoutedCommandName);
return CommandManager.GetRoutedUICommand(RoutedCommandName);
}
}
/// <summary>
/// List of categories associated with input binding
/// </summary>
public List<InputBindingCategory> Categories {
get; private set;
}
/// <summary>
/// Indicates whether <see cref="InputBindingInfo" /> was modified. When modified
/// <see cref="InputBinding" />s are re-generated
/// </summary>
public bool IsModifyed {
get; set;
}
/// <summary>
/// Re-generate <see cref="InputBinding" /> from <see cref="InputBindingInfo" />
/// </summary>
public void GenerateInputBindings()
{
OldInputBindings = NewInputBindings;
NewInputBindings = new InputBindingCollection();
foreach(InputGesture gesture in Gestures) {
var inputBinding = new InputBinding(RoutedCommand, gesture);
NewInputBindings.Add(inputBinding);
}
}
private BindingsUpdatedHandler defaultInputBindingHandler;
/// <summary>
/// Default binding update handler update owner or type bindings (depending on input binding info type)
/// so they would always contain latest version
/// Updates owner bindings
/// </summary>
public BindingsUpdatedHandler DefaultInputBindingHandler
internal BindingsUpdatedHandler DefaultInputBindingHandler
{
get {
if(defaultInputBindingHandler == null && (OwnerTypeName != null || OwnerType != null)) {
@ -119,11 +213,11 @@ namespace ICSharpCode.Core.Presentation @@ -119,11 +213,11 @@ namespace ICSharpCode.Core.Presentation
GenerateInputBindings();
foreach(InputBinding binding in OldInputBindings) {
CommandsRegistry.RemoveClassInputBinding(OwnerType, binding);
CommandManager.RemoveClassInputBinding(OwnerType, binding);
}
foreach(InputBinding binding in NewInputBindings) {
CommandManager.RegisterClassInputBinding(OwnerType, binding);
System.Windows.Input.CommandManager.RegisterClassInputBinding(OwnerType, binding);
}
IsModifyed = false;
@ -150,35 +244,19 @@ namespace ICSharpCode.Core.Presentation @@ -150,35 +244,19 @@ namespace ICSharpCode.Core.Presentation
}
/// <summary>
/// List of categories associated with input binding
/// </summary>
public List<InputBindingCategory> Categories {
get; private set;
}
/// <summary>
/// Indicates whether generated input bindings where modified from last access
/// Old input bindings which where assigned to owner when before <see cref="InputBindingInfo" />
/// was modified.
///
/// When new <see cref="InputBinding" />s are generated these bindings are removed from the owner
/// </summary>
public bool IsModifyed {
get; set;
}
public void GenerateInputBindings()
{
OldInputBindings = NewInputBindings;
NewInputBindings = new InputBindingCollection();
foreach(InputGesture gesture in Gestures) {
var inputBinding = new InputBinding(RoutedCommand, gesture);
NewInputBindings.Add(inputBinding);
}
}
internal InputBindingCollection OldInputBindings
{
get; set;
}
/// <summary>
/// New input bindings are assigned to owner when <see cref="CommandBindingInfo" /> is modified
/// </summary>
internal InputBindingCollection NewInputBindings
{
get; set;

10
src/Main/ICSharpCode.Core.Presentation/CommandsService/InputGestureCollectionConverter.cs

@ -55,7 +55,7 @@ namespace ICSharpCode.Core.Presentation @@ -55,7 +55,7 @@ namespace ICSharpCode.Core.Presentation
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
if (value is string) {
var gestures = new InputGestureCollection();
var serializedGestures = Regex.Split((string)value, @"\s*\|\s*");
var serializedGestures = Regex.Split((string)value, @"\s*\;\s*");
foreach(var serializedGesture in serializedGestures) {
if(string.IsNullOrEmpty(serializedGesture)) continue;
@ -91,7 +91,9 @@ namespace ICSharpCode.Core.Presentation @@ -91,7 +91,9 @@ namespace ICSharpCode.Core.Presentation
string serializedGesture;
if (gesture is MultiKeyGesture) {
serializedGesture = (string)new MultiKeyGestureConverter().ConvertTo(context, culture, gesture, typeof(string));
} else if (gesture is KeyGesture) {
} else if (gesture is PartialKeyGesture) {
serializedGesture = (string)new PartialKeyGestureConverter().ConvertTo(context, culture, gesture, typeof(string));
} else if (gesture is KeyGesture) {
serializedGesture = (string)new KeyGestureConverter().ConvertTo(context, culture, gesture, typeof(string));
} else if (gesture is MouseGesture) {
serializedGesture = (string)new MouseGestureConverter().ConvertTo(context, culture, gesture, typeof(string));
@ -99,10 +101,10 @@ namespace ICSharpCode.Core.Presentation @@ -99,10 +101,10 @@ namespace ICSharpCode.Core.Presentation
continue;
}
sb.AppendFormat("{0} | ", serializedGesture);
sb.AppendFormat("{0};", serializedGesture);
}
return sb.Length >= 3 ? sb.ToString(0, sb.Length - 3) : sb.ToString();
return sb.Length >= 3 ? sb.ToString(0, sb.Length - 1) : sb.ToString();
}
return base.ConvertTo(context, culture, value, destinationType);

17
src/Main/ICSharpCode.Core.Presentation/CommandsService/InputGestureCollectionExtensions.cs

@ -8,6 +8,17 @@ namespace ICSharpCode.Core.Presentation @@ -8,6 +8,17 @@ namespace ICSharpCode.Core.Presentation
/// </summary>
public static class InputGestureCollectionExtensions
{
public static bool ContainsTemplateForAny(this InputGestureCollection inputGestureTemplateCollection, InputGestureCollection testedInputGestureCollection, GestureCompareMode mode) {
foreach (InputGesture template in inputGestureTemplateCollection) {
if (template.IsTemplateForAny(testedInputGestureCollection, mode)) {
return true;
}
}
return false;
}
public static bool ContainsCopy(this InputGestureCollection gestures, InputGesture searchedGesture) {
var searchedMultiKeyGesture = searchedGesture as MultiKeyGesture;
var searchedKeyGesture = searchedGesture as KeyGesture;
@ -16,10 +27,10 @@ namespace ICSharpCode.Core.Presentation @@ -16,10 +27,10 @@ namespace ICSharpCode.Core.Presentation
foreach(var gesture in gestures) {
if(searchedMultiKeyGesture != null) {
var multiKeyGesture = gesture as MultiKeyGesture;
if(multiKeyGesture != null && multiKeyGesture.Gestures != null && searchedMultiKeyGesture.Gestures != null && multiKeyGesture.Gestures.Count == searchedMultiKeyGesture.Gestures.Count) {
if(multiKeyGesture != null && multiKeyGesture.Chords != null && searchedMultiKeyGesture.Chords != null && multiKeyGesture.Chords.Count == searchedMultiKeyGesture.Chords.Count) {
var foundMatch = true;
foreach(var partialGesture in multiKeyGesture.Gestures) {
foreach(var searchedPartialGesture in searchedMultiKeyGesture.Gestures) {
foreach(var partialGesture in multiKeyGesture.Chords) {
foreach(var searchedPartialGesture in searchedMultiKeyGesture.Chords) {
if(partialGesture.Key != searchedPartialGesture.Key || partialGesture.Modifiers != searchedPartialGesture.Modifiers) {
foundMatch = false;
break;

100
src/AddIns/Misc/ShortcutsManagement/ShortcutsManagement/Src/Extensions/PartialKeyGestureExtensions.cs → src/Main/ICSharpCode.Core.Presentation/CommandsService/InputGestureExtensions.cs

@ -1,15 +1,44 @@ @@ -1,15 +1,44 @@
using System.Collections.Generic;
/*
* Created by SharpDevelop.
* User: Administrator
* Date: 6/26/2009
* Time: 1:13 AM
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Windows.Input;
using ICSharpCode.Core.Presentation;
using ICSharpCode.ShortcutsManagement.Data;
using System.Collections.Generic;
namespace ICSharpCode.ShortcutsManagement.Extensions
namespace ICSharpCode.Core.Presentation
{
/// <summary>
/// <see cref="PartialKeyGesture"/> extensions
/// </summary>
public static class PartialKeyGestureExtensions
{
public enum GestureCompareMode
{
/// <summary>
/// Match is successful if template gesture strictly matches compared gesture
/// </summary>
StrictlyMatches,
ExactlyMatches,
/// <summary>
/// Match is successfull if template gesture partly matches compared geture.
/// Template is found in any place within matched gesture
/// </summary>
PartlyMatches,
/// <summary>
/// match is successfull if matched gesture starts with provided template
/// </summary>
StartsWith
}
/// <summary>
/// Description of InputGestureExtensions.
/// </summary>
public static class InputGestureExtensions
{
/// <summary>
/// Returns true whether compared gesture matches input gesture template
/// </summary>
@ -17,7 +46,7 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -17,7 +46,7 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
/// <param name="inputGesture">Compared input gesture</param>
/// <param name="mode">Match mode</param>
/// <returns>Returns true if template matches compared geture</returns>
private static bool IsTemplate(this InputGesture inputGestureTemplate, InputGesture inputGesture, GestureFilterMode mode)
public static bool IsTemplateFor(this InputGesture inputGestureTemplate, InputGesture inputGesture, GestureCompareMode mode)
{
var multiKeyGesture = inputGesture as MultiKeyGesture;
var multiKeyGestureTemplate = inputGestureTemplate as MultiKeyGesture;
@ -44,11 +73,16 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -44,11 +73,16 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
}
// Check for common missmatches
if(multiKeyGestureTemplate.Gestures == null
|| multiKeyGesture.Gestures == null
|| multiKeyGestureTemplate.Gestures.Count == 0
|| multiKeyGesture.Gestures.Count == 0
|| multiKeyGestureTemplate.Gestures.Count > multiKeyGesture.Gestures.Count)
if(multiKeyGestureTemplate.Chords == null
|| multiKeyGesture.Chords == null
|| multiKeyGestureTemplate.Chords.Count == 0
|| multiKeyGesture.Chords.Count == 0
|| multiKeyGestureTemplate.Chords.Count > multiKeyGesture.Chords.Count)
{
return false;
}
if (mode == GestureCompareMode.ExactlyMatches && multiKeyGestureTemplate.Chords.Count != multiKeyGesture.Chords.Count)
{
return false;
}
@ -57,30 +91,39 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -57,30 +91,39 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
var previousChords = new LinkedList<PartialKeyGesture>();
// Search whether chord sequece matches template sequenc in any place
foreach (PartialKeyGesture chord in multiKeyGesture.Gestures)
foreach (PartialKeyGesture chord in multiKeyGesture.Chords)
{
// Accumulates previous chords
previousChords.AddLast(chord);
if (previousChords.Count > multiKeyGestureTemplate.Gestures.Count)
if (previousChords.Count > multiKeyGestureTemplate.Chords.Count)
{
previousChords.RemoveFirst();
}
// Only start comparing with template when needed amount of previous chords where collected
if (previousChords.Count == multiKeyGestureTemplate.Gestures.Count)
if (previousChords.Count == multiKeyGestureTemplate.Chords.Count)
{
var multiKeyGestureTemplateEnumerator = multiKeyGestureTemplate.Gestures.GetEnumerator();
var multiKeyGestureTemplateEnumerator = multiKeyGestureTemplate.Chords.GetEnumerator();
var previousChordsEnumerator = previousChords.GetEnumerator();
multiKeyGestureTemplateEnumerator.Reset();
// Compare two chord sequences in a loop
var multiKeyGesturesMatch = true;
var i = 0;
while (previousChordsEnumerator.MoveNext() && multiKeyGestureTemplateEnumerator.MoveNext())
{
if (multiKeyGestureTemplateEnumerator.Current.Modifiers != previousChordsEnumerator.Current.Modifiers
|| multiKeyGestureTemplateEnumerator.Current.Key != previousChordsEnumerator.Current.Key)
{
var templateGesture = multiKeyGestureTemplateEnumerator.Current;
var gesture = previousChordsEnumerator.Current;
if (((mode == GestureCompareMode.StartsWith || mode == GestureCompareMode.PartlyMatches) && i == previousChords.Count)
|| (mode == GestureCompareMode.PartlyMatches && i == 0)) {
if(!templateGesture.IsTemplateFor(gesture, GestureCompareMode.PartlyMatches)) {
multiKeyGesturesMatch = false;
break;
}
} else if (templateGesture.Modifiers != gesture.Modifiers || templateGesture.Key != gesture.Key) {
multiKeyGesturesMatch = false;
break;
}
@ -91,7 +134,7 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -91,7 +134,7 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
return true;
}
if (mode == GestureFilterMode.StartsWith)
if (mode == GestureCompareMode.StartsWith)
{
break;
}
@ -106,7 +149,7 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -106,7 +149,7 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
var templateModifiers = partialKeyGestureTemplate != null ? partialKeyGestureTemplate.Modifiers : keyGestureTemplate.Modifiers;
var templateKey = partialKeyGestureTemplate != null ? partialKeyGestureTemplate.Key : keyGestureTemplate.Key;
if (mode == GestureFilterMode.PartlyMatches)
if (mode == GestureCompareMode.PartlyMatches || mode == GestureCompareMode.StartsWith)
{
return (templateModifiers == ModifierKeys.None || templateModifiers == gestureModifiers)
&& (templateKey == Key.None || templateKey == gestureKey);
@ -117,7 +160,8 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -117,7 +160,8 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
return false;
}
/// <summary>
/// Determines whether this instance of <see cref="InputGesture"/> matches any of provided templates
/// </summary>
@ -125,10 +169,10 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -125,10 +169,10 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
/// <param name="inputGestureTemplateCollection">Collection of input gestures templates which (at least one of them) should match this input gesture to return true</param>
/// <param name="mode">Matching mode</param>
/// <returns>True if this gsture matches templates collection, otherwise false</returns>
public static bool MatchesCollection(this InputGesture thisGesture, InputGestureCollection inputGestureTemplateCollection, GestureFilterMode mode)
public static bool IsTemplateForAny(this InputGesture thisGesture, InputGestureCollection inputGestureTemplateCollection, GestureCompareMode mode)
{
foreach (InputGesture gesture in inputGestureTemplateCollection) {
if (thisGesture.IsTemplate(gesture, mode))
if (thisGesture.IsTemplateFor(gesture, mode))
{
return true;
}
@ -136,5 +180,5 @@ namespace ICSharpCode.ShortcutsManagement.Extensions @@ -136,5 +180,5 @@ namespace ICSharpCode.ShortcutsManagement.Extensions
return false;
}
}
}
}

35
src/Main/ICSharpCode.Core.Presentation/CommandsService/ManagedCommandBinding.cs

@ -1,35 +0,0 @@ @@ -1,35 +0,0 @@
using System;
using System.Windows.Input;
namespace ICSharpCode.Core.Presentation
{
/// <summary>
/// ManagedCommandBinding is used to distinguish command bindings managed
/// by CommandsRegistry from other command bindings not managed by CommandsRegistry
///
/// If command binding is not managed then CommandsRegistry ignores it when
/// performing any action
/// </summary>
public class ManagedCommandBinding : System.Windows.Input.CommandBinding
{
/// <see cref="System.Windows.Input.CommandBinding()" />
public ManagedCommandBinding()
: base()
{ }
/// <see cref="System.Windows.Input.CommandBinding(System.Windows.Input.ICommand)" />
public ManagedCommandBinding(System.Windows.Input.ICommand command)
: base(command)
{ }
/// <see cref="System.Windows.Input.CommandBinding(System.Windows.Input.ICommand, System.Windows.Input.ExecutedRoutedEventHandler)" />
public ManagedCommandBinding(System.Windows.Input.ICommand command, System.Windows.Input.ExecutedRoutedEventHandler executed)
: base(command, executed)
{ }
/// <see cref="System.Windows.Input.CommandBinding(System.Windows.Input.ICommand, System.Windows.Input.ExecutedRoutedEventHandler, System.Windows.Input.CanExecuteRoutedEventHandler)" />
public ManagedCommandBinding(System.Windows.Input.ICommand command, System.Windows.Input.ExecutedRoutedEventHandler executed, System.Windows.Input.CanExecuteRoutedEventHandler canExecute)
: base(command, executed, canExecute)
{ }
}
}

24
src/Main/ICSharpCode.Core.Presentation/CommandsService/ManagedInputBinding.cs

@ -1,24 +0,0 @@ @@ -1,24 +0,0 @@
using System;
using System.Windows.Input;
namespace ICSharpCode.Core.Presentation
{
/// <summary>
/// ManagedKeyBinding is used to distinguish input bindings managed
/// by CommandsRegistry from other input bindings not managed by CommandsRegistry.
///
/// If input binding is not managed then CommansRegistry ignores it when
/// performing any action
/// </summary>
public class ManagedInputBinding : System.Windows.Input.InputBinding
{
/// <see cref="System.Windows.Input.InputBinding()"></see>
public ManagedInputBinding() : base()
{ }
/// <see cref="System.Windows.Input.InputBinding(System.Windows.Input.ICommand, System.Windows.Input.InputGesture)"></see>
public ManagedInputBinding(System.Windows.Input.ICommand command, System.Windows.Input.InputGesture gesture)
: base(command, gesture)
{ }
}
}

33
src/Main/ICSharpCode.Core.Presentation/CommandsService/MultiKeyGesture.cs

@ -23,11 +23,22 @@ namespace ICSharpCode.Core.Presentation @@ -23,11 +23,22 @@ namespace ICSharpCode.Core.Presentation
}
}
private readonly ReadOnlyCollection<PartialKeyGesture> gestures;
private readonly ReadOnlyCollection<PartialKeyGesture> chords;
private int currentGestureIndex;
private DateTime lastGestureInput;
private static readonly TimeSpan maxDelayBetweenGestureInputs = TimeSpan.FromSeconds(2);
/// <summary>
/// Maximum delay between multi-key gesture chords
/// </summary>
public static TimeSpan DelayBetweenChords
{
get; set;
}
static MultiKeyGesture()
{
DelayBetweenChords = TimeSpan.FromSeconds(2);
}
/// <summary>
/// Creates instance of <see cref="MultiKeyGesture"/> from list of partial key gestures
@ -40,8 +51,8 @@ namespace ICSharpCode.Core.Presentation @@ -40,8 +51,8 @@ namespace ICSharpCode.Core.Presentation
{
throw new ArgumentException("Must specify atleast one gesture");
}
this.gestures = new ReadOnlyCollection<PartialKeyGesture>(gestures);
this.chords = new ReadOnlyCollection<PartialKeyGesture>(gestures);
allGestures.Add(this);
}
@ -49,11 +60,11 @@ namespace ICSharpCode.Core.Presentation @@ -49,11 +60,11 @@ namespace ICSharpCode.Core.Presentation
/// <summary>
/// Sequence of partial key gestures which describe this sequential key gesture
/// </summary>
public ICollection<PartialKeyGesture> Gestures
public ICollection<PartialKeyGesture> Chords
{
get
{
return gestures;
return chords;
}
}
@ -78,10 +89,10 @@ namespace ICSharpCode.Core.Presentation @@ -78,10 +89,10 @@ namespace ICSharpCode.Core.Presentation
}
// Checks wheter it is not too long from last match
var isOnTime = (DateTime.Now - lastGestureInput) <= maxDelayBetweenGestureInputs;
var isOnTime = (DateTime.Now - lastGestureInput) <= DelayBetweenChords;
// If strict match is on time
var strictMatch = gestures[currentGestureIndex].StrictlyMatches(targetElement, inputEventArgs);
var strictMatch = chords[currentGestureIndex].StrictlyMatches(targetElement, inputEventArgs);
if (strictMatch && (currentGestureIndex == 0 || isOnTime))
{
currentGestureIndex++;
@ -89,7 +100,7 @@ namespace ICSharpCode.Core.Presentation @@ -89,7 +100,7 @@ namespace ICSharpCode.Core.Presentation
inputEventArgs.Handled = true;
// Check whether this is last gesture in sequence
if(currentGestureIndex == gestures.Count)
if(currentGestureIndex == chords.Count)
{
ResetAllGestures();
return true;
@ -99,7 +110,7 @@ namespace ICSharpCode.Core.Presentation @@ -99,7 +110,7 @@ namespace ICSharpCode.Core.Presentation
}
// If partial match is on time allow continue without reseting current gesture index
var partialMatch = gestures[currentGestureIndex].Matches(targetElement, inputEventArgs);
var partialMatch = chords[currentGestureIndex].Matches(targetElement, inputEventArgs);
if (partialMatch && currentGestureIndex > 0 && isOnTime)
{
return false;

4
src/Main/ICSharpCode.Core.Presentation/CommandsService/MultiKeyGestureConverter.cs

@ -63,8 +63,8 @@ namespace ICSharpCode.Core.Presentation @@ -63,8 +63,8 @@ namespace ICSharpCode.Core.Presentation
var MultiKeyGesture = value as MultiKeyGesture;
if (MultiKeyGesture != null && destinationType == typeof(string))
{
var partialKeyGestureStrings = MultiKeyGesture.Gestures.Select(gesture => (string)partialKeyGestureConverter.ConvertTo(context, culture, gesture, typeof(string))).ToArray();
var MultiKeyGestureString = string.Join(", ", partialKeyGestureStrings);
var partialKeyGestureStrings = MultiKeyGesture.Chords.Select(gesture => (string)partialKeyGestureConverter.ConvertTo(context, culture, gesture, typeof(string))).ToArray();
var MultiKeyGestureString = string.Join(",", partialKeyGestureStrings);
return MultiKeyGestureString;
}

28
src/Main/ICSharpCode.Core.Presentation/CommandsService/PartialKeyGesture.cs

@ -49,8 +49,19 @@ namespace ICSharpCode.Core.Presentation @@ -49,8 +49,19 @@ namespace ICSharpCode.Core.Presentation
{
var keyboardDevice = (KeyboardDevice)keyEventArgs.Device;
_key = keyEventArgs.Key;
_modifiers = keyboardDevice.Modifiers;
var enteredKey = keyEventArgs.Key == Key.System ? keyEventArgs.SystemKey : keyEventArgs.Key;
var enteredModifiers = keyboardDevice.Modifiers;
if(Array.IndexOf(new[] { Key.LeftAlt, Key.RightAlt,
Key.LeftShift, Key.RightShift,
Key.LeftCtrl, Key.RightCtrl,
Key.LWin, Key.RWin}, enteredKey) >= 0) {
_key = Key.None;
_modifiers = enteredModifiers;
} else {
_key = enteredKey;
_modifiers = enteredModifiers;
}
}
/// <summary>
@ -60,8 +71,17 @@ namespace ICSharpCode.Core.Presentation @@ -60,8 +71,17 @@ namespace ICSharpCode.Core.Presentation
public PartialKeyGesture(KeyGesture gesture)
: base(Key.None, ModifierKeys.None)
{
_key = gesture.Key;
_modifiers = gesture.Modifiers;
var partialKeyGesture = gesture as PartialKeyGesture;
if (partialKeyGesture != null) {
_key = partialKeyGesture.Key;
_modifiers = partialKeyGesture.Modifiers;
} else if (gesture is MultiKeyGesture) {
throw new ArgumentException("Can not create partial key gesture from multi-key gesture");
} else {
_key = gesture.Key;
_modifiers = gesture.Modifiers;
}
}
/// <summary>

87
src/Main/ICSharpCode.Core.Presentation/CommandsService/UserDefinedGesturesManager.cs

@ -0,0 +1,87 @@ @@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.Xml;
using System.Windows.Input;
using System.IO;
namespace ICSharpCode.Core.Presentation
{
/// <summary>
/// Manages user defined gestures
/// </summary>
internal static class UserDefinedGesturesManager
{
private static Dictionary<string, InputGestureCollection> userDefinedGestures = new Dictionary<string, InputGestureCollection>();
/// <summary>
/// Save user defined gestures to specified file
/// </summary>
/// <param name="destinationPath">Path to the file containing user defined gestures</param>
public static void Save(string destinationPath)
{
var xmlDocument = new XmlDocument();
var rootNode = xmlDocument.CreateElement("UserDefinedGestures");
foreach(var definedGestures in userDefinedGestures) {
var bindingInfoNode = xmlDocument.CreateElement("InputBindingInfo");
var nameAttribute = xmlDocument.CreateAttribute("name");
nameAttribute.Value = definedGestures.Key;
bindingInfoNode.Attributes.Append(nameAttribute);
var gesturesAttribute = xmlDocument.CreateAttribute("gestures");
gesturesAttribute.Value = new InputGestureCollectionConverter().ConvertToInvariantString(definedGestures.Value);
bindingInfoNode.Attributes.Append(gesturesAttribute);
rootNode.AppendChild(bindingInfoNode);
}
xmlDocument.AppendChild(rootNode);
xmlDocument.Save(destinationPath);
}
/// <summary>
/// Load user defined gesturs from specified file
/// </summary>
/// <param name="sourcePath">Path to the file containing user defined gestures</param>
public static void Load(string sourcePath)
{
userDefinedGestures.Clear();
if(File.Exists(sourcePath)) {
var xmlDocument = new XmlDocument();
xmlDocument.Load(sourcePath);
foreach(XmlElement bindingInfoNode in xmlDocument.SelectNodes("//InputBindingInfo")) {
var name = bindingInfoNode.Attributes["name"].Value;
var gestures = (InputGestureCollection)new InputGestureCollectionConverter().ConvertFromInvariantString(bindingInfoNode.Attributes["gestures"].Value);
userDefinedGestures[name] = gestures;
}
}
}
/// <summary>
/// Get user defined input binding gestures
/// </summary>
/// <param name="inputBindingInfoName">Input binding name</param>
/// <returns>Gestures assigned to this input binding</returns>
public static InputGestureCollection GetInputBindingGesture(string inputBindingInfoName)
{
InputGestureCollection gestures;
userDefinedGestures.TryGetValue(inputBindingInfoName, out gestures);
return gestures;
}
/// <summary>
/// Set user defined input binding gestures
/// </summary>
/// <param name="inputBindingInfoName">Input binding name</param>
/// <param name="inputGestureCollection">Gesture assigned to this input binding</param>
public static void SetInputBindingGesture(string inputBindingInfoName, InputGestureCollection inputGestureCollection)
{
userDefinedGestures[inputBindingInfoName] = inputGestureCollection;
}
}
}

7
src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj

@ -68,20 +68,21 @@ @@ -68,20 +68,21 @@
<Link>Properties\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="CommandsService\CommandBindingInfo.cs" />
<Compile Include="CommandsService\CommandManager.cs" />
<Compile Include="CommandsService\CommandsService.cs" />
<Compile Include="CommandsService\CommandsRegistry.cs" />
<Compile Include="CommandsService\GesturePlaceHolderRegistry.cs" />
<Compile Include="CommandsService\InputBindingCategory.cs" />
<Compile Include="CommandsService\InputBindingInfo.cs" />
<Compile Include="CommandsService\InputGestureCollectionConverter.cs" />
<Compile Include="CommandsService\InputGestureCollectionExtensions.cs" />
<Compile Include="CommandsService\ManagedCommandBinding.cs" />
<Compile Include="CommandsService\ManagedInputBinding.cs" />
<Compile Include="CommandsService\InputGestureExtensions.cs">
</Compile>
<Compile Include="CommandsService\MultiKeyBinding.cs" />
<Compile Include="CommandsService\MultiKeyGesture.cs" />
<Compile Include="CommandsService\MultiKeyGestureConverter.cs" />
<Compile Include="CommandsService\PartialKeyGesture.cs" />
<Compile Include="CommandsService\PartialKeyGestureConverter.cs" />
<Compile Include="CommandsService\UserDefinedGesturesManager.cs" />
<Compile Include="CommandsService\WpfCommandWrapper.cs" />
<Compile Include="ConditionalSeparator.cs" />
<Compile Include="DropDownButton.cs" />

56
src/Main/ICSharpCode.Core.Presentation/Menu/MenuCommand.cs

@ -82,8 +82,8 @@ namespace ICSharpCode.Core.Presentation @@ -82,8 +82,8 @@ namespace ICSharpCode.Core.Presentation
}
public event EventHandler CanExecuteChanged {
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
add { System.Windows.Input.CommandManager.RequerySuggested += value; }
remove { System.Windows.Input.CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
@ -130,42 +130,54 @@ namespace ICSharpCode.Core.Presentation @@ -130,42 +130,54 @@ namespace ICSharpCode.Core.Presentation
routedCommandText = "Menu item \"" + codon.Properties["label"] + "\"";
}
var routedCommand = CommandsRegistry.GetRoutedUICommand(routedCommandName);
var routedCommand = CommandManager.GetRoutedUICommand(routedCommandName);
if(routedCommand == null) {
routedCommand = CommandsRegistry.RegisterRoutedUICommand(routedCommandName, routedCommandText);
routedCommand = CommandManager.RegisterRoutedUICommand(routedCommandName, routedCommandText);
}
this.Command = routedCommand;
if(!codon.Properties.Contains("command") && (codon.Properties.Contains("link") || codon.Properties.Contains("class"))) {
var commandBindingInfo = new CommandBindingInfo();
commandBindingInfo.AddIn = codon.AddIn;
commandBindingInfo.OwnerTypeName = CommandsRegistry.DefaultContextName;
commandBindingInfo.Class = CommandWrapper.GetCommand(codon, caller, createCommand);
commandBindingInfo.RoutedCommandName = routedCommandName;
commandBindingInfo.IsLazy = true;
var commandBindingInfoName = "MenuCommandBinding_" + routedCommandName + "_" + codon.AddIn.Name + "_" + CommandManager.DefaultContextName;
var commandBindingInfo = CommandManager.GetCommandBindingInfo(commandBindingInfoName);
CommandsRegistry.RegisterCommandBinding(commandBindingInfo);
if(commandBindingInfo == null) {
commandBindingInfo = new CommandBindingInfo();
commandBindingInfo.AddIn = codon.AddIn;
commandBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
commandBindingInfo.CommandInstance = CommandWrapper.GetCommand(codon, caller, createCommand);
commandBindingInfo.RoutedCommandName = routedCommandName;
commandBindingInfo.IsLazy = true;
commandBindingInfo.Name = commandBindingInfoName;
CommandManager.RegisterCommandBinding(commandBindingInfo);
}
}
if(codon.Properties.Contains("shortcut")) {
var shortcut = codon.Properties["shortcut"];
var inputBindingInfo = new InputBindingInfo();
inputBindingInfo.AddIn = codon.AddIn;
inputBindingInfo.Categories.AddRange(CommandsRegistry.RegisterInputBindingCategories("Menu Items"));
inputBindingInfo.OwnerTypeName = CommandsRegistry.DefaultContextName;
inputBindingInfo.RoutedCommandName = routedCommandName;
inputBindingInfo.Gestures = (InputGestureCollection)new InputGestureCollectionConverter().ConvertFromInvariantString(codon.Properties["gestures"]);
CommandsRegistry.RegisterInputBinding(inputBindingInfo);
var inputBindingInfoName = "MenuInputBinding_" + routedCommandName + "_" + codon.AddIn.Name + "_" + CommandManager.DefaultContextName;
var inputBindingInfo = CommandManager.GetInputBindingInfo(inputBindingInfoName);
if(inputBindingInfo == null) {
var shortcut = codon.Properties["shortcut"];
inputBindingInfo = new InputBindingInfo();
inputBindingInfo.AddIn = codon.AddIn;
inputBindingInfo.Categories.AddRange(CommandManager.RegisterInputBindingCategories("Menu Items"));
inputBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
inputBindingInfo.RoutedCommandName = routedCommandName;
inputBindingInfo.Gestures = (InputGestureCollection)new InputGestureCollectionConverter().ConvertFromInvariantString(codon.Properties["gestures"]);
inputBindingInfo.Name = inputBindingInfoName;
CommandManager.RegisterInputBinding(inputBindingInfo);
}
BindingsUpdatedHandler gesturesUpdateHandler = delegate {
var updatedGestures = CommandsRegistry.FindInputGestures(null, null, null, null, routedCommandName);
var updatedGestures = CommandManager.FindInputGestures(null, null, null, null, routedCommandName);
this.InputGestureText = (string)new InputGestureCollectionConverter().ConvertToInvariantString(updatedGestures);
};
gesturesUpdateHandler.Invoke();
CommandsRegistry.RegisterClassInputBindingsUpdateHandler(CommandsRegistry.DefaultContextName, gesturesUpdateHandler);
CommandManager.RegisterClassInputBindingsUpdateHandler(CommandManager.DefaultContextName, gesturesUpdateHandler);
}
}
}

24
src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs

@ -40,22 +40,28 @@ namespace ICSharpCode.Core.Presentation @@ -40,22 +40,28 @@ namespace ICSharpCode.Core.Presentation
routedCommandText = "Menu item \"" + codon.Properties["label"] + "\"";
}
var routedCommand = CommandsRegistry.GetRoutedUICommand(routedCommandName);
var routedCommand = CommandManager.GetRoutedUICommand(routedCommandName);
if(routedCommand == null) {
routedCommand = CommandsRegistry.RegisterRoutedUICommand(routedCommandName, routedCommandText);
routedCommand = CommandManager.RegisterRoutedUICommand(routedCommandName, routedCommandText);
}
this.Command = routedCommand;
if(!codon.Properties.Contains("command") && (codon.Properties.Contains("link") || codon.Properties.Contains("class"))) {
var commandBindingInfo = new CommandBindingInfo();
commandBindingInfo.AddIn = codon.AddIn;
commandBindingInfo.OwnerTypeName = CommandsRegistry.DefaultContextName;
commandBindingInfo.Class = CommandWrapper.GetCommand(codon, caller, createCommand);
commandBindingInfo.RoutedCommandName = routedCommandName;
commandBindingInfo.IsLazy = true;
var commandBindingInfoName = "MenuCommandBinding_" + routedCommandName + "_" + codon.AddIn.Name + "_" + CommandManager.DefaultContextName;
var commandBindingInfo = CommandManager.GetCommandBindingInfo(commandBindingInfoName);
CommandsRegistry.RegisterCommandBinding(commandBindingInfo);
if(commandBindingInfo == null) {
commandBindingInfo = new CommandBindingInfo();
commandBindingInfo.AddIn = codon.AddIn;
commandBindingInfo.OwnerTypeName = CommandManager.DefaultContextName;
commandBindingInfo.CommandInstance = CommandWrapper.GetCommand(codon, caller, createCommand);
commandBindingInfo.RoutedCommandName = routedCommandName;
commandBindingInfo.IsLazy = true;
commandBindingInfo.Name = commandBindingInfoName;
CommandManager.RegisterCommandBinding(commandBindingInfo);
}
}
if (codon.Properties.Contains("icon")) {

278
src/SharpDevelop.sln

@ -6,167 +6,167 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{14A277 @@ -6,167 +6,167 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{14A277
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpRefactoring", "AddIns\Misc\SharpRefactoring\SharpRefactoring.csproj", "{3CA90546-3B4C-4663-9445-C4E9371750A7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceAnalysis", "AddIns\Misc\SourceAnalysis\SourceAnalysis.csproj", "86CE7B3F-6273-4215-9E36-6184D98F854E"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowDesigner", "AddIns\DisplayBindings\WorkflowDesigner\Project\WorkflowDesigner.csproj", "{533F4684-DBA6-4518-B005-C84F22A2DD57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClassDiagram", "ClassDiagram", "{DB137F0B-9B62-4232-AE92-F7BE0280B8D3}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Diagrams", "AddIns\DisplayBindings\ClassDiagram\DiagramRouter\Diagrams.csproj", "{0991423A-DBF6-4C89-B365-A1DF1EB32E42}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassDiagramAddin", "AddIns\DisplayBindings\ClassDiagram\ClassDiagramAddin\ClassDiagramAddin.csproj", "{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegExpTk", "AddIns\Misc\RegExpTk\Project\RegExpTk.csproj", "{64A3E5E6-90BF-47F6-94DF-68C94B62C817}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassCanvas", "AddIns\DisplayBindings\ClassDiagram\ClassCanvas\ClassCanvas.csproj", "{08F772A1-F0BE-433E-8B37-F6522953DB05}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiletypeRegisterer", "AddIns\Misc\FiletypeRegisterer\Project\FiletypeRegisterer.csproj", "{D022A6CE-7438-41E8-AC64-F2DE18EC54C6}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SettingsEditor", "AddIns\DisplayBindings\SettingsEditor\Project\SettingsEditor.csproj", "{85226AFB-CE71-4851-9A75-7EEC663A8E8A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{6604365C-C702-4C10-9BA8-637F1E3D4D0D}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IconEditor", "IconEditor", "{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "AddIns\Misc\Debugger\Debugger.Core\Project\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "AddIns\Misc\Debugger\Debugger.AddIn\Project\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlHelp2", "AddIns\Misc\HtmlHelp2\Project\HtmlHelp2.csproj", "{918487B7-2153-4618-BBB3-344DBDDF2A2A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "AddIns\Misc\AddInManager\Project\AddInManager.csproj", "{F93E52FD-DA66-4CE5-A0CB-BCD902811122}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditorAddIn", "AddIns\DisplayBindings\IconEditor\IconEditorAddIn\IconEditorAddIn.csproj", "{DFB936AD-90EE-4B4F-941E-4F4A636F0D92}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PInvokeAddIn", "AddIns\Misc\PInvokeAddIn\Project\PInvokeAddIn.csproj", "{5EEB99CF-EA2B-4733-80A6-CE9192D68170}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditor", "AddIns\DisplayBindings\IconEditor\IconEditor\IconEditor.csproj", "{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08ce9972-283b-44f4-82fa-966f7dfa6b7a}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{6B717BD1-CD5E-498C-A42E-9E6A4584DC48}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HtmlHelp2JScriptGlobals", "AddIns\Misc\HtmlHelp2\JScriptGlobals\HtmlHelp2JScriptGlobals.vbproj", "{E54A5AD2-418D-4A85-BA5E-CD803DE38715}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEditor", "AddIns\DisplayBindings\ResourceEditor\Project\ResourceEditor.csproj", "{CBC6C247-747B-4908-B09A-4D2E0F640B6B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "AddIns\Misc\SubversionAddIn\Project\SubversionAddIn.csproj", "{17F4D7E0-6933-4C2E-8714-FD7E98D625D5}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HexEditor", "AddIns\DisplayBindings\HexEditor\Project\HexEditor.csproj", "{E618A9CD-A39F-4925-A538-E8A3FEF24E54}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonEdit.AddIn", "AddIns\DisplayBindings\AvalonEdit.AddIn\AvalonEdit.AddIn.csproj", "{0162E499-42D0-409B-AA25-EED21F75336B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ComponentInspector", "ComponentInspector", "{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backends", "Backends", "{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector", "AddIns\Misc\ComponentInspector\ComponentInspector\ComponentInspector.csproj", "{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{e1b288a2-08ee-4318-8bbb-8ab72c69e33e}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.AddIn", "AddIns\Misc\ComponentInspector\ComponentInspector.AddIn\ComponentInspector.AddIn.csproj", "{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.Core", "AddIns\Misc\ComponentInspector\ComponentInspector.Core\ComponentInspector.Core.csproj", "{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit", "AddIns\Misc\ResourceToolkit\Project\ResourceToolkit.csproj", "{461606BD-E824-4D0A-8CBA-01810B1F5E02}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILAsmBinding", "AddIns\BackendBindings\ILAsmBinding\Project\ILAsmBinding.csproj", "{6e59af58-f635-459a-9a35-c9ac41c00339}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectorAddIn", "AddIns\Misc\ReflectorAddIn\ReflectorAddIn\Project\ReflectorAddIn.csproj", "{8AA421C8-D7AF-4957-9F43-5135328ACB24}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backends", "Backends", "{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Python", "Python", "{8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding", "AddIns\BackendBindings\XamlBinding\XamlBinding\XamlBinding.csproj", "{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Build.Tasks", "AddIns\BackendBindings\Python\Python.Build.Tasks\Project\Python.Build.Tasks.csproj", "{D332F2D1-2CF1-43B7-903C-844BD5211A7E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding", "AddIns\BackendBindings\Python\PythonBinding\Project\PythonBinding.csproj", "{8D732610-8FC6-43BA-94C9-7126FD7FE361}"
EndProject
Project("{982E8BC1-ACD7-4dbf-96AB-B2CE67D6A008}") = "FSharpBinding", "AddIns\BackendBindings\FSharp\FSharpBinding\Project\FSharpBinding.fsproj", "{99BAE3A2-C40D-40D2-A7B4-EBB4798F36E4}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Python", "Python", "{8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding", "AddIns\BackendBindings\XamlBinding\XamlBinding\XamlBinding.csproj", "{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PythonBinding", "AddIns\BackendBindings\Python\PythonBinding\Project\PythonBinding.csproj", "{8D732610-8FC6-43BA-94C9-7126FD7FE361}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectorAddIn", "AddIns\Misc\ReflectorAddIn\ReflectorAddIn\Project\ReflectorAddIn.csproj", "{8AA421C8-D7AF-4957-9F43-5135328ACB24}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Build.Tasks", "AddIns\BackendBindings\Python\Python.Build.Tasks\Project\Python.Build.Tasks.csproj", "{D332F2D1-2CF1-43B7-903C-844BD5211A7E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceToolkit", "AddIns\Misc\ResourceToolkit\Project\ResourceToolkit.csproj", "{461606BD-E824-4D0A-8CBA-01810B1F5E02}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBinding", "AddIns\BackendBindings\CSharpBinding\Project\CSharpBinding.csproj", "{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ComponentInspector", "ComponentInspector", "{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBNetBinding", "AddIns\BackendBindings\VBNetBinding\Project\VBNetBinding.csproj", "{BF38FB72-B380-4196-AF8C-95749D726C61}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.Core", "AddIns\Misc\ComponentInspector\ComponentInspector.Core\ComponentInspector.Core.csproj", "{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ILAsmBinding", "AddIns\BackendBindings\ILAsmBinding\Project\ILAsmBinding.csproj", "{6e59af58-f635-459a-9a35-c9ac41c00339}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector.AddIn", "AddIns\Misc\ComponentInspector\ComponentInspector.AddIn\ComponentInspector.AddIn.csproj", "{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "AddIns\BackendBindings\Boo\BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ComponentInspector", "AddIns\Misc\ComponentInspector\ComponentInspector\ComponentInspector.csproj", "{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "AddIns\BackendBindings\Boo\NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeAnalysis", "AddIns\Misc\CodeAnalysis\CodeAnalysis.csproj", "{3EAA45A9-735C-4AC7-A799-947B93EA449D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixBinding", "AddIns\BackendBindings\WixBinding\Project\WixBinding.csproj", "{e1b288a2-08ee-4318-8bbb-8ab72c69e33e}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubversionAddIn", "AddIns\Misc\SubversionAddIn\Project\SubversionAddIn.csproj", "{17F4D7E0-6933-4C2E-8714-FD7E98D625D5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Display Bindings", "Display Bindings", "{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "HtmlHelp2JScriptGlobals", "AddIns\Misc\HtmlHelp2\JScriptGlobals\HtmlHelp2JScriptGlobals.vbproj", "{E54A5AD2-418D-4A85-BA5E-CD803DE38715}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonEdit.AddIn", "AddIns\DisplayBindings\AvalonEdit.AddIn\AvalonEdit.AddIn.csproj", "{0162E499-42D0-409B-AA25-EED21F75336B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "AddIns\Misc\UnitTesting\UnitTesting.csproj", "{1F261725-6318-4434-A1B1-6C70CE4CD324}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HexEditor", "AddIns\DisplayBindings\HexEditor\Project\HexEditor.csproj", "{E618A9CD-A39F-4925-A538-E8A3FEF24E54}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CodeCoverage", "AddIns\Misc\CodeCoverage\Project\CodeCoverage.csproj", "{08ce9972-283b-44f4-82fa-966f7dfa6b7a}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEditor", "AddIns\DisplayBindings\ResourceEditor\Project\ResourceEditor.csproj", "{CBC6C247-747B-4908-B09A-4D2E0F640B6B}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PInvokeAddIn", "AddIns\Misc\PInvokeAddIn\Project\PInvokeAddIn.csproj", "{5EEB99CF-EA2B-4733-80A6-CE9192D68170}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "AddIns\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddInManager", "AddIns\Misc\AddInManager\Project\AddInManager.csproj", "{F93E52FD-DA66-4CE5-A0CB-BCD902811122}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XmlEditor", "AddIns\DisplayBindings\XmlEditor\Project\XmlEditor.csproj", "{6B717BD1-CD5E-498C-A42E-9E6A4584DC48}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HtmlHelp2", "AddIns\Misc\HtmlHelp2\Project\HtmlHelp2.csproj", "{918487B7-2153-4618-BBB3-344DBDDF2A2A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IconEditor", "IconEditor", "{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{6604365C-C702-4C10-9BA8-637F1E3D4D0D}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditor", "AddIns\DisplayBindings\IconEditor\IconEditor\IconEditor.csproj", "{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.AddIn", "AddIns\Misc\Debugger\Debugger.AddIn\Project\Debugger.AddIn.csproj", "{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconEditorAddIn", "AddIns\DisplayBindings\IconEditor\IconEditorAddIn\IconEditorAddIn.csproj", "{DFB936AD-90EE-4B4F-941E-4F4A636F0D92}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Debugger.Core", "AddIns\Misc\Debugger\Debugger.Core\Project\Debugger.Core.csproj", "{1D18D788-F7EE-4585-A23B-34DC8EC63CB8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SettingsEditor", "AddIns\DisplayBindings\SettingsEditor\Project\SettingsEditor.csproj", "{85226AFB-CE71-4851-9A75-7EEC663A8E8A}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiletypeRegisterer", "AddIns\Misc\FiletypeRegisterer\Project\FiletypeRegisterer.csproj", "{D022A6CE-7438-41E8-AC64-F2DE18EC54C6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ClassDiagram", "ClassDiagram", "{DB137F0B-9B62-4232-AE92-F7BE0280B8D3}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RegExpTk", "AddIns\Misc\RegExpTk\Project\RegExpTk.csproj", "{64A3E5E6-90BF-47F6-94DF-68C94B62C817}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassCanvas", "AddIns\DisplayBindings\ClassDiagram\ClassCanvas\ClassCanvas.csproj", "{08F772A1-F0BE-433E-8B37-F6522953DB05}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "AddIns\Misc\StartPage\Project\StartPage.csproj", "{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassDiagramAddin", "AddIns\DisplayBindings\ClassDiagram\ClassDiagramAddin\ClassDiagramAddin.csproj", "{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Diagrams", "AddIns\DisplayBindings\ClassDiagram\DiagramRouter\Diagrams.csproj", "{0991423A-DBF6-4C89-B365-A1DF1EB32E42}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SearchAndReplace", "AddIns\Misc\SearchAndReplace\Project\SearchAndReplace.csproj", "{9196DD8A-B4D4-4780-8742-C5762E547FC2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkflowDesigner", "AddIns\DisplayBindings\WorkflowDesigner\Project\WorkflowDesigner.csproj", "{533F4684-DBA6-4518-B005-C84F22A2DD57}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceAnalysis", "AddIns\Misc\SourceAnalysis\SourceAnalysis.csproj", "86CE7B3F-6273-4215-9E36-6184D98F854E"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpRefactoring", "AddIns\Misc\SharpRefactoring\SharpRefactoring.csproj", "{3CA90546-3B4C-4663-9445-C4E9371750A7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{9421EDF4-9769-4BE9-B5A6-C87DE221D73C}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "Libraries\AvalonDock\AvalonDock.csproj", "{2FF700C2-A38A-48BD-A637-8CAFD4FE6237}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TreeView", "Libraries\SharpTreeView\ICSharpCode.TreeView\ICSharpCode.TreeView.csproj", "{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Build.Tasks", "Libraries\ICSharpCode.Build.Tasks\Project\ICSharpCode.Build.Tasks.csproj", "{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aga.Controls", "Libraries\TreeViewAdv\Aga.Controls\Aga.Controls.csproj", "{E73BB233-D88B-44A7-A98F-D71EE158381D}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.AvalonEdit", "Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj", "{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TreeView", "Libraries\SharpTreeView\ICSharpCode.TreeView\ICSharpCode.TreeView.csproj", "{DDE2A481-8271-4EAC-A330-8FA6A38D13D1}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvalonDock", "Libraries\AvalonDock\AvalonDock.csproj", "{2FF700C2-A38A-48BD-A637-8CAFD4FE6237}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{5A3EBEBA-0560-41C1-966B-23F7D03A5486}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms", "Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj", "{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}"
EndProject
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "Tools\Tools.build", "B13EFF7F-7EA4-4B68-A375-D112105E9182"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Sda", "Main\ICSharpCode.SharpDevelop.Sda\ICSharpCode.SharpDevelop.Sda.csproj", "{80318B5F-A25D-45AB-8A95-EF31D2370A4C}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Widgets", "Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj", "{8035765F-D51F-4A0C-A746-2FD100E19419}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.Dom", "Main\ICSharpCode.SharpDevelop.Dom\Project\ICSharpCode.SharpDevelop.Dom.csproj", "{924EE450-603D-49C1-A8E5-4AFAA31CE6F3}"
Project("{00000000-0000-0000-0000-000000000000}") = "Tools", "Tools\Tools.build", "B13EFF7F-7EA4-4B68-A375-D112105E9182"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.WinForms", "Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj", "{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop.BuildWorker", "Main\ICSharpCode.SharpDevelop.BuildWorker\ICSharpCode.SharpDevelop.BuildWorker.csproj", "{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Presentation", "Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj", "{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -420,74 +420,74 @@ Global @@ -420,74 +420,74 @@ Global
{2FF700C2-A38A-48BD-A637-8CAFD4FE6237}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{CE5B42B7-6E8C-4385-9E97-F4023FC16BF2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{8AA421C8-D7AF-4957-9F43-5135328ACB24} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{461606BD-E824-4D0A-8CBA-01810B1F5E02} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{E54A5AD2-418D-4A85-BA5E-CD803DE38715} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{08ce9972-283b-44f4-82fa-966f7dfa6b7a} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{5EEB99CF-EA2B-4733-80A6-CE9192D68170} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{F93E52FD-DA66-4CE5-A0CB-BCD902811122} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{918487B7-2153-4618-BBB3-344DBDDF2A2A} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{6604365C-C702-4C10-9BA8-637F1E3D4D0D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{D022A6CE-7438-41E8-AC64-F2DE18EC54C6} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{64A3E5E6-90BF-47F6-94DF-68C94B62C817} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
86CE7B3F-6273-4215-9E36-6184D98F854E = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{3CA90546-3B4C-4663-9445-C4E9371750A7} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{e1b288a2-08ee-4318-8bbb-8ab72c69e33e} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{6e59af58-f635-459a-9a35-c9ac41c00339} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{99BAE3A2-C40D-40D2-A7B4-EBB4798F36E4} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{D332F2D1-2CF1-43B7-903C-844BD5211A7E} = {8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8}
{8D732610-8FC6-43BA-94C9-7126FD7FE361} = {8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8}
{533F4684-DBA6-4518-B005-C84F22A2DD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{DB137F0B-9B62-4232-AE92-F7BE0280B8D3} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{6B717BD1-CD5E-498C-A42E-9E6A4584DC48} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{CBC6C247-747B-4908-B09A-4D2E0F640B6B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{E618A9CD-A39F-4925-A538-E8A3FEF24E54} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{4EA396ED-64AD-4AD0-A67A-AB363F3E0C79} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5}
{0162E499-42D0-409B-AA25-EED21F75336B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{DFB936AD-90EE-4B4F-941E-4F4A636F0D92} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{0991423A-DBF6-4C89-B365-A1DF1EB32E42} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{E618A9CD-A39F-4925-A538-E8A3FEF24E54} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{CBC6C247-747B-4908-B09A-4D2E0F640B6B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{6B717BD1-CD5E-498C-A42E-9E6A4584DC48} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{0D37CE59-B0EF-4F3C-B9EB-8557E53A448B} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{85226AFB-CE71-4851-9A75-7EEC663A8E8A} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{DB137F0B-9B62-4232-AE92-F7BE0280B8D3} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{533F4684-DBA6-4518-B005-C84F22A2DD57} = {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79}
{08F772A1-F0BE-433E-8B37-F6522953DB05} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{E73BB233-D88B-44A7-A98F-D71EE158381D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{5A1354DF-4989-4BB4-BC6B-D627C2E9FA13} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{0991423A-DBF6-4C89-B365-A1DF1EB32E42} = {DB137F0B-9B62-4232-AE92-F7BE0280B8D3}
{DC1CCE11-CB91-40FA-9C47-4D9EB5D67BFD} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{DFB936AD-90EE-4B4F-941E-4F4A636F0D92} = {0D37CE59-B0EF-4F3C-B9EB-8557E53A448B}
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{99BAE3A2-C40D-40D2-A7B4-EBB4798F36E4} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{BF38FB72-B380-4196-AF8C-95749D726C61} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{6e59af58-f635-459a-9a35-c9ac41c00339} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{4AC2D5F1-F671-480C-A075-6BF62B3721B2} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{DBCF20A1-BA13-4582-BFA9-74DE4D987B73} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{e1b288a2-08ee-4318-8bbb-8ab72c69e33e} = {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C}
{8D732610-8FC6-43BA-94C9-7126FD7FE361} = {8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8}
{D332F2D1-2CF1-43B7-903C-844BD5211A7E} = {8CF9DB5A-A2F6-4A88-BABA-100912EAF6E8}
{3CA90546-3B4C-4663-9445-C4E9371750A7} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
86CE7B3F-6273-4215-9E36-6184D98F854E = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{64A3E5E6-90BF-47F6-94DF-68C94B62C817} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{D022A6CE-7438-41E8-AC64-F2DE18EC54C6} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{6604365C-C702-4C10-9BA8-637F1E3D4D0D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{918487B7-2153-4618-BBB3-344DBDDF2A2A} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{F93E52FD-DA66-4CE5-A0CB-BCD902811122} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{5EEB99CF-EA2B-4733-80A6-CE9192D68170} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{08ce9972-283b-44f4-82fa-966f7dfa6b7a} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{1F261725-6318-4434-A1B1-6C70CE4CD324} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{E54A5AD2-418D-4A85-BA5E-CD803DE38715} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{17F4D7E0-6933-4C2E-8714-FD7E98D625D5} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{3EAA45A9-735C-4AC7-A799-947B93EA449D} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{461606BD-E824-4D0A-8CBA-01810B1F5E02} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{8AA421C8-D7AF-4957-9F43-5135328ACB24} = {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2}
{000E4F64-5D0D-4EB1-B0BF-1A62ADBC6EAD} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{869951D5-A0D6-4DC6-9F1D-E6B9A12AC446} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{E6F4983F-DE41-4AEC-88E7-1FA9AFB4E6FF} = {BDDDCD01-D2FE-4EAD-9425-4B6B91922C7C}
{1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D}
{2FF700C2-A38A-48BD-A637-8CAFD4FE6237} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
B13EFF7F-7EA4-4B68-A375-D112105E9182 = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{4139CCF6-FB49-4A9D-B2CF-331E9EA3198D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{E73BB233-D88B-44A7-A98F-D71EE158381D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{DDE2A481-8271-4EAC-A330-8FA6A38D13D1} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C}
{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{C3CBC8E3-81D8-4C5B-9941-DCCD12D50B1F} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
B13EFF7F-7EA4-4B68-A375-D112105E9182 = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{80318B5F-A25D-45AB-8A95-EF31D2370A4C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{8035765F-D51F-4A0C-A746-2FD100E19419} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{924EE450-603D-49C1-A8E5-4AFAA31CE6F3} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486}
EndGlobalSection
EndGlobal

Loading…
Cancel
Save