Browse Source

Merge pull request #2 from Perspex/master

Merge latest commits.
pull/207/head
danwalmsley 11 years ago
parent
commit
87333eb083
  1. 44
      Tests/Perspex.Controls.UnitTests/DockPanelTests/AlignerTests.cs
  2. 38
      Tests/Perspex.Controls.UnitTests/DockPanelTests/LeftDockerTests.cs
  3. 40
      Tests/Perspex.Controls.UnitTests/DockPanelTests/RectAlignerTests.cs
  4. 38
      Tests/Perspex.Controls.UnitTests/DockPanelTests/RightDockerTests.cs
  5. 4
      samples/TestApplication/App.config
  6. 3
      samples/TestApplication/TestApplication.csproj
  7. 15
      samples/TestApplication/packages.config
  8. 7
      samples/XamlTestApplication/Views/MainWindow.paml
  9. 7
      samples/XamlTestApplication/XamlTestApplication.csproj
  10. 2
      samples/XamlTestApplication/packages.config
  11. 7
      src/Gtk/Perspex.Cairo/CairoPlatform.cs
  12. 1
      src/Gtk/Perspex.Cairo/Media/FormattedTextImpl.cs
  13. 1
      src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs
  14. 3
      src/Gtk/Perspex.Cairo/Perspex.Cairo.csproj
  15. 7
      src/Gtk/Perspex.Cairo/packages.config
  16. 20
      src/Gtk/Perspex.Gtk/GtkPlatform.cs
  17. 3
      src/Gtk/Perspex.Gtk/Perspex.Gtk.csproj
  18. 26
      src/Gtk/Perspex.Gtk/WindowImpl.cs
  19. 7
      src/Gtk/Perspex.Gtk/packages.config
  20. 5
      src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs
  21. 41
      src/Markup/Perspex.Markup.Xaml/Converters/TimeSpanTypeConverter.cs
  22. 4
      src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj
  23. 5
      src/Markup/Perspex.Markup.Xaml/PerspexXamlLoader.cs
  24. 1
      src/Markup/Perspex.Markup.Xaml/packages.config
  25. 22
      src/Perspex.Application/Application.cs
  26. 3
      src/Perspex.Application/Perspex.Application.csproj
  27. 1
      src/Perspex.Application/packages.config
  28. 4
      src/Perspex.Base/Perspex.Base.csproj
  29. 120
      src/Perspex.Base/PerspexLocator.cs
  30. 5
      src/Perspex.Base/Threading/DispatcherTimer.cs
  31. 3
      src/Perspex.Base/Threading/MainLoop.cs
  32. 1
      src/Perspex.Base/packages.config
  33. 3
      src/Perspex.Controls/Control.cs
  34. 448
      src/Perspex.Controls/DockPanel.cs
  35. 21
      src/Perspex.Controls/DockPanel/Aligner.cs
  36. 10
      src/Perspex.Controls/DockPanel/Alignment.cs
  37. 24
      src/Perspex.Controls/DockPanel/Alignments.cs
  38. 98
      src/Perspex.Controls/DockPanel/CoordinateMixin.cs
  39. 10
      src/Perspex.Controls/DockPanel/Dock.cs
  40. 129
      src/Perspex.Controls/DockPanel/DockPanel.cs
  41. 33
      src/Perspex.Controls/DockPanel/Docker.cs
  42. 54
      src/Perspex.Controls/DockPanel/DockingArranger.cs
  43. 32
      src/Perspex.Controls/DockPanel/EnumerableMixin.cs
  44. 27
      src/Perspex.Controls/DockPanel/LayoutSizes.cs
  45. 21
      src/Perspex.Controls/DockPanel/LeftDocker.cs
  46. 51
      src/Perspex.Controls/DockPanel/RectMixin.cs
  47. 23
      src/Perspex.Controls/DockPanel/RightDocker.cs
  48. 21
      src/Perspex.Controls/DockPanel/Segment.cs
  49. 2
      src/Perspex.Controls/DropDown.cs
  50. 8
      src/Perspex.Controls/Margins.cs
  51. 18
      src/Perspex.Controls/MenuItem.cs
  52. 20
      src/Perspex.Controls/Perspex.Controls.csproj
  53. 3
      src/Perspex.Controls/Primitives/Popup.cs
  54. 5
      src/Perspex.Controls/Primitives/PopupRoot.cs
  55. 5
      src/Perspex.Controls/SystemDialog.cs
  56. 3
      src/Perspex.Controls/Templates/DataTemplateExtensions.cs
  57. 27
      src/Perspex.Controls/TextBox.cs
  58. 11
      src/Perspex.Controls/TopLevel.cs
  59. 3
      src/Perspex.Controls/Window.cs
  60. 1
      src/Perspex.Controls/packages.config
  61. 3
      src/Perspex.HtmlRenderer/Adapters/PerspexAdapter.cs
  62. 2
      src/Perspex.HtmlRenderer/HtmlContainer.cs
  63. 4
      src/Perspex.HtmlRenderer/HtmlControl.cs
  64. 3
      src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj
  65. 1
      src/Perspex.HtmlRenderer/packages.config
  66. 2
      src/Perspex.Input/AccessKeyHandler.cs
  67. 3
      src/Perspex.Input/Cursors.cs
  68. 3
      src/Perspex.Input/FocusManager.cs
  69. 2
      src/Perspex.Input/IInputElement.cs
  70. 5
      src/Perspex.Input/IKeyboardDevice.cs
  71. 6
      src/Perspex.Input/InputElement.cs
  72. 3
      src/Perspex.Input/InputManager.cs
  73. 2
      src/Perspex.Input/KeyEventArgs.cs
  74. 7
      src/Perspex.Input/KeyboardDevice.cs
  75. 2
      src/Perspex.Input/KeyboardNavigationHandler.cs
  76. 43
      src/Perspex.Input/MouseDevice.cs
  77. 4
      src/Perspex.Input/Perspex.Input.csproj
  78. 21
      src/Perspex.Input/PointerEventArgs.cs
  79. 10
      src/Perspex.Input/PointerPressEventArgs.cs
  80. 4
      src/Perspex.Input/Raw/RawKeyEventArgs.cs
  81. 10
      src/Perspex.Input/Raw/RawMouseEventArgs.cs
  82. 4
      src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs
  83. 1
      src/Perspex.Input/packages.config
  84. 3
      src/Perspex.Interactivity/Perspex.Interactivity.csproj
  85. 1
      src/Perspex.Interactivity/packages.config
  86. 3
      src/Perspex.Layout/Perspex.Layout.csproj
  87. 1
      src/Perspex.Layout/packages.config
  88. 9
      src/Perspex.SceneGraph/Animation/CrossFade.cs
  89. 9
      src/Perspex.SceneGraph/Animation/PageSlide.cs
  90. 3
      src/Perspex.SceneGraph/Media/EllipseGeometry.cs
  91. 3
      src/Perspex.SceneGraph/Media/FormattedText.cs
  92. 7
      src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs
  93. 3
      src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs
  94. 3
      src/Perspex.SceneGraph/Media/RectangleGeometry.cs
  95. 3
      src/Perspex.SceneGraph/Media/StreamGeometry.cs
  96. 3
      src/Perspex.SceneGraph/Perspex.SceneGraph.csproj
  97. 1
      src/Perspex.SceneGraph/packages.config
  98. 3
      src/Perspex.Styling/Perspex.Styling.csproj
  99. 3
      src/Perspex.Styling/Styling/Styler.cs
  100. 3
      src/Perspex.Themes.Default/Perspex.Themes.Default.csproj

44
Tests/Perspex.Controls.UnitTests/DockPanelTests/AlignerTests.cs

@ -1,44 +0,0 @@
namespace Perspex.Controls.UnitTests.DockPanelTests
{
using Xunit;
public class AlignerTests
{
[Fact]
public void ToStartTest()
{
Segment container = new Segment(2, 5);
var aligned = container.AlignToStart(2);
Assert.Equal(new Segment(2, 4), aligned);
}
[Fact]
public void ToEndTest()
{
Segment container = new Segment(2, 5);
var aligned = container.AlignToEnd(2);
Assert.Equal(new Segment(3, 5), aligned);
}
[Fact]
public void ToMiddleTest()
{
Segment container = new Segment(2, 5);
var aligned = container.AlignToMiddle(2);
Assert.Equal(new Segment(2.5, 4.5), aligned);
}
[Fact]
public void ToMiddleTest2()
{
Segment container = new Segment(0, 500);
var aligned = container.AlignToMiddle(200);
Assert.Equal(new Segment(150, 350), aligned);
}
}
}

38
Tests/Perspex.Controls.UnitTests/DockPanelTests/LeftDockerTests.cs

@ -1,38 +0,0 @@
namespace Perspex.Controls.UnitTests.DockPanelTests
{
using System.Collections.Generic;
using Layout;
using Moq;
using Xunit;
public class LeftDockerTests
{
private readonly ILayoutable _layoutable;
public LeftDockerTests()
{
var layoutableMock = new Mock<ILayoutable>();
layoutableMock.Setup(l => l.DesiredSize).Returns(new Size(40, 30));
_layoutable = layoutableMock.Object;
}
[Theory]
[MemberData("Source")]
public void Dock(Margins margins, Rect expectedRect)
{
var sut = new LeftDocker(new Size(100, 50));
var actualRect = sut.GetDockingRect(_layoutable.DesiredSize, margins, new Alignments(Alignment.Middle, Alignment.Stretch));
Assert.Equal(expectedRect, actualRect);
}
// ReSharper disable once UnusedMember.Global
public static IEnumerable<object[]> Source => new[]
{
new object[] { new Margins(), new Rect(0, 0, 40, 50)},
new object[] { new Margins { VerticalMargin = new Segment(15, 0) }, new Rect(0, 15, 40, 35)},
new object[] { new Margins { VerticalMargin = new Segment(0, 15) }, new Rect(0, 0, 40, 35)},
new object[] { new Margins { VerticalMargin = new Segment(20, 15) }, new Rect(0, 20, 40, 15)},
};
}
}

40
Tests/Perspex.Controls.UnitTests/DockPanelTests/RectAlignerTests.cs

@ -1,40 +0,0 @@
namespace Perspex.Controls.UnitTests.DockPanelTests
{
using Layout;
using Xunit;
public class RectAlignerTests
{
private readonly Rect _container = new Rect(0, 0, 40, 40);
private readonly Size _child = new Size(20, 20);
[Theory]
[MemberData("TestData")]
public void LefTopTest(Alignment horz, Alignment vert, Rect expectedRect)
{
var actualRect = _container.AlignChild(_child, horz, vert);
Assert.Equal(expectedRect, actualRect);
}
// ReSharper disable once UnusedMember.Global
public static object[] TestData => new object[]
{
new object[] {Alignment.Start, Alignment.Start, new Rect(0, 0, 20, 20)},
new object[] {Alignment.Middle, Alignment.Start, new Rect(10, 0, 20, 20)},
new object[] {Alignment.End, Alignment.Start, new Rect(20, 0, 20, 20)},
new object[] {Alignment.Stretch, Alignment.Start, new Rect(0, 0, 40, 20)},
new object[] {Alignment.Start, Alignment.Middle, new Rect(0, 10, 20, 20)},
new object[] {Alignment.Middle, Alignment.Middle, new Rect(10, 10, 20, 20)},
new object[] {Alignment.End, Alignment.Middle, new Rect(20, 10, 20, 20)},
new object[] {Alignment.Stretch, Alignment.Middle, new Rect(0, 10, 40, 20)},
new object[] {Alignment.Start, VerticalAlignment.Bottom, new Rect(0, 20, 20, 20)},
new object[] {Alignment.Middle, VerticalAlignment.Bottom, new Rect(10, 20, 20, 20)},
new object[] {Alignment.End, VerticalAlignment.Bottom, new Rect(20, 20, 20, 20)},
new object[] {Alignment.Stretch, VerticalAlignment.Bottom, new Rect(0, 20, 40, 20)},
new object[] {Alignment.Stretch, VerticalAlignment.Stretch, new Rect(0, 0, 40, 40)},
};
}
}

38
Tests/Perspex.Controls.UnitTests/DockPanelTests/RightDockerTests.cs

@ -1,38 +0,0 @@
namespace Perspex.Controls.UnitTests.DockPanelTests
{
using System.Collections.Generic;
using Layout;
using Moq;
using Xunit;
public class RightDockerTests
{
private readonly ILayoutable _layoutable;
public RightDockerTests()
{
var layoutableMock = new Mock<ILayoutable>();
layoutableMock.Setup(l => l.DesiredSize).Returns(new Size(40, 30));
_layoutable = layoutableMock.Object;
}
[Theory]
[MemberData("Source")]
public void Dock(Margins margins, Rect expectedRect)
{
var sut = new RightDocker(new Size(100, 50));
var actualRect = sut.GetDockingRect(_layoutable.DesiredSize, margins, new Alignments(Alignment.Middle, Alignment.Stretch));
Assert.Equal(expectedRect, actualRect);
}
// ReSharper disable once UnusedMember.Global
public static IEnumerable<object[]> Source => new[]
{
new object[] { new Margins(), new Rect(60, 0, 40, 50)},
new object[] { new Margins { VerticalMargin = new Segment(0, 15) }, new Rect(60, 0, 40, 35)},
new object[] { new Margins { VerticalMargin = new Segment(15, 0) }, new Rect(60, 15, 40, 35)},
new object[] { new Margins { VerticalMargin = new Segment(20, 15) }, new Rect(60, 20, 40, 15)},
};
}
}

4
samples/TestApplication/App.config

@ -21,6 +21,10 @@
<assemblyIdentity name="SharpDX" publicKeyToken="b4dcf0f35e5521f1" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.3.0" newVersion="2.6.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Mono.Cairo" publicKeyToken="0738eb9f132ed756" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

3
samples/TestApplication/TestApplication.csproj

@ -66,9 +66,6 @@
<Reference Include="Serilog.FullNetFx, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
<HintPath>..\..\packages\Serilog.1.5.9\lib\net45\Serilog.FullNetFx.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="App.cs" />

15
samples/TestApplication/packages.config

@ -1,11 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Main" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-XAML" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Serilog" version="1.5.9" targetFramework="net45" userInstalled="true" />
<package id="Splat" version="1.6.2" targetFramework="net45" userInstalled="true" />
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
<package id="Rx-Main" version="2.2.5" targetFramework="net45" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
<package id="Rx-XAML" version="2.2.5" targetFramework="net45" />
<package id="Serilog" version="1.5.9" targetFramework="net45" />
</packages>

7
samples/XamlTestApplication/Views/MainWindow.paml

@ -3,8 +3,11 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Perspex Test Application" Height="350" Width="525" SizeToContent="WidthAndHeight" >
<Grid RowDefinitions="Auto,*">
<TabControl Grid.Row="1">
<Grid RowDefinitions="Auto,*,Auto" ColumnDefinitions="*,*">
<TabControl Grid.Row="1" Grid.ColumnSpan="2" Padding="5">
<TabControl.Transition>
<PageSlide Duration="0.25" />
</TabControl.Transition>
<TabItem Header="Buttons">
<StackPanel HorizontalAlignment="Center" Width="200" VerticalAlignment="Center">
<StackPanel.Styles>

7
samples/XamlTestApplication/XamlTestApplication.csproj

@ -36,6 +36,10 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
@ -55,9 +59,6 @@
<Reference Include="Serilog.FullNetFx, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
<HintPath>..\..\packages\Serilog.1.5.9\lib\net45\Serilog.FullNetFx.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
</Reference>
<Reference Include="Sprache, Version=2.0.0.47, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Sprache.2.0.0.47\lib\portable-net4+netcore45+win8+wp8+sl5+MonoAndroid1+MonoTouch1\Sprache.dll</HintPath>
</Reference>

2
samples/XamlTestApplication/packages.config

@ -7,6 +7,6 @@
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="net46" />
<package id="Rx-XAML" version="2.2.5" targetFramework="net46" />
<package id="Serilog" version="1.5.9" targetFramework="net46" />
<package id="Splat" version="1.6.2" targetFramework="net46" />
<package id="Splat" version="1.6.2" targetFramework="net45" />
<package id="Sprache" version="2.0.0.47" targetFramework="net451" />
</packages>

7
src/Gtk/Perspex.Cairo/CairoPlatform.cs

@ -6,7 +6,6 @@ using Perspex.Cairo.Media;
using Perspex.Cairo.Media.Imaging;
using Perspex.Media;
using Perspex.Platform;
using Splat;
namespace Perspex.Cairo
{
@ -19,11 +18,7 @@ namespace Perspex.Cairo
private static Pango.Context s_pangoContext = CreatePangoContext();
public static void Initialize()
{
var locator = Locator.CurrentMutable;
locator.Register(() => s_instance, typeof(IPlatformRenderInterface));
}
public static void Initialize() => PerspexLocator.CurrentMutable.Bind<IPlatformRenderInterface>().ToConstant(s_instance);
public IBitmapImpl CreateBitmap(int width, int height)
{

1
src/Gtk/Perspex.Cairo/Media/FormattedTextImpl.cs

@ -7,7 +7,6 @@ using System.Linq;
using System.Text;
using Perspex.Media;
using Perspex.Platform;
using Splat;
namespace Perspex.Cairo.Media
{

1
src/Gtk/Perspex.Cairo/Media/StreamGeometryImpl.cs

@ -4,7 +4,6 @@
using System;
using Perspex.Media;
using Perspex.Platform;
using Splat;
using System.Collections.Generic;
namespace Perspex.Cairo.Media

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

@ -51,9 +51,6 @@
<HintPath>..\..\..\packages\Rx-Interfaces.2.2.5\lib\net45\System.Reactive.Interfaces.dll</HintPath>
</Reference>
<Reference Include="atk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="CairoPlatform.cs" />

7
src/Gtk/Perspex.Cairo/packages.config

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Splat" version="1.6.2" targetFramework="net45" userInstalled="true" />
</packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
</packages>

20
src/Gtk/Perspex.Gtk/GtkPlatform.cs

@ -8,7 +8,6 @@ using Perspex.Input.Platform;
using Perspex.Input;
using Perspex.Platform;
using Perspex.Shared.PlatformSupport;
using Splat;
namespace Perspex.Gtk
{
@ -29,15 +28,16 @@ namespace Perspex.Gtk
public static void Initialize()
{
var locator = Locator.CurrentMutable;
locator.Register(() => new WindowImpl(), typeof(IWindowImpl));
locator.Register(() => new PopupImpl(), typeof(IPopupImpl));
locator.Register(() => new ClipboardImpl(), typeof(IClipboard));
locator.Register(() => CursorFactory.Instance, typeof(IStandardCursorFactory));
locator.Register(() => GtkKeyboardDevice.Instance, typeof(IKeyboardDevice));
locator.Register(() => s_instance, typeof(IPlatformSettings));
locator.Register(() => s_instance, typeof(IPlatformThreadingInterface));
locator.Register(() => new SystemDialogImpl(), typeof (ISystemDialogImpl));
PerspexLocator.CurrentMutable
.Bind<IWindowImpl>().ToTransient<WindowImpl>()
.Bind<IPopupImpl>().ToTransient<PopupImpl>()
.Bind<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<IStandardCursorFactory>().ToConstant(CursorFactory.Instance)
.Bind<IKeyboardDevice>().ToConstant(GtkKeyboardDevice.Instance)
.Bind<IMouseDevice>().ToConstant(GtkMouseDevice.Instance)
.Bind<IPlatformSettings>().ToConstant(s_instance)
.Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
.Bind<ISystemDialogImpl>().ToSingleton<SystemDialogImpl>();
SharedPlatform.Register();
}

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

@ -44,9 +44,6 @@
<HintPath>..\..\..\packages\Rx-Linq.2.2.5\lib\net45\System.Reactive.Linq.dll</HintPath>
</Reference>
<Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ClipboardImpl.cs" />

26
src/Gtk/Perspex.Gtk/WindowImpl.cs

@ -134,26 +134,34 @@ namespace Perspex.Gtk
Activate();
}
private static ModifierKeys GetModifierKeys(ModifierType state)
private static InputModifiers GetModifierKeys(ModifierType state)
{
var rv = ModifierKeys.None;
var rv = InputModifiers.None;
if (state.HasFlag(ModifierType.ControlMask))
rv |= ModifierKeys.Control;
rv |= InputModifiers.Control;
if (state.HasFlag(ModifierType.ShiftMask))
rv |= ModifierKeys.Shift;
rv |= InputModifiers.Shift;
if (state.HasFlag(ModifierType.Mod1Mask))
rv |= ModifierKeys.Control;
rv |= InputModifiers.Control;
if(state.HasFlag(ModifierType.Button1Mask))
rv |= InputModifiers.LeftMouseButton;
if (state.HasFlag(ModifierType.Button2Mask))
rv |= InputModifiers.RightMouseButton;
if (state.HasFlag(ModifierType.Button3Mask))
rv |= InputModifiers.MiddleMouseButton;
return rv;
}
protected override bool OnButtonPressEvent(EventButton evnt)
{
var e = new RawMouseEventArgs(
GtkMouseDevice.Instance,
evnt.Time,
_owner,
RawMouseEventType.LeftButtonDown,
evnt.Button == 0
? RawMouseEventType.LeftButtonDown
: evnt.Button == 1 ? RawMouseEventType.RightButtonDown : RawMouseEventType.MiddleButtonDown,
new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State));
Input(e);
return true;
@ -165,7 +173,9 @@ namespace Perspex.Gtk
GtkMouseDevice.Instance,
evnt.Time,
_owner,
RawMouseEventType.LeftButtonUp,
evnt.Button == 0
? RawMouseEventType.LeftButtonUp
: evnt.Button == 1 ? RawMouseEventType.RightButtonUp : RawMouseEventType.MiddleButtonUp,
new Point(evnt.X, evnt.Y), GetModifierKeys(evnt.State));
Input(e);
return true;

7
src/Gtk/Perspex.Gtk/packages.config

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Rx-Core" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" userInstalled="true" />
<package id="Splat" version="1.6.2" targetFramework="net45" userInstalled="true" />
<package id="Rx-Core" version="2.2.5" targetFramework="net45" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
</packages>

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

@ -1,6 +1,7 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
@ -20,7 +21,6 @@ using Perspex.Media.Imaging;
using Perspex.Metadata;
using Perspex.Platform;
using Perspex.Styling;
using Splat;
namespace Perspex.Markup.Xaml.Context
{
@ -52,7 +52,7 @@ namespace Perspex.Markup.Xaml.Context
foreach (var nsa in
forcedAssemblies
.Concat(Locator.Current.GetService<IPclPlatformWrapper>().GetLoadedAssemblies())
.Concat(PerspexLocator.Current.GetService<IPclPlatformWrapper>().GetLoadedAssemblies())
.Distinct()
.SelectMany(asm
=> asm.GetCustomAttributes<XmlnsDefinitionAttribute>().Select(attr => new {asm, attr}))
@ -87,6 +87,7 @@ namespace Perspex.Markup.Xaml.Context
new TypeConverterRegistration(typeof(RowDefinitions), new RowDefinitionsTypeConverter()),
new TypeConverterRegistration(typeof(Thickness), new ThicknessTypeConverter()),
new TypeConverterRegistration(typeof(Selector), new SelectorTypeConverter()),
new TypeConverterRegistration(typeof(TimeSpan), new TimeSpanTypeConverter()),
};
typeConverterProvider.AddAll(converters);

41
src/Markup/Perspex.Markup.Xaml/Converters/TimeSpanTypeConverter.cs

@ -0,0 +1,41 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Globalization;
using OmniXaml.TypeConversion;
using Perspex.Media;
namespace Perspex.Markup.Xaml.Converters
{
public class TimeSpanTypeConverter : ITypeConverter
{
public bool CanConvertFrom(IXamlTypeConverterContext context, Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(IXamlTypeConverterContext context, Type destinationType)
{
return false;
}
public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value)
{
var valueStr = (string)value;
if (!valueStr.Contains(":"))
{
// shorthand seconds format (ie. "0.25")
var secs = double.Parse(valueStr);
return TimeSpan.FromSeconds(secs);
}
return TimeSpan.Parse(valueStr);
}
public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType)
{
throw new NotImplementedException();
}
}
}

4
src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj

@ -48,6 +48,7 @@
<Compile Include="Converters\PerspexPropertyTypeConverter.cs" />
<Compile Include="Converters\SelectorTypeConverter.cs" />
<Compile Include="Context\PerspexWiringContext.cs" />
<Compile Include="Converters\TimeSpanTypeConverter.cs" />
<Compile Include="MarkupExtensions\BindingExtension.cs" />
<Compile Include="Converters\BrushTypeConverter.cs" />
<Compile Include="Converters\BitmapTypeConverter.cs" />
@ -291,9 +292,6 @@
<Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
<HintPath>..\..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
<Reference Include="Sprache, Version=2.0.0.47, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\..\packages\Sprache.2.0.0.47\lib\portable-net4+netcore45+win8+wp8+sl5+MonoAndroid1+MonoTouch1\Sprache.dll</HintPath>
</Reference>

5
src/Markup/Perspex.Markup.Xaml/PerspexXamlLoader.cs

@ -8,7 +8,6 @@ using System.Reflection;
using OmniXaml;
using Perspex.Markup.Xaml.Context;
using Perspex.Platform;
using Splat;
namespace Perspex.Markup.Xaml
{
@ -57,7 +56,7 @@ namespace Perspex.Markup.Xaml
// HACK: Currently Visual Studio is forcing us to change the extension of xaml files
// in certain situations, so we try to load .xaml and if that's not found we try .paml.
// Ideally we'd be able to use .xaml everywhere
var assetLocator = Locator.Current.GetService<IAssetLoader>();
var assetLocator = PerspexLocator.Current.GetService<IAssetLoader>();
if (assetLocator == null)
{
throw new InvalidOperationException(
@ -86,7 +85,7 @@ namespace Perspex.Markup.Xaml
/// <returns>The loaded object.</returns>
public object Load(Uri uri, object rootInstance = null)
{
var assetLocator = Locator.Current.GetService<IAssetLoader>();
var assetLocator = PerspexLocator.Current.GetService<IAssetLoader>();
if (assetLocator == null)
{

1
src/Markup/Perspex.Markup.Xaml/packages.config

@ -6,6 +6,5 @@
<package id="Rx-Main" version="2.2.5" targetFramework="portable46-net451+win81" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable46-net451+win81" />
<package id="Serilog" version="1.5.9" targetFramework="portable46-net451+win81" />
<package id="Splat" version="1.6.2" targetFramework="portable46-net451+win81" />
<package id="Sprache" version="2.0.0.47" targetFramework="portable45-net45+win8" />
</packages>

22
src/Perspex.Application/Application.cs

@ -12,7 +12,6 @@ using Perspex.Layout;
using Perspex.Rendering;
using Perspex.Styling;
using Perspex.Threading;
using Splat;
namespace Perspex
{
@ -40,7 +39,7 @@ namespace Perspex
private DataTemplates _dataTemplates;
private readonly Lazy<IClipboard> _clipboard =
new Lazy<IClipboard>(() => (IClipboard)Locator.Current.GetService(typeof(IClipboard)));
new Lazy<IClipboard>(() => (IClipboard)PerspexLocator.Current.GetService(typeof(IClipboard)));
/// <summary>
/// The styler that will be used to apply styles to controls.
@ -157,15 +156,16 @@ namespace Perspex
FocusManager = new FocusManager();
InputManager = new InputManager();
Locator.CurrentMutable.Register(() => new AccessKeyHandler(), typeof(IAccessKeyHandler));
Locator.CurrentMutable.Register(() => this, typeof(IGlobalDataTemplates));
Locator.CurrentMutable.Register(() => this, typeof(IGlobalStyles));
Locator.CurrentMutable.Register(() => FocusManager, typeof(IFocusManager));
Locator.CurrentMutable.Register(() => InputManager, typeof(IInputManager));
Locator.CurrentMutable.Register(() => new KeyboardNavigationHandler(), typeof(IKeyboardNavigationHandler));
Locator.CurrentMutable.Register(() => _styler, typeof(IStyler));
Locator.CurrentMutable.Register(() => new LayoutManager(), typeof(ILayoutManager));
Locator.CurrentMutable.Register(() => new RenderManager(), typeof(IRenderManager));
PerspexLocator.CurrentMutable
.Bind<IAccessKeyHandler>().ToTransient<AccessKeyHandler>()
.Bind<IGlobalDataTemplates>().ToConstant(this)
.Bind<IGlobalStyles>().ToConstant(this)
.Bind<IFocusManager>().ToConstant(FocusManager)
.Bind<IInputManager>().ToConstant(InputManager)
.Bind<IKeyboardNavigationHandler>().ToTransient<KeyboardNavigationHandler>()
.Bind<IStyler>().ToConstant(_styler)
.Bind<ILayoutManager>().ToTransient<LayoutManager>()
.Bind<IRenderManager>().ToTransient<RenderManager>();
}
/// <summary>

3
src/Perspex.Application/Perspex.Application.csproj

@ -89,9 +89,6 @@
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

1
src/Perspex.Application/packages.config

@ -5,5 +5,4 @@
<package id="Rx-Linq" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

4
src/Perspex.Base/Perspex.Base.csproj

@ -46,6 +46,7 @@
<Compile Include="Diagnostics\PerspexObjectExtensions.cs" />
<Compile Include="IObservablePropertyBag.cs" />
<Compile Include="IPropertyBag.cs" />
<Compile Include="PerspexLocator.cs" />
<Compile Include="Metadata\XmlnsDefinitionAttribute.cs" />
<Compile Include="PerspexObjectExtensions.cs" />
<Compile Include="PerspexProperty`1.cs" />
@ -93,9 +94,6 @@
<Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
<HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

120
src/Perspex.Base/PerspexLocator.cs

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Reactive.Disposables;
#pragma warning disable CS1591 // Enable me later
namespace Perspex
{
public class PerspexLocator : IPerspexDependencyResolver
{
private readonly IPerspexDependencyResolver _parentScope;
public static IPerspexDependencyResolver Current { get; set; }
public static PerspexLocator CurrentMutable { get; set; }
private readonly Dictionary<Type, Func<object>> _registry = new Dictionary<Type, Func<object>>();
static PerspexLocator()
{
Current = CurrentMutable = new PerspexLocator();
}
public PerspexLocator()
{
}
public PerspexLocator(IPerspexDependencyResolver parentScope)
{
_parentScope = parentScope;
}
public object GetService(Type t)
{
Func<object> rv;
return _registry.TryGetValue(t, out rv) ? rv() : _parentScope?.GetService(t);
}
public class RegistrationHelper<TService>
{
private PerspexLocator _locator;
public RegistrationHelper(PerspexLocator locator)
{
_locator = locator;
}
public PerspexLocator ToConstant<TImpl>(TImpl constant) where TImpl : TService
{
_locator._registry[typeof (TService)] = () => constant;
return _locator;
}
public PerspexLocator ToFunc<TImlp>(Func<TImlp> func) where TImlp : TService
{
_locator._registry[typeof (TService)] = () => func();
return _locator;
}
public PerspexLocator ToSingleton<TImpl>() where TImpl : class, TService, new()
{
TImpl instance = null;
return ToFunc(() => instance ?? (instance = new TImpl()));
}
public PerspexLocator ToTransient<TImpl>() where TImpl : class, TService, new() => ToFunc(() => new TImpl());
}
public RegistrationHelper<T> Bind<T>() => new RegistrationHelper<T>(this);
public PerspexLocator BindToSelf<T>(T constant)
=> Bind<T>().ToConstant(constant);
public PerspexLocator BindToSelfSingleton<T>() where T : class, new() => Bind<T>().ToSingleton<T>();
class ResolverDisposable : IDisposable
{
private readonly IPerspexDependencyResolver _resolver;
private readonly PerspexLocator _mutable;
public ResolverDisposable(IPerspexDependencyResolver resolver, PerspexLocator mutable)
{
_resolver = resolver;
_mutable = mutable;
}
public void Dispose()
{
Current = _resolver;
CurrentMutable = _mutable;
}
}
public static IDisposable EnterScope()
{
return Disposable.Empty;
//Switch to that code when we are ready to fix tests
/*
var d = new ResolverDisposable(Current, CurrentMutable);
Current = CurrentMutable = new PerspexLocator(Current);
return d;
*/
}
}
public interface IPerspexDependencyResolver
{
object GetService(Type t);
}
public static class LocatorExtensions
{
public static T GetService<T>(this IPerspexDependencyResolver resolver)
{
return (T) resolver.GetService(typeof (T));
}
}
}

5
src/Perspex.Base/Threading/DispatcherTimer.cs

@ -4,7 +4,6 @@
using System;
using System.Reactive.Disposables;
using Perspex.Platform;
using Splat;
namespace Perspex.Threading
{
@ -175,7 +174,7 @@ namespace Perspex.Threading
{
if (!IsEnabled)
{
IPlatformThreadingInterface threading = Locator.Current.GetService<IPlatformThreadingInterface>();
IPlatformThreadingInterface threading = PerspexLocator.Current.GetService<IPlatformThreadingInterface>();
_timer = threading.StartTimer(Interval, InternalTick);
}
}
@ -187,7 +186,7 @@ namespace Perspex.Threading
{
if (IsEnabled)
{
IPlatformThreadingInterface threading = Locator.Current.GetService<IPlatformThreadingInterface>();
IPlatformThreadingInterface threading = PerspexLocator.Current.GetService<IPlatformThreadingInterface>();
_timer.Dispose();
_timer = null;
}

3
src/Perspex.Base/Threading/MainLoop.cs

@ -7,7 +7,6 @@ using System.Threading;
using System.Threading.Tasks;
using Perspex.Platform;
using Perspex.Threading;
using Splat;
namespace Perspex.Win32.Threading
{
@ -25,7 +24,7 @@ namespace Perspex.Win32.Threading
/// </summary>
static MainLoop()
{
s_platform = Locator.Current.GetService<IPlatformThreadingInterface>();
s_platform = PerspexLocator.Current.GetService<IPlatformThreadingInterface>();
}
/// <summary>

1
src/Perspex.Base/packages.config

@ -6,5 +6,4 @@
<package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

3
src/Perspex.Controls/Control.cs

@ -12,7 +12,6 @@ using Perspex.Interactivity;
using Perspex.LogicalTree;
using Perspex.Rendering;
using Perspex.Styling;
using Splat;
namespace Perspex.Controls
{
@ -397,7 +396,7 @@ namespace Perspex.Controls
{
base.OnAttachedToVisualTree(root);
IStyler styler = Locator.Current.GetService<IStyler>();
IStyler styler = PerspexLocator.Current.GetService<IStyler>();
styler.ApplyStyles(this);
}

448
src/Perspex.Controls/DockPanel.cs

@ -0,0 +1,448 @@
namespace Perspex.Controls
{
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Layout;
public class DockPanel : Panel
{
public static readonly PerspexProperty<Dock> DockProperty = PerspexProperty.RegisterAttached<DockPanel, Control, Dock>("Dock");
static DockPanel()
{
AffectsArrange(DockProperty);
}
// ReSharper disable once UnusedMember.Global
public static Dock GetDock(PerspexObject perspexObject)
{
return perspexObject.GetValue(DockProperty);
}
// ReSharper disable once UnusedMember.Global
public static void SetDock(PerspexObject element, Dock dock)
{
element.SetValue(DockProperty, dock);
}
public static readonly PerspexProperty<bool> LastChildFillProperty = PerspexProperty.Register<DockPanel, bool>(nameof(LastChildFillProperty), defaultValue: true);
public bool LastChildFill
{
get { return GetValue(LastChildFillProperty); }
set { SetValue(LastChildFillProperty, value); }
}
protected override Size MeasureOverride(Size availableSize)
{
if (!LastChildFill)
{
return MeasureItemsThatWillBeDocked(availableSize, Children);
}
var sizeRequiredByDockingItems = MeasureItemsThatWillBeDocked(availableSize, Children.WithoutLast());
var elementThatWillFill = Children.Last();
elementThatWillFill.Measure(availableSize - sizeRequiredByDockingItems);
var finalSize = sizeRequiredByDockingItems.Inflate(new Thickness(elementThatWillFill.DesiredSize.Width, elementThatWillFill.DesiredSize.Height));
return finalSize;
}
private static Size MeasureItemsThatWillBeDocked(Size availableSize, IEnumerable<IControl> children)
{
var requiredHorizontalLength = 0D;
var requiredVerticalLength = 0D;
foreach (var control in children)
{
control.Measure(availableSize);
var dock = control.GetValue(DockProperty);
if (IsHorizontal(dock))
{
requiredHorizontalLength += control.DesiredSize.Width;
}
else
{
requiredVerticalLength += control.DesiredSize.Height;
}
}
return new Size(requiredHorizontalLength, requiredVerticalLength);
}
private static bool IsHorizontal(Dock dock)
{
return dock == Dock.Left || dock == Dock.Right;
}
protected override Size ArrangeOverride(Size finalSize)
{
if (!LastChildFill)
{
return ArrangeAllChildren(finalSize);
}
else
{
return ArrangeChildrenAndFillLastChild(finalSize);
}
}
private Size ArrangeChildrenAndFillLastChild(Size finalSize)
{
var docker = new DockingArranger();
var requiredSize = docker.ArrangeAndGetUsedSize(finalSize, Children.WithoutLast());
ArrangeToFill(Children.Last(), finalSize, docker.UsedMargin);
return requiredSize;
}
private Size ArrangeAllChildren(Size finalSize)
{
return new DockingArranger().ArrangeAndGetUsedSize(finalSize, Children);
}
private static void ArrangeToFill(ILayoutable layoutable, Size containerSize, Margin margin)
{
var containerRect = new Rect(new Point(0, 0), containerSize);
var marginsCutout = margin.AsThickness();
var withoutMargins = containerRect.Deflate(marginsCutout);
layoutable.Arrange(withoutMargins);
}
private class DockingArranger
{
public Margin UsedMargin { get; private set; }
public Size ArrangeAndGetUsedSize(Size availableSize, IEnumerable<IControl> children)
{
var leftArranger = new LeftDocker(availableSize);
var rightArranger = new RightDocker(availableSize);
var topArranger = new LeftDocker(availableSize.Swap());
var bottomArranger = new RightDocker(availableSize.Swap());
UsedMargin = new Margin();
foreach (var control in children)
{
Rect dockedRect;
var dock = control.GetValue(DockProperty);
switch (dock)
{
case Dock.Left:
dockedRect = leftArranger.GetDockedRect(control.DesiredSize, UsedMargin, control.GetAlignments());
break;
case Dock.Top:
UsedMargin.Swap();
dockedRect = topArranger.GetDockedRect(control.DesiredSize.Swap(), UsedMargin, control.GetAlignments().Swap()).Swap();
UsedMargin.Swap();
break;
case Dock.Right:
dockedRect = rightArranger.GetDockedRect(control.DesiredSize, UsedMargin, control.GetAlignments());
break;
case Dock.Bottom:
UsedMargin.Swap();
dockedRect = bottomArranger.GetDockedRect(control.DesiredSize.Swap(), UsedMargin, control.GetAlignments().Swap()).Swap();
UsedMargin.Swap();
break;
default:
throw new InvalidOperationException($"Invalid dock value {dock}");
}
control.Arrange(dockedRect);
}
return availableSize;
}
}
private class LeftDocker : Docker
{
public LeftDocker(Size availableSize) : base(availableSize)
{
}
public override Rect GetDockedRect(Size childSize, Margin margin, Alignments alignments)
{
var marginsCutout = margin.AsThickness();
var availableRect = OriginalRect.Deflate(marginsCutout);
var alignedRect = AlignToLeft(availableRect, childSize, alignments.Vertical);
AccumulatedOffset += childSize.Width;
margin.Horizontal = margin.Horizontal.Offset(childSize.Width, 0);
return alignedRect;
}
private static Rect AlignToLeft(Rect availableRect, Size childSize, Alignment verticalAlignment)
{
return availableRect.AlignChild(childSize, Alignment.Start, verticalAlignment);
}
}
private class RightDocker : Docker
{
public RightDocker(Size availableSize) : base(availableSize)
{
}
public override Rect GetDockedRect(Size childSize, Margin margin, Alignments alignments)
{
var marginsCutout = margin.AsThickness();
var withoutMargins = OriginalRect.Deflate(marginsCutout);
var finalRect = withoutMargins.AlignChild(childSize, Alignment.End, alignments.Vertical);
AccumulatedOffset += childSize.Width;
margin.Horizontal = margin.Horizontal.Offset(0, childSize.Width);
return finalRect;
}
}
private abstract class Docker
{
protected Docker(Size availableSize)
{
OriginalRect = new Rect(new Point(0, 0), availableSize);
}
protected double AccumulatedOffset { get; set; }
protected Rect OriginalRect { get; }
public abstract Rect GetDockedRect(Size childSize, Margin margin, Alignments alignments);
}
}
public class Margin
{
public Segment Horizontal { get; set; }
public Segment Vertical { get; set; }
}
public enum Alignment
{
Stretch, Start, Middle, End,
}
public static class SegmentMixin
{
public static Segment AlignToStart(this Segment container, double length)
{
return new Segment(container.Start, container.Start + length);
}
public static Segment AlignToEnd(this Segment container, double length)
{
return new Segment(container.End - length, container.End);
}
public static Segment AlignToMiddle(this Segment container, double length)
{
var start = container.Start + (container.Length - length) / 2;
return new Segment(start, start + length);
}
}
public struct Alignments
{
private readonly Alignment _horizontal;
private readonly Alignment _vertical;
public Alignments(Alignment horizontal, Alignment vertical)
{
_horizontal = horizontal;
_vertical = vertical;
}
public Alignment Horizontal => _horizontal;
public Alignment Vertical => _vertical;
}
public static class CoordinateMixin
{
private static Point Swap(this Point p)
{
return new Point(p.Y, p.X);
}
public static Size Swap(this Size s)
{
return new Size(s.Height, s.Width);
}
public static Rect Swap(this Rect r)
{
return new Rect(r.Position.Swap(), r.Size.Swap());
}
public static Segment Offset(this Segment l, double startOffset, double endOffset)
{
return new Segment(l.Start + startOffset, l.End + endOffset);
}
public static void Swap(this Margin m)
{
var v = m.Vertical;
m.Vertical = m.Horizontal;
m.Horizontal = v;
}
public static Thickness AsThickness(this Margin margin)
{
return new Thickness(margin.Horizontal.Start, margin.Vertical.Start, margin.Horizontal.End, margin.Vertical.End);
}
private static Alignment AsAlignment(this HorizontalAlignment horz)
{
switch (horz)
{
case HorizontalAlignment.Stretch:
return Alignment.Stretch;
case HorizontalAlignment.Left:
return Alignment.Start;
case HorizontalAlignment.Center:
return Alignment.Middle;
case HorizontalAlignment.Right:
return Alignment.End;
default:
throw new ArgumentOutOfRangeException(nameof(horz), horz, null);
}
}
private static Alignment AsAlignment(this VerticalAlignment vert)
{
switch (vert)
{
case VerticalAlignment.Stretch:
return Alignment.Stretch;
case VerticalAlignment.Top:
return Alignment.Start;
case VerticalAlignment.Center:
return Alignment.Middle;
case VerticalAlignment.Bottom:
return Alignment.End;
default:
throw new ArgumentOutOfRangeException(nameof(vert), vert, null);
}
}
public static Alignments GetAlignments(this ILayoutable layoutable)
{
return new Alignments(layoutable.HorizontalAlignment.AsAlignment(), layoutable.VerticalAlignment.AsAlignment());
}
public static Alignments Swap(this Alignments alignments)
{
return new Alignments(alignments.Vertical, alignments.Horizontal);
}
}
public enum Dock
{
Left = 0,
Bottom,
Right,
Top
}
public static class RectMixin
{
public static Rect AlignChild(this Rect container, Size childSize, Alignment horizontalAlignment, Alignment verticalAlignment)
{
var horzSegment = container.GetHorizontalCoordinates();
var vertSegment = container.GetVerticalCoordinates();
var horzResult = GetAlignedSegment(childSize.Width, horizontalAlignment, horzSegment);
var vertResult = GetAlignedSegment(childSize.Height, verticalAlignment, vertSegment);
return FromSegments(horzResult, vertResult);
}
private static Rect FromSegments(Segment horzSegment, Segment vertSegment)
{
return new Rect(horzSegment.Start, vertSegment.Start, horzSegment.Length, vertSegment.Length);
}
private static Segment GetAlignedSegment(double width, Alignment alignment, Segment horzSegment)
{
switch (alignment)
{
case Alignment.Start:
return horzSegment.AlignToStart(width);
case Alignment.Middle:
return horzSegment.AlignToMiddle(width);
case Alignment.End:
return horzSegment.AlignToEnd(width);
default:
return new Segment(horzSegment.Start, horzSegment.End);
}
}
private static Segment GetHorizontalCoordinates(this Rect rect)
{
return new Segment(rect.X, rect.Right);
}
private static Segment GetVerticalCoordinates(this Rect rect)
{
return new Segment(rect.Y, rect.Bottom);
}
}
public struct Segment
{
public Segment(double start, double end)
{
Start = start;
End = end;
}
public double Start { get; }
public double End { get; }
public double Length => End - Start;
public override string ToString()
{
return $"Start: {Start}, End: {End}";
}
}
public static class EnumerableMixin
{
private static IEnumerable<T> Shrink<T>(this IEnumerable<T> source, int left, int right)
{
int i = 0;
var buffer = new Queue<T>(right + 1);
foreach (T x in source)
{
if (i >= left) // Read past left many elements at the start
{
buffer.Enqueue(x);
if (buffer.Count > right) // Build a buffer to drop right many elements at the end
yield return buffer.Dequeue();
}
else i++;
}
}
public static IEnumerable<T> WithoutLast<T>(this IEnumerable<T> source, int n = 1)
{
return source.Shrink(0, n);
}
public static IEnumerable<T> WithoutFirst<T>(this IEnumerable<T> source, int n = 1)
{
return source.Shrink(n, 0);
}
}
}

21
src/Perspex.Controls/DockPanel/Aligner.cs

@ -1,21 +0,0 @@
namespace Perspex.Controls
{
public static class LinearMarginMixin
{
public static Segment AlignToStart(this Segment container, double length)
{
return new Segment(container.Start, container.Start + length);
}
public static Segment AlignToEnd(this Segment container, double length)
{
return new Segment(container.End - length, container.End);
}
public static Segment AlignToMiddle(this Segment container, double length)
{
var start = container.Start + (container.Length - length) / 2;
return new Segment(start, start + length);
}
}
}

10
src/Perspex.Controls/DockPanel/Alignment.cs

@ -1,10 +0,0 @@
namespace Perspex.Controls
{
public enum Alignment
{
Stretch,
Start,
Middle,
End,
}
}

24
src/Perspex.Controls/DockPanel/Alignments.cs

@ -1,24 +0,0 @@
namespace Perspex.Controls
{
public struct Alignments
{
private readonly Alignment _horizontal;
private readonly Alignment _vertical;
public Alignments(Alignment horizontal, Alignment vertical)
{
_horizontal = horizontal;
_vertical = vertical;
}
public Alignment Horizontal
{
get { return _horizontal; }
}
public Alignment Vertical
{
get { return _vertical; }
}
}
}

98
src/Perspex.Controls/DockPanel/CoordinateMixin.cs

@ -1,98 +0,0 @@
namespace Perspex.Controls
{
using System;
using Layout;
public static class CoordinateMixin
{
private static Point Swap(this Point p)
{
return new Point(p.Y, p.X);
}
public static Size Swap(this Size s)
{
return new Size(s.Height, s.Width);
}
public static Rect Swap(this Rect r)
{
return new Rect(r.Position.Swap(), r.Size.Swap());
}
public static Segment Offset(this Segment l, double startOffset, double endOffset)
{
return new Segment(l.Start + startOffset, l.End + endOffset);
}
public static void Swap(this Margins m)
{
var v = m.VerticalMargin;
m.VerticalMargin = m.HorizontalMargin;
m.HorizontalMargin = v;
}
public static Thickness AsThickness(this Margins margins)
{
return new Thickness(margins.HorizontalMargin.Start, margins.VerticalMargin.Start, margins.HorizontalMargin.End, margins.VerticalMargin.End);
}
private static Alignment AsAlignment(this HorizontalAlignment horz)
{
switch (horz)
{
case HorizontalAlignment.Stretch:
return Alignment.Stretch;
case HorizontalAlignment.Left:
return Alignment.Start;
case HorizontalAlignment.Center:
return Alignment.Middle;
case HorizontalAlignment.Right:
return Alignment.End;
default:
throw new ArgumentOutOfRangeException(nameof(horz), horz, null);
}
}
private static Alignment AsAlignment(this VerticalAlignment vert)
{
switch (vert)
{
case VerticalAlignment.Stretch:
return Alignment.Stretch;
case VerticalAlignment.Top:
return Alignment.Start;
case VerticalAlignment.Center:
return Alignment.Middle;
case VerticalAlignment.Bottom:
return Alignment.End;
default:
throw new ArgumentOutOfRangeException(nameof(vert), vert, null);
}
}
public static Alignments GetAlignments(this ILayoutable layoutable)
{
return new Alignments(layoutable.HorizontalAlignment.AsAlignment(), layoutable.VerticalAlignment.AsAlignment());
}
public static Alignments Swap(this Alignments alignments)
{
return new Alignments(alignments.Vertical, alignments.Horizontal);
}
public static LayoutSizes GetLayoutSizes(this ILayoutable layoutable)
{
return new LayoutSizes(
new Size(layoutable.Width, layoutable.Height),
new Size(layoutable.MaxWidth, layoutable.MaxHeight),
new Size(layoutable.MinWidth, layoutable.MinHeight));
}
public static LayoutSizes Swap(this LayoutSizes l)
{
return new LayoutSizes(l.Size.Swap(), l.MaxSize.Swap(), l.MinSize.Swap());
}
}
}

10
src/Perspex.Controls/DockPanel/Dock.cs

@ -1,10 +0,0 @@
namespace Perspex.Controls
{
public enum Dock
{
Left = 0,
Bottom,
Right,
Top
}
}

129
src/Perspex.Controls/DockPanel/DockPanel.cs

@ -1,129 +0,0 @@
namespace Perspex.Controls
{
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Layout;
// ReSharper disable once UnusedMember.Global
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
public class DockPanel : Panel
{
public static readonly PerspexProperty<Dock> DockProperty = PerspexProperty.RegisterAttached<DockPanel, Control, Dock>("Dock");
static DockPanel()
{
AffectsArrange(DockProperty);
}
public static Dock GetDock(PerspexObject element)
{
return element.GetValue(DockProperty);
}
public static void SetDock(PerspexObject element, Dock dock)
{
element.SetValue(DockProperty, dock);
}
public static readonly PerspexProperty<bool> LastChildFillProperty = PerspexProperty.Register<DockPanel, bool>(nameof(DataContext), defaultValue: true);
public bool LastChildFill
{
get { return GetValue(LastChildFillProperty); }
set { SetValue(LastChildFillProperty, value); }
}
protected override Size MeasureOverride(Size availableSize)
{
if (!LastChildFill)
{
return MeasureItemsThatWillBeDocked(availableSize, Children);
}
var sizeRequiredByDockingItems = MeasureItemsThatWillBeDocked(availableSize, Children.WithoutLast());
var elementThatWillFill = Children.Last();
elementThatWillFill.Measure(availableSize - sizeRequiredByDockingItems);
var finalSize = sizeRequiredByDockingItems.Inflate(new Thickness(elementThatWillFill.DesiredSize.Width, elementThatWillFill.DesiredSize.Height));
return finalSize;
}
private static Size MeasureItemsThatWillBeDocked(Size availableSize, IEnumerable<IControl> children)
{
var requiredHorizontalLength = 0D;
var requiredVerticalLength = 0D;
foreach (var control in children)
{
control.Measure(availableSize);
var dock = control.GetValue(DockProperty);
if (IsHorizontal(dock))
{
requiredHorizontalLength += control.DesiredSize.Width;
}
else
{
requiredVerticalLength += control.DesiredSize.Height;
}
}
return new Size(requiredHorizontalLength, requiredVerticalLength);
}
private static bool IsHorizontal(Dock dock)
{
return dock == Dock.Left || dock == Dock.Right;
}
protected override Size ArrangeOverride(Size finalSize)
{
var docker = new DockingArranger();
if (!LastChildFill)
{
return docker.ArrangeChildren(finalSize, Children);
}
var requiredSize = docker.ArrangeChildren(finalSize, Children.WithoutLast());
ArrangeToFill(finalSize, docker.Margins, Children.Last());
return requiredSize;
}
private static void ArrangeToFill(Size availableSize, Margins margins, ILayoutable layoutable)
{
var containerRect = new Rect(new Point(0,0), availableSize);
var marginsCutout = margins.AsThickness();
var withoutMargins = containerRect.Deflate(marginsCutout);
var finalSize = GetConstrainedSize(layoutable, withoutMargins);
var finalRect = withoutMargins.AlignChild(finalSize, Alignment.Middle, Alignment.Middle);
layoutable.Arrange(finalRect);
}
private static Size GetConstrainedSize(ILayoutable layoutable, Rect withoutMargins)
{
var width = GetWidth(layoutable.GetLayoutSizes(), withoutMargins);
var height = GetWidth(layoutable.GetLayoutSizes().Swap(), withoutMargins.Swap());
var finalSize = new Size(width, height);
return finalSize;
}
private static double GetWidth(LayoutSizes layoutSizes, Rect withoutMargins)
{
return layoutSizes.IsWidthSpecified
? layoutSizes.Size.Width
: GetConstrainedDimension(withoutMargins.Width, layoutSizes.MaxSize.Width, layoutSizes.MinSize.Width);
}
private static double GetConstrainedDimension(double toConstrain, double maximum, double minimum)
{
return Math.Max(Math.Min(toConstrain, maximum), minimum);
}
}
}

33
src/Perspex.Controls/DockPanel/Docker.cs

@ -1,33 +0,0 @@
namespace Perspex.Controls
{
public class Docker
{
private Size _availableSize;
private double _accumulatedOffset;
private Rect _originalRect;
protected Docker(Size availableSize)
{
AvailableSize = availableSize;
OriginalRect = new Rect(new Point(0, 0), AvailableSize);
}
protected Size AvailableSize
{
get { return _availableSize; }
set { _availableSize = value; }
}
protected double AccumulatedOffset
{
get { return _accumulatedOffset; }
set { _accumulatedOffset = value; }
}
protected Rect OriginalRect
{
get { return _originalRect; }
set { _originalRect = value; }
}
}
}

54
src/Perspex.Controls/DockPanel/DockingArranger.cs

@ -1,54 +0,0 @@
using System;
using System.Collections.Generic;
using Perspex;
using Perspex.Controls;
internal class DockingArranger
{
public Margins Margins { get; private set; }
public Size ArrangeChildren(Size finalSize, IEnumerable<IControl> controls)
{
var leftArranger = new LeftDocker(finalSize);
var rightArranger = new RightDocker(finalSize);
var topArranger = new LeftDocker(finalSize.Swap());
var bottomArranger = new RightDocker(finalSize.Swap());
Margins = new Margins();
foreach (var control in controls)
{
Rect dockedRect;
var dock = control.GetValue(DockPanel.DockProperty);
switch (dock)
{
case Dock.Left:
dockedRect = leftArranger.GetDockingRect(control.DesiredSize, Margins, control.GetAlignments());
break;
case Dock.Top:
Margins.Swap();
dockedRect = topArranger.GetDockingRect(control.DesiredSize.Swap(), Margins, control.GetAlignments().Swap()).Swap();
Margins.Swap();
break;
case Dock.Right:
dockedRect = rightArranger.GetDockingRect(control.DesiredSize, Margins, control.GetAlignments());
break;
case Dock.Bottom:
Margins.Swap();
dockedRect = bottomArranger.GetDockingRect(control.DesiredSize.Swap(), Margins, control.GetAlignments().Swap()).Swap();
Margins.Swap();
break;
default:
throw new InvalidOperationException($"Invalid dock value {dock}");
}
control.Arrange(dockedRect);
}
return finalSize;
}
}

32
src/Perspex.Controls/DockPanel/EnumerableMixin.cs

@ -1,32 +0,0 @@
namespace Perspex.Controls
{
using System.Collections.Generic;
public static class EnumerableMixin
{
public static IEnumerable<T> Shrink<T>(this IEnumerable<T> source, int left, int right)
{
int i = 0;
var buffer = new Queue<T>(right + 1);
foreach (T x in source)
{
if (i >= left) // Read past left many elements at the start
{
buffer.Enqueue(x);
if (buffer.Count > right) // Build a buffer to drop right many elements at the end
yield return buffer.Dequeue();
}
else i++;
}
}
public static IEnumerable<T> WithoutLast<T>(this IEnumerable<T> source, int n = 1)
{
return source.Shrink(0, n);
}
public static IEnumerable<T> WithoutFirst<T>(this IEnumerable<T> source, int n = 1)
{
return source.Shrink(n, 0);
}
}
}

27
src/Perspex.Controls/DockPanel/LayoutSizes.cs

@ -1,27 +0,0 @@
namespace Perspex.Controls
{
using System;
public struct LayoutSizes
{
private readonly Size _size;
private readonly Size _maxSize;
private readonly Size _minSize;
public LayoutSizes(Size size, Size maxSize, Size minSize)
{
_size = size;
_maxSize = maxSize;
_minSize = minSize;
}
public Size MinSize => _minSize;
public Size MaxSize => _maxSize;
public Size Size => _size;
public bool IsWidthSpecified => !double.IsNaN(_size.Width);
public bool IsHeightSpecified => !double.IsNaN(_size.Height);
}
}

21
src/Perspex.Controls/DockPanel/LeftDocker.cs

@ -1,21 +0,0 @@
namespace Perspex.Controls
{
public class LeftDocker : Docker
{
public LeftDocker(Size availableSize) : base(availableSize)
{
}
public Rect GetDockingRect(Size sizeToDock, Margins margins, Alignments alignments)
{
var marginsCutout = margins.AsThickness();
var withoutMargins = OriginalRect.Deflate(marginsCutout);
var finalRect = withoutMargins.AlignChild(sizeToDock, Alignment.Start, alignments.Vertical);
AccumulatedOffset += sizeToDock.Width;
margins.HorizontalMargin = margins.HorizontalMargin.Offset(sizeToDock.Width, 0);
return finalRect;
}
}
}

51
src/Perspex.Controls/DockPanel/RectMixin.cs

@ -1,51 +0,0 @@
namespace Perspex.Controls
{
using Layout;
public static class RectMixin
{
public static Rect AlignChild(this Rect container, Size childSize, Alignment horizontalAlignment, Alignment verticalAlignment)
{
var horzSegment = container.GetHorizontalCoordinates();
var vertSegment = container.GetVerticalCoordinates();
var horzResult = GetAlignedSegment(childSize.Width, horizontalAlignment, horzSegment);
var vertResult = GetAlignedSegment(childSize.Height, verticalAlignment, vertSegment);
return FromSegments(horzResult, vertResult);
}
public static Rect FromSegments(Segment horzSegment, Segment vertSegment)
{
return new Rect(horzSegment.Start, vertSegment.Start, horzSegment.Length, vertSegment.Length);
}
private static Segment GetAlignedSegment(double width, Alignment alignment, Segment horzSegment)
{
switch (alignment)
{
case Alignment.Start:
return horzSegment.AlignToStart(width);
case Alignment.Middle:
return horzSegment.AlignToMiddle(width);
case Alignment.End:
return horzSegment.AlignToEnd(width);
default:
return new Segment(horzSegment.Start, horzSegment.End);
}
}
public static Segment GetHorizontalCoordinates(this Rect rect)
{
return new Segment(rect.X, rect.Right);
}
public static Segment GetVerticalCoordinates(this Rect rect)
{
return new Segment(rect.Y, rect.Bottom);
}
}
}

23
src/Perspex.Controls/DockPanel/RightDocker.cs

@ -1,23 +0,0 @@
namespace Perspex.Controls
{
using Layout;
public class RightDocker : Docker
{
public RightDocker(Size availableSize) : base(availableSize)
{
}
public Rect GetDockingRect(Size sizeToDock, Margins margins, Alignments alignments)
{
var marginsCutout = margins.AsThickness();
var withoutMargins = OriginalRect.Deflate(marginsCutout);
var finalRect = withoutMargins.AlignChild(sizeToDock, Alignment.End, alignments.Vertical);
AccumulatedOffset += sizeToDock.Width;
margins.HorizontalMargin = margins.HorizontalMargin.Offset(0, sizeToDock.Width);
return finalRect;
}
}
}

21
src/Perspex.Controls/DockPanel/Segment.cs

@ -1,21 +0,0 @@
namespace Perspex.Controls
{
public struct Segment
{
public Segment(double start, double end)
{
Start = start;
End = end;
}
public double Start { get; set; }
public double End { get; set; }
public double Length => End - Start;
public override string ToString()
{
return $"Start: {Start}, End: {End}";
}
}
}

2
src/Perspex.Controls/DropDown.cs

@ -86,7 +86,7 @@ namespace Perspex.Controls
if (!e.Handled)
{
if (e.Key == Key.F4 ||
(e.Key == Key.Down && ((e.Modifiers & ModifierKeys.Alt) != 0)))
(e.Key == Key.Down && ((e.Modifiers & InputModifiers.Alt) != 0)))
{
IsDropDownOpen = !IsDropDownOpen;
e.Handled = true;

8
src/Perspex.Controls/Margins.cs

@ -1,8 +0,0 @@
namespace Perspex.Controls
{
public class Margins
{
public Segment HorizontalMargin { get; set; }
public Segment VerticalMargin { get; set; }
}
}

18
src/Perspex.Controls/MenuItem.cs

@ -14,7 +14,6 @@ using Perspex.Input;
using Perspex.Interactivity;
using Perspex.Threading;
using Perspex.VisualTree;
using Splat;
namespace Perspex.Controls
{
@ -489,7 +488,7 @@ namespace Perspex.Controls
/// <summary>
/// A dependency resolver which returns a <see cref="MenuItemAccessKeyHandler"/>.
/// </summary>
private class DependencyResolver : IDependencyResolver
private class DependencyResolver : IPerspexDependencyResolver
{
/// <summary>
/// Gets the default instance of <see cref="DependencyResolver"/>.
@ -509,7 +508,7 @@ namespace Perspex.Controls
/// <param name="serviceType">The service type.</param>
/// <param name="contract">An optional contract.</param>
/// <returns>A service of the requested type.</returns>
public object GetService(Type serviceType, string contract = null)
public object GetService(Type serviceType)
{
if (serviceType == typeof(IAccessKeyHandler))
{
@ -517,20 +516,9 @@ namespace Perspex.Controls
}
else
{
return Locator.Current.GetService(serviceType, contract);
return PerspexLocator.Current.GetService(serviceType);
}
}
/// <summary>
/// Gets collection of services of the specified type.
/// </summary>
/// <param name="serviceType">The service type.</param>
/// <param name="contract">An optional contract.</param>
/// <returns>A collection of services of the requested type.</returns>
public IEnumerable<object> GetServices(Type serviceType, string contract = null)
{
return Locator.Current.GetServices(serviceType, contract);
}
}
}
}

20
src/Perspex.Controls/Perspex.Controls.csproj

@ -41,18 +41,8 @@
<Compile Include="..\Shared\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="DockPanel.cs" />
<Compile Include="SystemDialog.cs" />
<Compile Include="DockPanel\Aligner.cs" />
<Compile Include="DockPanel\Alignment.cs" />
<Compile Include="DockPanel\Alignments.cs" />
<Compile Include="DockPanel\CoordinateMixin.cs" />
<Compile Include="DockPanel\Dock.cs" />
<Compile Include="DockPanel\Docker.cs" />
<Compile Include="DockPanel\DockingArranger.cs" />
<Compile Include="DockPanel\DockPanel.cs" />
<Compile Include="DockPanel\EnumerableMixin.cs" />
<Compile Include="DockPanel\LayoutSizes.cs" />
<Compile Include="DockPanel\RectMixin.cs" />
<Compile Include="Generators\ITreeItemContainerGenerator.cs" />
<Compile Include="Generators\ItemContainers.cs" />
<Compile Include="IContentControl.cs" />
@ -60,9 +50,6 @@
<Compile Include="IPanel.cs" />
<Compile Include="IReparentingHost.cs" />
<Compile Include="ISetLogicalParent.cs" />
<Compile Include="DockPanel\LeftDocker.cs" />
<Compile Include="DockPanel\Segment.cs" />
<Compile Include="Margins.cs" />
<Compile Include="MenuItemAccessKeyHandler.cs" />
<Compile Include="Mixins\SelectableMixin.cs" />
<Compile Include="Platform\ISystemDialogImpl.cs" />
@ -81,7 +68,6 @@
<Compile Include="Primitives\IScrollInfo.cs" />
<Compile Include="Primitives\Popup.cs" />
<Compile Include="Primitives\ScrollInfoAdapter.cs" />
<Compile Include="DockPanel\RightDocker.cs" />
<Compile Include="Canvas.cs" />
<Compile Include="Templates\ControlTemplate`2.cs" />
<Compile Include="Templates\DataTemplate`1.cs" />
@ -187,9 +173,6 @@
<Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
<HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
@ -225,6 +208,7 @@
<Name>Perspex.Styling</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

3
src/Perspex.Controls/Primitives/Popup.cs

@ -5,7 +5,6 @@ using System;
using Perspex.Interactivity;
using Perspex.Rendering;
using Perspex.VisualTree;
using Splat;
namespace Perspex.Controls.Primitives
{
@ -94,7 +93,7 @@ namespace Perspex.Controls.Primitives
/// This property allows a client to customize the behaviour of the popup by injecting
/// a specialized dependency resolver into the <see cref="PopupRoot"/>'s constructor.
/// </remarks>
public IDependencyResolver DependencyResolver
public IPerspexDependencyResolver DependencyResolver
{
get;
set;

5
src/Perspex.Controls/Primitives/PopupRoot.cs

@ -8,7 +8,6 @@ using Perspex.Interactivity;
using Perspex.Media;
using Perspex.Platform;
using Perspex.VisualTree;
using Splat;
namespace Perspex.Controls.Primitives
{
@ -41,8 +40,8 @@ namespace Perspex.Controls.Primitives
/// <param name="dependencyResolver">
/// The dependency resolver to use. If null the default dependency resolver will be used.
/// </param>
public PopupRoot(IDependencyResolver dependencyResolver)
: base(Locator.Current.GetService<IPopupImpl>(), dependencyResolver)
public PopupRoot(IPerspexDependencyResolver dependencyResolver)
: base(PerspexLocator.Current.GetService<IPopupImpl>(), dependencyResolver)
{
GetObservable(ParentProperty).Subscribe(x => InheritanceParent = (PerspexObject)x);
}

5
src/Perspex.Controls/SystemDialog.cs

@ -2,7 +2,6 @@
using System.Linq;
using System.Threading.Tasks;
using Perspex.Controls.Platform;
using Splat;
namespace Perspex.Controls
{
@ -20,7 +19,7 @@ namespace Perspex.Controls
public async Task<string> ShowAsync(Window window = null)
=>
((await Locator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl)) ??
((await PerspexLocator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl)) ??
new string[0]).FirstOrDefault();
}
@ -29,7 +28,7 @@ namespace Perspex.Controls
public bool AllowMultiple { get; set; }
public Task<string[]> ShowAsync(Window window = null)
=> Locator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl);
=> PerspexLocator.Current.GetService<ISystemDialogImpl>().ShowFileDialogAsync(this, window?.PlatformImpl);
}
public abstract class SystemDialog

3
src/Perspex.Controls/Templates/DataTemplateExtensions.cs

@ -3,7 +3,6 @@
using System.Linq;
using Perspex.LogicalTree;
using Splat;
namespace Perspex.Controls.Templates
{
@ -63,7 +62,7 @@ namespace Perspex.Controls.Templates
}
}
IGlobalDataTemplates global = Locator.Current.GetService<IGlobalDataTemplates>();
IGlobalDataTemplates global = PerspexLocator.Current.GetService<IGlobalDataTemplates>();
if (global != null)
{

27
src/Perspex.Controls/TextBox.cs

@ -2,7 +2,6 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Input.Platform;
using Splat;
using System;
using System.Collections.Generic;
using System.Linq;
@ -150,13 +149,13 @@ namespace Perspex.Controls
private async void Copy()
{
await ((IClipboard)Locator.Current.GetService(typeof(IClipboard)))
await ((IClipboard)PerspexLocator.Current.GetService(typeof(IClipboard)))
.SetTextAsync(GetSelection());
}
private async void Paste()
{
var text = await ((IClipboard)Locator.Current.GetService(typeof(IClipboard))).GetTextAsync();
var text = await ((IClipboard)PerspexLocator.Current.GetService(typeof(IClipboard))).GetTextAsync();
if (text == null)
{
return;
@ -176,21 +175,21 @@ namespace Perspex.Controls
switch (e.Key)
{
case Key.A:
if (modifiers == ModifierKeys.Control)
if (modifiers == InputModifiers.Control)
{
SelectAll();
}
break;
case Key.C:
if (modifiers == ModifierKeys.Control)
if (modifiers == InputModifiers.Control)
{
Copy();
}
break;
case Key.V:
if (modifiers == ModifierKeys.Control)
if (modifiers == InputModifiers.Control)
{
Paste();
}
@ -265,7 +264,7 @@ namespace Perspex.Controls
break;
}
if (movement && ((modifiers & ModifierKeys.Shift) != 0))
if (movement && ((modifiers & InputModifiers.Shift) != 0))
{
SelectionEnd = CaretIndex;
}
@ -336,12 +335,12 @@ namespace Perspex.Controls
return Math.Max(0, Math.Min(length, value));
}
private void MoveHorizontal(int count, ModifierKeys modifiers)
private void MoveHorizontal(int count, InputModifiers modifiers)
{
var text = Text ?? string.Empty;
var caretIndex = CaretIndex;
if ((modifiers & ModifierKeys.Control) != 0)
if ((modifiers & InputModifiers.Control) != 0)
{
if (count > 0)
{
@ -356,7 +355,7 @@ namespace Perspex.Controls
CaretIndex = caretIndex += count;
}
private void MoveVertical(int count, ModifierKeys modifiers)
private void MoveVertical(int count, InputModifiers modifiers)
{
var formattedText = _presenter.FormattedText;
var lines = formattedText.GetLines().ToList();
@ -374,12 +373,12 @@ namespace Perspex.Controls
}
}
private void MoveHome(ModifierKeys modifiers)
private void MoveHome(InputModifiers modifiers)
{
var text = Text ?? string.Empty;
var caretIndex = CaretIndex;
if ((modifiers & ModifierKeys.Control) != 0)
if ((modifiers & InputModifiers.Control) != 0)
{
caretIndex = 0;
}
@ -404,12 +403,12 @@ namespace Perspex.Controls
CaretIndex = caretIndex;
}
private void MoveEnd(ModifierKeys modifiers)
private void MoveEnd(InputModifiers modifiers)
{
var text = Text ?? string.Empty;
var caretIndex = CaretIndex;
if ((modifiers & ModifierKeys.Control) != 0)
if ((modifiers & InputModifiers.Control) != 0)
{
caretIndex = text.Length;
}

11
src/Perspex.Controls/TopLevel.cs

@ -12,7 +12,6 @@ using Perspex.Platform;
using Perspex.Rendering;
using Perspex.Styling;
using Perspex.Threading;
using Splat;
namespace Perspex.Controls
{
@ -87,7 +86,7 @@ namespace Perspex.Controls
/// </summary>
/// <param name="impl">The platform-specific window implementation.</param>
public TopLevel(ITopLevelImpl impl)
: this(impl, Locator.Current)
: this(impl, PerspexLocator.Current)
{
}
@ -98,7 +97,7 @@ namespace Perspex.Controls
/// <param name="dependencyResolver">
/// The dependency resolver to use. If null the default dependency resolver will be used.
/// </param>
public TopLevel(ITopLevelImpl impl, IDependencyResolver dependencyResolver)
public TopLevel(ITopLevelImpl impl, IPerspexDependencyResolver dependencyResolver)
{
if (impl == null)
{
@ -108,7 +107,7 @@ namespace Perspex.Controls
PlatformImpl = impl;
dependencyResolver = dependencyResolver ?? Locator.Current;
dependencyResolver = dependencyResolver ?? PerspexLocator.Current;
var renderInterface = TryGetService<IPlatformRenderInterface>(dependencyResolver);
var styler = TryGetService<IStyler>(dependencyResolver);
_accessKeyHandler = TryGetService<IAccessKeyHandler>(dependencyResolver);
@ -327,13 +326,13 @@ namespace Perspex.Controls
}
/// <summary>
/// Tries to get a service from an <see cref="IDependencyResolver"/>, throwing an
/// Tries to get a service from an <see cref="IPerspexDependencyResolver"/>, throwing an
/// exception if not found.
/// </summary>
/// <typeparam name="T">The service type.</typeparam>
/// <param name="resolver">The resolver.</param>
/// <returns>The service.</returns>
private static T TryGetService<T>(IDependencyResolver resolver) where T : class
private static T TryGetService<T>(IPerspexDependencyResolver resolver) where T : class
{
var result = resolver.GetService<T>();

3
src/Perspex.Controls/Window.cs

@ -8,7 +8,6 @@ using Perspex.Input;
using Perspex.Media;
using Perspex.Platform;
using Perspex.Styling;
using Splat;
namespace Perspex.Controls
{
@ -72,7 +71,7 @@ namespace Perspex.Controls
/// Initializes a new instance of the <see cref="Window"/> class.
/// </summary>
public Window()
: base(Locator.Current.GetService<IWindowImpl>())
: base(PerspexLocator.Current.GetService<IWindowImpl>())
{
_maxPlatformClientSize = this.PlatformImpl.MaxClientSize;
}

1
src/Perspex.Controls/packages.config

@ -6,5 +6,4 @@
<package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

3
src/Perspex.HtmlRenderer/Adapters/PerspexAdapter.cs

@ -9,7 +9,6 @@ using Perspex;
using Perspex.Input.Platform;
using Perspex.Media;
using Perspex.Media.Imaging;
using Splat;
using TheArtOfDev.HtmlRenderer.Adapters;
using TheArtOfDev.HtmlRenderer.Adapters.Entities;
using TheArtOfDev.HtmlRenderer.Perspex.Utilities;
@ -118,7 +117,7 @@ namespace TheArtOfDev.HtmlRenderer.Perspex.Adapters
protected override void SetToClipboardInt(string text)
{
Locator.Current.GetService<IClipboard>().SetTextAsync(text);
PerspexLocator.Current.GetService<IClipboard>().SetTextAsync(text);
}
protected override void SetToClipboardInt(RImage image)

2
src/Perspex.HtmlRenderer/HtmlContainer.cs

@ -462,7 +462,7 @@ namespace TheArtOfDev.HtmlRenderer.Perspex
/// </summary>
private static RKeyEvent CreateKeyEevent(KeyEventArgs e)
{
var control = (e.Modifiers & ModifierKeys.Control) == ModifierKeys.Control;
var control = (e.Modifiers & InputModifiers.Control) == InputModifiers.Control;
return new RKeyEvent(control, e.Key == Key.A, e.Key == Key.C);
}

4
src/Perspex.HtmlRenderer/HtmlControl.cs

@ -85,8 +85,8 @@ namespace Perspex.Controls.Html
public static readonly PerspexProperty TextProperty =
PropertyHelper.Register<HtmlControl, string>("Text", null, OnPerspexProperty_valueChanged);
public static readonly PerspexProperty BackgroundProperty =
PerspexProperty.Register<HtmlControl, Brush>("Background", Brushes.White);
public static readonly PerspexProperty<Brush> BackgroundProperty =
Border.BackgroundProperty.AddOwner<HtmlControl>();
public static readonly PerspexProperty BorderThicknessProperty =
PerspexProperty.Register<HtmlControl, Thickness>("BorderThickness", new Thickness(0));

3
src/Perspex.HtmlRenderer/Perspex.HtmlRenderer.csproj

@ -172,9 +172,6 @@
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Reference Include="Splat">
<HintPath>..\..\packages\Splat.1.6.2\lib\Net45\Splat.dll</HintPath>
</Reference>
<Reference Include="System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<HintPath>..\..\packages\Rx-Core.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.Core.dll</HintPath>
</Reference>

1
src/Perspex.HtmlRenderer/packages.config

@ -4,5 +4,4 @@
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="portable45-net45+win8" />
<package id="Rx-Core" version="2.2.5" targetFramework="portable45-net45+win8" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="portable45-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

2
src/Perspex.Input/AccessKeyHandler.cs

@ -143,7 +143,7 @@ namespace Perspex.Input
CloseMenu();
e.Handled = true;
}
else if ((e.Modifiers & ModifierKeys.Alt) != 0 || menuIsOpen)
else if ((e.Modifiers & InputModifiers.Alt) != 0 || menuIsOpen)
{
// If any other key is pressed with the Alt key held down, or the main menu is open,
// find all controls who have registered that access key.

3
src/Perspex.Input/Cursors.cs

@ -1,7 +1,6 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Splat;
using System;
using System.Collections.Generic;
using System.Linq;
@ -50,7 +49,7 @@ namespace Perspex.Input
public Cursor(StandardCursorType cursorType)
: this(
((IStandardCursorFactory)Locator.Current.GetService(typeof(IStandardCursorFactory))).GetCursor(
((IStandardCursorFactory)PerspexLocator.Current.GetService(typeof(IStandardCursorFactory))).GetCursor(
cursorType))
{
}

3
src/Perspex.Input/FocusManager.cs

@ -6,7 +6,6 @@ using System.Collections.Generic;
using System.Linq;
using Perspex.Interactivity;
using Perspex.VisualTree;
using Splat;
namespace Perspex.Input
{
@ -35,7 +34,7 @@ namespace Perspex.Input
/// <summary>
/// Gets the instance of the <see cref="IFocusManager"/>.
/// </summary>
public static IFocusManager Instance => Locator.Current.GetService<IFocusManager>();
public static IFocusManager Instance => PerspexLocator.Current.GetService<IFocusManager>();
/// <summary>
/// Gets the currently focused <see cref="IInputElement"/>.

2
src/Perspex.Input/IInputElement.cs

@ -60,7 +60,7 @@ namespace Perspex.Input
/// <summary>
/// Occurs when the pointer is released over the control.
/// </summary>
event EventHandler<PointerEventArgs> PointerReleased;
event EventHandler<PointerReleasedEventArgs> PointerReleased;
/// <summary>
/// Occurs when the mouse wheen is scrolled over the control.

5
src/Perspex.Input/IKeyboardDevice.cs

@ -6,13 +6,16 @@ using System;
namespace Perspex.Input
{
[Flags]
public enum ModifierKeys
public enum InputModifiers
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Windows = 8,
LeftMouseButton = 16,
RightMouseButton = 32,
MiddleMouseButton = 64
}
[Flags]

6
src/Perspex.Input/InputElement.cs

@ -123,8 +123,8 @@ namespace Perspex.Input
/// <summary>
/// Defines the <see cref="PointerReleased"/> event.
/// </summary>
public static readonly RoutedEvent<PointerEventArgs> PointerReleasedEvent =
RoutedEvent.Register<InputElement, PointerEventArgs>(
public static readonly RoutedEvent<PointerReleasedEventArgs> PointerReleasedEvent =
RoutedEvent.Register<InputElement, PointerReleasedEventArgs>(
"PointerReleased",
RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
@ -240,7 +240,7 @@ namespace Perspex.Input
/// <summary>
/// Occurs when the pointer is released over the control.
/// </summary>
public event EventHandler<PointerEventArgs> PointerReleased
public event EventHandler<PointerReleasedEventArgs> PointerReleased
{
add { AddHandler(PointerReleasedEvent, value); }
remove { RemoveHandler(PointerReleasedEvent, value); }

3
src/Perspex.Input/InputManager.cs

@ -6,7 +6,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Reactive.Subjects;
using Perspex.Input.Raw;
using Splat;
namespace Perspex.Input
{
@ -16,7 +15,7 @@ namespace Perspex.Input
private readonly Subject<RawInputEventArgs> _postProcess = new Subject<RawInputEventArgs>();
public static IInputManager Instance => Locator.Current.GetService<IInputManager>();
public static IInputManager Instance => PerspexLocator.Current.GetService<IInputManager>();
public IObservable<RawInputEventArgs> RawEventReceived => _rawEventReceived;

2
src/Perspex.Input/KeyEventArgs.cs

@ -12,6 +12,6 @@ namespace Perspex.Input
public Key Key { get; set; }
public ModifierKeys Modifiers { get; set; }
public InputModifiers Modifiers { get; set; }
}
}

7
src/Perspex.Input/KeyboardDevice.cs

@ -8,7 +8,6 @@ using System.Reactive.Linq;
using System.Runtime.CompilerServices;
using Perspex.Input.Raw;
using Perspex.Interactivity;
using Splat;
namespace Perspex.Input
{
@ -26,11 +25,11 @@ namespace Perspex.Input
public event PropertyChangedEventHandler PropertyChanged;
public static IKeyboardDevice Instance => Locator.Current.GetService<IKeyboardDevice>();
public static IKeyboardDevice Instance => PerspexLocator.Current.GetService<IKeyboardDevice>();
public IInputManager InputManager => Locator.Current.GetService<IInputManager>();
public IInputManager InputManager => PerspexLocator.Current.GetService<IInputManager>();
public IFocusManager FocusManager => Locator.Current.GetService<IFocusManager>();
public IFocusManager FocusManager => PerspexLocator.Current.GetService<IFocusManager>();
public IInputElement FocusedElement
{

2
src/Perspex.Input/KeyboardNavigationHandler.cs

@ -98,7 +98,7 @@ namespace Perspex.Input
switch (e.Key)
{
case Key.Tab:
direction = (e.Modifiers & ModifierKeys.Shift) == 0 ?
direction = (e.Modifiers & InputModifiers.Shift) == 0 ?
FocusNavigationDirection.Next : FocusNavigationDirection.Previous;
break;
case Key.Up:

43
src/Perspex.Input/MouseDevice.cs

@ -9,7 +9,6 @@ using Perspex.Input.Raw;
using Perspex.Interactivity;
using Perspex.Platform;
using Perspex.VisualTree;
using Splat;
namespace Perspex.Input
{
@ -31,7 +30,7 @@ namespace Perspex.Input
.Subscribe(ProcessRawEvent);
}
public static IMouseDevice Instance => Locator.Current.GetService<IMouseDevice>();
public static IMouseDevice Instance => PerspexLocator.Current.GetService<IMouseDevice>();
public IInputElement Captured
{
@ -39,7 +38,7 @@ namespace Perspex.Input
protected set;
}
public IInputManager InputManager => Locator.Current.GetService<IInputManager>();
public IInputManager InputManager => PerspexLocator.Current.GetService<IInputManager>();
public Point Position
{
@ -78,16 +77,28 @@ namespace Perspex.Input
LeaveWindow(mouse, e.Root);
break;
case RawMouseEventType.LeftButtonDown:
MouseDown(mouse, e.Timestamp, e.Root, e.Position);
case RawMouseEventType.RightButtonDown:
case RawMouseEventType.MiddleButtonDown:
MouseDown(mouse, e.Timestamp, e.Root, e.Position,
e.Type == RawMouseEventType.LeftButtonDown
? MouseButton.Left
: e.Type == RawMouseEventType.RightButtonDown ? MouseButton.Right : MouseButton.Middle,
e.InputModifiers);
break;
case RawMouseEventType.LeftButtonUp:
MouseUp(mouse, e.Root, e.Position);
case RawMouseEventType.RightButtonUp:
case RawMouseEventType.MiddleButtonUp:
MouseUp(mouse, e.Root, e.Position,
e.Type == RawMouseEventType.LeftButtonUp
? MouseButton.Left
: e.Type == RawMouseEventType.RightButtonUp ? MouseButton.Right : MouseButton.Middle,
e.InputModifiers);
break;
case RawMouseEventType.Move:
MouseMove(mouse, e.Root, e.Position);
MouseMove(mouse, e.Root, e.Position, e.InputModifiers);
break;
case RawMouseEventType.Wheel:
MouseWheel(mouse, e.Root, e.Position, ((RawMouseWheelEventArgs)e).Delta);
MouseWheel(mouse, e.Root, e.Position, ((RawMouseWheelEventArgs)e).Delta, e.InputModifiers);
break;
}
}
@ -97,7 +108,7 @@ namespace Perspex.Input
ClearPointerOver(this, root);
}
private void MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p)
private void MouseDown(IMouseDevice device, uint timestamp, IInputElement root, Point p, MouseButton button, InputModifiers inputModifiers)
{
var hit = HitTest(root, p);
@ -107,7 +118,7 @@ namespace Perspex.Input
if (source != null)
{
var settings = Locator.Current.GetService<IPlatformSettings>();
var settings = PerspexLocator.Current.GetService<IPlatformSettings>();
var doubleClickTime = settings.DoubleClickTime.TotalMilliseconds;
if (!_lastClickRect.Contains(p) || timestamp - _lastClickTime > doubleClickTime)
@ -126,6 +137,8 @@ namespace Perspex.Input
RoutedEvent = InputElement.PointerPressedEvent,
Source = source,
ClickCount = _clickCount,
MouseButton = button,
InputModifiers = inputModifiers
};
source.RaiseEvent(e);
@ -133,7 +146,7 @@ namespace Perspex.Input
}
}
private void MouseMove(IMouseDevice device, IInputRoot root, Point p)
private void MouseMove(IMouseDevice device, IInputRoot root, Point p, InputModifiers inputModifiers)
{
IInputElement source;
@ -153,10 +166,11 @@ namespace Perspex.Input
Device = this,
RoutedEvent = InputElement.PointerMovedEvent,
Source = source,
InputModifiers = inputModifiers
});
}
private void MouseUp(IMouseDevice device, IInputRoot root, Point p)
private void MouseUp(IMouseDevice device, IInputRoot root, Point p, MouseButton button, InputModifiers inputModifiers)
{
var hit = HitTest(root, p);
@ -166,17 +180,19 @@ namespace Perspex.Input
if (source != null)
{
source.RaiseEvent(new PointerEventArgs
source.RaiseEvent(new PointerReleasedEventArgs
{
Device = this,
RoutedEvent = InputElement.PointerReleasedEvent,
Source = source,
MouseButton = button,
InputModifiers = inputModifiers
});
}
}
}
private void MouseWheel(IMouseDevice device, IInputRoot root, Point p, Vector delta)
private void MouseWheel(IMouseDevice device, IInputRoot root, Point p, Vector delta, InputModifiers inputModifiers)
{
var hit = HitTest(root, p);
@ -192,6 +208,7 @@ namespace Perspex.Input
RoutedEvent = InputElement.PointerWheelChangedEvent,
Source = source,
Delta = delta,
InputModifiers = inputModifiers
});
}
}

4
src/Perspex.Input/Perspex.Input.csproj

@ -98,7 +98,6 @@
<Compile Include="Navigation\DirectionalNavigation.cs" />
<Compile Include="Navigation\TabNavigation.cs" />
<Compile Include="Platform\IPlatformSettings.cs" />
<Compile Include="PointerPressEventArgs.cs" />
<Compile Include="PointerWheelEventArgs.cs" />
<Compile Include="Raw\RawMouseWheelEventArgs.cs" />
<Compile Include="Raw\RawSizeEventArgs.cs" />
@ -126,9 +125,6 @@
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

21
src/Perspex.Input/PointerEventArgs.cs

@ -10,9 +10,30 @@ namespace Perspex.Input
{
public IPointerDevice Device { get; set; }
public InputModifiers InputModifiers { get; set; }
public Point GetPosition(IVisual relativeTo)
{
return Device.GetPosition(relativeTo);
}
}
public enum MouseButton
{
None,
Left,
Right,
Middle
}
public class PointerPressEventArgs : PointerEventArgs
{
public int ClickCount { get; set; }
public MouseButton MouseButton { get; set; }
}
public class PointerReleasedEventArgs : PointerEventArgs
{
public MouseButton MouseButton { get; set; }
}
}

10
src/Perspex.Input/PointerPressEventArgs.cs

@ -1,10 +0,0 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
namespace Perspex.Input
{
public class PointerPressEventArgs : PointerEventArgs
{
public int ClickCount { get; set; }
}
}

4
src/Perspex.Input/Raw/RawKeyEventArgs.cs

@ -15,7 +15,7 @@ namespace Perspex.Input.Raw
IKeyboardDevice device,
uint timestamp,
RawKeyEventType type,
Key key, ModifierKeys modifiers)
Key key, InputModifiers modifiers)
: base(device, timestamp)
{
Key = key;
@ -25,7 +25,7 @@ namespace Perspex.Input.Raw
public Key Key { get; set; }
public ModifierKeys Modifiers { get; set; }
public InputModifiers Modifiers { get; set; }
public RawKeyEventType Type { get; set; }
}

10
src/Perspex.Input/Raw/RawMouseEventArgs.cs

@ -10,6 +10,10 @@ namespace Perspex.Input.Raw
LeaveWindow,
LeftButtonDown,
LeftButtonUp,
RightButtonDown,
RightButtonUp,
MiddleButtonDown,
MiddleButtonUp,
Move,
Wheel,
}
@ -21,7 +25,7 @@ namespace Perspex.Input.Raw
uint timestamp,
IInputRoot root,
RawMouseEventType type,
Point position, ModifierKeys modifierKeys)
Point position, InputModifiers inputModifiers)
: base(device, timestamp)
{
Contract.Requires<ArgumentNullException>(device != null);
@ -30,7 +34,7 @@ namespace Perspex.Input.Raw
Root = root;
Position = position;
Type = type;
ModifierKeys = modifierKeys;
InputModifiers = inputModifiers;
}
public IInputRoot Root { get; private set; }
@ -39,6 +43,6 @@ namespace Perspex.Input.Raw
public RawMouseEventType Type { get; private set; }
public ModifierKeys ModifierKeys { get; private set; }
public InputModifiers InputModifiers { get; private set; }
}
}

4
src/Perspex.Input/Raw/RawMouseWheelEventArgs.cs

@ -13,8 +13,8 @@ namespace Perspex.Input.Raw
uint timestamp,
IInputRoot root,
Point position,
Vector delta, ModifierKeys modifierKeys)
: base(device, timestamp, root, RawMouseEventType.Wheel, position, modifierKeys)
Vector delta, InputModifiers inputModifiers)
: base(device, timestamp, root, RawMouseEventType.Wheel, position, inputModifiers)
{
Delta = delta;
}

1
src/Perspex.Input/packages.config

@ -5,5 +5,4 @@
<package id="Rx-Linq" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

3
src/Perspex.Interactivity/Perspex.Interactivity.csproj

@ -81,9 +81,6 @@
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

1
src/Perspex.Interactivity/packages.config

@ -5,5 +5,4 @@
<package id="Rx-Linq" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

3
src/Perspex.Layout/Perspex.Layout.csproj

@ -80,9 +80,6 @@
<Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
<HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

1
src/Perspex.Layout/packages.config

@ -6,5 +6,4 @@
<package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

9
src/Perspex.SceneGraph/Animation/CrossFade.cs

@ -13,6 +13,13 @@ namespace Perspex.Animation
/// </summary>
public class CrossFade : IPageTransition
{
/// <summary>
/// Initializes a new instance of the <see cref="CrossFade"/> class.
/// </summary>
public CrossFade()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="CrossFade"/> class.
/// </summary>
@ -25,7 +32,7 @@ namespace Perspex.Animation
/// <summary>
/// Gets the duration of the animation.
/// </summary>
public TimeSpan Duration { get; }
public TimeSpan Duration { get; set; }
/// <summary>
/// Starts the animation.

9
src/Perspex.SceneGraph/Animation/PageSlide.cs

@ -14,6 +14,13 @@ namespace Perspex.Animation
/// </summary>
public class PageSlide : IPageTransition
{
/// <summary>
/// Initializes a new instance of the <see cref="PageSlide"/> class.
/// </summary>
public PageSlide()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="PageSlide"/> class.
/// </summary>
@ -26,7 +33,7 @@ namespace Perspex.Animation
/// <summary>
/// Gets the duration of the animation.
/// </summary>
public TimeSpan Duration { get; }
public TimeSpan Duration { get; set; }
/// <summary>
/// Starts the animation.

3
src/Perspex.SceneGraph/Media/EllipseGeometry.cs

@ -3,7 +3,6 @@
using System;
using Perspex.Platform;
using Splat;
namespace Perspex.Media
{
@ -18,7 +17,7 @@ namespace Perspex.Media
/// <param name="rect">The rectangle that the ellipse should fill.</param>
public EllipseGeometry(Rect rect)
{
IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
IStreamGeometryImpl impl = factory.CreateStreamGeometry();
using (IStreamGeometryContextImpl ctx = impl.Open())

3
src/Perspex.SceneGraph/Media/FormattedText.cs

@ -4,7 +4,6 @@
using System;
using System.Collections.Generic;
using Perspex.Platform;
using Splat;
namespace Perspex.Media
{
@ -37,7 +36,7 @@ namespace Perspex.Media
FontWeight = fontWeight;
TextAlignment = textAlignment;
var platform = Locator.Current.GetService<IPlatformRenderInterface>();
var platform = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
PlatformImpl = platform.CreateFormattedText(
text,

7
src/Perspex.SceneGraph/Media/Imaging/Bitmap.cs

@ -3,7 +3,6 @@
using System.IO;
using Perspex.Platform;
using Splat;
namespace Perspex.Media.Imaging
{
@ -18,7 +17,7 @@ namespace Perspex.Media.Imaging
/// <param name="fileName">The filename of the bitmap.</param>
public Bitmap(string fileName)
{
IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
PlatformImpl = factory.LoadBitmap(fileName);
}
@ -28,7 +27,7 @@ namespace Perspex.Media.Imaging
/// <param name="stream">The stream to read the bitmap from.</param>
public Bitmap(Stream stream)
{
IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
PlatformImpl = factory.LoadBitmap(stream);
}
@ -39,7 +38,7 @@ namespace Perspex.Media.Imaging
/// <param name="height">The height of the bitmap, in pixels.</param>
public Bitmap(int width, int height)
{
IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
PlatformImpl = factory.CreateBitmap(width, height);
}

3
src/Perspex.SceneGraph/Media/Imaging/RenderTargetBitmap.cs

@ -3,7 +3,6 @@
using System;
using Perspex.Platform;
using Splat;
namespace Perspex.Media.Imaging
{
@ -55,7 +54,7 @@ namespace Perspex.Media.Imaging
/// <returns>The platform-specific implementation.</returns>
private static IBitmapImpl CreateImpl(int width, int height)
{
IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
return factory.CreateRenderTargetBitmap(width, height);
}
}

3
src/Perspex.SceneGraph/Media/RectangleGeometry.cs

@ -2,7 +2,6 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Platform;
using Splat;
namespace Perspex.Media
{
@ -17,7 +16,7 @@ namespace Perspex.Media
/// <param name="rect">The rectangle bounds.</param>
public RectangleGeometry(Rect rect)
{
IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
IStreamGeometryImpl impl = factory.CreateStreamGeometry();
using (IStreamGeometryContextImpl context = impl.Open())

3
src/Perspex.SceneGraph/Media/StreamGeometry.cs

@ -2,7 +2,6 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Platform;
using Splat;
namespace Perspex.Media
{
@ -16,7 +15,7 @@ namespace Perspex.Media
/// </summary>
public StreamGeometry()
{
IPlatformRenderInterface factory = Locator.Current.GetService<IPlatformRenderInterface>();
IPlatformRenderInterface factory = PerspexLocator.Current.GetService<IPlatformRenderInterface>();
PlatformImpl = factory.CreateStreamGeometry();
}

3
src/Perspex.SceneGraph/Perspex.SceneGraph.csproj

@ -143,9 +143,6 @@
<Reference Include="Serilog, Version=1.5.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10">
<HintPath>..\..\packages\Serilog.1.5.9\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+MonoTouch10\Serilog.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

1
src/Perspex.SceneGraph/packages.config

@ -6,5 +6,4 @@
<package id="Rx-Main" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Rx-PlatformServices" version="2.2.5" targetFramework="portable-net45+win8" />
<package id="Serilog" version="1.5.9" targetFramework="portable45-net45+win8" />
<package id="Splat" version="1.6.2" targetFramework="portable45-net45+win8" />
</packages>

3
src/Perspex.Styling/Perspex.Styling.csproj

@ -77,9 +77,6 @@
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

3
src/Perspex.Styling/Styling/Styler.cs

@ -4,7 +4,6 @@
using System;
using System.Linq;
using Perspex.VisualTree;
using Splat;
namespace Perspex.Styling
{
@ -17,7 +16,7 @@ namespace Perspex.Styling
.GetSelfAndVisualAncestors()
.OfType<IStyleHost>()
.FirstOrDefault();
IGlobalStyles global = Locator.Current.GetService<IGlobalStyles>();
IGlobalStyles global = PerspexLocator.Current.GetService<IGlobalStyles>();
if (global != null)
{

3
src/Perspex.Themes.Default/Perspex.Themes.Default.csproj

@ -118,9 +118,6 @@
<Reference Include="System.Reactive.PlatformServices">
<HintPath>..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-windows8+net45+wp8\System.Reactive.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\..\packages\Splat.1.6.2\lib\Portable-net45+win+wpa81+wp80\Splat.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save