diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs index 84bcd70377..1419521e82 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs @@ -639,6 +639,34 @@ namespace ICSharpCode.WpfDesign.Tests.Designer AddBindingWithStaticResourceWhereResourceOnSameElement(true); } + [Test] + public void AddStaticResourceWhereResourceOnSameElement() + { + DesignItem button = CreateCanvasContext(""; + + AssertCanvasDesignerOutput(expectedXaml, button.Context); + AssertLog(""); + } + [Test] public void AddBrushAsResource() { diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs index d7b1b1949e..dd23b6eef2 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs @@ -38,36 +38,7 @@ namespace ICSharpCode.WpfDesign.XamlDom return false; } - foreach (var property in obj.Properties.Where((prop) => prop.IsSet)) - { - var value = property.PropertyValue; - if (value is XamlTextValue) - continue; - else - { - XamlObject xamlObject = value as XamlObject; - if (xamlObject == null || !xamlObject.IsMarkupExtension) - return false; - else { - var staticResource = xamlObject.Instance as System.Windows.StaticResourceExtension; - if (staticResource != null && - staticResource.ResourceKey != null) { - XamlObject parent = GetNonMarkupExtensionParent(xamlObject); - - if (parent != null) { - var parentLocalResource = parent.ServiceProvider.Resolver.FindLocalResource(staticResource.ResourceKey); - - // If resource with the specified key is declared locally on the same object as the StaticResource is being used the markup extension - // must be printed as element to find the resource, otherwise it will search from parent-parent and find none or another resource. - if (parentLocalResource != null) - return false; - } - } - } - } - } - - return true; + return CanPrint(obj, false, GetNonMarkupExtensionParent(obj)); } /// @@ -115,6 +86,28 @@ namespace ICSharpCode.WpfDesign.XamlDom return sb.ToString(); } + private static bool CanPrint(XamlObject obj, bool isNested, XamlObject nonMarkupExtensionParent) + { + if ((isNested || obj.ParentObject == nonMarkupExtensionParent) && IsStaticResourceThatReferencesLocalResource(obj, nonMarkupExtensionParent)) { + return false; + } + + foreach (var property in obj.Properties.Where((prop) => prop.IsSet)) { + var value = property.PropertyValue; + if (value is XamlTextValue) + continue; + else { + var xamlObject = value as XamlObject; + if (xamlObject == null || !xamlObject.IsMarkupExtension) + return false; + else + return CanPrint(xamlObject, true, nonMarkupExtensionParent); + } + } + + return true; + } + private static XamlObject GetNonMarkupExtensionParent(XamlObject markupExtensionObject) { System.Diagnostics.Debug.Assert(markupExtensionObject.IsMarkupExtension); @@ -125,5 +118,21 @@ namespace ICSharpCode.WpfDesign.XamlDom } return obj; } + + private static bool IsStaticResourceThatReferencesLocalResource(XamlObject obj, XamlObject nonMarkupExtensionParent) + { + var staticResource = obj.Instance as System.Windows.StaticResourceExtension; + if (staticResource != null && staticResource.ResourceKey != null && nonMarkupExtensionParent != null) { + + var parentLocalResource = nonMarkupExtensionParent.ServiceProvider.Resolver.FindLocalResource(staticResource.ResourceKey); + + // If resource with the specified key is declared locally on the same object as the StaticResource is being used the markup extension + // must be printed as element to find the resource, otherwise it will search from parent-parent and find none or another resource. + if (parentLocalResource != null) + return true; + } + + return false; + } } } diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs index b77ef92be8..1e7ac464a9 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs @@ -27,6 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui public class ProjectReferencePanel : ListView, IReferencePanel { ISelectReferenceDialog selectDialog; + TextBox filterTextBox; public ProjectReferencePanel(ISelectReferenceDialog selectDialog) { @@ -48,6 +49,15 @@ namespace ICSharpCode.SharpDevelop.Gui ItemActivate += delegate { AddReference(); }; PopulateListView(); + + + Panel upperPanel = new Panel { Dock = DockStyle.Top, Height = 20 }; + filterTextBox = new TextBox { Width = 150, Dock = DockStyle.Right }; + filterTextBox.TextChanged += delegate { Search(); }; + + upperPanel.Controls.Add(filterTextBox); + + this.Controls.Add(upperPanel); } public void AddReference() @@ -60,6 +70,7 @@ namespace ICSharpCode.SharpDevelop.Gui new ProjectReferenceProjectItem(selectDialog.ConfigureProject, project) ); } + filterTextBox.Text = ""; } void PopulateListView() @@ -74,5 +85,32 @@ namespace ICSharpCode.SharpDevelop.Gui Items.Add(newItem); } } + + static bool ContainsAnyOfTokens(string bigText, string[] tokens) + { + if(tokens.Length==0) + return true; + foreach(var token in tokens) + { + if(bigText.IndexOf(token, StringComparison.OrdinalIgnoreCase)<0) + return false; + } + return true; + } + + void Search() + { + Items.Clear(); + var tokens = filterTextBox.Text.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries); + + foreach (IProject project in ProjectService.OpenSolution.Projects. + Where(pr=>ContainsAnyOfTokens(pr.Name, tokens)) + .OrderBy(p => p.Name, StringComparer.OrdinalIgnoreCase) + ) { + ListViewItem newItem = new ListViewItem(new string[] { project.Name, project.Directory }); + newItem.Tag = project; + Items.Add(newItem); + } + } } } diff --git a/src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs b/src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs index cb85ac4348..af97190bf2 100644 --- a/src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs +++ b/src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs @@ -161,9 +161,8 @@ namespace ICSharpCode.SharpDevelop { Type serviceType = typeof(T); lock (services) { - object instance; - if (services.TryGetValue(serviceType, out instance)) { - return Task.FromResult((T)instance); + if (services.ContainsKey(serviceType)) { + return Task.FromResult((T)GetService(serviceType)); } else { object taskCompletionSource; if (taskCompletionSources.TryGetValue(serviceType, out taskCompletionSource)) { diff --git a/src/Main/GlobalAssemblyInfo.cs.template b/src/Main/GlobalAssemblyInfo.cs.template index 24cb65ee69..abf126b695 100644 --- a/src/Main/GlobalAssemblyInfo.cs.template +++ b/src/Main/GlobalAssemblyInfo.cs.template @@ -46,7 +46,7 @@ internal static class RevisionClass public const string Minor = "0"; public const string Build = "0"; public const string Revision = "$INSERTREVISION$"; - public const string VersionName = "Beta 4"; // "" is not valid for no version name, you have to use null if you don't want a version name (eg "Beta 1") + public const string VersionName = "Beta 5"; // "" is not valid for no version name, you have to use null if you don't want a version name (eg "Beta 1") public const string FullVersion = Major + "." + Minor + "." + Build + ".$INSERTREVISION$$INSERTBRANCHPOSTFIX$$INSERTVERSIONNAMEPOSTFIX$"; }