Browse Source

Merge pull request #143 from kekekeks/xmlns-attr

Now resolving xml namespaces via attributes
pull/145/head
Nikita Tsukanov 11 years ago
parent
commit
43118aeda5
  1. 1
      Perspex.sln
  2. 1
      src/Gtk/Perspex.Gtk/GtkPlatform.cs
  3. 3
      src/Gtk/Perspex.Gtk/Perspex.Gtk.csproj
  4. 53
      src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs
  5. 3
      src/Markup/Perspex.Markup.Xaml/Properties/AssemblyInfo.cs
  6. 21
      src/Perspex.Base/Metadata/XmlnsDefinitionAttribute.cs
  7. 2
      src/Perspex.Base/Perspex.Base.csproj
  8. 14
      src/Perspex.Base/Platform/IPclPlatformWrapper.cs
  9. 6
      src/Perspex.Controls/Properties/AssemblyInfo.cs
  10. 2
      src/Perspex.Styling/Properties/AssemblyInfo.cs
  11. BIN
      src/Shared/PclPlatformWrapper.cs
  12. 3
      src/Windows/Perspex.Win32/Perspex.Win32.csproj
  13. 1
      src/Windows/Perspex.Win32/Win32Platform.cs

1
Perspex.sln

@ -79,6 +79,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9B9E
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A689DEF5-D50F-4975-8B72-124C9EB54066}"
ProjectSection(SolutionItems) = preProject
src\Shared\PclPlatformWrapper.cs = src\Shared\PclPlatformWrapper.cs
src\Shared\SharedAssemblyInfo.cs = src\Shared\SharedAssemblyInfo.cs
EndProjectSection
EndProject

1
src/Gtk/Perspex.Gtk/GtkPlatform.cs

@ -28,6 +28,7 @@ namespace Perspex.Gtk
public static void Initialize()
{
var locator = Locator.CurrentMutable;
locator.Register(() => new PclPlatformWrapper(), typeof(IPclPlatformWrapper));
locator.Register(() => new WindowImpl(), typeof(IWindowImpl));
locator.Register(() => new PopupImpl(), typeof(IPopupImpl));
locator.Register(() => new ClipboardImpl(), typeof(IClipboard));

3
src/Gtk/Perspex.Gtk/Perspex.Gtk.csproj

@ -58,6 +58,9 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\Shared\PclPlatformWrapper.cs">
<Link>PclPlatformWrapper.cs</Link>
</Compile>
<Compile Include="AssetLoader.cs" />
<Compile Include="ClipboardImpl.cs" />
<Compile Include="CursorFactory.cs" />

53
src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs

@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
using Glass;
using OmniXaml;
@ -16,6 +17,10 @@ using Perspex.Markup.Xaml.DataBinding;
using Perspex.Markup.Xaml.MarkupExtensions;
using Perspex.Media;
using Perspex.Media.Imaging;
using Perspex.Metadata;
using Perspex.Platform;
using Perspex.Styling;
using Splat;
namespace Perspex.Markup.Xaml.Context
{
@ -39,37 +44,27 @@ namespace Perspex.Markup.Xaml.Context
{
var xamlNamespaceRegistry = new XamlNamespaceRegistry();
var rootType = typeof(Control);
var bindingType = typeof(BindingExtension);
var templateType = typeof(XamlDataTemplate);
var definitionForRoot = XamlNamespace
.Map(PerspexNs)
.With(
new[]
{
Route.Assembly(rootType.GetTypeInfo().Assembly).WithNamespaces(
new[]
{
rootType.Namespace
}),
Route.Assembly(bindingType.GetTypeInfo().Assembly).WithNamespaces(
new[]
{
bindingType.Namespace,
}),
Route.Assembly(templateType.GetTypeInfo().Assembly).WithNamespaces(
new[]
{
templateType.Namespace,
})
});
foreach (var ns in new List<XamlNamespace> { definitionForRoot })
var forcedAssemblies = new[]
{
xamlNamespaceRegistry.AddNamespace(ns);
typeof (Control),
typeof(Style)
}.Select(t => t.GetTypeInfo().Assembly);
foreach (var nsa in
forcedAssemblies
.Concat(Locator.Current.GetService<IPclPlatformWrapper>().GetLoadedAssemblies())
.Distinct()
.SelectMany(asm
=> asm.GetCustomAttributes<XmlnsDefinitionAttribute>().Select(attr => new {asm, attr}))
.GroupBy(entry => entry.attr.XmlNamespace))
{
var def = XamlNamespace.Map(nsa.Key)
.With(nsa.GroupBy(x => x.asm).Select(
a => Route.Assembly(a.Key)
.WithNamespaces(a.Select(entry => entry.attr.ClrNamespace).ToList())
));
xamlNamespaceRegistry.AddNamespace(def);
}
xamlNamespaceRegistry.RegisterPrefix(new PrefixRegistration(string.Empty, PerspexNs));
return xamlNamespaceRegistry;

3
src/Markup/Perspex.Markup.Xaml/Properties/AssemblyInfo.cs

@ -2,5 +2,8 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Reflection;
using Perspex.Metadata;
[assembly: AssemblyTitle("Perspex.Markup.Xaml")]
[assembly: XmlnsDefinition("https://github.com/perspex", "Perspex.Markup.Xaml.MarkupExtensions")]
[assembly: XmlnsDefinition("https://github.com/perspex", "Perspex.Markup.Xaml.Templates")]

21
src/Perspex.Base/Metadata/XmlnsDefinitionAttribute.cs

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Perspex.Metadata
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public class XmlnsDefinitionAttribute : Attribute
{
public string XmlNamespace { get; set; }
public string ClrNamespace { get; set; }
public XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace)
{
XmlNamespace = xmlNamespace;
ClrNamespace = clrNamespace;
}
}
}

2
src/Perspex.Base/Perspex.Base.csproj

@ -46,8 +46,10 @@
<Compile Include="Diagnostics\PerspexObjectExtensions.cs" />
<Compile Include="IObservablePropertyBag.cs" />
<Compile Include="IPropertyBag.cs" />
<Compile Include="Metadata\XmlnsDefinitionAttribute.cs" />
<Compile Include="PerspexObjectExtensions.cs" />
<Compile Include="PerspexProperty`1.cs" />
<Compile Include="Platform\IPclPlatformWrapper.cs" />
<Compile Include="PriorityBindingEntry.cs" />
<Compile Include="Collections\IPerspexList.cs" />
<Compile Include="Collections\PerspexList.cs" />

14
src/Perspex.Base/Platform/IPclPlatformWrapper.cs

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Perspex.Platform
{
public interface IPclPlatformWrapper
{
Assembly[] GetLoadedAssemblies();
}
}

6
src/Perspex.Controls/Properties/AssemblyInfo.cs

@ -3,6 +3,10 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using Perspex.Metadata;
[assembly: AssemblyTitle("Perspex.Controls")]
[assembly: InternalsVisibleTo("Perspex.Controls.UnitTests")]
[assembly: InternalsVisibleTo("Perspex.Controls.UnitTests")]
[assembly: XmlnsDefinition("https://github.com/perspex", "Perspex.Controls")]
[assembly: XmlnsDefinition("https://github.com/perspex", "Perspex.Controls.Primitives")]

2
src/Perspex.Styling/Properties/AssemblyInfo.cs

@ -2,5 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Reflection;
using Perspex.Metadata;
[assembly: AssemblyTitle("Perspex.Styling")]
[assembly: XmlnsDefinition("https://github.com/perspex", "Perspex.Styling")]

BIN
src/Shared/PclPlatformWrapper.cs

Binary file not shown.

3
src/Windows/Perspex.Win32/Perspex.Win32.csproj

@ -62,6 +62,9 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\Shared\PclPlatformWrapper.cs">
<Link>PclPlatformWrapper.cs</Link>
</Compile>
<Compile Include="..\..\Shared\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>

1
src/Windows/Perspex.Win32/Win32Platform.cs

@ -40,6 +40,7 @@ namespace Perspex.Win32
private static void InitializeInternal()
{
var locator = Locator.CurrentMutable;
locator.Register(()=>new PclPlatformWrapper(), typeof(IPclPlatformWrapper));
locator.Register(() => new PopupImpl(), typeof(IPopupImpl));
locator.Register(() => new ClipboardImpl(), typeof(IClipboard));
locator.Register(() => WindowsKeyboardDevice.Instance, typeof(IKeyboardDevice));

Loading…
Cancel
Save