Browse Source

Add IssueOptions panel.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
5e1642ebd2
  1. 5
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.addin
  2. 18
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
  3. 3
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeActionProviderDoozer.cs
  4. 104
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs
  5. 42
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml
  6. 64
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml.cs
  7. 47
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptionsViewModel.cs
  8. 14
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptions.xaml
  9. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ContextActionOptions.xaml.cs
  10. 19
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs
  11. 18
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceViewModel.cs
  12. 4
      src/Main/Base/Project/Src/Gui/Dialogs/TabbedOptions.cs
  13. 10
      src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml.cs
  14. 3
      src/Main/Base/Project/Src/Internal/Doozers/DefaultOptionPanelDescriptor.cs
  15. 6
      src/Main/Core/Project/Src/Services/PropertyService/Properties.cs
  16. 37
      src/Main/ICSharpCode.Core.Presentation/RestrictDesiredSize.cs
  17. 60
      src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ViewModelBase.cs

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

@ -118,10 +118,13 @@
class = "CSharpBinding.CSharpProjectBinding" /> class = "CSharpBinding.CSharpProjectBinding" />
</Path> </Path>
<Path path = "/SharpDevelop/Dialogs/OptionsDialog/TextEditorOptions"> <Path path = "/SharpDevelop/Dialogs/OptionsDialog/CodingOptions">
<OptionPanel id = "C#" <OptionPanel id = "C#"
insertafter = "Highlighting" insertafter = "Highlighting"
label = "C#"> label = "C#">
<OptionPanel id="Issues"
label="Code inspection"
class="CSharpBinding.Refactoring.IssueOptions"/>
<ContextActionOptionPanel id="ContextActions" path="/SharpDevelop/ViewContent/TextEditor/C#/ContextActions"/> <ContextActionOptionPanel id="ContextActions" path="/SharpDevelop/ViewContent/TextEditor/C#/ContextActions"/>
</OptionPanel> </OptionPanel>
</Path> </Path>

18
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj

@ -66,8 +66,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Configuration\AssemblyInfo.cs" /> <Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\Refactoring\IssueOptions.xaml.cs">
<DependentUpon>IssueOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Refactoring\CSharpContextActionWrapper.cs" /> <Compile Include="Src\Refactoring\CSharpContextActionWrapper.cs" />
<Compile Include="Src\Refactoring\IssueManager.cs" /> <Compile Include="Src\Refactoring\IssueManager.cs" />
<Compile Include="Src\Refactoring\IssueOptionsViewModel.cs" />
<Compile Include="Src\Refactoring\SDScript.cs" /> <Compile Include="Src\Refactoring\SDScript.cs" />
<EmbeddedResource Include="Resources\BuildOptions.xfrm" /> <EmbeddedResource Include="Resources\BuildOptions.xfrm" />
<EmbeddedResource Include="Resources\MyNamespaceSupportForCSharp.cs" /> <EmbeddedResource Include="Resources\MyNamespaceSupportForCSharp.cs" />
@ -129,15 +134,28 @@
<Name>ICSharpCode.Core</Name> <Name>ICSharpCode.Core</Name>
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj">
<Project>{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}</Project>
<Name>ICSharpCode.Core.Presentation</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj"> <ProjectReference Include="..\..\..\..\Main\ICSharpCode.Core.WinForms\ICSharpCode.Core.WinForms.csproj">
<Project>{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}</Project> <Project>{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}</Project>
<Name>ICSharpCode.Core.WinForms</Name> <Name>ICSharpCode.Core.WinForms</Name>
<Private>False</Private> <Private>False</Private>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\..\..\Main\ICSharpCode.SharpDevelop.Widgets\Project\ICSharpCode.SharpDevelop.Widgets.csproj">
<Project>{8035765F-D51F-4A0C-A746-2FD100E19419}</Project>
<Name>ICSharpCode.SharpDevelop.Widgets</Name>
<Private>False</Private>
</ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Src\Completion" /> <Folder Include="Src\Completion" />
<Folder Include="Src\Refactoring" /> <Folder Include="Src\Refactoring" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Page Include="Src\Refactoring\IssueOptions.xaml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project> </Project>

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

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

104
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs

@ -7,10 +7,12 @@ using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using CSharpBinding.Parser; using CSharpBinding.Parser;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Refactoring; using ICSharpCode.NRefactory.CSharp.Refactoring;
using ICSharpCode.NRefactory.Editor; using ICSharpCode.NRefactory.Editor;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
@ -25,8 +27,65 @@ namespace CSharpBinding.Refactoring
/// </summary> /// </summary>
public class IssueManager : IDisposable, IContextActionProvider public class IssueManager : IDisposable, IContextActionProvider
{ {
static readonly Lazy<IList<ICodeIssueProvider>> issueProviders = new Lazy<IList<ICodeIssueProvider>>( static readonly Lazy<IReadOnlyList<IssueProvider>> issueProviders = new Lazy<IReadOnlyList<IssueProvider>>(
() => AddInTree.BuildItems<ICodeIssueProvider>("/SharpDevelop/ViewContent/TextEditor/C#/IssueProviders", null, false)); () => AddInTree.BuildItems<ICodeIssueProvider>("/SharpDevelop/ViewContent/TextEditor/C#/IssueProviders", null, false)
.Select(p => new IssueProvider(p)).ToList());
internal static IReadOnlyList<IssueProvider> IssueProviders {
get { return issueProviders.Value; }
}
internal class IssueProvider
{
readonly ICodeIssueProvider provider;
public readonly Type ProviderType;
public readonly IssueDescriptionAttribute Attribute;
public IssueProvider(ICodeIssueProvider provider)
{
if (provider == null)
throw new ArgumentNullException("provider");
this.provider = provider;
this.ProviderType = provider.GetType();
var attributes = ProviderType.GetCustomAttributes(typeof(IssueDescriptionAttribute), true);
if (attributes.Length == 1)
this.Attribute = (IssueDescriptionAttribute)attributes[0];
}
public Severity DefaultSeverity {
get { return Attribute != null ? Attribute.Severity : Severity.Hint; }
}
public IssueMarker DefaultMarker {
get { return Attribute != null ? Attribute.IssueMarker : IssueMarker.Underline; }
}
public IEnumerable<CodeIssue> GetIssues(BaseRefactoringContext context)
{
return provider.GetIssues(context);
}
}
public static IReadOnlyDictionary<Type, Severity> GetIssueSeveritySettings()
{
// TODO: cache the result
var dict = new Dictionary<Type, Severity>();
var prop = PropertyService.Get("CSharpIssueSeveritySettings", new Properties());
foreach (var provider in issueProviders.Value) {
dict[provider.ProviderType] = prop.Get(provider.ProviderType.FullName, provider.DefaultSeverity);
}
return dict;
}
public static void SetIssueSeveritySettings(IReadOnlyDictionary<Type, Severity> dict)
{
var prop = new Properties();
foreach (var pair in dict) {
prop.Set(pair.Key.FullName, pair.Value);
}
PropertyService.Set("CSharpIssueSeveritySettings", prop);
}
readonly ITextEditor editor; readonly ITextEditor editor;
readonly ITextMarkerService markerService; readonly ITextMarkerService markerService;
@ -50,14 +109,15 @@ namespace CSharpBinding.Refactoring
sealed class InspectionTag sealed class InspectionTag
{ {
readonly IssueManager manager; readonly IssueManager manager;
public readonly ICodeIssueProvider Provider; public readonly IssueProvider Provider;
public readonly ITextSourceVersion InspectedVersion; public readonly ITextSourceVersion InspectedVersion;
public readonly string Description; public readonly string Description;
public readonly int StartOffset; public readonly int StartOffset;
public readonly int EndOffset; public readonly int EndOffset;
public readonly IReadOnlyList<IContextAction> Actions; public readonly IReadOnlyList<IContextAction> Actions;
public readonly Severity Severity;
public InspectionTag(IssueManager manager, ICodeIssueProvider provider, ITextSourceVersion inspectedVersion, string description, int startOffset, int endOffset, IEnumerable<CodeAction> actions) public InspectionTag(IssueManager manager, IssueProvider provider, ITextSourceVersion inspectedVersion, string description, int startOffset, int endOffset, Severity severity, IEnumerable<CodeAction> actions)
{ {
this.manager = manager; this.manager = manager;
this.Provider = provider; this.Provider = provider;
@ -65,6 +125,7 @@ namespace CSharpBinding.Refactoring
this.Description = description; this.Description = description;
this.StartOffset = startOffset; this.StartOffset = startOffset;
this.EndOffset = endOffset; this.EndOffset = endOffset;
this.Severity = severity;
this.Actions = actions.Select(Wrap).ToList(); this.Actions = actions.Select(Wrap).ToList();
} }
@ -105,11 +166,34 @@ namespace CSharpBinding.Refactoring
return; return;
marker = markerService.Create(startOffset, endOffset - startOffset); marker = markerService.Create(startOffset, endOffset - startOffset);
marker.ToolTip = this.Description; marker.ToolTip = this.Description;
marker.MarkerType = TextMarkerType.SquigglyUnderline; switch (Provider.DefaultMarker) {
marker.MarkerColor = Colors.Blue; case IssueMarker.Underline:
Color underlineColor = GetColor(this.Severity);
underlineColor.A = 186;
marker.MarkerType = TextMarkerType.SquigglyUnderline;
marker.MarkerColor = underlineColor;
break;
case IssueMarker.GrayOut:
marker.ForegroundColor = SystemColors.GrayTextColor;
break;
}
marker.Tag = this; marker.Tag = this;
} }
static Color GetColor(Severity severity)
{
switch (severity) {
case Severity.Error:
return Colors.Red;
case Severity.Warning:
return Colors.Orange;
case Severity.Suggestion:
return Colors.Green;
default:
return Colors.Blue;
}
}
public void RemoveMarker() public void RemoveMarker()
{ {
if (marker != null) { if (marker != null) {
@ -163,7 +247,14 @@ namespace CSharpBinding.Refactoring
var compilation = ParserService.GetCompilationForFile(parseInfo.FileName); var compilation = ParserService.GetCompilationForFile(parseInfo.FileName);
var resolver = parseInfo.GetResolver(compilation); var resolver = parseInfo.GetResolver(compilation);
var context = new SDRefactoringContext(textSource, resolver, new TextLocation(0, 0), 0, 0, cancellationToken); var context = new SDRefactoringContext(textSource, resolver, new TextLocation(0, 0), 0, 0, cancellationToken);
var settings = GetIssueSeveritySettings();
foreach (var issueProvider in issueProviders.Value) { foreach (var issueProvider in issueProviders.Value) {
Severity severity;
if (!settings.TryGetValue(issueProvider.ProviderType, out severity))
severity = Severity.Hint;
if (severity == Severity.None)
continue;
foreach (var issue in issueProvider.GetIssues(context)) { foreach (var issue in issueProvider.GetIssues(context)) {
results.Add(new InspectionTag( results.Add(new InspectionTag(
this, this,
@ -172,6 +263,7 @@ namespace CSharpBinding.Refactoring
issue.Desription, issue.Desription,
context.GetOffset(issue.Start), context.GetOffset(issue.Start),
context.GetOffset(issue.End), context.GetOffset(issue.End),
severity,
issue.Action != null ? new [] { issue.Action } : new CodeAction[0])); issue.Action != null ? new [] { issue.Action } : new CodeAction[0]));
} }
} }

42
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml

@ -0,0 +1,42 @@
<gui:OptionPanel x:Class="CSharpBinding.Refactoring.IssueOptions"
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:nr="clr-namespace:ICSharpCode.NRefactory.CSharp;assembly=ICSharpCode.NRefactory.CSharp"
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop">
<DockPanel>
<!-- TODO: Translate -->
<CheckBox Name="featureEnabledCheckBox" DockPanel.Dock="Top"
IsEnabled="False"
IsChecked="True" Content="Enable code inspection" />
<sd:RestrictDesiredSize Margin="0, 4, 0, 0">
<ListBox Name="listBox"
HorizontalContentAlignment="Stretch"
IsEnabled="{Binding IsChecked, ElementName=featureEnabledCheckBox}">
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel>
<ComboBox DockPanel.Dock="Right"
MinWidth="85"
VerticalAlignment="Center"
gui:EnumBinding.EnumType="{x:Type nr:Severity}"
SelectedValue="{Binding Severity}"/>
<sd:RestrictDesiredSize RestrictHeight="False" MinWidth="150">
<TextBlock Text="{Binding DisplayName}" ToolTip="{Binding ToolTip}" TextWrapping="WrapWithOverflow" />
</sd:RestrictDesiredSize>
</DockPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate DataType="Group">
<TextBlock FontWeight="Bold" Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
</sd:RestrictDesiredSize>
</DockPanel>
</gui:OptionPanel>

64
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml.cs

@ -0,0 +1,64 @@
// 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.Collections.ObjectModel;
using System.ComponentModel;
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.NRefactory.CSharp;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Refactoring;
namespace CSharpBinding.Refactoring
{
/// <summary>
/// Interaction logic for IssueOptions.xaml
/// </summary>
public partial class IssueOptions : OptionPanel
{
ObservableCollection<IssueOptionsViewModel> viewModels;
public IssueOptions()
{
InitializeComponent();
viewModels = new ObservableCollection<IssueOptionsViewModel>(
from p in IssueManager.IssueProviders
where p.Attribute != null
select new IssueOptionsViewModel(p.ProviderType, p.Attribute)
);
ICollectionView view = CollectionViewSource.GetDefaultView(viewModels);
if (viewModels.Any(p => !string.IsNullOrEmpty(p.Category)))
view.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
listBox.ItemsSource = view;
}
public override void LoadOptions()
{
base.LoadOptions();
var settings = IssueManager.GetIssueSeveritySettings();
foreach (var m in viewModels) {
Severity severity;
if (settings.TryGetValue(m.ProviderType, out severity))
m.Severity = severity;
}
}
public override bool SaveOptions()
{
Dictionary<Type, Severity> dict = new Dictionary<Type, Severity>();
foreach (var m in viewModels) {
dict[m.ProviderType] = m.Severity;
}
IssueManager.SetIssueSeveritySettings(dict);
return base.SaveOptions();
}
}
}

47
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptionsViewModel.cs

@ -0,0 +1,47 @@
// 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.ComponentModel;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.SharpDevelop.Widgets;
namespace CSharpBinding.Refactoring
{
public class IssueOptionsViewModel : ViewModelBase
{
readonly Type providerType;
readonly IssueDescriptionAttribute attribute;
public IssueOptionsViewModel(Type providerType, IssueDescriptionAttribute attribute)
{
this.providerType = providerType;
this.attribute = attribute;
this.Severity = attribute.Severity;
}
public Type ProviderType {
get { return providerType; }
}
// TODO: Translate
public string DisplayName {
get { return attribute.Title; }
}
public string ToolTip {
get { return attribute.Description; }
}
public string Category {
get { return attribute.Category; }
}
Severity severity;
public Severity Severity {
get { return severity; }
set { SetAndNotifyPropertyChanged(ref severity, value); }
}
}
}

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

@ -6,18 +6,28 @@
<DockPanel> <DockPanel>
<!-- TODO: Translate --> <!-- TODO: Translate -->
<CheckBox Name="featureEnabledCheckBox" DockPanel.Dock="Top" <CheckBox Name="featureEnabledCheckBox" DockPanel.Dock="Top"
IsEnabled="False"
IsChecked="True" Content="Enable context actions" /> IsChecked="True" Content="Enable context actions" />
<sd:RestrictDesiredSize Margin="0, 4, 0, 0"> <sd:RestrictDesiredSize Margin="0, 4, 0, 0">
<ListBox x:Name="listBox" SelectionMode="Multiple" <ListBox Name="listBox" SelectionMode="Multiple"
IsEnabled="{Binding IsChecked, ElementName=featureEnabledCheckBox}"
ItemContainerStyle="{x:Static sd:GlobalStyles.ListBoxItemFocusHighlightStyle}"> ItemContainerStyle="{x:Static sd:GlobalStyles.ListBoxItemFocusHighlightStyle}">
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<!-- The checkbox is toggling the actual IsSelected property on the container (ListBoxItem), so it'll update ListBox.SelectedItems --> <!-- The checkbox is toggling the actual IsSelected property on the container (ListBoxItem), so it'll update ListBox.SelectedItems -->
<CheckBox Content="{Binding DisplayName}" <CheckBox Content="{Binding DisplayName}"
IsEnabled="{Binding IsChecked, ElementName=featureEnabledCheckBox}"
IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" /> IsChecked="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" />
</DataTemplate> </DataTemplate>
</ListBox.ItemTemplate> </ListBox.ItemTemplate>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate DataType="Group">
<TextBlock FontWeight="Bold" Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox> </ListBox>
</sd:RestrictDesiredSize> </sd:RestrictDesiredSize>
</DockPanel> </DockPanel>

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

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Windows; using System.Windows;
@ -27,7 +28,10 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions
{ {
InitializeComponent(); InitializeComponent();
this.providers = providers.ToArray(); this.providers = providers.ToArray();
listBox.ItemsSource = this.providers; ICollectionView view = CollectionViewSource.GetDefaultView(this.providers);
if (this.providers.Any(p => !string.IsNullOrEmpty(p.Category)))
view.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
listBox.ItemsSource = view;
} }
public override void LoadOptions() public override void LoadOptions()

19
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AddServiceReferenceViewModel.cs

@ -256,7 +256,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return title; } get { return title; }
set { set {
title = value; title = value;
base.RaisePropertyChanged(() => Title); OnPropertyChanged();
} }
} }
@ -268,7 +268,8 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return discoverButtonContent; } get { return discoverButtonContent; }
set { set {
discoverButtonContent = value; discoverButtonContent = value;
base.RaisePropertyChanged(() => DiscoverButtonContent); OnPropertyChanged();
OnPropertyChanged();
} }
} }
@ -276,7 +277,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return mruServices; } get { return mruServices; }
set { set {
mruServices = value; mruServices = value;
base.RaisePropertyChanged(() => MruServices); OnPropertyChanged();
} }
} }
@ -284,7 +285,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return selectedService; } get { return selectedService; }
set { set {
selectedService = value; selectedService = value;
base.RaisePropertyChanged(() => SelectedService); OnPropertyChanged();
} }
} }
@ -292,7 +293,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return items; } get { return items; }
set { set {
items = value; items = value;
base.RaisePropertyChanged(() => ServiceItems); OnPropertyChanged();
} }
} }
@ -301,7 +302,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
set { set {
myItem = value; myItem = value;
UpdateListView(); UpdateListView();
base.RaisePropertyChanged(() => ServiceItem); OnPropertyChanged();
} }
} }
@ -309,7 +310,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return serviceDescriptionMessage; } get { return serviceDescriptionMessage; }
set { set {
serviceDescriptionMessage = value; serviceDescriptionMessage = value;
base.RaisePropertyChanged(() => ServiceDescriptionMessage); OnPropertyChanged();
} }
} }
@ -317,7 +318,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return defaultNameSpace; } get { return defaultNameSpace; }
set { set {
defaultNameSpace = value; defaultNameSpace = value;
base.RaisePropertyChanged(() => DefaultNameSpace); OnPropertyChanged();
} }
} }
@ -325,7 +326,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return twoValues; } get { return twoValues; }
set { set {
twoValues = value; twoValues = value;
base.RaisePropertyChanged(() => TwoValues); OnPropertyChanged();
} }
} }

18
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/AdvancedServiceViewModel.cs

@ -85,7 +85,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return selectedModifier; } get { return selectedModifier; }
set { set {
selectedModifier = value; selectedModifier = value;
base.RaisePropertyChanged(() => SelectedModifier); OnPropertyChanged();
} }
} }
@ -95,7 +95,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return generateAsyncOperations; } get { return generateAsyncOperations; }
set { set {
generateAsyncOperations = value; generateAsyncOperations = value;
base.RaisePropertyChanged(() => GenerateAsyncOperations); OnPropertyChanged();
} }
} }
@ -105,7 +105,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return generateMessageContract; } get { return generateMessageContract; }
set { set {
generateMessageContract = value; generateMessageContract = value;
base.RaisePropertyChanged(() => GenerateMessageContract); OnPropertyChanged();
} }
} }
@ -115,7 +115,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return collectionType; } get { return collectionType; }
set { set {
collectionType = value; collectionType = value;
base.RaisePropertyChanged(() => CollectionType); OnPropertyChanged();
} }
} }
@ -125,7 +125,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return dictionaryCollectionType; } get { return dictionaryCollectionType; }
set { set {
dictionaryCollectionType = value; dictionaryCollectionType = value;
base.RaisePropertyChanged(() => DictionaryCollectionType); OnPropertyChanged();
} }
} }
@ -136,7 +136,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
set { set {
useReferencedAssemblies = value; useReferencedAssemblies = value;
ReuseTypes = useReferencedAssemblies; ReuseTypes = useReferencedAssemblies;
base.RaisePropertyChanged(() => UseReferencedAssemblies); OnPropertyChanged();
} }
} }
@ -146,7 +146,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return reuseTypes; } get { return reuseTypes; }
set { set {
reuseTypes = value; reuseTypes = value;
base.RaisePropertyChanged(() => ReuseTypes); OnPropertyChanged();
} }
} }
@ -157,7 +157,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
set { set {
reuseReferencedTypes = value; reuseReferencedTypes = value;
ListViewEnable = value; ListViewEnable = value;
base.RaisePropertyChanged(() => ReuseReferencedTypes); OnPropertyChanged();
} }
} }
@ -167,7 +167,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference
get { return listViewEnable; } get { return listViewEnable; }
set { set {
listViewEnable = value; listViewEnable = value;
base.RaisePropertyChanged(() => ListViewEnable); OnPropertyChanged();
} }
} }

4
src/Main/Base/Project/Src/Gui/Dialogs/TabbedOptions.cs

@ -28,9 +28,7 @@ namespace ICSharpCode.SharpDevelop.Gui
if (descriptor.HasOptionPanel) { if (descriptor.HasOptionPanel) {
this.Items.Add(new OptionTabPage(this, descriptor)); this.Items.Add(new OptionTabPage(this, descriptor));
} }
if (descriptor.ChildOptionPanelDescriptors != null) { AddOptionPanels(descriptor.ChildOptionPanelDescriptors);
AddOptionPanels(descriptor.ChildOptionPanelDescriptors);
}
} }
} }
OnIsDirtyChanged(null, null); OnIsDirtyChanged(null, null);

10
src/Main/Base/Project/Src/Gui/Dialogs/TreeViewOptionsDialog.xaml.cs

@ -136,7 +136,7 @@ namespace ICSharpCode.SharpDevelop.Gui
get { get {
if (IsActive) if (IsActive)
return PresentationResourceService.GetBitmapSource("Icons.16x16.SelectionArrow"); return PresentationResourceService.GetBitmapSource("Icons.16x16.SelectionArrow");
if (OptionPanelDescriptor.ChildOptionPanelDescriptors != null) { if (OptionPanelDescriptor.ChildOptionPanelDescriptors.Any()) {
if (IsExpanded) if (IsExpanded)
return PresentationResourceService.GetBitmapSource("Icons.16x16.OpenFolderBitmap"); return PresentationResourceService.GetBitmapSource("Icons.16x16.OpenFolderBitmap");
else else
@ -152,12 +152,8 @@ namespace ICSharpCode.SharpDevelop.Gui
public List<OptionPanelNode> Children { public List<OptionPanelNode> Children {
get { get {
if (children == null) { if (children == null) {
if (OptionPanelDescriptor.ChildOptionPanelDescriptors != null) { children = OptionPanelDescriptor.ChildOptionPanelDescriptors
children = OptionPanelDescriptor.ChildOptionPanelDescriptors .Select(op => new OptionPanelNode(op, this)).ToList();
.Select(op => new OptionPanelNode(op, this)).ToList();
} else {
children = new List<OptionPanelNode>();
}
} }
return children; return children;
} }

3
src/Main/Base/Project/Src/Internal/Doozers/DefaultOptionPanelDescriptor.cs

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core; using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop namespace ICSharpCode.SharpDevelop
@ -23,7 +24,7 @@ namespace ICSharpCode.SharpDevelop
public IEnumerable<IOptionPanelDescriptor> ChildOptionPanelDescriptors { public IEnumerable<IOptionPanelDescriptor> ChildOptionPanelDescriptors {
get { get {
return optionPanelDescriptors; return optionPanelDescriptors ?? Enumerable.Empty<IOptionPanelDescriptor>();
} }
} }

6
src/Main/Core/Project/Src/Services/PropertyService/Properties.cs

@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq;
using System.Text; using System.Text;
using System.Xml; using System.Xml;
using System.Xml.Serialization; using System.Xml.Serialization;
@ -72,10 +73,7 @@ namespace ICSharpCode.Core
{ {
get { get {
lock (properties) { lock (properties) {
List<string> ret = new List<string>(); return properties.Keys.ToArray();
foreach (KeyValuePair<string, object> property in properties)
ret.Add(property.Key);
return ret.ToArray();
} }
} }
} }

37
src/Main/ICSharpCode.Core.Presentation/RestrictDesiredSize.cs

@ -14,19 +14,48 @@ namespace ICSharpCode.Core.Presentation
/// </summary> /// </summary>
public class RestrictDesiredSize : Decorator public class RestrictDesiredSize : Decorator
{ {
Size lastArrangeSize = new Size(double.NaN, double.NaN); public static readonly DependencyProperty RestrictWidthProperty =
DependencyProperty.Register("RestrictWidth", typeof(bool), typeof(RestrictDesiredSize),
new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange));
public bool RestrictWidth {
get { return (bool)GetValue(RestrictWidthProperty); }
set { SetValue(RestrictWidthProperty, value); }
}
public static readonly DependencyProperty RestrictHeightProperty =
DependencyProperty.Register("RestrictHeight", typeof(bool), typeof(RestrictDesiredSize),
new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsArrange));
public bool RestrictHeight {
get { return (bool)GetValue(RestrictHeightProperty); }
set { SetValue(RestrictHeightProperty, value); }
}
Size lastArrangeSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
Size lastMeasureSize = new Size(double.NaN, double.NaN);
protected override Size MeasureOverride(Size constraint) protected override Size MeasureOverride(Size constraint)
{ {
return new Size(0, 0); if (RestrictWidth && RestrictHeight)
return new Size(0, 0);
if (RestrictWidth && constraint.Width > lastArrangeSize.Width)
constraint.Width = lastArrangeSize.Width;
if (RestrictHeight && constraint.Height > lastArrangeSize.Height)
constraint.Height = lastArrangeSize.Height;
lastMeasureSize = constraint;
Size baseSize = base.MeasureOverride(constraint);
return new Size(RestrictWidth ? 0 : baseSize.Width, RestrictHeight ? 0 : baseSize.Height);
} }
protected override Size ArrangeOverride(Size arrangeSize) protected override Size ArrangeOverride(Size arrangeSize)
{ {
if (lastArrangeSize != arrangeSize) { if (lastMeasureSize != arrangeSize) {
lastArrangeSize = arrangeSize; lastMeasureSize = arrangeSize;
base.MeasureOverride(arrangeSize); base.MeasureOverride(arrangeSize);
} }
lastArrangeSize = arrangeSize;
return base.ArrangeOverride(arrangeSize); return base.ArrangeOverride(arrangeSize);
} }
} }

60
src/Main/ICSharpCode.SharpDevelop.Widgets/Project/ViewModelBase.cs

@ -2,73 +2,35 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
namespace ICSharpCode.SharpDevelop.Widgets namespace ICSharpCode.SharpDevelop.Widgets
{ {
/// <summary> /// <summary>
/// Description of ViewModelBase. /// Base class for view models; implements INotifyPropertyChanged.
/// </summary> /// </summary>
public class ViewModelBase:INotifyPropertyChanged public class ViewModelBase : INotifyPropertyChanged
{ {
public ViewModelBase()
{
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e) protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ {
var handler = this.PropertyChanged; var handler = this.PropertyChanged;
if (handler != null) if (handler != null) {
{ handler(this, new PropertyChangedEventArgs(propertyName));
handler(this, e);
} }
} }
protected void SetAndNotifyPropertyChanged<T>(ref T field, T newValue, [CallerMemberName] string propertyName = null)
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
{
var propertyName = ExtractPropertyName(propertyExpresssion);
this.RaisePropertyChanged(propertyName);
}
protected void RaisePropertyChanged(String propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
private static String ExtractPropertyName<T>(Expression<Func<T>> propertyExpresssion)
{ {
if (propertyExpresssion == null) if (!EqualityComparer<T>.Default.Equals(field, newValue)) {
{ field = newValue;
throw new ArgumentNullException("propertyExpresssion"); OnPropertyChanged(propertyName);
}
var memberExpression = propertyExpresssion.Body as MemberExpression;
if (memberExpression == null)
{
throw new ArgumentException("The expression is not a member access expression.", "propertyExpresssion");
} }
var property = memberExpression.Member as PropertyInfo;
if (property == null)
{
throw new ArgumentException("The member access expression does not access a property.", "propertyExpresssion");
}
var getMethod = property.GetGetMethod(true);
if (getMethod.IsStatic)
{
throw new ArgumentException("The referenced property is a static property.", "propertyExpresssion");
}
return memberExpression.Member.Name;
} }
} }
} }

Loading…
Cancel
Save