Browse Source

Add options dialog for context actions.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
a45a631ad4
  1. 10
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
  2. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/ExtensionMethods.cs
  3. 3
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeActionProviderDoozer.cs
  4. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin
  5. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
  6. 86
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptionPanelDoozer.cs
  7. 24
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptions.xaml
  8. 56
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptions.xaml.cs
  9. 15
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/EditorActionsProvider.cs
  10. 5
      src/Main/Base/Project/Src/Internal/Doozers/IOptionPanelDescriptor.cs
  11. 2
      src/Main/Base/Project/Src/Project/IProject.cs

10
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin

@ -6,6 +6,8 @@ @@ -6,6 +6,8 @@
<Manifest>
<Identity name = "ICSharpCode.CSharpBinding"/>
<!-- The AvalonEdit dependency is necessary for the context action option page -->
<Dependency addin = "ICSharpCode.AvalonEdit" />
</Manifest>
<Runtime>
@ -116,6 +118,14 @@ @@ -116,6 +118,14 @@
class = "CSharpBinding.CSharpProjectBinding" />
</Path>
<Path path = "/SharpDevelop/Dialogs/OptionsDialog/TextEditorOptions">
<OptionPanel id = "C#"
insertafter = "Highlighting"
label = "C#">
<ContextActionOptionPanel id="ContextActions" path="/SharpDevelop/ViewContent/TextEditor/C#/ContextActions"/>
</OptionPanel>
</Path>
<Path path = "/SharpDevelop/ViewContent/TextEditor/C#/IssueProviders">
<Class id = "ConditionalToNullCoalescingInspector"
class = "ICSharpCode.NRefactory.CSharp.Refactoring.ConditionalToNullCoalescingInspector" />

2
src/AddIns/BackendBindings/CSharpBinding/Project/Src/ExtensionMethods.cs

@ -32,7 +32,7 @@ namespace CSharpBinding @@ -32,7 +32,7 @@ namespace CSharpBinding
var parseInfo = (await ec.GetParseInformationAsync().ConfigureAwait(false)) as CSharpFullParseInformation;
var compilation = await ec.GetCompilationAsync().ConfigureAwait(false);
if (parseInfo != null)
return new CSharpAstResolver(compilation, parseInfo.CompilationUnit, parseInfo.ParsedFile);
return parseInfo.GetResolver(compilation);
else
return new CSharpAstResolver(compilation, new CompilationUnit(), new CSharpParsedFile(ec.FileName));
});

3
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeActionProviderDoozer.cs

@ -76,7 +76,8 @@ namespace CSharpBinding.Refactoring @@ -76,7 +76,8 @@ namespace CSharpBinding.Refactoring
}
public string Category {
get { return attribute.Category; }
get { return string.IsNullOrEmpty(attribute.Category) ? attribute.Title[0].ToString() : attribute.Category; }
// get { return attribute.Category ?? string.Empty; }
}
public bool AllowHiding {

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin

@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
<Import assembly = ":ICSharpCode.AvalonEdit"/>
<Import assembly = "ICSharpCode.AvalonEdit.AddIn.dll">
<Doozer name="SyntaxMode" class="ICSharpCode.AvalonEdit.AddIn.SyntaxModeDoozer"/>
<Doozer name="ContextActionOptionPanel" class="ICSharpCode.AvalonEdit.AddIn.ContextActions.ContextActionOptionPanelDoozer"/>
</Import>
</Runtime>

6
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj

@ -72,6 +72,11 @@ @@ -72,6 +72,11 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Src\ContextActions\ContextActionOptionPanelDoozer.cs" />
<Compile Include="Src\ContextActions\ContextActionOptions.xaml.cs">
<DependentUpon>ContextActionOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\ContextActions\ContextActionsBulbControl.xaml.cs">
<DependentUpon>ContextActionsBulbControl.xaml</DependentUpon>
</Compile>
@ -199,6 +204,7 @@ @@ -199,6 +204,7 @@
<Resource Include="Src\ContextActions\pencil.png" />
</ItemGroup>
<ItemGroup>
<Page Include="Src\ContextActions\ContextActionOptions.xaml" />
<Page Include="Src\ContextActions\ContextActionsBulbControl.xaml" />
<Page Include="Src\ContextActions\ContextActionsControl.xaml" />
<Page Include="Src\ContextActions\ContextActionsHeaderedControl.xaml" />

86
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptionPanelDoozer.cs

@ -0,0 +1,86 @@ @@ -0,0 +1,86 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
{
/// <summary>
/// Creates IOptionPanelDescriptor objects that are used in option dialogs.
/// </summary>
/// <attribute name="path" use="required">
/// AddInTree-path that contains the IContextActionProviders.
/// </attribute>
/// <attribute name="label" use="optional">
/// Caption of the dialog panel.
/// </attribute>
/// <children childTypes="OptionPanel">
/// In the SharpDevelop options, option pages can have subpages by specifying them
/// as children in the AddInTree.
/// </children>
/// <usage>In /SharpDevelop/BackendBindings/ProjectOptions/ and /SharpDevelop/Dialogs/OptionsDialog</usage>
/// <returns>
/// IOptionPanelDescriptor object.
/// </returns>
public class ContextActionOptionPanelDoozer : IDoozer
{
public bool HandleConditions {
get { return false; }
}
public object BuildItem(BuildItemArgs args)
{
return new ContextActionOptionPanelDescriptor(args.Codon);
}
sealed class ContextActionOptionPanelDescriptor : IOptionPanelDescriptor
{
readonly string id;
readonly string label;
readonly string path;
public ContextActionOptionPanelDescriptor(Codon codon)
{
this.id = codon.Id;
this.path = codon.Properties["path"];
this.label = codon.Properties["label"];
if (string.IsNullOrEmpty(label))
label = "Context Actions"; // TODO: Translate
}
public string ID {
get { return this.id; }
}
public string Label {
get { return this.label; }
}
public IEnumerable<IOptionPanelDescriptor> ChildOptionPanelDescriptors {
get { return EmptyList<IOptionPanelDescriptor>.Instance; }
}
IOptionPanel optionPanel;
public IOptionPanel OptionPanel {
get {
if (optionPanel == null) {
var providers = AddInTree.BuildItems<IContextActionProvider>(path, null, false);
optionPanel = new ContextActionOptions(providers.Where(p => p.AllowHiding));
}
return optionPanel;
}
}
public bool HasOptionPanel {
get { return true; }
}
}
}
}

24
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptions.xaml

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
<gui:OptionPanel x:Class="ICSharpCode.AvalonEdit.AddIn.ContextActions.ContextActionOptions"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sd="http://icsharpcode.net/sharpdevelop/core"
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop">
<DockPanel>
<!-- TODO: Translate -->
<CheckBox Name="featureEnabledCheckBox" DockPanel.Dock="Top"
IsChecked="True" Content="Enable context actions" />
<sd:RestrictDesiredSize Margin="0, 4, 0, 0">
<ListBox x:Name="listBox" SelectionMode="Multiple"
ItemContainerStyle="{x:Static sd:GlobalStyles.ListBoxItemFocusHighlightStyle}">
<ListBox.ItemTemplate>
<DataTemplate>
<!-- The checkbox is toggling the actual IsSelected property on the container (ListBoxItem), so it'll update ListBox.SelectedItems -->
<CheckBox Content="{Binding DisplayName}"
IsEnabled="{Binding IsChecked, ElementName=featureEnabledCheckBox}"
IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</sd:RestrictDesiredSize>
</DockPanel>
</gui:OptionPanel>

56
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptions.xaml.cs

@ -0,0 +1,56 @@ @@ -0,0 +1,56 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Refactoring;
namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
{
/// <summary>
/// Interaction logic for ContextActionOptions.xaml
/// </summary>
public partial class ContextActionOptions : OptionPanel
{
readonly IContextActionProvider[] providers;
public ContextActionOptions(IEnumerable<IContextActionProvider> providers)
{
InitializeComponent();
this.providers = providers.ToArray();
listBox.ItemsSource = this.providers;
}
public override void LoadOptions()
{
base.LoadOptions();
EditorActionsProvider.LoadProviderVisibilities(providers);
listBox.UnselectAll();
foreach (var provider in providers) {
if (provider.IsVisible)
listBox.SelectedItems.Add(provider);
}
}
public override bool SaveOptions()
{
foreach (var provider in providers) {
provider.IsVisible = false;
}
foreach (IContextActionProvider provider in listBox.SelectedItems) {
provider.IsVisible = true;
}
EditorActionsProvider.SaveProviderVisibilities(providers);
return base.SaveOptions();
}
}
}

15
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/EditorActionsProvider.cs

@ -24,12 +24,16 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions @@ -24,12 +24,16 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
/// </summary>
const string PropertyServiceKey = "DisabledContextActionProviders";
static List<string> LoadProviderVisibilities()
internal static void LoadProviderVisibilities(IEnumerable<IContextActionProvider> providers)
{
return PropertyService.Get(PropertyServiceKey, new List<string>());
var list = PropertyService.Get(PropertyServiceKey, new List<string>());
var disabledActions = new HashSet<string>(list);
foreach (var provider in providers) {
provider.IsVisible = !(provider.AllowHiding && disabledActions.Contains(provider.ID));
}
}
static void SaveProviderVisibilities(IEnumerable<IContextActionProvider> providers)
internal static void SaveProviderVisibilities(IEnumerable<IContextActionProvider> providers)
{
List<string> disabledProviders = providers.Where(p => !p.IsVisible).Select(p => p.ID).ToList();
PropertyService.Set(PropertyServiceKey, disabledProviders);
@ -50,11 +54,6 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions @@ -50,11 +54,6 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
throw new ArgumentNullException("providers");
this.providers = providers;
this.editorContext = editorContext;
var disabledActions = new HashSet<string>(LoadProviderVisibilities());
foreach (var provider in providers) {
provider.IsVisible = !disabledActions.Contains(provider.ID);
}
}
public Task<IEnumerable<IContextAction>> GetVisibleActionsAsync(CancellationToken cancellationToken)

5
src/Main/Base/Project/Src/Internal/Doozers/IOptionPanelDescriptor.cs

@ -18,10 +18,7 @@ namespace ICSharpCode.SharpDevelop @@ -18,10 +18,7 @@ namespace ICSharpCode.SharpDevelop
/// <value>
/// Returns the label of the dialog panel
/// </value>
string Label {
get;
set;
}
string Label { get; }
/// <summary>
/// The child dialog panels (e.g. for treeviews)

2
src/Main/Base/Project/Src/Project/IProject.cs

@ -213,12 +213,10 @@ namespace ICSharpCode.SharpDevelop.Project @@ -213,12 +213,10 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
bool IsStartable { get; }
/*
/// <summary>
/// Gets project specific properties.
/// </summary>
Properties ProjectSpecificProperties { get; }
*/
/// <summary>
/// Starts the project.

Loading…
Cancel
Save