Browse Source

Merge remote-tracking branch 'origin/4.x'

pull/315/head
Daniel Grunwald 12 years ago
parent
commit
80029d841f
  1. 3
      .gitattributes
  2. 1304
      src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs
  3. 164
      src/AddIns/Debugger/Debugger.Core/Breakpoint.cs
  4. 16
      src/AddIns/Debugger/Debugger.Core/Interop/MetaData.cs
  5. 1252
      src/AddIns/Debugger/Debugger.Core/Process.cs
  6. 558
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
  7. 106
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/ThumbnailViewPad.cs
  8. 8
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs
  9. 656
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs
  10. 158
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/NameScopeHelper.cs
  11. 1060
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs
  12. 100
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/ExtensionMethods.cs
  13. 840
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs
  14. 3
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  15. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  16. 11
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs
  17. 1
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs
  18. 4
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectProperty.cs
  19. 27
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Reference.cs
  20. 14
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/References.cs
  21. 1
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs
  22. 11
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs
  23. 15
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs
  24. 35
      src/AddIns/Misc/PackageManagement/Project/Src/RemovedPackageReferenceMonitor.cs
  25. 24
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/GlobalMSBuildProjectCollection.cs
  26. 55
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/MSBuildProjectPropertiesMergeResult.cs
  27. 95
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/MSBuildProjectPropertiesMerger.cs
  28. 21
      src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManager.cs
  29. BIN
      src/AddIns/Misc/PackageManagement/RequiredLibraries/Microsoft.Web.XmlTransform.dll
  30. BIN
      src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Console.Types.dll
  31. BIN
      src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Core.dll
  32. BIN
      src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.exe
  33. 4
      src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Configuration/AssemblyInfo.vb
  34. 1
      src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/ProjectItem.vb
  35. 3
      src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/Reference.vb
  36. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  37. 26
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs
  38. 30
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs
  39. 60
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectPropertyTests.cs
  40. 70
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/Reference3Tests.cs
  41. 20
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ReferencesTests.cs
  42. 9
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs
  43. 23
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs
  44. 46
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs
  45. 249
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/MSBuildProjectPropertiesMergerTests.cs
  46. 132
      src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs
  47. 6
      src/Main/Base/Project/Src/Gui/Components/SideBar/TextEditorSideBar.cs
  48. 13
      src/Main/Base/Project/Src/Project/TargetFramework.cs
  49. 33
      src/Main/Base/Project/Util/DotnetDetection.cs
  50. 2
      src/Setup/Chocolatey/Tools/chocolateyInstall.ps1
  51. 2
      src/Setup/Chocolatey/sharpdevelop.nuspec

3
.gitattributes vendored

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
*.cs text diff=csharp
*.sln text eol=crlf
*.csproj text eol=crlf

1304
src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs

File diff suppressed because it is too large Load Diff

164
src/AddIns/Debugger/Debugger.Core/Breakpoint.cs

@ -1,82 +1,82 @@ @@ -1,82 +1,82 @@
// 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.Runtime.InteropServices;
using Debugger.Interop.CorDebug;
namespace Debugger
{
public class Breakpoint: DebuggerObject
{
bool enabled;
List<ICorDebugFunctionBreakpoint> corBreakpoints = new List<ICorDebugFunctionBreakpoint>();
[Tests.Ignore]
public string FileName { get; private set; }
public int Line { get; set; }
public int Column { get; set; }
public byte[] Checksum { get; private set; }
public bool IsEnabled {
get { return enabled; }
set {
enabled = value;
foreach(ICorDebugFunctionBreakpoint corBreakpoint in corBreakpoints) {
try {
corBreakpoint.Activate(enabled ? 1 : 0);
} catch(COMException e) {
// Sometimes happens, but we had not repro yet.
// 0x80131301: Process was terminated.
if ((uint)e.ErrorCode == 0x80131301)
continue;
throw;
}
}
}
}
public bool IsSet {
get { return corBreakpoints.Count > 0; }
}
internal Breakpoint()
{
}
internal Breakpoint(string fileName, int line, int column, bool enabled)
{
this.FileName = fileName;
this.Line = line;
this.Column = column;
this.enabled = enabled;
}
internal bool IsOwnerOf(ICorDebugBreakpoint breakpoint)
{
foreach(ICorDebugFunctionBreakpoint corFunBreakpoint in corBreakpoints) {
if (((ICorDebugBreakpoint)corFunBreakpoint).Equals(breakpoint)) return true;
}
return false;
}
internal void NotifyDebuggerTerminated()
{
corBreakpoints.Clear();
}
public void SetBreakpoint(Module module)
{
foreach(var symbolSource in module.Process.Debugger.SymbolSources) {
foreach (var seq in symbolSource.GetSequencePoints(module, this.FileName, this.Line, this.Column)) {
ICorDebugFunction corFunction = module.CorModule.GetFunctionFromToken(seq.MethodDefToken);
ICorDebugFunctionBreakpoint corBreakpoint = corFunction.GetILCode().CreateBreakpoint((uint)seq.ILOffset);
corBreakpoint.Activate(enabled ? 1 : 0);
corBreakpoints.Add(corBreakpoint);
}
}
}
}
}
// 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.Runtime.InteropServices;
using Debugger.Interop.CorDebug;
namespace Debugger
{
public class Breakpoint: DebuggerObject
{
bool enabled;
List<ICorDebugFunctionBreakpoint> corBreakpoints = new List<ICorDebugFunctionBreakpoint>();
[Tests.Ignore]
public string FileName { get; private set; }
public int Line { get; set; }
public int Column { get; set; }
public byte[] Checksum { get; private set; }
public bool IsEnabled {
get { return enabled; }
set {
enabled = value;
foreach(ICorDebugFunctionBreakpoint corBreakpoint in corBreakpoints) {
try {
corBreakpoint.Activate(enabled ? 1 : 0);
} catch(COMException e) {
// Sometimes happens, but we had not repro yet.
// 0x80131301: Process was terminated.
if ((uint)e.ErrorCode == 0x80131301)
continue;
throw;
}
}
}
}
public bool IsSet {
get { return corBreakpoints.Count > 0; }
}
internal Breakpoint()
{
}
internal Breakpoint(string fileName, int line, int column, bool enabled)
{
this.FileName = fileName;
this.Line = line;
this.Column = column;
this.enabled = enabled;
}
internal bool IsOwnerOf(ICorDebugBreakpoint breakpoint)
{
foreach(ICorDebugFunctionBreakpoint corFunBreakpoint in corBreakpoints) {
if (((ICorDebugBreakpoint)corFunBreakpoint).Equals(breakpoint)) return true;
}
return false;
}
internal void NotifyDebuggerTerminated()
{
corBreakpoints.Clear();
}
public void SetBreakpoint(Module module)
{
foreach(var symbolSource in module.Process.Debugger.SymbolSources) {
foreach (var seq in symbolSource.GetSequencePoints(module, this.FileName, this.Line, this.Column)) {
ICorDebugFunction corFunction = module.CorModule.GetFunctionFromToken(seq.MethodDefToken);
ICorDebugFunctionBreakpoint corBreakpoint = corFunction.GetILCode().CreateBreakpoint((uint)seq.ILOffset);
corBreakpoint.Activate(enabled ? 1 : 0);
corBreakpoints.Add(corBreakpoint);
}
}
}
}
}

16
src/AddIns/Debugger/Debugger.Core/Interop/MetaData.cs

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
// 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)
// 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)
#pragma warning disable 108, 1591
using System;
@ -14,7 +14,7 @@ namespace Debugger.Interop.MetaData @@ -14,7 +14,7 @@ namespace Debugger.Interop.MetaData
{
public uint ridOfField;
public uint ulOffset;
}
}
[System.Flags()]
public enum ClassFieldAttribute: uint
{
@ -46,7 +46,7 @@ namespace Debugger.Interop.MetaData @@ -46,7 +46,7 @@ namespace Debugger.Interop.MetaData
fdHasFieldMarshal = 0x1000, // Field has marshalling information.
fdHasDefault = 0x8000, // Field has default.
fdHasFieldRVA = 0x0100, // Field has RVA.
}
}
public enum CorCallingConvention: uint
{
IMAGE_CEE_CS_CALLCONV_DEFAULT = 0x0,
@ -63,7 +63,7 @@ namespace Debugger.Interop.MetaData @@ -63,7 +63,7 @@ namespace Debugger.Interop.MetaData
IMAGE_CEE_CS_CALLCONV_MASK = 0x0f, // Calling convention is bottom 4 bits
IMAGE_CEE_CS_CALLCONV_HASTHIS = 0x20, // Top bit indicates a 'this' parameter
IMAGE_CEE_CS_CALLCONV_EXPLICITTHIS = 0x40, // This parameter is explicitly in the signature
}
}
public enum CorMethodAttr: uint
{
// member access mask - Use this mask to retrieve accessibility information.
@ -104,7 +104,7 @@ namespace Debugger.Interop.MetaData @@ -104,7 +104,7 @@ namespace Debugger.Interop.MetaData
mdHasSecurity = 0x4000, // Method has security associate with it.
mdRequireSecObject = 0x8000, // Method calls another method containing security code.
}
}
public enum CorTokenType: uint
{
Module = 0x00000000, //
@ -275,4 +275,4 @@ namespace Debugger.Interop.MetaData @@ -275,4 +275,4 @@ namespace Debugger.Interop.MetaData
}
}
#pragma warning restore 108, 1591
#pragma warning restore 108, 1591

1252
src/AddIns/Debugger/Debugger.Core/Process.cs

File diff suppressed because it is too large Load Diff

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

@ -1,280 +1,280 @@ @@ -1,280 +1,280 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{0162E499-42D0-409B-AA25-EED21F75336B}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>Library</OutputType>
<RootNamespace>ICSharpCode.AvalonEdit.AddIn</RootNamespace>
<AssemblyName>ICSharpCode.AvalonEdit.AddIn</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<SourceAnalysisOverrideSettingsFile>C:\Users\Daniel\AppData\Roaming\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis</SourceAnalysisOverrideSettingsFile>
<OutputPath>..\..\..\..\AddIns\DisplayBindings\AvalonEdit\</OutputPath>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<RunCodeAnalysis>False</RunCodeAnalysis>
<CodeAnalysisRules>-Microsoft.Design#CA1014;-Microsoft.Design#CA2210</CodeAnalysisRules>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<Optimize>True</Optimize>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="PresentationCore">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="PresentationFramework">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="PresentationFramework.Aero">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="ReachFramework">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Printing">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Runtime.Serialization">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsFormsIntegration">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Src\ChangeMarkerMargin\ChangeMarkerMargin.cs" />
<Compile Include="Src\ChangeMarkerMargin\DefaultChangeWatcher.cs" />
<Compile Include="Src\ChangeMarkerMargin\DiffControl.xaml.cs">
<DependentUpon>DiffControl.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\ChangeMarkerMargin\DocumentSequence.cs" />
<Compile Include="Src\ChangeMarkerMargin\IChangeWatcher.cs" />
<Compile Include="Src\ChangeMarkerMargin\LineChangeInfo.cs" />
<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>
<Compile Include="Src\ContextActions\ContextActionsBulbPopup.cs" />
<Compile Include="Src\ContextActions\ContextActionsBulbViewModel.cs" />
<Compile Include="Src\ContextActions\ContextActionsControl.xaml.cs">
<DependentUpon>ContextActionsControl.xaml</DependentUpon>
</Compile>
<Compile Include="Src\ContextActions\ContextActionsHeaderedControl.xaml.cs">
<DependentUpon>ContextActionsHeaderedControl.xaml</DependentUpon>
</Compile>
<Compile Include="Src\ContextActions\ContextActionsPopup.cs" />
<Compile Include="Src\ContextActions\ContextActionsRenderer.cs" />
<Compile Include="Src\ContextActions\EditorActionsProvider.cs" />
<Compile Include="Src\ContextActions\FindBaseClasses.cs" />
<Compile Include="Src\ContextActions\FindDerivedClassesOrOverrides.cs" />
<Compile Include="Src\ContextActions\GoToEntityAction.cs" />
<Compile Include="Src\EnhancedScrollBar.cs" />
<Compile Include="Src\HiddenDefinitionRenderer.cs" />
<Compile Include="Src\SyntaxHighlighting\CustomizingHighlighter.cs" />
<Compile Include="Src\SyntaxHighlighting\FixedHighlighter.cs" />
<Compile Include="Src\SyntaxHighlighting\MultiHighlighter.cs" />
<Compile Include="Src\Snippets\CodeSnippetComparer.cs" />
<Compile Include="Src\SyntaxHighlighting\SyntaxModeDoozer.cs" />
<Compile Include="Src\TextMarkerToolTipProvider.cs" />
<Compile Include="Src\Utils.cs" />
<Compile Include="Src\XmlDoc\DocumentationUIBuilder.cs" />
<Compile Include="Src\XmlDoc\XmlDocTooltipProvider.cs" />
<None Include="AvalonEdit.AddIn.addin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<Compile Include="..\..\..\Main\GlobalAssemblyInfo.cs">
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\AvalonEditDisplayBinding.cs" />
<Compile Include="Src\AvalonEditEditorUIService.cs" />
<Compile Include="Src\AvalonEditorControlService.cs" />
<Compile Include="Src\AvalonEditViewContent.cs" />
<Compile Include="Src\BracketHighlightRenderer.cs" />
<Compile Include="Src\CaretReferencesRenderer.cs" />
<Compile Include="Src\ChooseEncodingDialog.xaml.cs">
<DependentUpon>ChooseEncodingDialog.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\CodeCompletionEditorAdapter.cs" />
<Compile Include="Src\CodeEditor.cs" />
<Compile Include="Src\CodeEditorAdapter.cs" />
<Compile Include="Src\CodeEditorView.cs" />
<Compile Include="Src\ExpressionHighlightRenderer.cs" />
<Compile Include="Src\CaretHighlightAdorner.cs" />
<Compile Include="Src\NewLineConsistencyCheck.cs" />
<Compile Include="Src\SearchPanelLocalization.cs" />
<Compile Include="Src\SharpDevelopTextEditor.cs" />
<Compile Include="Src\Commands\FoldingCommands.cs" />
<Compile Include="Src\Commands\SaveFileWithEncoding.cs" />
<Compile Include="Src\Commands\SortOptionsDialog.xaml.cs">
<DependentUpon>SortOptionsDialog.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Commands\SortSelectionCommand.cs" />
<Compile Include="Src\Commands\SurroundWithCommand.cs" />
<Compile Include="Src\CustomCommands.cs" />
<Compile Include="Src\CustomizedHighlightingColor.cs" />
<Compile Include="Src\DocumentPrinter.cs" />
<Compile Include="Src\InlineUIElementGenerator.cs" />
<Compile Include="Src\IconBarManager.cs" />
<Compile Include="Src\IconBarMargin.cs" />
<Compile Include="Src\Options\BehaviorOptions.xaml.cs">
<DependentUpon>BehaviorOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Options\Converters.cs" />
<Compile Include="Src\Options\CustomizedHighlightingItem.cs" />
<Compile Include="Src\Options\GeneralEditorOptions.xaml.cs">
<DependentUpon>GeneralEditorOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Options\CodeEditorOptions.cs" />
<Compile Include="Src\Options\HighlightingOptions.xaml.cs">
<DependentUpon>HighlightingOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Options\IHighlightingItem.cs" />
<Compile Include="Src\Options\NamedColorHighlightingItem.cs" />
<Compile Include="Src\Options\SimpleHighlightingItem.cs" />
<Compile Include="Src\Options\TextViewOptions.xaml.cs">
<DependentUpon>TextViewOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\PrintPreviewViewContent.cs" />
<Compile Include="Src\Snippets\AnchorSnippetElementProvider.cs" />
<Compile Include="Src\Snippets\CodeSnippet.cs" />
<Compile Include="Src\Snippets\CodeSnippetCompletionWindow.cs" />
<Compile Include="Src\Snippets\CodeSnippetGroup.cs" />
<Compile Include="Src\Snippets\DefaultSnippetElementProvider.cs" />
<Compile Include="Src\Snippets\SnippetCompletionItem.cs" />
<Compile Include="Src\Snippets\SnippetManager.cs" />
<Compile Include="Src\Snippets\SnippetOptionPanel.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\ParserFoldingStrategy.cs" />
<Compile Include="Src\QuickClassBrowser.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\SharpDevelopCompletionWindow.cs" />
<Compile Include="Src\SharpDevelopInsightWindow.cs">
</Compile>
<Compile Include="Src\StringToVisibilityConverter.cs" />
<Compile Include="Src\TextMarkerService.cs" />
<EmbeddedResource Include="Resources\IncrementalSearchCursor.cur" />
<EmbeddedResource Include="Resources\ReverseIncrementalSearchCursor.cur" />
<Resource Include="Src\ContextActions\bulb.png" />
<None Include="Src\ContextActions\license.txt" />
<Resource Include="Src\ContextActions\pencil.png" />
</ItemGroup>
<ItemGroup>
<Page Include="Src\ChangeMarkerMargin\DiffControl.xaml" />
<Page Include="Src\ContextActions\ContextActionOptions.xaml" />
<Page Include="Src\ContextActions\ContextActionsBulbControl.xaml" />
<Page Include="Src\ContextActions\ContextActionsControl.xaml" />
<Page Include="Src\ContextActions\ContextActionsHeaderedControl.xaml" />
<Page Include="Src\SharpDevelopCompletionWindow.xaml">
<DependentUpon>SharpDevelopCompletionWindow.cs</DependentUpon>
</Page>
<Page Include="themes\generic.xaml" />
<ProjectReference Include="..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">
<Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project>
<Name>ICSharpCode.AvalonEdit</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory.Xml\ICSharpCode.NRefactory.Xml.csproj">
<Project>{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}</Project>
<Name>ICSharpCode.NRefactory.Xml</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
<Private>False</Private>
</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">
<Project>{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}</Project>
<Name>ICSharpCode.Core.WinForms</Name>
<Private>False</Private>
</ProjectReference>
<Page Include="Src\ChooseEncodingDialog.xaml" />
<Page Include="Src\Commands\SortOptionsDialog.xaml" />
<Page Include="Src\Options\BehaviorOptions.xaml" />
<Page Include="Src\Options\GeneralEditorOptions.xaml" />
<Page Include="Src\Options\HighlightingOptions.xaml" />
<Page Include="Src\Options\TextViewOptions.xaml" />
<Page Include="Src\Snippets\SnippetOptionPanel.xaml">
<DependentUpon>SnippetOptionPanel.cs</DependentUpon>
</Page>
<Page Include="Src\QuickClassBrowser.xaml">
<DependentUpon>QuickClassBrowser.cs</DependentUpon>
</Page>
<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>
<Folder Include="Src\ContextActions" />
<Folder Include="Src\ChangeMarkerMargin" />
<Folder Include="Src\SyntaxHighlighting" />
<Folder Include="Src\XmlDoc" />
</ItemGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{0162E499-42D0-409B-AA25-EED21F75336B}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>Library</OutputType>
<RootNamespace>ICSharpCode.AvalonEdit.AddIn</RootNamespace>
<AssemblyName>ICSharpCode.AvalonEdit.AddIn</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<SourceAnalysisOverrideSettingsFile>C:\Users\Daniel\AppData\Roaming\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis</SourceAnalysisOverrideSettingsFile>
<OutputPath>..\..\..\..\AddIns\DisplayBindings\AvalonEdit\</OutputPath>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<RunCodeAnalysis>False</RunCodeAnalysis>
<CodeAnalysisRules>-Microsoft.Design#CA1014;-Microsoft.Design#CA2210</CodeAnalysisRules>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<Optimize>False</Optimize>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<Optimize>True</Optimize>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="PresentationCore">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="PresentationFramework">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="PresentationFramework.Aero">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="ReachFramework">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Printing">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Runtime.Serialization">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsFormsIntegration">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Src\ChangeMarkerMargin\ChangeMarkerMargin.cs" />
<Compile Include="Src\ChangeMarkerMargin\DefaultChangeWatcher.cs" />
<Compile Include="Src\ChangeMarkerMargin\DiffControl.xaml.cs">
<DependentUpon>DiffControl.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\ChangeMarkerMargin\DocumentSequence.cs" />
<Compile Include="Src\ChangeMarkerMargin\IChangeWatcher.cs" />
<Compile Include="Src\ChangeMarkerMargin\LineChangeInfo.cs" />
<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>
<Compile Include="Src\ContextActions\ContextActionsBulbPopup.cs" />
<Compile Include="Src\ContextActions\ContextActionsBulbViewModel.cs" />
<Compile Include="Src\ContextActions\ContextActionsControl.xaml.cs">
<DependentUpon>ContextActionsControl.xaml</DependentUpon>
</Compile>
<Compile Include="Src\ContextActions\ContextActionsHeaderedControl.xaml.cs">
<DependentUpon>ContextActionsHeaderedControl.xaml</DependentUpon>
</Compile>
<Compile Include="Src\ContextActions\ContextActionsPopup.cs" />
<Compile Include="Src\ContextActions\ContextActionsRenderer.cs" />
<Compile Include="Src\ContextActions\EditorActionsProvider.cs" />
<Compile Include="Src\ContextActions\FindBaseClasses.cs" />
<Compile Include="Src\ContextActions\FindDerivedClassesOrOverrides.cs" />
<Compile Include="Src\ContextActions\GoToEntityAction.cs" />
<Compile Include="Src\EnhancedScrollBar.cs" />
<Compile Include="Src\HiddenDefinitionRenderer.cs" />
<Compile Include="Src\SyntaxHighlighting\CustomizingHighlighter.cs" />
<Compile Include="Src\SyntaxHighlighting\FixedHighlighter.cs" />
<Compile Include="Src\SyntaxHighlighting\MultiHighlighter.cs" />
<Compile Include="Src\Snippets\CodeSnippetComparer.cs" />
<Compile Include="Src\SyntaxHighlighting\SyntaxModeDoozer.cs" />
<Compile Include="Src\TextMarkerToolTipProvider.cs" />
<Compile Include="Src\Utils.cs" />
<Compile Include="Src\XmlDoc\DocumentationUIBuilder.cs" />
<Compile Include="Src\XmlDoc\XmlDocTooltipProvider.cs" />
<None Include="AvalonEdit.AddIn.addin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<Compile Include="..\..\..\Main\GlobalAssemblyInfo.cs">
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\AvalonEditDisplayBinding.cs" />
<Compile Include="Src\AvalonEditEditorUIService.cs" />
<Compile Include="Src\AvalonEditorControlService.cs" />
<Compile Include="Src\AvalonEditViewContent.cs" />
<Compile Include="Src\BracketHighlightRenderer.cs" />
<Compile Include="Src\CaretReferencesRenderer.cs" />
<Compile Include="Src\ChooseEncodingDialog.xaml.cs">
<DependentUpon>ChooseEncodingDialog.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\CodeCompletionEditorAdapter.cs" />
<Compile Include="Src\CodeEditor.cs" />
<Compile Include="Src\CodeEditorAdapter.cs" />
<Compile Include="Src\CodeEditorView.cs" />
<Compile Include="Src\ExpressionHighlightRenderer.cs" />
<Compile Include="Src\CaretHighlightAdorner.cs" />
<Compile Include="Src\NewLineConsistencyCheck.cs" />
<Compile Include="Src\SearchPanelLocalization.cs" />
<Compile Include="Src\SharpDevelopTextEditor.cs" />
<Compile Include="Src\Commands\FoldingCommands.cs" />
<Compile Include="Src\Commands\SaveFileWithEncoding.cs" />
<Compile Include="Src\Commands\SortOptionsDialog.xaml.cs">
<DependentUpon>SortOptionsDialog.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Commands\SortSelectionCommand.cs" />
<Compile Include="Src\Commands\SurroundWithCommand.cs" />
<Compile Include="Src\CustomCommands.cs" />
<Compile Include="Src\CustomizedHighlightingColor.cs" />
<Compile Include="Src\DocumentPrinter.cs" />
<Compile Include="Src\InlineUIElementGenerator.cs" />
<Compile Include="Src\IconBarManager.cs" />
<Compile Include="Src\IconBarMargin.cs" />
<Compile Include="Src\Options\BehaviorOptions.xaml.cs">
<DependentUpon>BehaviorOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Options\Converters.cs" />
<Compile Include="Src\Options\CustomizedHighlightingItem.cs" />
<Compile Include="Src\Options\GeneralEditorOptions.xaml.cs">
<DependentUpon>GeneralEditorOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Options\CodeEditorOptions.cs" />
<Compile Include="Src\Options\HighlightingOptions.xaml.cs">
<DependentUpon>HighlightingOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\Options\IHighlightingItem.cs" />
<Compile Include="Src\Options\NamedColorHighlightingItem.cs" />
<Compile Include="Src\Options\SimpleHighlightingItem.cs" />
<Compile Include="Src\Options\TextViewOptions.xaml.cs">
<DependentUpon>TextViewOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\PrintPreviewViewContent.cs" />
<Compile Include="Src\Snippets\AnchorSnippetElementProvider.cs" />
<Compile Include="Src\Snippets\CodeSnippet.cs" />
<Compile Include="Src\Snippets\CodeSnippetCompletionWindow.cs" />
<Compile Include="Src\Snippets\CodeSnippetGroup.cs" />
<Compile Include="Src\Snippets\DefaultSnippetElementProvider.cs" />
<Compile Include="Src\Snippets\SnippetCompletionItem.cs" />
<Compile Include="Src\Snippets\SnippetManager.cs" />
<Compile Include="Src\Snippets\SnippetOptionPanel.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\ParserFoldingStrategy.cs" />
<Compile Include="Src\QuickClassBrowser.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\SharpDevelopCompletionWindow.cs" />
<Compile Include="Src\SharpDevelopInsightWindow.cs">
</Compile>
<Compile Include="Src\StringToVisibilityConverter.cs" />
<Compile Include="Src\TextMarkerService.cs" />
<EmbeddedResource Include="Resources\IncrementalSearchCursor.cur" />
<EmbeddedResource Include="Resources\ReverseIncrementalSearchCursor.cur" />
<Resource Include="Src\ContextActions\bulb.png" />
<None Include="Src\ContextActions\license.txt" />
<Resource Include="Src\ContextActions\pencil.png" />
</ItemGroup>
<ItemGroup>
<Page Include="Src\ChangeMarkerMargin\DiffControl.xaml" />
<Page Include="Src\ContextActions\ContextActionOptions.xaml" />
<Page Include="Src\ContextActions\ContextActionsBulbControl.xaml" />
<Page Include="Src\ContextActions\ContextActionsControl.xaml" />
<Page Include="Src\ContextActions\ContextActionsHeaderedControl.xaml" />
<Page Include="Src\SharpDevelopCompletionWindow.xaml">
<DependentUpon>SharpDevelopCompletionWindow.cs</DependentUpon>
</Page>
<Page Include="themes\generic.xaml" />
<ProjectReference Include="..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">
<Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project>
<Name>ICSharpCode.AvalonEdit</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory.Xml\ICSharpCode.NRefactory.Xml.csproj">
<Project>{DC393B66-92ED-4CAD-AB25-CFEF23F3D7C6}</Project>
<Name>ICSharpCode.NRefactory.Xml</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
<Name>ICSharpCode.NRefactory</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
<Private>False</Private>
</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">
<Project>{857CA1A3-FC88-4BE0-AB6A-D1EE772AB288}</Project>
<Name>ICSharpCode.Core.WinForms</Name>
<Private>False</Private>
</ProjectReference>
<Page Include="Src\ChooseEncodingDialog.xaml" />
<Page Include="Src\Commands\SortOptionsDialog.xaml" />
<Page Include="Src\Options\BehaviorOptions.xaml" />
<Page Include="Src\Options\GeneralEditorOptions.xaml" />
<Page Include="Src\Options\HighlightingOptions.xaml" />
<Page Include="Src\Options\TextViewOptions.xaml" />
<Page Include="Src\Snippets\SnippetOptionPanel.xaml">
<DependentUpon>SnippetOptionPanel.cs</DependentUpon>
</Page>
<Page Include="Src\QuickClassBrowser.xaml">
<DependentUpon>QuickClassBrowser.cs</DependentUpon>
</Page>
<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>
<Folder Include="Src\ContextActions" />
<Folder Include="Src\ChangeMarkerMargin" />
<Folder Include="Src\SyntaxHighlighting" />
<Folder Include="Src\XmlDoc" />
</ItemGroup>
</Project>

106
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/ThumbnailViewPad.cs

@ -1,53 +1,53 @@ @@ -1,53 +1,53 @@
// 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.Windows;
using System.Windows.Controls;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Workbench;
using ICSharpCode.WpfDesign.Designer.ThumbnailView;
namespace ICSharpCode.WpfDesign.AddIn
{
public class ThumbnailViewPad : AbstractPadContent
{
ContentPresenter contentControl = new ContentPresenter();
ThumbnailView thumbnailView = new ThumbnailView();
TextBlock notAvailableTextBlock = new TextBlock {
Text = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.OutlinePad.NotAvailable}"),
TextWrapping = TextWrapping.Wrap
};
public ThumbnailViewPad()
{
SD.Workbench.ActiveViewContentChanged += WorkbenchActiveViewContentChanged;
WorkbenchActiveViewContentChanged(null, null);
}
void WorkbenchActiveViewContentChanged(object sender, EventArgs e)
{
WpfViewContent wpfView = SD.Workbench.ActiveViewContent as WpfViewContent;
if (wpfView != null)
{
thumbnailView.DesignSurface = wpfView.DesignSurface;
SD.WinForms.SetContent(contentControl, thumbnailView);
} else {
SD.WinForms.SetContent(contentControl, notAvailableTextBlock);
}
}
/// <summary>
/// The <see cref="System.Windows.Forms.Control"/> representing the pad
/// </summary>
public override object Control {
get {
return contentControl;
}
}
}
}
// 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.Windows;
using System.Windows.Controls;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Workbench;
using ICSharpCode.WpfDesign.Designer.ThumbnailView;
namespace ICSharpCode.WpfDesign.AddIn
{
public class ThumbnailViewPad : AbstractPadContent
{
ContentPresenter contentControl = new ContentPresenter();
ThumbnailView thumbnailView = new ThumbnailView();
TextBlock notAvailableTextBlock = new TextBlock {
Text = StringParser.Parse("${res:ICSharpCode.SharpDevelop.Gui.OutlinePad.NotAvailable}"),
TextWrapping = TextWrapping.Wrap
};
public ThumbnailViewPad()
{
SD.Workbench.ActiveViewContentChanged += WorkbenchActiveViewContentChanged;
WorkbenchActiveViewContentChanged(null, null);
}
void WorkbenchActiveViewContentChanged(object sender, EventArgs e)
{
WpfViewContent wpfView = SD.Workbench.ActiveViewContent as WpfViewContent;
if (wpfView != null)
{
thumbnailView.DesignSurface = wpfView.DesignSurface;
SD.WinForms.SetContent(contentControl, thumbnailView);
} else {
SD.WinForms.SetContent(contentControl, notAvailableTextBlock);
}
}
/// <summary>
/// The <see cref="System.Windows.Forms.Control"/> representing the pad
/// </summary>
public override object Control {
get {
return contentControl;
}
}
}
}

8
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfToolbox.cs

@ -167,7 +167,13 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -167,7 +167,13 @@ namespace ICSharpCode.WpfDesign.AddIn
if (this.ActiveTab.ChoosedItem != draggedItem && this.ActiveTab.Items.Contains(draggedItem)) {
this.ActiveTab.ChoosedItem = draggedItem;
}
return new System.Windows.DataObject(draggedItem.Tag);
if (draggedItem.Tag != null) {
return new System.Windows.DataObject(draggedItem.Tag);
}
else {
return new System.Windows.DataObject();
}
}
}
}

656
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGrid.cs

@ -1,328 +1,328 @@ @@ -1,328 +1,328 @@
// 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.ComponentModel;
using System.Collections.ObjectModel;
using System.Threading;
using System.Globalization;
using ICSharpCode.WpfDesign.PropertyGrid;
using System.Windows.Threading;
using System.Diagnostics;
using System.Windows.Media;
using System.Windows;
namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
{
public class PropertyGrid : INotifyPropertyChanged
{
public PropertyGrid()
{
Categories = new CategoriesCollection();
Categories.Add(specialCategory);
Categories.Add(popularCategory);
Categories.Add(otherCategory);
Categories.Add(attachedCategory);
Events = new PropertyNodeCollection();
}
Category specialCategory = new Category("Special");
Category popularCategory = new Category("Popular");
Category otherCategory = new Category("Other");
Category attachedCategory = new Category("Attached");
Dictionary<MemberDescriptor, PropertyNode> nodeFromDescriptor = new Dictionary<MemberDescriptor, PropertyNode>();
public CategoriesCollection Categories { get; private set; }
public PropertyNodeCollection Events { get; private set; }
private PropertyGridGroupMode _groupMode;
public PropertyGridGroupMode GroupMode
{
get { return _groupMode; }
set
{
if (_groupMode != value)
{
_groupMode = value;
RaisePropertyChanged("GroupMode");
Reload();
}
}
}
PropertyGridTab currentTab;
public PropertyGridTab CurrentTab {
get {
return currentTab;
}
set {
currentTab = value;
RaisePropertyChanged("CurrentTab");
RaisePropertyChanged("NameBackground");
}
}
string filter;
public string Filter {
get {
return filter;
}
set {
filter = value;
Reload();
RaisePropertyChanged("Filter");
}
}
DesignItem singleItem;
public DesignItem SingleItem {
get {
return singleItem;
}
private set {
if (singleItem != null) {
singleItem.NameChanged -= singleItem_NameChanged;
}
singleItem = value;
if (singleItem != null) {
singleItem.NameChanged += singleItem_NameChanged;
}
RaisePropertyChanged("SingleItem");
RaisePropertyChanged("Name");
RaisePropertyChanged("IsNameEnabled");
IsNameCorrect = true;
}
}
void singleItem_NameChanged(object sender, EventArgs e)
{
RaisePropertyChanged("Name");
}
public string OldName {
get; private set;
}
public string Name {
get {
if (SingleItem != null) {
return SingleItem.Name;
}
return null;
}
set {
if (SingleItem != null) {
try {
if (string.IsNullOrEmpty(value)) {
OldName = null;
SingleItem.Name = null;
} else {
OldName = SingleItem.Name;
SingleItem.Name = value;
}
IsNameCorrect = true;
} catch {
IsNameCorrect = false;
}
RaisePropertyChanged("Name");
}
}
}
bool isNameCorrect = true;
public bool IsNameCorrect {
get {
return isNameCorrect;
}
set {
isNameCorrect = value;
RaisePropertyChanged("IsNameCorrect");
}
}
public bool IsNameEnabled {
get {
return SingleItem != null;
}
}
IEnumerable<DesignItem> selectedItems;
public IEnumerable<DesignItem> SelectedItems {
get {
return selectedItems;
}
set {
selectedItems = value;
RaisePropertyChanged("SelectedItems");
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(
delegate {
Reload();
}));
}
}
public void ClearFilter()
{
Filter = null;
}
void Reload()
{
Clear();
if (SelectedItems == null || SelectedItems.Count() == 0) return;
if (SelectedItems.Count() == 1) SingleItem = SelectedItems.First();
foreach (var md in GetDescriptors()) {
if (PassesFilter(md.Name))
AddNode(md);
}
}
void Clear()
{
foreach (var c in Categories) {
c.IsVisible = false;
foreach (var p in c.Properties) {
p.IsVisible = false;
}
}
foreach (var e in Events) {
e.IsVisible = false;
}
SingleItem = null;
}
List<MemberDescriptor> GetDescriptors()
{
List<MemberDescriptor> list = new List<MemberDescriptor>();
if (SelectedItems.Count() == 1) {
foreach (MemberDescriptor d in TypeHelper.GetAvailableProperties(SingleItem.Component)) {
list.Add(d);
}
foreach (MemberDescriptor d in TypeHelper.GetAvailableEvents(SingleItem.ComponentType)) {
list.Add(d);
}
} else {
foreach (MemberDescriptor d in TypeHelper.GetCommonAvailableProperties(SelectedItems.Select(t => t.Component))) {
list.Add(d);
}
}
return list;
}
bool PassesFilter(string name)
{
if (string.IsNullOrEmpty(Filter)) return true;
for (int i = 0; i < name.Length; i++) {
if (i == 0 || char.IsUpper(name[i])) {
if (string.Compare(name, i, Filter, 0, Filter.Length, true) == 0) {
return true;
}
}
}
return false;
}
void AddNode(MemberDescriptor md)
{
var designProperties = SelectedItems.Select(item => item.Properties.GetProperty(md)).ToArray();
if (!Metadata.IsBrowsable(designProperties[0])) return;
PropertyNode node;
if (nodeFromDescriptor.TryGetValue(md, out node)) {
node.Load(designProperties);
} else {
node = new PropertyNode();
node.Load(designProperties);
if (node.IsEvent) {
Events.AddSorted(node);
} else {
var cat = PickCategory(node);
cat.Properties.AddSorted(node);
node.Category = cat;
}
nodeFromDescriptor[md] = node;
}
node.IsVisible = true;
if (node.Category != null)
node.Category.IsVisible = true;
}
Category PickCategory(PropertyNode node)
{
if (Metadata.IsPopularProperty(node.FirstProperty)) return popularCategory;
if (node.FirstProperty.IsAttachedDependencyProperty()) return attachedCategory;
var typeName = node.FirstProperty.DeclaringType.FullName;
if (typeName.StartsWith("System.Windows.") || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls."))
return otherCategory;
return specialCategory;
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
void RaisePropertyChanged(string name)
{
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion
//class CategoryNameComparer : IComparer<string>
//{
// public static CategoryNameComparer Instance = new CategoryNameComparer();
// public int Compare(string x, string y)
// {
// int i1 = Array.IndexOf(Metadata.CategoryOrder, x);
// if (i1 == -1) i1 = int.MaxValue;
// int i2 = Array.IndexOf(Metadata.CategoryOrder, y);
// if (i2 == -1) i2 = int.MaxValue;
// if (i1 == i2) return x.CompareTo(y);
// return i1.CompareTo(i2);
// }
//}
}
public class CategoriesCollection : SortedObservableCollection<Category, string>
{
public CategoriesCollection()
: base(n => n.Name)
{
}
}
public enum PropertyGridGroupMode
{
GroupByPopularCategorys,
GroupByCategorys,
Ungrouped,
}
public enum PropertyGridTab
{
Properties,
Events
}
}
// 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.ComponentModel;
using System.Collections.ObjectModel;
using System.Threading;
using System.Globalization;
using ICSharpCode.WpfDesign.PropertyGrid;
using System.Windows.Threading;
using System.Diagnostics;
using System.Windows.Media;
using System.Windows;
namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
{
public class PropertyGrid : INotifyPropertyChanged
{
public PropertyGrid()
{
Categories = new CategoriesCollection();
Categories.Add(specialCategory);
Categories.Add(popularCategory);
Categories.Add(otherCategory);
Categories.Add(attachedCategory);
Events = new PropertyNodeCollection();
}
Category specialCategory = new Category("Special");
Category popularCategory = new Category("Popular");
Category otherCategory = new Category("Other");
Category attachedCategory = new Category("Attached");
Dictionary<MemberDescriptor, PropertyNode> nodeFromDescriptor = new Dictionary<MemberDescriptor, PropertyNode>();
public CategoriesCollection Categories { get; private set; }
public PropertyNodeCollection Events { get; private set; }
private PropertyGridGroupMode _groupMode;
public PropertyGridGroupMode GroupMode
{
get { return _groupMode; }
set
{
if (_groupMode != value)
{
_groupMode = value;
RaisePropertyChanged("GroupMode");
Reload();
}
}
}
PropertyGridTab currentTab;
public PropertyGridTab CurrentTab {
get {
return currentTab;
}
set {
currentTab = value;
RaisePropertyChanged("CurrentTab");
RaisePropertyChanged("NameBackground");
}
}
string filter;
public string Filter {
get {
return filter;
}
set {
filter = value;
Reload();
RaisePropertyChanged("Filter");
}
}
DesignItem singleItem;
public DesignItem SingleItem {
get {
return singleItem;
}
private set {
if (singleItem != null) {
singleItem.NameChanged -= singleItem_NameChanged;
}
singleItem = value;
if (singleItem != null) {
singleItem.NameChanged += singleItem_NameChanged;
}
RaisePropertyChanged("SingleItem");
RaisePropertyChanged("Name");
RaisePropertyChanged("IsNameEnabled");
IsNameCorrect = true;
}
}
void singleItem_NameChanged(object sender, EventArgs e)
{
RaisePropertyChanged("Name");
}
public string OldName {
get; private set;
}
public string Name {
get {
if (SingleItem != null) {
return SingleItem.Name;
}
return null;
}
set {
if (SingleItem != null) {
try {
if (string.IsNullOrEmpty(value)) {
OldName = null;
SingleItem.Name = null;
} else {
OldName = SingleItem.Name;
SingleItem.Name = value;
}
IsNameCorrect = true;
} catch {
IsNameCorrect = false;
}
RaisePropertyChanged("Name");
}
}
}
bool isNameCorrect = true;
public bool IsNameCorrect {
get {
return isNameCorrect;
}
set {
isNameCorrect = value;
RaisePropertyChanged("IsNameCorrect");
}
}
public bool IsNameEnabled {
get {
return SingleItem != null;
}
}
IEnumerable<DesignItem> selectedItems;
public IEnumerable<DesignItem> SelectedItems {
get {
return selectedItems;
}
set {
selectedItems = value;
RaisePropertyChanged("SelectedItems");
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(
delegate {
Reload();
}));
}
}
public void ClearFilter()
{
Filter = null;
}
void Reload()
{
Clear();
if (SelectedItems == null || SelectedItems.Count() == 0) return;
if (SelectedItems.Count() == 1) SingleItem = SelectedItems.First();
foreach (var md in GetDescriptors()) {
if (PassesFilter(md.Name))
AddNode(md);
}
}
void Clear()
{
foreach (var c in Categories) {
c.IsVisible = false;
foreach (var p in c.Properties) {
p.IsVisible = false;
}
}
foreach (var e in Events) {
e.IsVisible = false;
}
SingleItem = null;
}
List<MemberDescriptor> GetDescriptors()
{
List<MemberDescriptor> list = new List<MemberDescriptor>();
if (SelectedItems.Count() == 1) {
foreach (MemberDescriptor d in TypeHelper.GetAvailableProperties(SingleItem.Component)) {
list.Add(d);
}
foreach (MemberDescriptor d in TypeHelper.GetAvailableEvents(SingleItem.ComponentType)) {
list.Add(d);
}
} else {
foreach (MemberDescriptor d in TypeHelper.GetCommonAvailableProperties(SelectedItems.Select(t => t.Component))) {
list.Add(d);
}
}
return list;
}
bool PassesFilter(string name)
{
if (string.IsNullOrEmpty(Filter)) return true;
for (int i = 0; i < name.Length; i++) {
if (i == 0 || char.IsUpper(name[i])) {
if (string.Compare(name, i, Filter, 0, Filter.Length, true) == 0) {
return true;
}
}
}
return false;
}
void AddNode(MemberDescriptor md)
{
var designProperties = SelectedItems.Select(item => item.Properties.GetProperty(md)).ToArray();
if (!Metadata.IsBrowsable(designProperties[0])) return;
PropertyNode node;
if (nodeFromDescriptor.TryGetValue(md, out node)) {
node.Load(designProperties);
} else {
node = new PropertyNode();
node.Load(designProperties);
if (node.IsEvent) {
Events.AddSorted(node);
} else {
var cat = PickCategory(node);
cat.Properties.AddSorted(node);
node.Category = cat;
}
nodeFromDescriptor[md] = node;
}
node.IsVisible = true;
if (node.Category != null)
node.Category.IsVisible = true;
}
Category PickCategory(PropertyNode node)
{
if (Metadata.IsPopularProperty(node.FirstProperty)) return popularCategory;
if (node.FirstProperty.IsAttachedDependencyProperty()) return attachedCategory;
var typeName = node.FirstProperty.DeclaringType.FullName;
if (typeName.StartsWith("System.Windows.") || typeName.StartsWith("ICSharpCode.WpfDesign.Designer.Controls."))
return otherCategory;
return specialCategory;
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
void RaisePropertyChanged(string name)
{
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion
//class CategoryNameComparer : IComparer<string>
//{
// public static CategoryNameComparer Instance = new CategoryNameComparer();
// public int Compare(string x, string y)
// {
// int i1 = Array.IndexOf(Metadata.CategoryOrder, x);
// if (i1 == -1) i1 = int.MaxValue;
// int i2 = Array.IndexOf(Metadata.CategoryOrder, y);
// if (i2 == -1) i2 = int.MaxValue;
// if (i1 == i2) return x.CompareTo(y);
// return i1.CompareTo(i2);
// }
//}
}
public class CategoriesCollection : SortedObservableCollection<Category, string>
{
public CategoriesCollection()
: base(n => n.Name)
{
}
}
public enum PropertyGridGroupMode
{
GroupByPopularCategorys,
GroupByCategorys,
Ungrouped,
}
public enum PropertyGridTab
{
Properties,
Events
}
}

158
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/NameScopeHelper.cs

@ -1,79 +1,79 @@ @@ -1,79 +1,79 @@
// 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.Diagnostics;
using System.Windows;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.XamlDom
{
/// <summary>
/// Static methods to help with <see cref="System.Windows.Markup.INameScope"/> operations on Xaml elements.
/// </summary>
public static class NameScopeHelper
{
/// <summary>
/// Finds the XAML namescope for the specified object and uses it to unregister the old name and then register the new name.
/// </summary>
/// <param name="namedObject">The object where the name was changed.</param>
/// <param name="oldName">The old name.</param>
/// <param name="newName">The new name.</param>
internal static void NameChanged(XamlObject namedObject, string oldName, string newName)
{
var obj = namedObject;
while (obj != null) {
var nameScope = GetNameScopeFromObject(obj.Instance);
if (nameScope != null) {
if (oldName != null) {
try {
nameScope.UnregisterName(oldName);
} catch (Exception x) {
Debug.WriteLine(x.Message);
}
}
if (newName != null) {
nameScope.RegisterName(newName, namedObject.Instance);
try{
var prp = namedObject.ElementType.GetProperty(namedObject.RuntimeNameProperty);
if (prp != null)
prp.SetValue(namedObject.Instance, newName, null);
} catch (Exception x) {
Debug.WriteLine(x.Message);
}
}
break;
}
obj = obj.ParentObject;
}
}
/// <summary>
/// Gets the XAML namescope for the specified object.
/// </summary>
/// <param name="obj">The object to get the XAML namescope for.</param>
/// <returns>A XAML namescope, as an <see cref="INameScope"/> instance.</returns>
public static INameScope GetNameScopeFromObject(object obj)
{
var nameScope = obj as INameScope;
if (nameScope == null) {
var depObj = obj as DependencyObject;
if (depObj != null)
nameScope = NameScope.GetNameScope(depObj);
}
return nameScope;
}
/// <summary>
/// Clears the <see cref="NameScope.NameScopeProperty"/> if the object is a <see cref="DependencyObject"/>.
/// </summary>
/// <param name="obj">The object to clear the <see cref="NameScope.NameScopeProperty"/> on.</param>
public static void ClearNameScopeProperty(object obj)
{
var depObj = obj as DependencyObject;
if (depObj != null)
depObj.ClearValue(NameScope.NameScopeProperty);
}
}
}
// 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.Diagnostics;
using System.Windows;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.XamlDom
{
/// <summary>
/// Static methods to help with <see cref="System.Windows.Markup.INameScope"/> operations on Xaml elements.
/// </summary>
public static class NameScopeHelper
{
/// <summary>
/// Finds the XAML namescope for the specified object and uses it to unregister the old name and then register the new name.
/// </summary>
/// <param name="namedObject">The object where the name was changed.</param>
/// <param name="oldName">The old name.</param>
/// <param name="newName">The new name.</param>
internal static void NameChanged(XamlObject namedObject, string oldName, string newName)
{
var obj = namedObject;
while (obj != null) {
var nameScope = GetNameScopeFromObject(obj.Instance);
if (nameScope != null) {
if (oldName != null) {
try {
nameScope.UnregisterName(oldName);
} catch (Exception x) {
Debug.WriteLine(x.Message);
}
}
if (newName != null) {
nameScope.RegisterName(newName, namedObject.Instance);
try{
var prp = namedObject.ElementType.GetProperty(namedObject.RuntimeNameProperty);
if (prp != null)
prp.SetValue(namedObject.Instance, newName, null);
} catch (Exception x) {
Debug.WriteLine(x.Message);
}
}
break;
}
obj = obj.ParentObject;
}
}
/// <summary>
/// Gets the XAML namescope for the specified object.
/// </summary>
/// <param name="obj">The object to get the XAML namescope for.</param>
/// <returns>A XAML namescope, as an <see cref="INameScope"/> instance.</returns>
public static INameScope GetNameScopeFromObject(object obj)
{
var nameScope = obj as INameScope;
if (nameScope == null) {
var depObj = obj as DependencyObject;
if (depObj != null)
nameScope = NameScope.GetNameScope(depObj);
}
return nameScope;
}
/// <summary>
/// Clears the <see cref="NameScope.NameScopeProperty"/> if the object is a <see cref="DependencyObject"/>.
/// </summary>
/// <param name="obj">The object to clear the <see cref="NameScope.NameScopeProperty"/> on.</param>
public static void ClearNameScopeProperty(object obj)
{
var depObj = obj as DependencyObject;
if (depObj != null)
depObj.ClearValue(NameScope.NameScopeProperty);
}
}
}

1060
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs

File diff suppressed because it is too large Load Diff

100
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/ExtensionMethods.cs

@ -1,8 +1,8 @@ @@ -1,8 +1,8 @@
// 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;
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ComponentModel;
using System.Windows;
namespace ICSharpCode.WpfDesign
@ -23,52 +23,52 @@ namespace ICSharpCode.WpfDesign @@ -23,52 +23,52 @@ namespace ICSharpCode.WpfDesign
Math.Round(rect.Width, PlacementInformation.BoundsPrecision),
Math.Round(rect.Height, PlacementInformation.BoundsPrecision)
);
}
/// <summary>
/// Gets the design item property for the specified member descriptor.
/// </summary>
public static DesignItemProperty GetProperty(this DesignItemPropertyCollection properties, MemberDescriptor md)
{
DesignItemProperty prop = null;
var pd = md as PropertyDescriptor;
if (pd != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(pd);
if (dpd != null)
{
if (dpd.IsAttached)
{
prop = properties.GetAttachedProperty(dpd.DependencyProperty);
}
else
{
prop = properties.GetProperty(dpd.DependencyProperty);
}
}
}
if (prop == null)
{
prop = properties[md.Name];
}
return prop;
}
/// <summary>
/// Gets if the specified design item property represents an attached dependency property.
/// </summary>
public static bool IsAttachedDependencyProperty(this DesignItemProperty property)
{
if (property.DependencyProperty != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(property.DependencyProperty, property.DesignItem.ComponentType);
return dpd.IsAttached;
}
return false;
}
/// <summary>
/// Gets the design item property for the specified member descriptor.
/// </summary>
public static DesignItemProperty GetProperty(this DesignItemPropertyCollection properties, MemberDescriptor md)
{
DesignItemProperty prop = null;
var pd = md as PropertyDescriptor;
if (pd != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(pd);
if (dpd != null)
{
if (dpd.IsAttached)
{
prop = properties.GetAttachedProperty(dpd.DependencyProperty);
}
else
{
prop = properties.GetProperty(dpd.DependencyProperty);
}
}
}
if (prop == null)
{
prop = properties[md.Name];
}
return prop;
}
/// <summary>
/// Gets if the specified design item property represents an attached dependency property.
/// </summary>
public static bool IsAttachedDependencyProperty(this DesignItemProperty property)
{
if (property.DependencyProperty != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(property.DependencyProperty, property.DesignItem.ComponentType);
return dpd.IsAttached;
}
return false;
}
}
}

840
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs

@ -1,420 +1,420 @@ @@ -1,420 +1,420 @@
// 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.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.PropertyGrid
{
/// <summary>
/// View-Model class for the property grid.
/// </summary>
public class PropertyNode : INotifyPropertyChanged
{
static object Unset = new object();
/// <summary>
/// Gets the properties that are presented by this node.
/// This might be multiple properties if multiple controls are selected.
/// </summary>
public ReadOnlyCollection<DesignItemProperty> Properties { get; private set; }
bool raiseEvents = true;
bool hasStringConverter;
/// <summary>
/// Gets the name of the property.
/// </summary>
public string Name
{
get
{
var dp = FirstProperty.DependencyProperty;
if (dp != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(dp, FirstProperty.DesignItem.ComponentType);
if (dpd.IsAttached)
{
// Will return the attached property name in the form of <DeclaringType>.<PropertyName>
return dpd.Name;
}
}
return FirstProperty.Name;
}
}
/// <summary>
/// Gets if this property node represents an event.
/// </summary>
public bool IsEvent { get { return FirstProperty.IsEvent; } }
/// <summary>
/// Gets the design context associated with this set of properties.
/// </summary>
public DesignContext Context { get { return FirstProperty.DesignItem.Context; } }
/// <summary>
/// Gets the service container associated with this set of properties.
/// </summary>
public ServiceContainer Services { get { return FirstProperty.DesignItem.Services; } }
/// <summary>
/// Gets the editor control that edits this property.
/// </summary>
public FrameworkElement Editor { get; private set; }
/// <summary>
/// Gets the first property (equivalent to Properties[0])
/// </summary>
public DesignItemProperty FirstProperty { get { return Properties[0]; } }
/// <summary>
/// For nested property nodes, gets the parent node.
/// </summary>
public PropertyNode Parent { get; private set; }
/// <summary>
/// For nested property nodes, gets the level of this node.
/// </summary>
public int Level { get; private set; }
/// <summary>
/// Gets the category of this node.
/// </summary>
public Category Category { get; set; }
/// <summary>
/// Gets the list of child nodes.
/// </summary>
public ObservableCollection<PropertyNode> Children { get; private set; }
/// <summary>
/// Gets the list of advanced child nodes (not visible by default).
/// </summary>
public ObservableCollection<PropertyNode> MoreChildren { get; private set; }
bool isExpanded;
/// <summary>
/// Gets whether this property node is currently expanded.
/// </summary>
public bool IsExpanded {
get {
return isExpanded;
}
set {
isExpanded = value;
UpdateChildren();
RaisePropertyChanged("IsExpanded");
}
}
/// <summary>
/// Gets whether this property node has children.
/// </summary>
public bool HasChildren {
get { return Children.Count > 0 || MoreChildren.Count > 0; }
}
/// <summary>
/// Gets the description object using the IPropertyDescriptionService.
/// </summary>
public object Description {
get {
IPropertyDescriptionService s = Services.GetService<IPropertyDescriptionService>();
if (s != null) {
return s.GetDescription(FirstProperty);
}
return null;
}
}
/// <summary>
/// Gets/Sets the value of this property.
/// </summary>
public object Value {
get {
if (IsAmbiguous) return null;
var result = FirstProperty.ValueOnInstance;
if (result == DependencyProperty.UnsetValue) return null;
return result;
}
set {
SetValueCore(value);
}
}
/// <summary>
/// Gets/Sets the value of this property in string form
/// </summary>
public string ValueString {
get {
if (ValueItem == null || ValueItem.Component is MarkupExtension) {
if (Value == null) return null;
if (hasStringConverter) {
return FirstProperty.TypeConverter.ConvertToInvariantString(Value);
}
return "(" + Value.GetType().Name + ")";
}
return "(" + ValueItem.ComponentType.Name + ")";
}
set {
// make sure we only catch specific exceptions
// and/or show the error message to the user
//try {
Value = FirstProperty.TypeConverter.ConvertFromInvariantString(value);
//} catch {
// OnValueOnInstanceChanged();
//}
}
}
/// <summary>
/// Gets whether the property node is enabled for editing.
/// </summary>
public bool IsEnabled {
get {
return ValueItem == null && hasStringConverter;
}
}
/// <summary>
/// Gets whether this property was set locally.
/// </summary>
public bool IsSet {
get {
foreach (var p in Properties) {
if (p.IsSet) return true;
}
return false;
}
}
/// <summary>
/// Gets the color of the name.
/// Depends on the type of the value (binding/resource/etc.)
/// </summary>
public Brush NameForeground {
get {
if (ValueItem != null) {
object component = ValueItem.Component;
if (component is BindingBase)
return Brushes.DarkGoldenrod;
if (component is StaticResourceExtension || component is DynamicResourceExtension)
return Brushes.DarkGreen;
}
return SystemColors.WindowTextBrush;
}
}
/// <summary>
/// Returns the DesignItem that owns the property (= the DesignItem that is currently selected).
/// Returns null if multiple DesignItems are selected.
/// </summary>
public DesignItem ValueItem {
get {
if (Properties.Count == 1) {
return FirstProperty.Value;
}
return null;
}
}
/// <summary>
/// Gets whether the property value is ambiguous (multiple controls having different values are selected).
/// </summary>
public bool IsAmbiguous {
get {
foreach (var p in Properties) {
if (!object.Equals(p.ValueOnInstance, FirstProperty.ValueOnInstance)) {
return true;
}
}
return false;
}
}
bool isVisible;
/// <summary>
/// Gets/Sets whether the property is visible.
/// </summary>
public bool IsVisible {
get {
return isVisible;
}
set {
isVisible = value;
RaisePropertyChanged("IsVisible");
}
}
/// <summary>
/// Gets whether resetting the property is possible.
/// </summary>
public bool CanReset {
get { return IsSet; }
}
/// <summary>
/// Resets the property.
/// </summary>
public void Reset()
{
SetValueCore(Unset);
}
/// <summary>
/// Replaces the value of this node with a new binding.
/// </summary>
public void CreateBinding()
{
Value = new Binding();
IsExpanded = true;
}
void SetValueCore(object value)
{
raiseEvents = false;
if (value == Unset) {
foreach (var p in Properties) {
p.Reset();
}
} else {
foreach (var p in Properties) {
p.SetValue(value);
}
}
raiseEvents = true;
OnValueChanged();
}
void OnValueChanged()
{
RaisePropertyChanged("IsSet");
RaisePropertyChanged("Value");
RaisePropertyChanged("ValueString");
RaisePropertyChanged("IsAmbiguous");
RaisePropertyChanged("FontWeight");
RaisePropertyChanged("IsEnabled");
RaisePropertyChanged("NameForeground");
UpdateChildren();
}
void OnValueOnInstanceChanged()
{
RaisePropertyChanged("Value");
RaisePropertyChanged("ValueString");
}
/// <summary>
/// Creates a new PropertyNode instance.
/// </summary>
public PropertyNode()
{
Children = new ObservableCollection<PropertyNode>();
MoreChildren = new ObservableCollection<PropertyNode>();
}
PropertyNode(DesignItemProperty[] properties, PropertyNode parent) : this()
{
this.Parent = parent;
this.Level = parent == null ? 0 : parent.Level + 1;
Load(properties);
}
/// <summary>
/// Initializes this property node with the specified properties.
/// </summary>
public void Load(DesignItemProperty[] properties)
{
if (this.Properties != null) {
// detach events from old properties
foreach (var property in this.Properties) {
property.ValueChanged -= new EventHandler(property_ValueChanged);
property.ValueOnInstanceChanged -= new EventHandler(property_ValueOnInstanceChanged);
}
}
this.Properties = new ReadOnlyCollection<DesignItemProperty>(properties);
if (Editor == null)
Editor = EditorManager.CreateEditor(FirstProperty);
foreach (var property in properties) {
property.ValueChanged += new EventHandler(property_ValueChanged);
property.ValueOnInstanceChanged += new EventHandler(property_ValueOnInstanceChanged);
}
hasStringConverter =
FirstProperty.TypeConverter.CanConvertFrom(typeof(string)) &&
FirstProperty.TypeConverter.CanConvertTo(typeof(string));
OnValueChanged();
}
void property_ValueOnInstanceChanged(object sender, EventArgs e)
{
if (raiseEvents) OnValueOnInstanceChanged();
}
void property_ValueChanged(object sender, EventArgs e)
{
if (raiseEvents) OnValueChanged();
}
void UpdateChildren()
{
Children.Clear();
MoreChildren.Clear();
if (Parent == null || Parent.IsExpanded) {
if (ValueItem != null) {
var list = TypeHelper.GetAvailableProperties(ValueItem.Component)
.OrderBy(d => d.Name)
.Select(d => new PropertyNode(new[] { ValueItem.Properties.GetProperty(d) }, this));
foreach (var node in list) {
if (Metadata.IsBrowsable(node.FirstProperty)) {
node.IsVisible = true;
if (Metadata.IsPopularProperty(node.FirstProperty)) {
Children.Add(node);
} else {
MoreChildren.Add(node);
}
}
}
}
}
RaisePropertyChanged("HasChildren");
}
#region INotifyPropertyChanged Members
/// <summary>
/// Occurs when a property has changed. Used to support WPF data binding.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
void RaisePropertyChanged(string name)
{
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
}
// 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.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Collections.ObjectModel;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.PropertyGrid
{
/// <summary>
/// View-Model class for the property grid.
/// </summary>
public class PropertyNode : INotifyPropertyChanged
{
static object Unset = new object();
/// <summary>
/// Gets the properties that are presented by this node.
/// This might be multiple properties if multiple controls are selected.
/// </summary>
public ReadOnlyCollection<DesignItemProperty> Properties { get; private set; }
bool raiseEvents = true;
bool hasStringConverter;
/// <summary>
/// Gets the name of the property.
/// </summary>
public string Name
{
get
{
var dp = FirstProperty.DependencyProperty;
if (dp != null)
{
var dpd = DependencyPropertyDescriptor.FromProperty(dp, FirstProperty.DesignItem.ComponentType);
if (dpd.IsAttached)
{
// Will return the attached property name in the form of <DeclaringType>.<PropertyName>
return dpd.Name;
}
}
return FirstProperty.Name;
}
}
/// <summary>
/// Gets if this property node represents an event.
/// </summary>
public bool IsEvent { get { return FirstProperty.IsEvent; } }
/// <summary>
/// Gets the design context associated with this set of properties.
/// </summary>
public DesignContext Context { get { return FirstProperty.DesignItem.Context; } }
/// <summary>
/// Gets the service container associated with this set of properties.
/// </summary>
public ServiceContainer Services { get { return FirstProperty.DesignItem.Services; } }
/// <summary>
/// Gets the editor control that edits this property.
/// </summary>
public FrameworkElement Editor { get; private set; }
/// <summary>
/// Gets the first property (equivalent to Properties[0])
/// </summary>
public DesignItemProperty FirstProperty { get { return Properties[0]; } }
/// <summary>
/// For nested property nodes, gets the parent node.
/// </summary>
public PropertyNode Parent { get; private set; }
/// <summary>
/// For nested property nodes, gets the level of this node.
/// </summary>
public int Level { get; private set; }
/// <summary>
/// Gets the category of this node.
/// </summary>
public Category Category { get; set; }
/// <summary>
/// Gets the list of child nodes.
/// </summary>
public ObservableCollection<PropertyNode> Children { get; private set; }
/// <summary>
/// Gets the list of advanced child nodes (not visible by default).
/// </summary>
public ObservableCollection<PropertyNode> MoreChildren { get; private set; }
bool isExpanded;
/// <summary>
/// Gets whether this property node is currently expanded.
/// </summary>
public bool IsExpanded {
get {
return isExpanded;
}
set {
isExpanded = value;
UpdateChildren();
RaisePropertyChanged("IsExpanded");
}
}
/// <summary>
/// Gets whether this property node has children.
/// </summary>
public bool HasChildren {
get { return Children.Count > 0 || MoreChildren.Count > 0; }
}
/// <summary>
/// Gets the description object using the IPropertyDescriptionService.
/// </summary>
public object Description {
get {
IPropertyDescriptionService s = Services.GetService<IPropertyDescriptionService>();
if (s != null) {
return s.GetDescription(FirstProperty);
}
return null;
}
}
/// <summary>
/// Gets/Sets the value of this property.
/// </summary>
public object Value {
get {
if (IsAmbiguous) return null;
var result = FirstProperty.ValueOnInstance;
if (result == DependencyProperty.UnsetValue) return null;
return result;
}
set {
SetValueCore(value);
}
}
/// <summary>
/// Gets/Sets the value of this property in string form
/// </summary>
public string ValueString {
get {
if (ValueItem == null || ValueItem.Component is MarkupExtension) {
if (Value == null) return null;
if (hasStringConverter) {
return FirstProperty.TypeConverter.ConvertToInvariantString(Value);
}
return "(" + Value.GetType().Name + ")";
}
return "(" + ValueItem.ComponentType.Name + ")";
}
set {
// make sure we only catch specific exceptions
// and/or show the error message to the user
//try {
Value = FirstProperty.TypeConverter.ConvertFromInvariantString(value);
//} catch {
// OnValueOnInstanceChanged();
//}
}
}
/// <summary>
/// Gets whether the property node is enabled for editing.
/// </summary>
public bool IsEnabled {
get {
return ValueItem == null && hasStringConverter;
}
}
/// <summary>
/// Gets whether this property was set locally.
/// </summary>
public bool IsSet {
get {
foreach (var p in Properties) {
if (p.IsSet) return true;
}
return false;
}
}
/// <summary>
/// Gets the color of the name.
/// Depends on the type of the value (binding/resource/etc.)
/// </summary>
public Brush NameForeground {
get {
if (ValueItem != null) {
object component = ValueItem.Component;
if (component is BindingBase)
return Brushes.DarkGoldenrod;
if (component is StaticResourceExtension || component is DynamicResourceExtension)
return Brushes.DarkGreen;
}
return SystemColors.WindowTextBrush;
}
}
/// <summary>
/// Returns the DesignItem that owns the property (= the DesignItem that is currently selected).
/// Returns null if multiple DesignItems are selected.
/// </summary>
public DesignItem ValueItem {
get {
if (Properties.Count == 1) {
return FirstProperty.Value;
}
return null;
}
}
/// <summary>
/// Gets whether the property value is ambiguous (multiple controls having different values are selected).
/// </summary>
public bool IsAmbiguous {
get {
foreach (var p in Properties) {
if (!object.Equals(p.ValueOnInstance, FirstProperty.ValueOnInstance)) {
return true;
}
}
return false;
}
}
bool isVisible;
/// <summary>
/// Gets/Sets whether the property is visible.
/// </summary>
public bool IsVisible {
get {
return isVisible;
}
set {
isVisible = value;
RaisePropertyChanged("IsVisible");
}
}
/// <summary>
/// Gets whether resetting the property is possible.
/// </summary>
public bool CanReset {
get { return IsSet; }
}
/// <summary>
/// Resets the property.
/// </summary>
public void Reset()
{
SetValueCore(Unset);
}
/// <summary>
/// Replaces the value of this node with a new binding.
/// </summary>
public void CreateBinding()
{
Value = new Binding();
IsExpanded = true;
}
void SetValueCore(object value)
{
raiseEvents = false;
if (value == Unset) {
foreach (var p in Properties) {
p.Reset();
}
} else {
foreach (var p in Properties) {
p.SetValue(value);
}
}
raiseEvents = true;
OnValueChanged();
}
void OnValueChanged()
{
RaisePropertyChanged("IsSet");
RaisePropertyChanged("Value");
RaisePropertyChanged("ValueString");
RaisePropertyChanged("IsAmbiguous");
RaisePropertyChanged("FontWeight");
RaisePropertyChanged("IsEnabled");
RaisePropertyChanged("NameForeground");
UpdateChildren();
}
void OnValueOnInstanceChanged()
{
RaisePropertyChanged("Value");
RaisePropertyChanged("ValueString");
}
/// <summary>
/// Creates a new PropertyNode instance.
/// </summary>
public PropertyNode()
{
Children = new ObservableCollection<PropertyNode>();
MoreChildren = new ObservableCollection<PropertyNode>();
}
PropertyNode(DesignItemProperty[] properties, PropertyNode parent) : this()
{
this.Parent = parent;
this.Level = parent == null ? 0 : parent.Level + 1;
Load(properties);
}
/// <summary>
/// Initializes this property node with the specified properties.
/// </summary>
public void Load(DesignItemProperty[] properties)
{
if (this.Properties != null) {
// detach events from old properties
foreach (var property in this.Properties) {
property.ValueChanged -= new EventHandler(property_ValueChanged);
property.ValueOnInstanceChanged -= new EventHandler(property_ValueOnInstanceChanged);
}
}
this.Properties = new ReadOnlyCollection<DesignItemProperty>(properties);
if (Editor == null)
Editor = EditorManager.CreateEditor(FirstProperty);
foreach (var property in properties) {
property.ValueChanged += new EventHandler(property_ValueChanged);
property.ValueOnInstanceChanged += new EventHandler(property_ValueOnInstanceChanged);
}
hasStringConverter =
FirstProperty.TypeConverter.CanConvertFrom(typeof(string)) &&
FirstProperty.TypeConverter.CanConvertTo(typeof(string));
OnValueChanged();
}
void property_ValueOnInstanceChanged(object sender, EventArgs e)
{
if (raiseEvents) OnValueOnInstanceChanged();
}
void property_ValueChanged(object sender, EventArgs e)
{
if (raiseEvents) OnValueChanged();
}
void UpdateChildren()
{
Children.Clear();
MoreChildren.Clear();
if (Parent == null || Parent.IsExpanded) {
if (ValueItem != null) {
var list = TypeHelper.GetAvailableProperties(ValueItem.Component)
.OrderBy(d => d.Name)
.Select(d => new PropertyNode(new[] { ValueItem.Properties.GetProperty(d) }, this));
foreach (var node in list) {
if (Metadata.IsBrowsable(node.FirstProperty)) {
node.IsVisible = true;
if (Metadata.IsPopularProperty(node.FirstProperty)) {
Children.Add(node);
} else {
MoreChildren.Add(node);
}
}
}
}
}
RaisePropertyChanged("HasChildren");
}
#region INotifyPropertyChanged Members
/// <summary>
/// Occurs when a property has changed. Used to support WPF data binding.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
void RaisePropertyChanged(string name)
{
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
#endregion
}
}

3
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -238,6 +238,7 @@ @@ -238,6 +238,7 @@
<Compile Include="Src\ProjectBuilder.cs" />
<Compile Include="Src\ProjectRootElementExtensions.cs" />
<Compile Include="Src\ReducedPackageOperations.cs" />
<Compile Include="Src\RemovedPackageReferenceMonitor.cs" />
<Compile Include="Src\ResolveFileConflictEventArgs.cs" />
<Compile Include="Src\RestorePackagesCommand.cs" />
<Compile Include="Src\Scripting\ConsoleHostFileConflictResolver.cs" />
@ -247,6 +248,8 @@ @@ -247,6 +248,8 @@
<Compile Include="Src\Scripting\IGlobalMSBuildProjectCollection.cs" />
<Compile Include="Src\Scripting\MSBuildProjectImportsMerger.cs" />
<Compile Include="Src\Scripting\MSBuildProjectImportsMergeResult.cs" />
<Compile Include="Src\Scripting\MSBuildProjectPropertiesMerger.cs" />
<Compile Include="Src\Scripting\MSBuildProjectPropertiesMergeResult.cs" />
<Compile Include="Src\Scripting\NullGlobalMSBuildProjectCollection.cs" />
<Compile Include="Src\Scripting\RunAllProjectPackageScriptsAction.cs" />
<Compile Include="Src\ServiceWithWorkbenchOwner.cs" />

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs

@ -222,6 +222,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -222,6 +222,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
names.Add(propertyElement.Name);
}
names.Add("OutputFileName");
names.Add("LocalPath");
}
return names;
}
@ -324,5 +325,10 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -324,5 +325,10 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
return FileUtility.IsBaseDirectory(MSBuildProject.Directory, filePath);
}
internal void SaveFile(IViewContent view)
{
fileService.SaveFile(view);
}
}
}

11
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs

@ -21,6 +21,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -21,6 +21,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public const string CopyToOutputDirectoryPropertyName = "CopyToOutputDirectory";
public const string CustomToolPropertyName = "CustomTool";
public const string FullPathPropertyName = "FullPath";
public const string LocalPathPropertyName = "LocalPath";
public ProjectItem(Project project, FileProjectItem projectItem)
{
@ -98,7 +99,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -98,7 +99,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return GetCopyToOutputDirectory();
} else if (name == CustomToolPropertyName) {
return projectItem.CustomTool;
} else if (name == FullPathPropertyName) {
} else if ((name == FullPathPropertyName) || (name == LocalPathPropertyName)) {
return projectItem.FileName.ToString();
}
return String.Empty;
@ -235,5 +236,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -235,5 +236,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
return Path.GetDirectoryName(GetProjectItemRelativePathToProject());
}
public void Save(string fileName = null)
{
IViewContent view = containingProject.GetOpenFile(FileName);
if (view != null) {
containingProject.SaveFile(view);
}
}
}
}

1
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs

@ -32,6 +32,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -32,6 +32,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
yield return new ProjectItemProperty(projectItem, ProjectItem.CopyToOutputDirectoryPropertyName);
yield return new ProjectItemProperty(projectItem, ProjectItem.CustomToolPropertyName);
yield return new ProjectItemProperty(projectItem, ProjectItem.FullPathPropertyName);
yield return new ProjectItemProperty(projectItem, ProjectItem.LocalPathPropertyName);
}
}
}

4
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectProperty.cs

@ -48,7 +48,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -48,7 +48,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
bool IsFullPath()
{
return IsCaseInsensitiveMatch(Name, "FullPath");
return IsCaseInsensitiveMatch(Name, "FullPath") || IsCaseInsensitiveMatch(Name, "LocalPath");
}
bool IsOutputFileName()
@ -83,7 +83,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -83,7 +83,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
string GetFullPath()
{
return MSBuildProject.Directory;
return MSBuildProject.Directory + Path.DirectorySeparatorChar.ToString();
}
string GetOutputFileName()

27
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Reference.cs

@ -40,5 +40,32 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -40,5 +40,32 @@ namespace ICSharpCode.PackageManagement.EnvDTE
return null;
}
}
public string Identity {
get { return referenceProjectItem.ShortName; }
}
public string PublicKeyToken {
get {
if (referenceProjectItem.PublicKeyToken != "null") {
return referenceProjectItem.PublicKeyToken;
}
return String.Empty;
}
}
public bool StrongName {
get { return HasVersion() && HasPublicKeyToken(); }
}
bool HasVersion()
{
return referenceProjectItem.Version != null;
}
bool HasPublicKeyToken()
{
return !String.IsNullOrEmpty(PublicKeyToken);
}
}
}

14
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/References.cs

@ -10,7 +10,7 @@ using ICSharpCode.SharpDevelop.Project; @@ -10,7 +10,7 @@ using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class References : MarshalByRefObject, IEnumerable<Reference>, global::EnvDTE.References
public class References : MarshalByRefObject, IEnumerable, global::EnvDTE.References
{
MSBuildBasedProject msbuildProject;
IPackageManagementProjectService projectService;
@ -45,24 +45,18 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -45,24 +45,18 @@ namespace ICSharpCode.PackageManagement.EnvDTE
project.Save();
}
public IEnumerator<Reference> GetEnumerator()
public IEnumerator GetEnumerator()
{
List<Reference> references = GetReferences().ToList();
return references.GetEnumerator();
return GetReferences().ToList().GetEnumerator();
}
IEnumerable<Reference> GetReferences()
IEnumerable<global::EnvDTE.Reference> GetReferences()
{
foreach (ReferenceProjectItem referenceProjectItem in project.GetReferences()) {
yield return new Reference3(project, referenceProjectItem);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public global::EnvDTE.Reference Item(string identity)
{
return Find(identity);

1
src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs

@ -19,6 +19,7 @@ namespace ICSharpCode.PackageManagement @@ -19,6 +19,7 @@ namespace ICSharpCode.PackageManagement
bool FileExists(string fileName);
string[] GetFiles(string path);
string[] GetDirectories(string path);
void SaveFile(IViewContent view);
void ParseFile(string fileName);
ICompilation GetCompilationUnit(string fileName);

11
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs

@ -48,6 +48,17 @@ namespace ICSharpCode.PackageManagement @@ -48,6 +48,17 @@ namespace ICSharpCode.PackageManagement
InvokeIfRequired(() => FileService.CopyFile(oldFileName, newFileName, isDirectory: false, overwrite: false));
}
public void SaveFile(IViewContent view)
{
if (SD.MainThread.InvokeRequired) {
SD.MainThread.InvokeIfRequired(() => SaveFile(view));
} else {
if (view.IsDirty) {
view.Files.ForEach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save);
}
}
}
public bool FileExists(string fileName)
{
return InvokeIfRequired(() => File.Exists(fileName));

15
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSolution.cs

@ -69,7 +69,7 @@ namespace ICSharpCode.PackageManagement @@ -69,7 +69,7 @@ namespace ICSharpCode.PackageManagement
IPackageRepository ActivePackageRepository {
get { return registeredPackageRepositories.ActiveRepository; }
}
public IPackageManagementProject GetActiveProject(IPackageRepository sourceRepository)
{
MSBuildBasedProject activeProject = GetActiveMSBuildBasedProject();
@ -152,7 +152,18 @@ namespace ICSharpCode.PackageManagement @@ -152,7 +152,18 @@ namespace ICSharpCode.PackageManagement
public IQueryable<IPackage> GetPackages()
{
ISolutionPackageRepository repository = CreateSolutionPackageRepository();
return repository.GetPackages();
List<IPackageManagementProject> projects = GetProjects(ActivePackageRepository).ToList();
return repository
.GetPackages()
.Where(package => IsPackageInstalledInSolutionOrAnyProject(projects, package));
}
bool IsPackageInstalledInSolutionOrAnyProject(IList<IPackageManagementProject> projects, IPackage package)
{
if (projects.Any(project => project.IsPackageInstalled(package))) {
return true;
}
return false;
}
public string GetInstallPath(IPackage package)

35
src/AddIns/Misc/PackageManagement/Project/Src/RemovedPackageReferenceMonitor.cs

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
// 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 NuGet;
namespace ICSharpCode.PackageManagement
{
public class RemovedPackageReferenceMonitor : IDisposable
{
ISharpDevelopProjectManager projectManager;
List<IPackage> packagesRemoved = new List<IPackage>();
public RemovedPackageReferenceMonitor(ISharpDevelopProjectManager projectManager)
{
this.projectManager = projectManager;
projectManager.PackageReferenceRemoved += PackageReferenceRemoved;
}
void PackageReferenceRemoved(object sender, PackageOperationEventArgs e)
{
packagesRemoved.Add(e.Package);
}
public void Dispose()
{
projectManager.PackageReferenceRemoved -= PackageReferenceRemoved;
}
public List<IPackage> PackagesRemoved {
get { return packagesRemoved; }
}
}
}

24
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/GlobalMSBuildProjectCollection.cs

@ -55,6 +55,7 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -55,6 +55,7 @@ namespace ICSharpCode.PackageManagement.Scripting
{
foreach (GlobalAndInternalProject msbuildProjects in projects) {
UpdateImports(msbuildProjects);
UpdateProperties(msbuildProjects);
GetGlobalProjectCollection().UnloadProject(msbuildProjects.GlobalMSBuildProject);
}
}
@ -92,5 +93,28 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -92,5 +93,28 @@ namespace ICSharpCode.PackageManagement.Scripting
project.Name,
result);
}
void UpdateProperties(GlobalAndInternalProject msbuildProjects)
{
var propertiesMerger = new MSBuildProjectPropertiesMerger(
msbuildProjects.GlobalMSBuildProject,
msbuildProjects.SharpDevelopMSBuildProject);
propertiesMerger.Merge();
if (propertiesMerger.Result.AnyPropertiesChanged())
{
LogProjectPropertiesMergeResult(msbuildProjects.SharpDevelopMSBuildProject, propertiesMerger.Result);
}
}
void LogProjectPropertiesMergeResult(MSBuildBasedProject project, MSBuildProjectPropertiesMergeResult result)
{
logger.Log(
MessageLevel.Info,
"Project properties merge result for project '{0}':\r\n{1}",
project.Name,
result);
}
}
}

55
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/MSBuildProjectPropertiesMergeResult.cs

@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
// 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;
namespace ICSharpCode.PackageManagement.Scripting
{
public class MSBuildProjectPropertiesMergeResult
{
List<string> propertiesAdded = new List<string>();
List<string> propertiesUpdated = new List<string>();
public IEnumerable<string> PropertiesAdded {
get { return propertiesAdded; }
}
public IEnumerable<string> PropertiesUpdated {
get { return propertiesUpdated; }
}
public override string ToString()
{
return String.Format(
"Properties added: {0}\r\nProperties updated: {1}",
PropertiesToString(propertiesAdded),
PropertiesToString(propertiesUpdated));
}
static string PropertiesToString(IEnumerable<string> properties)
{
if (!properties.Any()) {
return String.Empty;
}
return String.Join(",\r\n", properties.Select(property => property));
}
public void AddPropertyAdded(string propertyName)
{
propertiesAdded.Add(propertyName);
}
public void AddPropertyUpdated(string propertyName)
{
propertiesUpdated.Add(propertyName);
}
public bool AnyPropertiesChanged()
{
return propertiesUpdated.Any() || propertiesAdded.Any();
}
}
}

95
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/MSBuildProjectPropertiesMerger.cs

@ -0,0 +1,95 @@ @@ -0,0 +1,95 @@
// 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.SharpDevelop.Project;
using Microsoft.Build.Construction;
using Microsoft.Build.Evaluation;
namespace ICSharpCode.PackageManagement.Scripting
{
public class MSBuildProjectPropertiesMerger
{
IPackageManagementProjectService projectService;
Project msbuildProject;
MSBuildBasedProject sharpDevelopProject;
MSBuildProjectPropertiesMergeResult result = new MSBuildProjectPropertiesMergeResult();
public MSBuildProjectPropertiesMerger(Project msbuildProject, MSBuildBasedProject sharpDevelopProject)
: this(msbuildProject, sharpDevelopProject, new PackageManagementProjectService())
{
}
public MSBuildProjectPropertiesMerger(
Project msbuildProject,
MSBuildBasedProject sharpDevelopProject,
IPackageManagementProjectService projectService)
{
this.msbuildProject = msbuildProject;
this.sharpDevelopProject = sharpDevelopProject;
this.projectService = projectService;
}
public MSBuildProjectPropertiesMergeResult Result {
get { return result; }
}
public void Merge()
{
foreach (ProjectPropertyElement property in msbuildProject.Xml.Properties) {
UpdateProperty(property);
}
projectService.Save(sharpDevelopProject);
}
void UpdateProperty(ProjectPropertyElement msbuildProjectProperty)
{
List<ProjectPropertyElement> sharpDevelopProjectProperties = FindSharpDevelopProjectProperties(msbuildProjectProperty);
if (sharpDevelopProjectProperties.Count > 1) {
// Ignore. Currently do not handle properties defined inside
// property groups with conditions (e.g. OutputPath)
} else if (!sharpDevelopProjectProperties.Any()) {
AddPropertyToSharpDevelopProject(msbuildProjectProperty);
} else if (HasMSBuildProjectPropertyBeenUpdated(msbuildProjectProperty, sharpDevelopProjectProperties.First())) {
UpdatePropertyInSharpDevelopProject(msbuildProjectProperty);
}
}
List<ProjectPropertyElement> FindSharpDevelopProjectProperties(ProjectPropertyElement msbuildProjectProperty)
{
lock (sharpDevelopProject.SyncRoot) {
return sharpDevelopProject
.MSBuildProjectFile
.Properties
.Where(property => String.Equals(property.Name, msbuildProjectProperty.Name, StringComparison.OrdinalIgnoreCase))
.ToList();
}
}
void AddPropertyToSharpDevelopProject(ProjectPropertyElement msbuildProjectProperty)
{
SetPropertyInSharpDevelopProject(msbuildProjectProperty);
result.AddPropertyAdded(msbuildProjectProperty.Name);
}
void SetPropertyInSharpDevelopProject(ProjectPropertyElement msbuildProjectProperty)
{
sharpDevelopProject.SetProperty(msbuildProjectProperty.Name, msbuildProjectProperty.Value);
}
bool HasMSBuildProjectPropertyBeenUpdated(ProjectPropertyElement msbuildProjectProperty, ProjectPropertyElement sharpDevelopProjectProperty)
{
return msbuildProjectProperty.Value != sharpDevelopProjectProperty.Value;
}
void UpdatePropertyInSharpDevelopProject(ProjectPropertyElement msbuildProjectProperty)
{
SetPropertyInSharpDevelopProject(msbuildProjectProperty);
result.AddPropertyUpdated(msbuildProjectProperty.Name);
}
}
}

21
src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManager.cs

@ -72,7 +72,12 @@ namespace ICSharpCode.PackageManagement @@ -72,7 +72,12 @@ namespace ICSharpCode.PackageManagement
void AddPackageReference(IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
{
ProjectManager.AddPackageReference(package.Id, package.Version, ignoreDependencies, allowPrereleaseVersions);
var monitor = new RemovedPackageReferenceMonitor(ProjectManager);
using (monitor) {
ProjectManager.AddPackageReference(package.Id, package.Version, ignoreDependencies, allowPrereleaseVersions);
}
monitor.PackagesRemoved.ForEach(packageRemoved => UninstallPackageFromSolutionRepository(packageRemoved));
}
public override void InstallPackage(IPackage package, bool ignoreDependencies, bool allowPrereleaseVersions)
@ -94,6 +99,13 @@ namespace ICSharpCode.PackageManagement @@ -94,6 +99,13 @@ namespace ICSharpCode.PackageManagement
}
}
public void UninstallPackageFromSolutionRepository(IPackage package)
{
if (!IsPackageReferencedByOtherProjects(package)) {
ExecuteUninstall(package);
}
}
bool IsPackageReferencedByOtherProjects(IPackage package)
{
var sharedRepository = LocalRepository as ISharedPackageRepository;
@ -128,7 +140,12 @@ namespace ICSharpCode.PackageManagement @@ -128,7 +140,12 @@ namespace ICSharpCode.PackageManagement
void UpdatePackageReference(IPackage package, bool updateDependencies, bool allowPrereleaseVersions)
{
ProjectManager.UpdatePackageReference(package.Id, package.Version, updateDependencies, allowPrereleaseVersions);
var monitor = new RemovedPackageReferenceMonitor(ProjectManager);
using (monitor) {
ProjectManager.UpdatePackageReference(package.Id, package.Version, updateDependencies, allowPrereleaseVersions);
}
monitor.PackagesRemoved.ForEach(packageRemoved => UninstallPackageFromSolutionRepository(packageRemoved));
}
public void UpdatePackages(UpdatePackagesAction updateAction)

BIN
src/AddIns/Misc/PackageManagement/RequiredLibraries/Microsoft.Web.XmlTransform.dll

Binary file not shown.

BIN
src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Console.Types.dll

Binary file not shown.

BIN
src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Core.dll

Binary file not shown.

BIN
src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.exe

Binary file not shown.

4
src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Configuration/AssemblyInfo.vb

@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices @@ -13,7 +13,7 @@ Imports System.Runtime.InteropServices
<assembly: AssemblyConfiguration("")>
<assembly: AssemblyCompany("ic#code")>
<assembly: AssemblyProduct("SharpDevelop")>
<assembly: AssemblyCopyright("2000-2012 AlphaSierraPapa for the SharpDevelop Team")>
<assembly: AssemblyCopyright("2000-2013 AlphaSierraPapa for the SharpDevelop Team")>
<assembly: AssemblyTrademark("")>
<assembly: AssemblyCulture("")>
@ -28,4 +28,4 @@ Imports System.Runtime.InteropServices @@ -28,4 +28,4 @@ Imports System.Runtime.InteropServices
' You can specify all values by your own or you can build default build and revision
' numbers with the '*' character (the default):
<assembly: AssemblyVersion("4.3.0")>
<assembly: AssemblyVersion("4.4.0")>

1
src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/ProjectItem.vb

@ -18,5 +18,6 @@ Namespace EnvDTE @@ -18,5 +18,6 @@ Namespace EnvDTE
Sub Delete()
Sub Remove()
Function Open(viewKind As String) As Global.EnvDTE.Window
Sub Save(Optional fileName As String = Nothing)
End Interface
End Namespace

3
src/AddIns/Misc/PackageManagement/SharpDevelop.EnvDTE/Src/Reference.vb

@ -3,9 +3,12 @@ @@ -3,9 +3,12 @@
Namespace EnvDTE
Public Interface Reference
ReadOnly Property Identity() As String
ReadOnly Property Name() As String
ReadOnly Property Path() As String
ReadOnly Property PublicKeyToken As String
ReadOnly Property SourceProject() As Project
ReadOnly Property StrongName As Boolean
Sub Remove()
End Interface

1
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -213,6 +213,7 @@ @@ -213,6 +213,7 @@
<Compile Include="Src\RunAllProjectPackageScriptsActionTests.cs" />
<Compile Include="Src\Scripting\ConsoleHostFileConflictResolverTests.cs" />
<Compile Include="Src\Scripting\MSBuildProjectImportsMergerTests.cs" />
<Compile Include="Src\Scripting\MSBuildProjectPropertiesMergerTests.cs" />
<Compile Include="Src\UpdatedPackagesTests.cs" />
<Compile Include="Src\UpdatePackagesActionTests.cs" />
<Compile Include="Src\UpdateSolutionPackagesActionTests.cs" />

26
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.PackageManagement.EnvDTE;
using ICSharpCode.SharpDevelop.Workbench;
using NUnit.Framework;
@ -21,7 +22,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -21,7 +22,7 @@ namespace PackageManagement.Tests.EnvDTE
SD.FileProjectItem msbuildFileProjectItem;
TestableDTEProject project;
TestableProject msbuildProject;
Properties properties;
ICSharpCode.PackageManagement.EnvDTE.Properties properties;
void CreateProjectItemProperties()
{
@ -29,7 +30,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -29,7 +30,7 @@ namespace PackageManagement.Tests.EnvDTE
msbuildProject = project.TestableProject;
msbuildFileProjectItem = new SD.FileProjectItem(msbuildProject, SD.ItemType.Compile);
projectItem = new ProjectItem(project, msbuildFileProjectItem);
properties = (Properties)projectItem.Properties;
properties = (ICSharpCode.PackageManagement.EnvDTE.Properties)projectItem.Properties;
IWorkbench workbench = MockRepository.GenerateStub<IWorkbench>();
ICSharpCode.SharpDevelop.SD.Services.AddService(typeof(IWorkbench), workbench);
@ -144,7 +145,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -144,7 +145,7 @@ namespace PackageManagement.Tests.EnvDTE
string path = properties.Item("FullPath").Value as string;
Assert.AreEqual(@"d:\projects\test.cs", path);
}
}
[Test]
public void GetEnumerator_FindFullPathPropertyInAllProperties_ReturnsPropertyWithFullPathName()
@ -153,5 +154,24 @@ namespace PackageManagement.Tests.EnvDTE @@ -153,5 +154,24 @@ namespace PackageManagement.Tests.EnvDTE
AssertContainsProperty("FullPath", properties);
}
[Test]
public void Value_GetLocalPath_ReturnsProjectItemFullFileName()
{
CreateProjectItemProperties();
msbuildFileProjectItem.FileName = FileName.Create(@"d:\projects\test.cs");
string path = properties.Item("LocalPath").Value as string;
Assert.AreEqual(@"d:\projects\test.cs", path);
}
[Test]
public void GetEnumerator_FindLocalPathPropertyInAllProperties_ReturnsPropertyWithFullPathName()
{
CreateProjectItemProperties();
AssertContainsProperty("LocalPath", properties);
}
}
}

30
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs

@ -42,11 +42,12 @@ namespace PackageManagement.Tests.EnvDTE @@ -42,11 +42,12 @@ namespace PackageManagement.Tests.EnvDTE
OpenFileInSharpDevelop(fileName, dirty: true);
}
void OpenFileInSharpDevelop(string fileName, bool dirty)
IViewContent OpenFileInSharpDevelop(string fileName, bool dirty)
{
IViewContent view = MockRepository.GenerateStub<IViewContent>();
view.Stub(v => v.IsDirty).Return(dirty);
fakeFileService.AddOpenView(view, fileName);
return view;
}
[Test]
@ -402,5 +403,32 @@ namespace PackageManagement.Tests.EnvDTE @@ -402,5 +403,32 @@ namespace PackageManagement.Tests.EnvDTE
global::EnvDTE.ProjectItem item = collection.Item("program.cs");
Assert.AreEqual("program.cs", item.Name);
}
[Test]
public void Save_FileNameNotPassed_SavesFile()
{
CreateProjectItems();
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
msbuildProject.AddFile(@"program.cs");
IViewContent view = OpenFileInSharpDevelop(@"d:\projects\MyProject\program.cs", false);
global::EnvDTE.ProjectItem item = projectItems.Item("program.cs");
item.Save();
Assert.AreEqual(view, fakeFileService.ViewContentPassedToSaveFile);
}
[Test]
public void Save_FileNameNotPassedAndFileNotOpen_FileNotSaved()
{
CreateProjectItems();
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
msbuildProject.AddFile(@"program.cs");
global::EnvDTE.ProjectItem item = projectItems.Item("program.cs");
item.Save();
Assert.IsFalse(fakeFileService.IsSaveFileCalled);
}
}
}

60
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectPropertyTests.cs

@ -2,7 +2,11 @@ @@ -2,7 +2,11 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.PackageManagement.EnvDTE;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
@ -12,7 +16,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -12,7 +16,7 @@ namespace PackageManagement.Tests.EnvDTE
[TestFixture]
public class ProjectPropertyTests
{
Properties properties;
ICSharpCode.PackageManagement.EnvDTE.Properties properties;
TestableDTEProject project;
TestableProject msbuildProject;
@ -21,7 +25,18 @@ namespace PackageManagement.Tests.EnvDTE @@ -21,7 +25,18 @@ namespace PackageManagement.Tests.EnvDTE
project = new TestableDTEProject();
msbuildProject = project.TestableProject;
var factory = new ProjectPropertyFactory(project);
properties = new Properties(factory);
properties = new ICSharpCode.PackageManagement.EnvDTE.Properties(factory);
}
void AssertContainsProperty(string propertyName, IEnumerable items)
{
var itemsList = new List<Property>();
foreach (Property property in items) {
itemsList.Add(property);
}
var matchedProperty = itemsList.Find(p => p.Name == propertyName);
Assert.AreEqual(propertyName, matchedProperty.Name);
}
[Test]
@ -136,7 +151,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -136,7 +151,7 @@ namespace PackageManagement.Tests.EnvDTE
global::EnvDTE.Property fullPathProperty = project.Properties.Item("FullPath");
string fullPath = fullPathProperty.Value as string;
string expectedFullPath = @"d:\projects\MyProject";
string expectedFullPath = @"d:\projects\MyProject\";
Assert.AreEqual(expectedFullPath, fullPath);
}
@ -149,7 +164,7 @@ namespace PackageManagement.Tests.EnvDTE @@ -149,7 +164,7 @@ namespace PackageManagement.Tests.EnvDTE
global::EnvDTE.Property fullPathProperty = project.Properties.Item("FULLPATH");
string fullPath = fullPathProperty.Value as string;
string expectedFullPath = @"d:\projects\MyProject";
string expectedFullPath = @"d:\projects\MyProject\";
Assert.AreEqual(expectedFullPath, fullPath);
}
@ -233,5 +248,42 @@ namespace PackageManagement.Tests.EnvDTE @@ -233,5 +248,42 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual("MyProjectRootNamespace", defaultNamespace);
}
[Test]
public void Value_GetLocalPathProperty_ReturnsProjectDirectory()
{
CreateProperties();
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
global::EnvDTE.Property localPathProperty = project.Properties.Item("LocalPath");
string localPath = localPathProperty.Value as string;
string expectedLocalPath = @"d:\projects\MyProject\";
Assert.AreEqual(expectedLocalPath, localPath);
}
[Test]
public void GetEnumerator_LocalPathProperty_ExistsInEnumeratedProperties()
{
CreateProperties();
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
var enumerable = project.Properties as IEnumerable;
AssertContainsProperty("LocalPath", enumerable);
}
[Test]
public void Value_GetLocalPathPropertyWithUpperCaseCharacters_ReturnsProjectDirectory()
{
CreateProperties();
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
global::EnvDTE.Property fullPathProperty = project.Properties.Item("LOCALPATH");
string fullPath = fullPathProperty.Value as string;
string expectedFullPath = @"d:\projects\MyProject\";
Assert.AreEqual(expectedFullPath, fullPath);
}
}
}

70
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/Reference3Tests.cs

@ -130,5 +130,75 @@ namespace PackageManagement.Tests.EnvDTE @@ -130,5 +130,75 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual(@"c:\Program Files\Microsoft\Reference Assemblies\v4\System.Xml.dll", path);
}
[Test]
public void PublicKeyToken_ReferenceHasPublicKeyToken_ReturnsPublicKeyToken()
{
CreateReference("ICSharpCode.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=f829da5c02be14ee");
string publicKeyToken = reference.PublicKeyToken;
Assert.AreEqual("f829da5c02be14ee", publicKeyToken);
}
[Test]
public void PublicKeyToken_ReferenceHasNullPublicKeyToken_ReturnsEmptyString()
{
CreateReference("ICSharpCode.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null");
string publicKeyToken = reference.PublicKeyToken;
Assert.AreEqual(String.Empty, publicKeyToken);
}
[Test]
public void StrongName_ReferenceHasStrongName_ReturnsTrue()
{
CreateReference("ICSharpCode.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=f829da5c02be14ee");
bool result = reference.StrongName;
Assert.IsTrue(result);
}
[Test]
public void StrongName_ReferenceMissingVersion_ReturnsFalse()
{
CreateReference("ICSharpCode.Core, Culture=neutral, PublicKeyToken=f829da5c02be14ee");
bool result = reference.StrongName;
Assert.IsFalse(result);
}
[Test]
public void StrongName_ReferenceMissingPublicKeyToken_ReturnsFalse()
{
CreateReference("ICSharpCode.Core, Version=4.4.0.0, Culture=neutral");
bool result = reference.StrongName;
Assert.IsFalse(result);
}
[Test]
public void StrongName_ReferenceHasNullPublicKeyToken_ReturnsFalse()
{
CreateReference("ICSharpCode.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=null");
bool result = reference.StrongName;
Assert.IsFalse(result);
}
[Test]
public void Identity_FullyQualifiedReference_ReturnsAssemblyShortName()
{
CreateReference("ICSharpCode.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=f829da5c02be14ee");
string identity = reference.Identity;
Assert.AreEqual("ICSharpCode.Core", identity);
}
}
}

20
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ReferencesTests.cs

@ -31,18 +31,10 @@ namespace PackageManagement.Tests.EnvDTE @@ -31,18 +31,10 @@ namespace PackageManagement.Tests.EnvDTE
references = (References)projectObject.References;
}
void ReferenceCollectionAssertAreEqual(string[] expectedReferences, List<Reference> referenceList)
{
var actualReferences = new List<string>();
referenceList.ForEach(r => actualReferences.Add(r.Name));
CollectionAssert.AreEqual(expectedReferences, actualReferences);
}
void ReferenceCollectionAssertAreEqual(string[] expectedReferences, IEnumerable referenceList)
{
var actualReferences = new List<string>();
foreach (Reference reference in referenceList) {
foreach (global::EnvDTE.Reference reference in referenceList) {
actualReferences.Add(reference.Name);
}
@ -117,15 +109,14 @@ namespace PackageManagement.Tests.EnvDTE @@ -117,15 +109,14 @@ namespace PackageManagement.Tests.EnvDTE
msbuildProject.AddReference("System.Data");
msbuildProject.AddReference("System.Xml");
var referenceList = new List<Reference>();
referenceList.AddRange(references);
var enumerable = references as IEnumerable;
var expectedReferences = new string[] {
"System.Data",
"System.Xml"
};
ReferenceCollectionAssertAreEqual(expectedReferences, referenceList);
ReferenceCollectionAssertAreEqual(expectedReferences, enumerable);
}
[Test]
@ -135,14 +126,13 @@ namespace PackageManagement.Tests.EnvDTE @@ -135,14 +126,13 @@ namespace PackageManagement.Tests.EnvDTE
msbuildProject.AddFile(@"src\Test.cs");
msbuildProject.AddReference("System.Xml");
var referenceList = new List<Reference>();
referenceList.AddRange(references);
var enumerable = references as IEnumerable;
var expectedReferences = new string[] {
"System.Xml"
};
ReferenceCollectionAssertAreEqual(expectedReferences, referenceList);
ReferenceCollectionAssertAreEqual(expectedReferences, enumerable);
}
[Test]

9
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs

@ -143,5 +143,14 @@ namespace PackageManagement.Tests.Helpers @@ -143,5 +143,14 @@ namespace PackageManagement.Tests.Helpers
}
return null;
}
public IViewContent ViewContentPassedToSaveFile;
public bool IsSaveFileCalled;
public void SaveFile(IViewContent view)
{
IsSaveFileCalled = true;
ViewContentPassedToSaveFile = view;
}
}
}

23
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementProjectFactory.cs

@ -12,6 +12,17 @@ namespace PackageManagement.Tests.Helpers @@ -12,6 +12,17 @@ namespace PackageManagement.Tests.Helpers
{
public class FakePackageManagementProjectFactory : IPackageManagementProjectFactory
{
public FakePackageManagementProjectFactory()
{
CreatePackageManagementProject = (sourceRepository, project) => {
RepositoriesPassedToCreateProject.Add(sourceRepository);
ProjectsPassedToCreateProject.Add(project);
var fakeProject = new FakePackageManagementProject();
FakeProjectsCreated.Add(fakeProject);
return fakeProject;
};
}
public List<FakePackageManagementProject> FakeProjectsCreated =
new List<FakePackageManagementProject>();
@ -30,17 +41,17 @@ namespace PackageManagement.Tests.Helpers @@ -30,17 +41,17 @@ namespace PackageManagement.Tests.Helpers
get { return ProjectsPassedToCreateProject[0]; }
}
public Func<IPackageRepository, MSBuildBasedProject, FakePackageManagementProject>
CreatePackageManagementProject = (sourceRepository, project) => {
return null;
};
public List<MSBuildBasedProject> ProjectsPassedToCreateProject =
new List<MSBuildBasedProject>();
public IPackageManagementProject CreateProject(IPackageRepository sourceRepository, MSBuildBasedProject project)
{
RepositoriesPassedToCreateProject.Add(sourceRepository);
ProjectsPassedToCreateProject.Add(project);
var fakeProject = new FakePackageManagementProject();
FakeProjectsCreated.Add(fakeProject);
return fakeProject;
return CreatePackageManagementProject(sourceRepository, project);
}
}
}

46
src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementSolutionTests.cs

@ -454,13 +454,18 @@ namespace PackageManagement.Tests @@ -454,13 +454,18 @@ namespace PackageManagement.Tests
fakeProjectService.CurrentProject = null;
FakePackage package = FakePackage.CreatePackageWithVersion("Test", "1.3.4.5");
fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add(package);
TestableProject testProject = AddProjectToOpenProjects("Test");
var project = new FakePackageManagementProject();
fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
return project;
};
project.FakePackages.Add(package);
IQueryable<IPackage> packages = solution.GetPackages();
var expectedPackages = new FakePackage[] {
package
};
PackageCollectionAssert.AreEqual(expectedPackages, packages);
}
@ -555,5 +560,44 @@ namespace PackageManagement.Tests @@ -555,5 +560,44 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedInstallPath, installPath);
Assert.AreEqual(package, fakeSolutionPackageRepository.PackagePassedToGetInstallPath);
}
[Test]
public void GetPackages_OnePackageInstalledIntoOneProjectButTwoPackagesInSolutionRepository_ReturnsOnlyPackageInstalled()
{
CreateSolution();
fakeProjectService.CurrentProject = null;
TestableProject testProject = AddProjectToOpenProjects("Test");
var project = new FakePackageManagementProject();
fakeProjectFactory.CreatePackageManagementProject = (repository, msbuildProject) => {
return project;
};
FakePackage notInstalledPackage = FakePackage.CreatePackageWithVersion("NotInstalled", "1.0.0.0");
fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add(notInstalledPackage);
FakePackage installedPackage = FakePackage.CreatePackageWithVersion("Installed", "1.0.0.0");
fakeSolutionPackageRepository.FakeSharedRepository.FakePackages.Add(installedPackage);
project.FakePackages.Add(installedPackage);
IQueryable<IPackage> packages = solution.GetPackages();
var expectedPackages = new FakePackage[] {
installedPackage
};
}
[Test]
public void GetPackages_TwoProjectsButNoPackagesInstalled_PackageProjectsCreatedUsingActiveRepository()
{
CreateSolution();
fakeProjectService.CurrentProject = null;
TestableProject testProject1 = AddProjectToOpenProjects("Test1");
TestableProject testProject2 = AddProjectToOpenProjects("Test2");
IQueryable<IPackage> packages = solution.GetPackages();
Assert.AreEqual(testProject1, fakeProjectFactory.ProjectsPassedToCreateProject[0]);
Assert.AreEqual(testProject2, fakeProjectFactory.ProjectsPassedToCreateProject[1]);
Assert.AreEqual(fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject[0]);
Assert.AreEqual(fakeRegisteredPackageRepositories.ActiveRepository, fakeProjectFactory.RepositoriesPassedToCreateProject[1]);
}
}
}

249
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/MSBuildProjectPropertiesMergerTests.cs

@ -0,0 +1,249 @@ @@ -0,0 +1,249 @@
// 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.Linq;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Scripting;
using Microsoft.Build.Construction;
using Microsoft.Build.Evaluation;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
using Rhino.Mocks;
namespace PackageManagement.Tests.Scripting
{
[TestFixture]
public class MSBuildProjectPropertiesMergerTests
{
MSBuildProjectPropertiesMerger propertiesMerger;
IPackageManagementProjectService projectService;
TestableProject sharpDevelopProject;
Project msbuildProject;
[SetUp]
public void Init()
{
CreateMSBuildProject();
CreateSharpDevelopProject();
CreateProjectPropertiesMerger();
}
void CreateMSBuildProject()
{
msbuildProject = new Project();
}
void CreateSharpDevelopProject()
{
sharpDevelopProject = ProjectHelper.CreateTestProject();
}
void CreateProjectPropertiesMerger()
{
projectService = MockRepository.GenerateStub<IPackageManagementProjectService>();
propertiesMerger = new MSBuildProjectPropertiesMerger(msbuildProject, sharpDevelopProject, projectService);
}
void Merge()
{
propertiesMerger.Merge();
}
void AddPropertyToSharpDevelopProject(string name, string value)
{
sharpDevelopProject.SetProperty(name, value);
}
void AddPropertyToSharpDevelopProjectWithCondition(string name, string value, string condition)
{
lock (sharpDevelopProject.SyncRoot)
AddPropertyWithCondition(sharpDevelopProject.MSBuildProjectFile, name, value, condition);
}
void AddPropertyWithCondition(ProjectRootElement projectRoot, string name, string value, string condition)
{
ProjectPropertyGroupElement groupProperty = projectRoot.CreatePropertyGroupElement();
groupProperty.Condition = condition;
projectRoot.AppendChild(groupProperty);
ProjectPropertyElement property = projectRoot.CreatePropertyElement(name);
groupProperty.AppendChild(property);
property.Value = value;
property.Condition = condition;
}
void AddPropertyToMSBuildProject(string name, string value)
{
msbuildProject.SetProperty(name, value);
}
void AddPropertyToMSBuildProjectWithCondition(string name, string value, string condition)
{
AddPropertyWithCondition(msbuildProject.Xml, name, value, condition);
}
void AssertSharpDevelopProjectContainsProperty(string propertyName, string expectedValue)
{
string actualValue = sharpDevelopProject.GetEvaluatedProperty(propertyName);
Assert.AreEqual(expectedValue, actualValue);
}
[Test]
public void Merge_MSBuildProjectHasNewPropertyAdded_PropertyAddedToSharpDevelopProject()
{
AddPropertyToMSBuildProject("Test", "test-value");
Merge();
AssertSharpDevelopProjectContainsProperty("Test", "test-value");
}
[Test]
public void Merge_MSBuildProjectHasNewPropertyAdded_SharpDevelopProjectIsSaved()
{
AddPropertyToMSBuildProject("Test", "test-value");
Merge();
projectService.AssertWasCalled(service => service.Save(sharpDevelopProject));
}
[Test]
public void Merge_MSBuildProjectHasTwoNewPropertiesAdded_BothPropertiesAddedToSharpDevelopProject()
{
AddPropertyToMSBuildProject("Test1", "test-value1");
AddPropertyToMSBuildProject("Test2", "test-value2");
Merge();
AssertSharpDevelopProjectContainsProperty("Test1", "test-value1");
AssertSharpDevelopProjectContainsProperty("Test2", "test-value2");
}
[Test]
public void Merge_MSBuildProjectHasTwoNewPropertiesAdded_MergeResultHasBothPropertiesAdded()
{
AddPropertyToMSBuildProject("Test1", "test-value2");
AddPropertyToMSBuildProject("Test2", "test-value2");
Merge();
var expected = new string[] { "Test1", "Test2" };
string expectedToString = "Properties added: Test1,\r\nTest2\r\nProperties updated: ";
CollectionAssert.AreEqual(expected, propertiesMerger.Result.PropertiesAdded);
Assert.AreEqual(expectedToString, propertiesMerger.Result.ToString());
}
[Test]
public void Merge_MSBuildProjectPropertyUpdated_SharpDevelopProjectPropertyIsUpdated()
{
AddPropertyToSharpDevelopProject("Test", "old-value");
AddPropertyToMSBuildProject("Test", "new-value");
Merge();
AssertSharpDevelopProjectContainsProperty("Test", "new-value");
}
[Test]
public void Merge_TwoMSBuildProjectsPropertiesUpdated_BothPropertiesUpdatedInSharpDevelopProject()
{
AddPropertyToSharpDevelopProject("Test1", "old-value");
AddPropertyToSharpDevelopProject("Test2", "old-value");
AddPropertyToMSBuildProject("Test1", "new-value1");
AddPropertyToMSBuildProject("Test2", "new-value2");
Merge();
AssertSharpDevelopProjectContainsProperty("Test1", "new-value1");
AssertSharpDevelopProjectContainsProperty("Test2", "new-value2");
}
[Test]
public void Merge_TwoMSBuildProjectsPropertiesUpdated_MergeResultShowsUpdatedProperty()
{
AddPropertyToSharpDevelopProject("Test1", "old-value");
AddPropertyToSharpDevelopProject("Test2", "old-value");
AddPropertyToMSBuildProject("Test1", "new-value");
AddPropertyToMSBuildProject("Test2", "new-value");
Merge();
var expected = new string[] { "Test1", "Test2" };
string expectedToString = "Properties added: \r\nProperties updated: Test1,\r\nTest2";
CollectionAssert.AreEqual(expected, propertiesMerger.Result.PropertiesUpdated);
Assert.AreEqual(expectedToString, propertiesMerger.Result.ToString());
}
[Test]
public void Merge_TwoMSBuildProjectsNotChanged_MergeResultShowNoUpdatedProperties()
{
AddPropertyToSharpDevelopProject("Test1", "old-value");
AddPropertyToSharpDevelopProject("Test2", "old-value");
AddPropertyToMSBuildProject("Test1", "old-value");
AddPropertyToMSBuildProject("Test2", "old-value");
Merge();
var expected = new string[0];
CollectionAssert.AreEqual(expected, propertiesMerger.Result.PropertiesUpdated);
CollectionAssert.AreEqual(expected, propertiesMerger.Result.PropertiesAdded);
Assert.IsFalse(propertiesMerger.Result.AnyPropertiesChanged());
}
[Test]
public void SetProperty_UseDifferentCaseForMSBuildPropertyName_WhatHappens()
{
AddPropertyToMSBuildProject("test", "value");
string propertyValue = msbuildProject.GetPropertyValue("TEST");
Assert.AreEqual("value", propertyValue);
}
[Test]
public void Merge_MSBuildProjectPropertyUpdatedButDifferentCaseUsedForName_SharpDevelopProjectPropertyIsStillUpdated()
{
AddPropertyToSharpDevelopProject("TEST", "old-value");
AddPropertyToMSBuildProject("Test", "new-value");
Merge();
AssertSharpDevelopProjectContainsProperty("TEST", "new-value");
}
[Test]
public void Merge_MSBuildProjectPropertyUpdatedButDifferentCaseUsedForName_MergeResultShowsPropertyHasBeenUpdated()
{
AddPropertyToSharpDevelopProject("TEST", "old-value");
AddPropertyToMSBuildProject("Test", "new-value");
Merge();
var expected = new string[] { "Test" };
CollectionAssert.AreEqual(expected, propertiesMerger.Result.PropertiesUpdated);
Assert.AreEqual(0, propertiesMerger.Result.PropertiesAdded.Count());
}
/// <summary>
/// Ignore any properties that are duplicated in the project file, such as
/// OutputPath which exists twice due to Debug and Release configurations.
/// </summary>
[Test]
public void Merge_OutputPathPropertyInDebugAndReleaseConfigurations_SharpDevelopProjectPropertiesNotChanged()
{
string debugConfiguration = "'$(Configuration)' == 'Debug'";
string releaseConfiguration = "'$(Configuration)' == 'Release'";
AddPropertyToSharpDevelopProjectWithCondition("OutputPath", @"bin\Release", releaseConfiguration);
AddPropertyToSharpDevelopProjectWithCondition("OutputPath", @"bin\Debug", debugConfiguration);
AddPropertyToMSBuildProjectWithCondition("OutputPath", @"bin\Release", releaseConfiguration);
AddPropertyToMSBuildProjectWithCondition("OutputPath", @"bin\Debug", debugConfiguration);
Merge();
Assert.IsFalse(propertiesMerger.Result.AnyPropertiesChanged());
}
}
}

132
src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs

@ -12,6 +12,7 @@ using NuGet; @@ -12,6 +12,7 @@ using NuGet;
using NUnit.Framework;
using Rhino.Mocks;
using PackageManagement.Tests.Helpers;
using Rhino.Mocks.Expectations;
namespace PackageManagement.Tests
{
@ -311,6 +312,34 @@ namespace PackageManagement.Tests @@ -311,6 +312,34 @@ namespace PackageManagement.Tests
fakePackageOperationResolverFactory.UpdatePackageOperationsResolver = fakePackageOperationResolver;
}
void RaisePackageRemovedEventWhenPackageReferenceUpdated(
ISharpDevelopProjectManager projectManager,
FakePackage updatedPackage,
params PackageOperationEventArgs[] eventArgs)
{
projectManager
.Stub(manager => manager.UpdatePackageReference(
Arg<string>.Is.Equal(updatedPackage.Id),
Arg<SemanticVersion>.Is.Equal(updatedPackage.Version),
Arg<bool>.Is.Anything,
Arg<bool>.Is.Anything))
.WhenCalled(call => eventArgs.ToList().ForEach(eventArg => projectManager.Raise(manager => manager.PackageReferenceRemoved += null, projectManager, eventArg)));
}
void RaisePackageRemovedEventWhenPackageReferenceAdded(
ISharpDevelopProjectManager projectManager,
FakePackage newPackage,
params PackageOperationEventArgs[] eventArgs)
{
projectManager
.Stub(manager => manager.AddPackageReference(
Arg<string>.Is.Equal(newPackage.Id),
Arg<SemanticVersion>.Is.Equal(newPackage.Version),
Arg<bool>.Is.Anything,
Arg<bool>.Is.Anything))
.WhenCalled(call => eventArgs.ToList().ForEach(eventArg => projectManager.Raise(manager => manager.PackageReferenceRemoved += null, projectManager, eventArg)));
}
[Test]
public void ProjectManager_InstanceCreated_SourceRepositoryIsSharedRepositoryPassedToPackageManager()
{
@ -969,5 +998,108 @@ namespace PackageManagement.Tests @@ -969,5 +998,108 @@ namespace PackageManagement.Tests
PackageCollectionAssert.AreEqual(expectedPackages, fakeSolutionSharedRepository.PackagesAdded);
}
[Test]
public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdating_OldPackageIsUninstalled()
{
CreatePackageManager();
var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
packageManager.ProjectManager = fakeProjectManager;
FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage", "1.0");
FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
RaisePackageRemovedEventWhenPackageReferenceUpdated(fakeProjectManager, updatedPackage, eventArgs);
var updateAction = new FakeUpdatePackageAction {
Operations = new List<PackageOperation>(),
UpdateDependencies = false
};
packageManager.UpdatePackage(updatedPackage, updateAction);
Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
}
[Test]
public void UpdatePackage_TwoOldPackageReferencesAreRemovedOnUpdating_BothOldPackagesAreUninstalled()
{
CreatePackageManager();
var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
packageManager.ProjectManager = fakeProjectManager;
FakePackage installedPackage1 = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage-Core", "1.0");
FakePackage installedPackage2 = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage", "1.0");
FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
var eventArgs1 = new PackageOperationEventArgs(installedPackage1, null, null);
var eventArgs2 = new PackageOperationEventArgs(installedPackage2, null, null);
RaisePackageRemovedEventWhenPackageReferenceUpdated(fakeProjectManager, updatedPackage, eventArgs1, eventArgs2);
var updateAction = new FakeUpdatePackageAction {
Operations = new List<PackageOperation>(),
UpdateDependencies = false
};
packageManager.UpdatePackage(updatedPackage, updateAction);
Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage2));
Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage1));
}
[Test]
public void UpdatePackage_OldPackageReferenceIsRemovedOnUpdatingButAnotherProjectStillReferencesThePackage_OldPackageIsNotUninstalled()
{
CreatePackageManager();
var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
packageManager.ProjectManager = fakeProjectManager;
FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage-Core", "1.0");
FakePackage updatedPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
RaisePackageRemovedEventWhenPackageReferenceUpdated(fakeProjectManager, updatedPackage, eventArgs);
var updateAction = new FakeUpdatePackageAction {
Operations = new List<PackageOperation>(),
UpdateDependencies = false
};
fakeSolutionSharedRepository.PackageIdsReferences.Add("MyPackage-Core");
packageManager.UpdatePackage(updatedPackage, updateAction);
Assert.IsTrue(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
}
[Test]
public void InstallPackage_OldPackageReferenceIsRemovedOnInstalling_OldPackageIsUninstalled()
{
CreatePackageManager();
var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
packageManager.ProjectManager = fakeProjectManager;
FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage", "1.0");
FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
RaisePackageRemovedEventWhenPackageReferenceAdded(fakeProjectManager, newPackage, eventArgs);
var installAction = new FakeInstallPackageAction {
Operations = new List<PackageOperation>()
};
packageManager.InstallPackage(newPackage, installAction);
Assert.IsFalse(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
}
[Test]
public void InstallPackage_OldPackageReferenceIsRemovedOnInstallingButOtherProjectsReferencesOldPackage_OldPackageIsNotUninstalled()
{
CreatePackageManager();
var fakeProjectManager = MockRepository.GenerateStub<ISharpDevelopProjectManager>();
packageManager.ProjectManager = fakeProjectManager;
FakePackage installedPackage = fakeSolutionSharedRepository.AddFakePackageWithVersion("MyPackage.Core", "1.0");
FakePackage newPackage = fakeFeedSourceRepository.AddFakePackageWithVersion("MyPackage", "1.1");
fakeSolutionSharedRepository.PackageIdsReferences.Add("MyPackage.Core");
var eventArgs = new PackageOperationEventArgs(installedPackage, null, null);
RaisePackageRemovedEventWhenPackageReferenceAdded(fakeProjectManager, newPackage, eventArgs);
var installAction = new FakeInstallPackageAction {
Operations = new List<PackageOperation>()
};
packageManager.InstallPackage(newPackage, installAction);
Assert.IsTrue(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
}
}
}

6
src/Main/Base/Project/Src/Gui/Components/SideBar/TextEditorSideBar.cs

@ -61,7 +61,11 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -61,7 +61,11 @@ namespace ICSharpCode.SharpDevelop.Gui
// do not show a warning when the side bar file does not exist
GenerateStandardSideBar();
} catch (Exception ex) {
MessageService.ShowWarning(ex.ToString());
LoggingService.Warn("Error loading SideBarConfig.xml", ex);
// We cannot show the error to the user; it's possible that this code is called
// while dispatcher processing is suspended.
// http://community.sharpdevelop.net/forums/t/19984.aspx
//MessageService.ShowWarning(ex.ToString());
GenerateStandardSideBar();
}

13
src/Main/Base/Project/Src/Project/TargetFramework.cs

@ -46,12 +46,17 @@ namespace ICSharpCode.SharpDevelop.Project @@ -46,12 +46,17 @@ namespace ICSharpCode.SharpDevelop.Project
RequiresAppConfigEntry = true,
IsAvailable = DotnetDetection.IsDotnet45Installed
};
// public readonly static TargetFramework Net45Client = new ClientProfileTargetFramework(Net45) {
// BasedOn = Net40Client
// };
public readonly static TargetFramework Net451 = new TargetFramework("v4.5.1", ".NET Framework 4.5.1") {
BasedOn = Net45,
MinimumMSBuildVersion = new Version(4, 0),
SupportedRuntimeVersion = "v4.0",
SupportedSku = ".NETFramework,Version=v4.5.1",
RequiresAppConfigEntry = true,
IsAvailable = DotnetDetection.IsDotnet451Installed
};
public readonly static TargetFramework[] TargetFrameworks = {
Net45, Net40, Net40Client, Net35, Net35Client, Net30, Net20
Net451, Net45, Net40, Net40Client, Net35, Net35Client, Net30, Net20
};
public readonly static TargetFramework DefaultTargetFramework = Net40Client;

33
src/Main/Base/Project/Util/DotnetDetection.cs

@ -6,24 +6,53 @@ using Microsoft.Win32; @@ -6,24 +6,53 @@ using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop
{
public class DotnetDetection
public static class DotnetDetection
{
/// <summary>
/// Gets whether .NET 3.5 is installed and has at least SP1.
/// </summary>
public static bool IsDotnet35SP1Installed()
{
using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5")) {
return key != null && (key.GetValue("SP") as int?) >= 1;
}
}
/// <summary>
/// Gets whether any .NET 4.x runtime is installed.
/// </summary>
public static bool IsDotnet40Installed()
{
return true; // required for SD to run
}
/// <summary>
/// Gets whether the .NET 4.5 runtime (or a later version of .NET 4.x) is installed.
/// </summary>
public static bool IsDotnet45Installed()
{
Version dotnet45Beta = new Version(4, 0, 30319, 17379);
return Environment.Version >= dotnet45Beta;
}
/// <summary>
/// Gets whether the .NET 4.5.1 runtime (or a later version of .NET 4.x) is installed.
/// </summary>
public static bool IsDotnet451Installed()
{
// According to: http://blogs.msdn.com/b/astebner/archive/2013/11/11/10466402.aspx
// 378675 is .NET 4.5.1 on Win8
// 378758 is .NET 4.5.1 on Win7
return GetDotnet4Release() >= 378675;
}
static int? GetDotnet4Release()
{
using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full")) {
if (key != null)
return key.GetValue("Release") as int?;
}
return null;
}
}
}

2
src/Setup/Chocolatey/Tools/chocolateyInstall.ps1

@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
$packageName = 'sharpdevelop'
$installerType = 'msi'
$url = 'http://downloads.sourceforge.net/sharpdevelop/SharpDevelop_4.3.3.9663_Setup.msi?download'
$url = 'http://downloads.sourceforge.net/sharpdevelop/SharpDevelop_4.4.0.9722_Setup.msi?download'
$silentArgs = '/q'
$validExitCodes = @(0)

2
src/Setup/Chocolatey/sharpdevelop.nuspec

@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
<metadata>
<id>sharpdevelop</id>
<title>SharpDevelop</title>
<version>4.3.3</version>
<version>4.4</version>
<authors>IC#Code Team</authors>
<owners>SharpDevelop Team</owners>
<summary>sharpdevelop</summary>

Loading…
Cancel
Save