Browse Source

Merge branch 'master' of github.com:icsharpcode/SharpDevelop

pull/520/merge
Peter Forstmeier 11 years ago
parent
commit
d4ca9909e5
  1. 28
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs
  2. 69
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs
  3. 38
      src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs
  4. 5
      src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs
  5. 2
      src/Main/GlobalAssemblyInfo.cs.template

28
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/Designer/ModelTests.cs

@ -639,6 +639,34 @@ namespace ICSharpCode.WpfDesign.Tests.Designer @@ -639,6 +639,34 @@ namespace ICSharpCode.WpfDesign.Tests.Designer
AddBindingWithStaticResourceWhereResourceOnSameElement(true);
}
[Test]
public void AddStaticResourceWhereResourceOnSameElement()
{
DesignItem button = CreateCanvasContext("<Button/>");
DesignItem canvas = button.Parent;
DesignItemProperty resProp = button.Properties.GetProperty("Resources");
Assert.IsTrue(resProp.IsCollection);
DesignItem exampleClassItem = canvas.Services.Component.RegisterComponentForDesigner(new ExampleClass());
exampleClassItem.Key = "res1";
resProp.CollectionElements.Add(exampleClassItem);
button.Properties["Tag"].SetValue(new StaticResourceExtension());
button.Properties["Tag"].Value.Properties["ResourceKey"].SetValue("res1");
string expectedXaml = "<Button>\n" +
" <Button.Resources>\n" +
" <t:ExampleClass x:Key=\"res1\" />\n" +
" </Button.Resources>\n" +
" <Button.Tag>\n" +
" <StaticResourceExtension ResourceKey=\"res1\" />\n" +
" </Button.Tag>\n" +
"</Button>";
AssertCanvasDesignerOutput(expectedXaml, button.Context);
AssertLog("");
}
[Test]
public void AddBrushAsResource()
{

69
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs

@ -38,36 +38,7 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -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));
}
/// <summary>
@ -115,6 +86,28 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -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 @@ -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;
}
}
}

38
src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ProjectReferencePanel.cs

@ -27,6 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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 @@ -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 @@ -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 @@ -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);
}
}
}
}

5
src/Main/Base/Project/Util/SharpDevelopServiceContainer.cs

@ -161,9 +161,8 @@ namespace ICSharpCode.SharpDevelop @@ -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)) {

2
src/Main/GlobalAssemblyInfo.cs.template

@ -46,7 +46,7 @@ internal static class RevisionClass @@ -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$";
}

Loading…
Cancel
Save